onlyn00bs-badge

OnlyN00bs: a DEF CON 34 friend-finder badge. ESP32 firmware, Web Bluetooth setup app, printable case
git clone https://git.virtualshack.io/onlyn00bs-badge.git
Log | Files | Refs | README | LICENSE

commit 42d362d3357b9373c265d5910c0a2546846e67ec
parent dfa872731c22bdb5367c56cbf27f8a18f22a5300
Author: virtualtack <[email protected]>
Date:   Sat, 26 Sep 2026 13:12:27 -0700

Snapshot of v1.10-2-g2ddd89f

Diffstat:
MSNAPSHOT.md | 2+-
Mweb/src/assets/badge.css | 4----
Mweb/src/gallery/index.html | 2+-
Mweb/src/index.html | 41++++++++++++++++++++---------------------
Mweb/src/sw.js | 2+-
5 files changed, 23 insertions(+), 28 deletions(-)

diff --git a/SNAPSHOT.md b/SNAPSHOT.md @@ -1,7 +1,7 @@ # About this snapshot This repository is the public release of the OnlyN00bs badge, taken from its private -development repo at `v1.10-1-g5e89d9b` on 2026-09-26. It holds what describes the **production unit +development repo at `v1.10-2-g2ddd89f` on 2026-09-26. It holds what describes the **production unit as it is**: the firmware, the Web Bluetooth setup app, the site, the parts list, and the case. diff --git a/web/src/assets/badge.css b/web/src/assets/badge.css @@ -296,10 +296,6 @@ dialog.lightbox figcaption { font-size: 13px; color: #bdbdbd; text-align: center .lightbox .next { right: 12px; top: 50%; transform: translateY(-50%); } .lightbox .count { position: fixed; top: 20px; left: 16px; font-size: 13px; color: #8b949e; } -/* The gallery link at the top of the page (where the TL;DR box was): a plain accent link in - the page's lowercase `//` voice, not a second call-to-action competing with setup. */ -.top-link { margin: 20px 0 8px; } - /* The badge page's // photos section: the gallery's first row (three tiles). On a phone the grid is two columns, so the third would sit alone on a second row: show two instead. */ @media (max-width: 520px) { .gallery-preview figure:nth-child(n+3) { display: none; } } diff --git a/web/src/gallery/index.html b/web/src/gallery/index.html @@ -17,7 +17,7 @@ <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:image" content="https://badge.virtualshack.io/assets/img/og-badge.jpg"> <!-- ?v= must match CACHE in ../sw.js — same rule as index.html --> -<link rel="stylesheet" href="../assets/badge.css?v=38"> +<link rel="stylesheet" href="../assets/badge.css?v=39"> <link rel="icon" type="image/svg+xml" href="../assets/icon.svg"> <link rel="manifest" href="../manifest.webmanifest"> <meta name="theme-color" content="#212121"> diff --git a/web/src/index.html b/web/src/index.html @@ -32,7 +32,7 @@ invisible to visitors for hours after a deploy. A new query = a new edge cache key = it lands immediately. Safe for offline: sw.js matches with ignoreSearch, so this still resolves to the precached bare URL. --> -<link rel="stylesheet" href="assets/badge.css?v=38"> +<link rel="stylesheet" href="assets/badge.css?v=39"> <link rel="icon" type="image/svg+xml" href="assets/icon.svg"> <link rel="manifest" href="manifest.webmanifest"> <meta name="theme-color" content="#212121"> @@ -44,7 +44,25 @@ <p class="tagline">a friend-finder badge for def con 34 · firmware v1.10</p> <p class="small muted"><a href="https://virtualshack.io/">virtualshack.io</a> / badge</p> - <p class="top-link"><a href="gallery/">// photos</a></p> + <!-- generated from the gallery manifest: the first row, once there are photos --> + <!-- gallery-preview:begin --> + <h2 id="photos">// photos</h2> + <div class="gallery gallery-preview"> + <figure> + <a href="gallery/" data-w="1600" data-h="1200"><img src="assets/gallery/thumbs/dc34-01.jpg" alt="A green OnlyN00bs badge on the finder screen beside the official DEF CON 34 badge and a challenge coin, with a purple foot charm on the case" + width="720" height="540" loading="eager" decoding="async"></a> + </figure> + <figure> + <a href="gallery/" data-w="1234" data-h="929"><img src="assets/gallery/thumbs/dc34-02.jpg" alt="A hand holding a purple OnlyN00bs badge on the finder screen, with a green badge on a lanyard behind it" + width="720" height="542" loading="eager" decoding="async"></a> + </figure> + <figure> + <a href="gallery/" data-w="929" data-h="1238"><img src="assets/gallery/thumbs/dc34-03.jpg" alt="A lavender badge with foot and gummy-bear charms, its finder screen listing five nearby badges" + width="540" height="720" loading="eager" decoding="async"></a> + </figure> + </div> + <p class="small"><a href="gallery/">all photos →</a></p> + <!-- gallery-preview:end --> <p style="text-align:center"><a class="cta" href="provision/">Set up my badge →</a></p> @@ -159,25 +177,6 @@ <li><b>Also not included: anyone's data.</b> Encounter logs and the list of who got which badge stayed private. The repo is the badge, not the con.</li> </ul> - <!-- generated from the gallery manifest: the first row, once there are photos --> - <!-- gallery-preview:begin --> - <h2 id="photos">// photos</h2> - <div class="gallery gallery-preview"> - <figure> - <a href="gallery/" data-w="1600" data-h="1200"><img src="assets/gallery/thumbs/dc34-01.jpg" alt="A green OnlyN00bs badge on the finder screen beside the official DEF CON 34 badge and a challenge coin, with a purple foot charm on the case" - width="720" height="540" loading="lazy" decoding="async"></a> - </figure> - <figure> - <a href="gallery/" data-w="1234" data-h="929"><img src="assets/gallery/thumbs/dc34-02.jpg" alt="A hand holding a purple OnlyN00bs badge on the finder screen, with a green badge on a lanyard behind it" - width="720" height="542" loading="lazy" decoding="async"></a> - </figure> - <figure> - <a href="gallery/" data-w="929" data-h="1238"><img src="assets/gallery/thumbs/dc34-03.jpg" alt="A lavender badge with foot and gummy-bear charms, its finder screen listing five nearby badges" - width="540" height="720" loading="lazy" decoding="async"></a> - </figure> - </div> - <p class="small"><a href="gallery/">all photos →</a></p> - <!-- gallery-preview:end --> <h2 id="setup">// setup</h2> diff --git a/web/src/sw.js b/web/src/sw.js @@ -17,7 +17,7 @@ * there is one version to remember, not two. */ -const CACHE = "onlyn00bs-v38"; +const CACHE = "onlyn00bs-v39"; // Resolved against the worker's own location, so it's right whether the site is served at // / (production) or under a path (a local preview).