[object Object]

← back to CelebritySignatures

QR points at public Kamatera host via short /k/<cat> route; verified all 6 decode

ac66a5d90cd7199211324046c05c7fd0d92f1c0b · 2026-06-18 17:15:57 -0700 · Steve

Files touched

Diff

commit ac66a5d90cd7199211324046c05c7fd0d92f1c0b
Author: Steve <steve@designerwallcoverings.com>
Date:   Thu Jun 18 17:15:57 2026 -0700

    QR points at public Kamatera host via short /k/<cat> route; verified all 6 decode
---
 output/collage-declaration-of-independence.png | Bin 648537 -> 648469 bytes
 output/collage-hollywood.png                   | Bin 799147 -> 798780 bytes
 output/collage-movies-classic.png              | Bin 834681 -> 834063 bytes
 output/collage-politics.png                    | Bin 588745 -> 588463 bytes
 output/collage-sports.png                      | Bin 355414 -> 355659 bytes
 output/collage-tv.png                          | Bin 169782 -> 169526 bytes
 scripts/build-collages.py                      |   8 ++++----
 server.js                                      |  11 ++++++++++-
 8 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/output/collage-declaration-of-independence.png b/output/collage-declaration-of-independence.png
index e03c263..168520e 100644
Binary files a/output/collage-declaration-of-independence.png and b/output/collage-declaration-of-independence.png differ
diff --git a/output/collage-hollywood.png b/output/collage-hollywood.png
index 77c8cce..3def647 100644
Binary files a/output/collage-hollywood.png and b/output/collage-hollywood.png differ
diff --git a/output/collage-movies-classic.png b/output/collage-movies-classic.png
index 1be8e4f..dd91d64 100644
Binary files a/output/collage-movies-classic.png and b/output/collage-movies-classic.png differ
diff --git a/output/collage-politics.png b/output/collage-politics.png
index aeefd2a..ccf1f54 100644
Binary files a/output/collage-politics.png and b/output/collage-politics.png differ
diff --git a/output/collage-sports.png b/output/collage-sports.png
index a844c9f..d02524b 100644
Binary files a/output/collage-sports.png and b/output/collage-sports.png differ
diff --git a/output/collage-tv.png b/output/collage-tv.png
index 69b34d2..cf4e5b5 100644
Binary files a/output/collage-tv.png and b/output/collage-tv.png differ
diff --git a/scripts/build-collages.py b/scripts/build-collages.py
index 26b0e27..40648dd 100644
--- a/scripts/build-collages.py
+++ b/scripts/build-collages.py
@@ -30,9 +30,9 @@ CACHE = os.path.join(ROOT, "tmp_collage_cache")
 OUT = os.path.join(ROOT, "output")
 UA = "CelebritySignatures-research/1.0 (steve@designerwallcoverings.com)"
 COMMONS = "https://commons.wikimedia.org/w/api.php"
-# Host the QR code points at. Defaults to the LAN IP so phone scans work on the
-# same network; override with PUBLIC_BASE_URL=https://… when this ever deploys.
-BASE_URL = os.environ.get("PUBLIC_BASE_URL", "http://192.168.1.53:9920").rstrip("/")
+# Host the QR code points at — the public Kamatera deployment so a phone scanning
+# the printed mural resolves the named "key" from anywhere (not just the LAN).
+BASE_URL = os.environ.get("PUBLIC_BASE_URL", "https://celebrity.designerwallcoverings.com").rstrip("/")
 os.makedirs(CACHE, exist_ok=True)
 os.makedirs(OUT, exist_ok=True)
 
@@ -227,7 +227,7 @@ def build(category, rows):
     # centred in the grid — same size, same placement as every signature. It links
     # to the named "key" version. render() uses the same cols formula, so inserting
     # at this index lands the QR in the middle row/column of the laid-out grid.
-    qr_url = f"{BASE_URL}/output/collage-{safe}-named.png"
+    qr_url = f"{BASE_URL}/k/{safe}"          # short → low-density → scans at sig size
     qr_cell = ("", make_qr_cell(qr_url))
     total = len(cells) + 1
     cols = min(10, max(1, round(total ** 0.5)))
diff --git a/server.js b/server.js
index cf5735a..610ebf6 100644
--- a/server.js
+++ b/server.js
@@ -7,13 +7,22 @@ import { fileURLToPath } from 'node:url';
 
 const ROOT = fileURLToPath(new URL('.', import.meta.url));
 const PORT = process.env.PORT || 9920;
-const TYPES = { '.html': 'text/html', '.js': 'text/javascript', '.css': 'text/css', '.json': 'application/json', '.svg': 'image/svg+xml' };
+const TYPES = {
+  '.html': 'text/html', '.js': 'text/javascript', '.css': 'text/css',
+  '.json': 'application/json', '.svg': 'image/svg+xml',
+  '.png': 'image/png', '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg',
+  '.webp': 'image/webp', '.gif': 'image/gif', '.ico': 'image/x-icon',
+};
 
 createServer(async (req, res) => {
   try {
     let path = decodeURIComponent(req.url.split('?')[0]);
     if (path === '/') path = '/public/index.html';
     if (path === '/api/signatures') path = '/data/celebrity_signatures.json';
+    // Short QR target: /k/<cat> -> the named "key" mural. A short encoded URL keeps
+    // the signature-sized QR low-density so it scans cleanly off a printed wall.
+    const k = path.match(/^\/k\/([a-z0-9-]+)$/);
+    if (k) path = `/output/collage-${k[1]}-named.png`;
     const file = join(ROOT, path);
     if (!file.startsWith(ROOT)) { res.writeHead(403).end('forbidden'); return; }
     const body = await readFile(file);

← a8e8de1 Murals: QR is now a signature-sized centre cell (drop panel/  ·  back to CelebritySignatures  ·  Mural QR: B+C — functional-size centre QR + short /k/<code> 84da440 →