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
86 lines
12 KiB
TypeScript
86 lines
12 KiB
TypeScript
/**
|
||
* Fictional marketplace vendors — every shop SKU resolves to one via sellerId + hash fallback.
|
||
* Thirty-six+ sellers for a busy vendor hall (synthetic marketplace data).
|
||
*/
|
||
|
||
export type ShopSeller = {
|
||
id: string;
|
||
/** URL segment: /vendor/{slug} */
|
||
slug: string;
|
||
/** Public handle */
|
||
handle: string;
|
||
/** One–two sentence pitch */
|
||
bio: string;
|
||
/** Flair line under the name */
|
||
tagline: string;
|
||
since: number;
|
||
/** Theater stats */
|
||
completedSales: number;
|
||
rating: number;
|
||
/** Busy indicator: “online” lore */
|
||
responseMins: number;
|
||
specialty: string;
|
||
};
|
||
|
||
export const SHOP_SELLERS: ShopSeller[] = [
|
||
{ id: "v1", slug: "sugarrush-vault", handle: "SugarRush_Vault", bio: "Started on bubblegum arbitrage; now runs a neon-lit confection aisle with same-day dead-drop fiction.", tagline: "Sweet logistics, sour opsec jokes", since: 2019, completedSales: 4280, rating: 4.92, responseMins: 14, specialty: "Confections" },
|
||
{ id: "v2", slug: "candyman-99", handle: "CandyMan_99", bio: "Greybeard vendor who still hand-writes batch numbers on Mylar; refuses clearnet DMs.", tagline: "Old school drops, new school memes", since: 2016, completedSales: 8912, rating: 4.78, responseMins: 42, specialty: "Confections" },
|
||
{ id: "v3", slug: "entropy-corp", handle: "EntropyCorp", bio: "Hardware RNG evangelist selling props that teach students what ‘random’ actually costs.", tagline: "Noise you can weigh", since: 2020, completedSales: 2104, rating: 4.85, responseMins: 55, specialty: "Hardware" },
|
||
{ id: "v4", slug: "ghost-layer-trades", handle: "GhostLayerTrades", bio: "Identity-pack cosplayer; every listing reads like a cautionary fable for journalism labs.", tagline: "Proof-of-personhood theater", since: 2018, completedSales: 1567, rating: 4.88, responseMins: 33, specialty: "Identity" },
|
||
{ id: "v5", slug: "neon-apotheke", handle: "NeonApotheke", bio: "Labels everything ‘for rhetoric class only’; partners with instructors for debrief worksheets.", tagline: "Inert props, loud disclaimers", since: 2021, completedSales: 3890, rating: 4.71, responseMins: 22, specialty: "Chemicals" },
|
||
{ id: "v6", slug: "opsec-omakase", handle: "OpsecOmakase", bio: "Bundles tor-themed desk toys with checklist PDFs; spammed mirror links so you learn verification.", tagline: "Compartmentalized clutter", since: 2017, completedSales: 5022, rating: 4.95, responseMins: 19, specialty: "Security" },
|
||
{ id: "v7", slug: "mixer-memory-lane", handle: "MixerMemoryLane", bio: "Sells nostalgia coasters and long threads about tumbler UIs — pedagogy with glitter.", tagline: "Hop jokes, real risk talk", since: 2019, completedSales: 1766, rating: 4.63, responseMins: 67, specialty: "Financial" },
|
||
{ id: "v8", slug: "ledger-moth", handle: "LedgerMoth", bio: "Attracted to cold-storage keychains and warm takes on multisig ceremony.", tagline: "Loves ledgers, hates ledger drama", since: 2015, completedSales: 12033, rating: 4.9, responseMins: 28, specialty: "Financial" },
|
||
{ id: "v9", slug: "cipherkids-collective", handle: "CipherKidsCollective", bio: "Student co-op listing meme PGP accessories; proceeds fund club pizza (fiction).", tagline: "ASCII armor, Unicode heart", since: 2022, completedSales: 942, rating: 4.55, responseMins: 120, specialty: "Digital goods" },
|
||
{ id: "v10", slug: "zero-k-knits", handle: "ZeroKKnits", bio: "Hand-knits ‘proof’ scarves — wearable ZKP jokes for compsci fashion crimes.", tagline: "Stitch, don’t snitch", since: 2020, completedSales: 884, rating: 4.82, responseMins: 48, specialty: "Services" },
|
||
{ id: "v11", slug: "patchbay-seven", handle: "Patchbay7", bio: "Audio engineer turned barter poet; swaps studio time for syllabi about copyright friction.", tagline: "TRS snakes & trust anchors", since: 2016, completedSales: 2633, rating: 4.77, responseMins: 36, specialty: "Hardware" },
|
||
{ id: "v12", slug: "eu-shift-goods", handle: "EU_shiftGoods", bio: "Time-zone hopping vendor shipping ‘sanitized scandal’ props for EU privacy curricula.", tagline: "GDPR-themed desk toys", since: 2018, completedSales: 3311, rating: 4.69, responseMins: 51, specialty: "Data Leaks" },
|
||
{ id: "v13", slug: "void-cartographer", handle: "void_cartographer", bio: "Maps imaginary nodes onto real cork boards; sells pins, string, and paranoia.", tagline: "Latitude: unknown", since: 2014, completedSales: 9011, rating: 4.93, responseMins: 24, specialty: "Identity" },
|
||
{ id: "v14", slug: "saltside-forge", handle: "SaltSideForge", bio: "Printmaker obsessed with microprint pedagogy — everything demilled, everything didactic.", tagline: "Chalcography, not counterfeits", since: 2017, completedSales: 1444, rating: 4.84, responseMins: 73, specialty: "Forgery" },
|
||
{ id: "v15", slug: "quiet-bag-trading", handle: "quietBagTrading", bio: "Minimal listings, maximal packing peanuts; teaches ‘less metadata, more mischief’.", tagline: "Plain boxes, loud lessons", since: 2021, completedSales: 2109, rating: 4.66, responseMins: 91, specialty: "Confections" },
|
||
{ id: "v16", slug: "watchtower-null", handle: "watchtower_09", bio: "Former helpdesk griefer; now sells IR playbooks printed on fireproof-ish paper.", tagline: "Pager-duty poetry", since: 2019, completedSales: 4566, rating: 4.8, responseMins: 31, specialty: "Security" },
|
||
{ id: "v17", slug: "neon-sick-labs", handle: "neon_sick_labs", bio: "Biohacker aesthetic without bio samples — gel pours, chalk presses, ethics handouts.", tagline: "Wetware cosplay, dry enforcement", since: 2020, completedSales: 2988, rating: 4.72, responseMins: 44, specialty: "Bio‑Enhancements" },
|
||
{ id: "v18", slug: "tor-baby-bazaar", handle: "tor_baby", bio: "First-time vendor energy; over-explains PGP in every package insert.", tagline: "Signed with love & line breaks", since: 2023, completedSales: 511, rating: 4.58, responseMins: 15, specialty: "Digital goods" },
|
||
{ id: "v19", slug: "checkout-sigh", handle: "checkout_sigh", bio: "Specializes in cart-abandonment empathy merch — stress balls shaped like loading spinners.", tagline: "One-click zen", since: 2018, completedSales: 6722, rating: 4.74, responseMins: 38, specialty: "Services" },
|
||
{ id: "v20", slug: "grid-griefer-wares", handle: "grid_griefer", bio: "Sells fidget friendly ‘exploit’ desk toys; banned three times, re-listed with better disclaimers.", tagline: "Lag is a lifestyle", since: 2016, completedSales: 8877, rating: 4.61, responseMins: 60, specialty: "Security" },
|
||
{ id: "v21", slug: "vendor-pm-me", handle: "VendorPM_me", bio: "Satire vendor whose entire FAQ is about not sliding into DMs without signed clearsigned intro.", tagline: "Inbox closed, mailbox mythic", since: 2017, completedSales: 1922, rating: 4.87, responseMins: 84, specialty: "Identity" },
|
||
{ id: "v22", slug: "dead-drop-nine", handle: "dead_drop_9", bio: "Geocache enthusiast selling magnetic tins labeled ‘training dead drops only’.", tagline: "Latitude redacted responsibly", since: 2015, completedSales: 5544, rating: 4.9, responseMins: 27, specialty: "Hardware" },
|
||
{ id: "v23", slug: "opsec-dad-outfitters", handle: "OPSEC_dad", bio: "Dad jokes × threat modeling; bumper stickers about passphrase rotation.", tagline: "Because I said verify", since: 2014, completedSales: 14002, rating: 4.96, responseMins: 11, specialty: "Security" },
|
||
{ id: "v24", slug: "liquidity-lurker", handle: "liquidity_lurker", bio: "Market-maker cosplay: sells LED tickers that only scroll educational disclaimers.", tagline: "Spreads tight, stories wider", since: 2019, completedSales: 3777, rating: 4.68, responseMins: 47, specialty: "Financial" },
|
||
{ id: "v25", slug: "v3-only-club", handle: "v3_only_club", bio: "Purist about onion v3 links; mousepads printed with address-length rulers.", tagline: "56 chars or bust", since: 2020, completedSales: 2233, rating: 4.83, responseMins: 29, specialty: "Digital goods" },
|
||
{ id: "v26", slug: "signed-or-bust", handle: "signed_or_bust", bio: "Only ships if your key cross-signs their joke manifesto — instructors get a bypass code.", tagline: ".sig or swim", since: 2018, completedSales: 6110, rating: 4.94, responseMins: 18, specialty: "Forgery" },
|
||
{ id: "v27", slug: "tails-eight-gb", handle: "tails_8gb", bio: "USB cases with tiny ventilation jokes; bundles Tails release posters (fan art).", tagline: "Live OS, die laughing", since: 2016, completedSales: 9881, rating: 4.76, responseMins: 35, specialty: "Hardware" },
|
||
{ id: "v28", slug: "finalize-never-co", handle: "finalize_never_co", bio: "Escrow-education vendor: enamel pins that say ‘multisig first’ in tiny letters.", tagline: "Early is wrong here", since: 2021, completedSales: 1888, rating: 4.7, responseMins: 52, specialty: "Financial" },
|
||
{ id: "v29", slug: "fud-archivist", handle: "FUD_archivist", bio: "Archives sensational headlines as coaster sets — ‘history of panic’ syllabus tie-in.", tagline: "Primary sources of drama", since: 2017, completedSales: 3055, rating: 4.64, responseMins: 63, specialty: "Data Leaks" },
|
||
{ id: "v30", slug: "ui-snob-studio", handle: "UI_snob_studio", bio: "Typography snob selling holographic UI roasts; heatmaps reproduced on mousepads.", tagline: "Pixels with prejudice", since: 2022, completedSales: 1201, rating: 4.59, responseMins: 88, specialty: "Services" },
|
||
{ id: "v31", slug: "wallet-scratch-pad", handle: "wallet_scratch", bio: "Paper notebooks for seed-phrase *practice* with nonsense words only.", tagline: "Writes friction, not seeds", since: 2019, completedSales: 4404, rating: 4.81, responseMins: 26, specialty: "Financial" },
|
||
{ id: "v32", slug: "btc-fee-woe", handle: "btc_fee_woe", bio: "Therapist-chic stickers about mempool grief; bundles feerate graphs as wrapping paper.", tagline: "Sat/vB & sob stories", since: 2020, completedSales: 2677, rating: 4.73, responseMins: 41, specialty: "Financial" },
|
||
{ id: "v33", slug: "monero-monk", handle: "monero_monk", bio: "Ring-sig mystique vendor; every parcel includes a ring-sized diagram coaster.", tagline: "Privacy incense not included", since: 2018, completedSales: 5122, rating: 4.89, responseMins: 30, specialty: "Financial" },
|
||
{ id: "v34", slug: "proof-of-receive", handle: "proof_of_receive", bio: "Packaging fetishist obsessed with signed delivery receipts — sells wax-seal stickers.", tagline: "Chain of custody cosplay", since: 2015, completedSales: 7288, rating: 4.91, responseMins: 23, specialty: "Forgery" },
|
||
{ id: "v35", slug: "browser-leak-boutique", handle: "browser_leak_boutique", bio: "Fingerprint-themed soaps and ‘WebRTC fear’ candles for blue-team spa nights.", tagline: "Scrub headers, not ethics", since: 2021, completedSales: 1644, rating: 4.67, responseMins: 57, specialty: "Security" },
|
||
{ id: "v36", slug: "hub-regular-supply", handle: "hub_regular_supply", bio: "Catch-all reseller mirroring whatever the hub hero section spotlights — chaotic neutral inventory.", tagline: "If it glows, I list it", since: 2013, completedSales: 22410, rating: 4.62, responseMins: 99, specialty: "Bio‑Enhancements" },
|
||
];
|
||
|
||
const BY_SLUG = new Map(SHOP_SELLERS.map((s) => [s.slug, s]));
|
||
const BY_ID = new Map(SHOP_SELLERS.map((s) => [s.id, s]));
|
||
|
||
export const SHOP_SELLER_COUNT = SHOP_SELLERS.length;
|
||
|
||
export function getSellerBySlug(slug: string): ShopSeller | undefined {
|
||
return BY_SLUG.get(slug);
|
||
}
|
||
|
||
export function getSellerById(id: string): ShopSeller | undefined {
|
||
return BY_ID.get(id);
|
||
}
|
||
|
||
/** Deterministic seller per product — spreads listings across the bazaar */
|
||
export function sellerIdForProduct(productId: string): string {
|
||
let h = 0;
|
||
for (let i = 0; i < productId.length; i++) {
|
||
h = (h + productId.charCodeAt(i) * (i + 3)) % 2147483647;
|
||
}
|
||
const idx = Math.abs(h) % SHOP_SELLERS.length;
|
||
return SHOP_SELLERS[idx]!.id;
|
||
}
|