"use client"; import Link from "next/link"; import { useMemo, useState } from "react"; import { PLACEHOLDER_ONION_HOST, PLACEHOLDER_ONION_URL } from "@/lib/placeholderOnion"; 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
Analyst-facing taxonomy for how underground ecosystems get clustered in threat intel — markets, access brokers, leak blogs,
whistleblowing rails, opsec boutiques, and rumor boards. External rows ship with boilerplate{" "}
{PLACEHOLDER_ONION_HOST} hostnames until you paste vetted mirrors; treat
every link as unconfirmed until PGP cross-check.
{visible.length} / {DARKNET_ATLAS.length} top-level categories visible · default template host:{" "} {PLACEHOLDER_ONION_URL}
No sections match that filter.
) : ( visible.map((cat) =>{cat.overview}
{cat.literacy}
{sub.blurb}