Harden onion boot flow and deepen site surfaces

Add persistent onion key backup and restore, improve startup resilience, and flesh out the major site verticals with richer navigation, search coverage, and operator documentation.

Made-with: Cursor
This commit is contained in:
drjones
2026-04-07 21:35:52 -07:00
parent 52432dccfa
commit 78a071ba02
162 changed files with 21692 additions and 39 deletions

52
lib/syndicateNetwork.ts Normal file
View File

@@ -0,0 +1,52 @@
/** Themed relay slugs — each `/w/[slug]` applies a different chrome; routing stays in-app. */
export type SyndicateEntry = {
slug: string;
tagline: string;
/** Visual bucket for /w/[slug] chrome */
skin: number;
};
/** Relay catalogue — each `/w/[slug]` maps to a layout skin bucket. */
export const SYNDICATE_NODES: SyndicateEntry[] = [
{ slug: "voidmail", tagline: "Dead-letter drop UI prototype", skin: 0 },
{ slug: "glasshouse", tagline: "Mirror node (empty room)", skin: 1 },
{ slug: "rustbucket", tagline: "FTP cosplay terminal", skin: 2 },
{ slug: "neonvault", tagline: "Savings vaporware vault", skin: 3 },
{ slug: "papertrail", tagline: "Audit log aesthetic", skin: 4 },
{ slug: "ghostcart", tagline: "Abandoned cart shrine", skin: 5 },
{ slug: "cipherkids", tagline: "PGP meme archive", skin: 6 },
{ slug: "midnightbazaar", tagline: "Tile mosaic lobby", skin: 7 },
{ slug: "nullsector", tagline: "404 ritual chamber", skin: 0 },
{ slug: "echochamber", tagline: "Forum screenshot museum", skin: 1 },
{ slug: "tarpit", tagline: "Honeypot styleguide", skin: 2 },
{ slug: "liquidsky", tagline: "Gradient overdose", skin: 3 },
{ slug: "hardcopy", tagline: "Xerox noir", skin: 4 },
{ slug: "softlaunch", tagline: "Beta forever landing", skin: 5 },
{ slug: "wiremesh", tagline: "Brutalist wireframe", skin: 6 },
{ slug: "dustcover", tagline: "Old hardcover intro", skin: 7 },
{ slug: "parallelcart", tagline: "Alternate checkout skin", skin: 0 },
{ slug: "sidechannel", tagline: "Noise generator page", skin: 1 },
{ slug: "loworbit", tagline: "Satellite status board", skin: 2 },
{ slug: "deepfreeze", tagline: "Cold storage copy", skin: 3 },
{ slug: "burnerline", tagline: "Disposable number UI", skin: 4 },
{ slug: "opalgrid", tagline: "Art deco grids", skin: 5 },
{ slug: "inkwell", tagline: "Fountain pen terminal", skin: 6 },
{ slug: "cobaltroom", tagline: "Blue chamber index", skin: 7 },
{ slug: "sleeveNotes", tagline: "Album liner notes as site", skin: 0 },
{ slug: "rollCredits", tagline: "End-credits scroll", skin: 1 },
{ slug: "junkdrawer", tagline: "Misc links bucket", skin: 2 },
{ slug: "hourglass", tagline: "Timer demo", skin: 3 },
{ slug: "patchbay", tagline: "Audio patch console", skin: 4 },
{ slug: "snowfield", tagline: "Whitespace maximalism", skin: 5 },
{ slug: "redindex", tagline: "Red-string board", skin: 6 },
{ slug: "greenroom", tagline: "Backstage pass pasteboard", skin: 7 },
];
export function syndicateSkinForSlug(slug: string): number {
const hit = SYNDICATE_NODES.find((n) => n.slug === slug);
if (hit) return hit.skin;
let h = 0;
for (let i = 0; i < slug.length; i++) h = (h + slug.charCodeAt(i) * (i + 1)) % 8;
return h;
}