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
53 lines
2.7 KiB
TypeScript
53 lines
2.7 KiB
TypeScript
/** 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;
|
|
}
|