"use client"; import Link from "next/link"; import { useMemo, useState } from "react"; import { DARKNET_ATLAS, atlasCategoryMatchesQuery, type AtlasCategory, } from "@/lib/darknetAtlas"; function isClearnet(href: string): boolean { if (href.toLowerCase().includes(".onion")) return false; return href.startsWith("https://") || href.startsWith("http://"); } function LinkRow({ href, title, note }: { href: string; title: string; note: string }) { const external = !href.startsWith("/"); const clearnet = isClearnet(href); const body = ( <> {title}

{note}

{clearnet ? clearnet · : null} {href}

); if (external) { return ( {body} ); } return ( {body} ); } export default function DarknetAtlasPage() { const [q, setQ] = useState(""); const visible = useMemo( () => DARKNET_ATLAS.filter((c) => atlasCategoryMatchesQuery(c, q)), [q], ); return (

reference · taxonomy

Darknet Atlas

Analyst-facing taxonomy for how underground ecosystems get clustered in threat intel — markets, access brokers, leak blogs, whistleblowing rails, opsec boutiques, and rumor boards. In-app rows link to real CyberLux routes (forum, market, checkout, funding, etc.); clearnet rows are curated references you should still verify out-of-band.

← Scrapbook wiki Hub Forums Link garden Dashboard Sign in Void crawler
setQ(e.target.value)} placeholder="Filter categories, subsections, or link titles…" className="w-full max-w-xl rounded border border-[#334155] bg-[#0f172a] px-4 py-3 font-mono text-sm text-[#e2e8f0] placeholder:text-[#475569] focus:border-[#38bdf8]/50 focus:outline-none" />

{visible.length} / {DARKNET_ATLAS.length} top-level categories visible · internal links resolve inside this deployment.

{visible.length === 0 ? (

No sections match that filter.

) : ( visible.map((cat) => ) )}
); } function AtlasCategorySection({ cat, query }: { cat: AtlasCategory; query: string }) { const subs = useMemo(() => { if (!query.trim()) return cat.subsections; const s = query.toLowerCase(); return cat.subsections.filter( (sub) => sub.name.toLowerCase().includes(s) || sub.blurb.toLowerCase().includes(s) || sub.links.some((L) => L.title.toLowerCase().includes(s) || L.note.toLowerCase().includes(s)), ); }, [cat.subsections, query]); if (subs.length === 0) return null; return (
{cat.icon}

{cat.title}

{cat.overview}

{cat.literacy}

{subs.map((sub) => (

{sub.name}

{sub.blurb}

    {sub.links.map((link) => (
  • ))}
))}
); }