search for standard sites pub-search.waow.tech
search zig blog atproto
0

Configure Feed

Select the types of activity you want to include in your feed.

site: add web app manifest + PWA icons (installable metadata)

Adds the manifest, icon set (192/512 + maskable, magnifier glyph on a dark
tile, generated by icons/render.py), and the <head> tags — manifest link,
theme-color, apple-touch-icon — across all seven pages. _headers serves the
manifest as application/manifest+json.

This is the installable-metadata half of PWA support. Offline/caching still
needs a service worker (deliberately not hand-rolled yet — researching the
right generated-SW approach for this no-build static site).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

+95
+3
site/_headers
··· 1 1 /llms.txt 2 2 Content-Type: text/plain; charset=utf-8 3 + 4 + /manifest.webmanifest 5 + Content-Type: application/manifest+json; charset=utf-8
+3
site/atlas.html
··· 20 20 <meta name="twitter:description" content="2d semantic map of atproto publishing platforms"> 21 21 <meta name="twitter:image" content="https://pub-search.waow.tech/og-image?page=atlas"> 22 22 <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><circle cx='16' cy='16' r='2' fill='%231B7340'/><circle cx='8' cy='10' r='1.5' fill='%231B7340' opacity='.6'/><circle cx='24' cy='8' r='1' fill='%231B7340' opacity='.4'/><circle cx='22' cy='22' r='1.5' fill='%231B7340' opacity='.5'/><circle cx='6' cy='24' r='1' fill='%231B7340' opacity='.3'/></svg>"> 23 + <link rel="manifest" href="/manifest.webmanifest"> 24 + <meta name="theme-color" content="#0d0d0d"> 25 + <link rel="apple-touch-icon" href="/icons/icon-192.png"> 23 26 <script> 24 27 (function() { 25 28 var t = localStorage.getItem('theme') || 'dark';
site/icons/icon-192.png

This is a binary file and will not be displayed.

site/icons/icon-512.png

This is a binary file and will not be displayed.

site/icons/icon-maskable.png

This is a binary file and will not be displayed.

+55
site/icons/render.py
··· 1 + """Render pub-search PWA icons (magnifier glyph on a dark tile). 4x supersample.""" 2 + 3 + from PIL import Image, ImageDraw 4 + 5 + BG = (13, 13, 13, 255) 6 + FG = (53, 181, 103, 255) # #35b567 7 + 8 + 9 + def render(size, cx, cy, r, ring_w, hx1, hy1, hx2, hy2, handle_w): 10 + s = 4 # supersample 11 + im = Image.new("RGBA", (size * s, size * s), BG) 12 + d = ImageDraw.Draw(im) 13 + 14 + def sc(v): 15 + return v * s 16 + 17 + # ring 18 + d.ellipse( 19 + [sc(cx - r), sc(cy - r), sc(cx + r), sc(cy + r)], 20 + outline=FG, 21 + width=int(ring_w * s), 22 + ) 23 + # handle with round caps 24 + d.line([sc(hx1), sc(hy1), sc(hx2), sc(hy2)], fill=FG, width=int(handle_w * s)) 25 + cap = handle_w / 2 26 + for (x, y) in ((hx1, hy1), (hx2, hy2)): 27 + d.ellipse([sc(x - cap), sc(y - cap), sc(x + cap), sc(y + cap)], fill=FG) 28 + 29 + return im.resize((size, size), Image.LANCZOS) 30 + 31 + 32 + # "any" geometry (512 reference), scaled per output size 33 + def any_icon(size): 34 + k = size / 512 35 + return render( 36 + size, 37 + 216 * k, 216 * k, 128 * k, 34 * k, 38 + 308 * k, 308 * k, 404 * k, 404 * k, 34 * k, 39 + ) 40 + 41 + 42 + # maskable: glyph pulled into the safe zone 43 + def maskable_icon(size): 44 + k = size / 512 45 + return render( 46 + size, 47 + 228 * k, 228 * k, 96 * k, 26 * k, 48 + 296 * k, 296 * k, 364 * k, 364 * k, 26 * k, 49 + ) 50 + 51 + 52 + any_icon(192).save("icon-192.png") 53 + any_icon(512).save("icon-512.png") 54 + maskable_icon(512).save("icon-maskable.png") 55 + print("wrote icon-192.png icon-512.png icon-maskable.png")
+3
site/index.html
··· 4 4 <meta charset="UTF-8" /> 5 5 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 6 <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> 7 + <link rel="manifest" href="/manifest.webmanifest" /> 8 + <meta name="theme-color" content="#0d0d0d" /> 9 + <link rel="apple-touch-icon" href="/icons/icon-192.png" /> 7 10 <title>pub search</title> 8 11 <meta 9 12 name="description"
+3
site/labels.html
··· 6 6 <title>pub search / labels</title> 7 7 <meta name="description" content="bulk-generated labels — automated accounts pub-search won't index, with the reason for each"> 8 8 <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect x='4' y='18' width='6' height='10' fill='%231B7340'/><rect x='13' y='12' width='6' height='16' fill='%231B7340'/><rect x='22' y='6' width='6' height='22' fill='%231B7340'/></svg>"> 9 + <link rel="manifest" href="/manifest.webmanifest"> 10 + <meta name="theme-color" content="#0d0d0d"> 11 + <link rel="apple-touch-icon" href="/icons/icon-192.png"> 9 12 <script> 10 13 (function() { 11 14 var t = localStorage.getItem('theme') || 'dark';
+16
site/manifest.webmanifest
··· 1 + { 2 + "name": "pub search", 3 + "short_name": "pub search", 4 + "id": "/", 5 + "start_url": "/", 6 + "scope": "/", 7 + "display": "standalone", 8 + "background_color": "#0d0d0d", 9 + "theme_color": "#0d0d0d", 10 + "description": "search standard.site publishing platforms", 11 + "icons": [ 12 + { "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" }, 13 + { "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" }, 14 + { "src": "/icons/icon-maskable.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" } 15 + ] 16 + }
+3
site/recommended.html
··· 16 16 <meta name="twitter:description" content="most-recommended posts across atproto publishing platforms"> 17 17 <meta name="twitter:image" content="https://pub-search.waow.tech/og-image?page=recommended"> 18 18 <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><circle cx='16' cy='16' r='2' fill='%231B7340'/><circle cx='8' cy='10' r='1.5' fill='%231B7340' opacity='.6'/><circle cx='24' cy='8' r='1' fill='%231B7340' opacity='.4'/><circle cx='22' cy='22' r='1.5' fill='%231B7340' opacity='.5'/><circle cx='6' cy='24' r='1' fill='%231B7340' opacity='.3'/></svg>"> 19 + <link rel="manifest" href="/manifest.webmanifest"> 20 + <meta name="theme-color" content="#0d0d0d"> 21 + <link rel="apple-touch-icon" href="/icons/icon-192.png"> 19 22 <script> 20 23 (function() { 21 24 var t = localStorage.getItem('theme') || 'dark';
+3
site/stats.html
··· 5 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 6 <title>pub search / stats</title> 7 7 <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect x='4' y='18' width='6' height='10' fill='%231B7340'/><rect x='13' y='12' width='6' height='16' fill='%231B7340'/><rect x='22' y='6' width='6' height='22' fill='%231B7340'/></svg>"> 8 + <link rel="manifest" href="/manifest.webmanifest"> 9 + <meta name="theme-color" content="#0d0d0d"> 10 + <link rel="apple-touch-icon" href="/icons/icon-192.png"> 8 11 <script> 9 12 (function() { 10 13 var t = localStorage.getItem('theme') || 'dark';
+3
site/subscribed.html
··· 16 16 <meta name="twitter:description" content="most-subscribed publications across atproto publishing platforms"> 17 17 <meta name="twitter:image" content="https://pub-search.waow.tech/og-image?page=subscribed"> 18 18 <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><circle cx='16' cy='16' r='2' fill='%231B7340'/><circle cx='8' cy='10' r='1.5' fill='%231B7340' opacity='.6'/><circle cx='24' cy='8' r='1' fill='%231B7340' opacity='.4'/><circle cx='22' cy='22' r='1.5' fill='%231B7340' opacity='.5'/><circle cx='6' cy='24' r='1' fill='%231B7340' opacity='.3'/></svg>"> 19 + <link rel="manifest" href="/manifest.webmanifest"> 20 + <meta name="theme-color" content="#0d0d0d"> 21 + <link rel="apple-touch-icon" href="/icons/icon-192.png"> 19 22 <script> 20 23 (function() { 21 24 var t = localStorage.getItem('theme') || 'dark';
+3
site/wrapped.html
··· 17 17 <meta name="twitter:description" content="what you publish, who reads it, your semantic neighborhoods, and what you recommend"> 18 18 <meta name="twitter:image" content="https://pub-search.waow.tech/og-image?page=wrapped"> 19 19 <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><circle cx='16' cy='16' r='2' fill='%231B7340'/><circle cx='8' cy='10' r='1.5' fill='%231B7340' opacity='.6'/><circle cx='24' cy='8' r='1' fill='%231B7340' opacity='.4'/><circle cx='22' cy='22' r='1.5' fill='%231B7340' opacity='.5'/><circle cx='6' cy='24' r='1' fill='%231B7340' opacity='.3'/></svg>"> 20 + <link rel="manifest" href="/manifest.webmanifest"> 21 + <meta name="theme-color" content="#0d0d0d"> 22 + <link rel="apple-touch-icon" href="/icons/icon-192.png"> 20 23 <script> 21 24 (function() { 22 25 var t = localStorage.getItem('theme') || 'dark';