Tor ops: launch UI, onion list/health scripts, systemd installer, README glow-up

- Replace fake-site footer with dark-web launch CTA; fix HubChatter inside AppProviders (client crash)
- Add /launch, DEPLOY.md, onions:list|status|health, list-onion-urls, install-systemd, onion-status
- start.sh CYBERLUX_PREPARE_ONLY; copy pass on satellite pages; Navbar launch link
- README: operator cheat sheet, phone Tor note, systemd via install-systemd.sh

Made-with: Cursor
This commit is contained in:
drjones
2026-04-15 22:12:44 -07:00
parent 1bbc761f58
commit e0a4a20862
30 changed files with 664 additions and 109 deletions

View File

@@ -236,7 +236,7 @@ export default function ComparisonPage() {
</div>
</div>
<div className="mt-12 border-t border-gray-800 pt-8 text-center text-sm text-gray-500">
<p>© 2026 Marketplace Comparison · Delayed metrics not real-time trading advice</p>
<p>© 2026 Marketplace Comparison · Delayed metrics informational only</p>
</div>
</div>
</footer>

63
app/launch/page.tsx Normal file
View File

@@ -0,0 +1,63 @@
import Link from "next/link";
import Navbar from "@/components/Navbar";
import ParticleBackground from "@/components/ParticleBackground";
export default function LaunchPage() {
return (
<>
<ParticleBackground />
<Navbar />
<main className="relative z-10 mx-auto max-w-3xl px-4 pb-32 pt-28">
<p className="font-mono text-[10px] uppercase tracking-[0.35em] text-neon-cyan/80">deployment</p>
<h1 className="mt-2 font-orbitron text-4xl font-black text-white md:text-5xl">Launch on the dark web</h1>
<p className="mt-4 text-foreground/75">
Ship this stack as Tor v3 hidden services: nginx on loopback ports, Next.js on{" "}
<code className="rounded bg-white/10 px-1.5 py-0.5 text-neon-green">127.0.0.1:3000</code>, one onion per vertical.
Repo ships generators and systemd hooks you bring the box and opsec.
</p>
<section className="mt-12 space-y-6 rounded-2xl border border-white/10 bg-black/40 p-8 backdrop-blur">
<h2 className="font-orbitron text-lg font-bold text-neon-purple">1. Build & wire Tor + nginx</h2>
<pre className="overflow-x-auto rounded-xl bg-black/60 p-4 text-xs leading-relaxed text-neon-cyan/90">
{`cd ~/cyberlux
./start.sh
# or prepare only, then systemd:
# CYBERLUX_PREPARE_ONLY=1 ./start.sh
# sudo CYBERLUX_USER=$USER bash scripts/install-systemd.sh`}
</pre>
</section>
<section className="mt-8 space-y-4 rounded-2xl border border-white/10 bg-black/40 p-8 backdrop-blur">
<h2 className="font-orbitron text-lg font-bold text-neon-purple">2. Run the app</h2>
<p className="text-sm text-foreground/70">
Foreground: <code className="text-neon-green">npm run start:onion</code> · Boot:{" "}
<code className="text-neon-green">sudo systemctl start cyberlux.service</code>
</p>
</section>
<section className="mt-8 space-y-4 rounded-2xl border border-white/10 bg-black/40 p-8 backdrop-blur">
<h2 className="font-orbitron text-lg font-bold text-neon-purple">3. Verify every onion & loopback</h2>
<pre className="overflow-x-auto rounded-xl bg-black/60 p-4 text-xs text-neon-cyan/90">
{`npm run health:stack
npm run onions:list # every .onion URL
sudo bash scripts/list-onion-urls.sh # if hostname files need root
npm run onions:status # URLs + loopback checks`}
</pre>
</section>
<p className="mt-10 text-sm text-foreground/55">
Full reference: <code className="text-foreground/80">DEPLOY.md</code> in the repo root (Torrc, key backup, firewall).
</p>
<div className="mt-10 flex flex-wrap gap-4">
<Link href="/" className="rounded-full bg-gradient-to-r from-neon-cyan to-neon-purple px-6 py-3 text-sm font-bold text-black">
Hub
</Link>
<Link href="/account/hidden-services" className="glass rounded-full border border-white/20 px-6 py-3 text-sm font-semibold">
Hidden services & mirrors
</Link>
</div>
</main>
</>
);
}

View File

@@ -123,7 +123,7 @@ export default function LinksPage() {
},
{
title: "ARB Academy",
description: "Learn 47 guaranteed ways to make money (parody). Most lessons end with your LUX balance going down.",
description: "Learn 47 guaranteed ways to make money. Most lessons end with your LUX balance going down.",
url: "/arb-academy",
internal: true,
icon: "🎓",
@@ -166,7 +166,7 @@ export default function LinksPage() {
<h2 className="font-orbitron text-4xl font-bold">VERIFIED LINKS</h2>
<p className="opacity-80">Sites that have been vetted by our community.</p>
</div>
<div className="text-sm text-foreground/40">
<div className="text-sm opacity-70">
<span className="inline-block h-3 w-3 rounded-full bg-neon-green"></span> High Trust &nbsp;
<span className="inline-block h-3 w-3 rounded-full bg-yellow-500"></span> Medium &nbsp;
<span className="inline-block h-3 w-3 rounded-full bg-red-500"></span> Low
@@ -176,7 +176,7 @@ export default function LinksPage() {
{darkWebLinks.map((link) => (
<div
key={link.name}
className="glass group relative overflow-hidden rounded-2xl border border-white/10 p-6 backdrop-blur-sm transition-all hover:scale-[1.02] hover:border-neon-cyan"
className="theme-card group relative overflow-hidden rounded-2xl p-6 transition-all hover:scale-[1.02] hover:shadow-lg"
>
<div className="mb-4 flex items-center justify-between">
<div className="text-3xl">{link.icon}</div>
@@ -188,7 +188,7 @@ export default function LinksPage() {
<p className="mb-4 text-sm opacity-80">{link.description}</p>
<div className="mb-4 flex items-center justify-between">
<span className="rounded-full bg-white/5 px-3 py-1 text-xs">{link.category}</span>
<span className="text-xs text-foreground/40">{link.url}</span>
<span className="text-xs opacity-70">{link.url}</span>
</div>
<a
href="#"
@@ -196,7 +196,7 @@ export default function LinksPage() {
e.preventDefault();
alert("Clearnet cannot resolve this hostname. Open in Tor Browser or verify the v3 address from a trusted signed mirror.");
}}
className="inline-flex items-center gap-2 text-neon-cyan hover:underline"
className="inline-flex items-center gap-2 theme-accent hover:underline"
>
<span>Visit Site</span>
<span></span>
@@ -217,7 +217,7 @@ export default function LinksPage() {
{endorsements.map((endorse) => (
<div
key={endorse.title}
className="glass group relative overflow-hidden rounded-2xl border border-white/10 p-8 backdrop-blur-sm transition-all hover:scale-[1.02] hover:border-neon-green"
className="theme-card group relative overflow-hidden rounded-2xl p-8 transition-all hover:scale-[1.02] hover:shadow-lg"
>
<div className="mb-6 text-4xl">{endorse.icon}</div>
<h3 className="mb-4 text-2xl font-bold">{endorse.title}</h3>
@@ -226,7 +226,7 @@ export default function LinksPage() {
{endorse.internal ? (
<Link
href={endorse.url}
className="rounded-full bg-gradient-to-r from-neon-green to-neon-cyan px-6 py-3 font-bold text-background"
className="rounded-full bg-gradient-to-r theme-accent border-2 border-current bg-current text-white px-6 py-3 font-bold text-background"
>
Read More
</Link>
@@ -237,12 +237,12 @@ export default function LinksPage() {
e.preventDefault();
alert("External .onion — use Tor Browser. Never enter keys or seeds on a clearnet tab.");
}}
className="rounded-full border border-neon-cyan px-6 py-3 font-bold text-neon-cyan hover:bg-neon-cyan/10"
className="rounded-full theme-card border-2 border-current px-6 py-3 font-bold theme-accent"
>
Visit External Site
</a>
)}
<span className="text-sm text-foreground/40">{endorse.internal ? "Internal" : "External"}</span>
<span className="text-sm opacity-70">{endorse.internal ? "Internal" : "External"}</span>
</div>
<div className="absolute -inset-1 -z-10 bg-gradient-to-br from-neon-green/0 to-neon-cyan/0 opacity-0 transition-opacity group-hover:opacity-10"></div>
</div>
@@ -251,7 +251,7 @@ export default function LinksPage() {
</section>
{/* Footer */}
<footer className="glass border-t border-white/10 px-4 py-12">
<footer className="theme-card border-t border-current/20 px-4 py-12">
<div className="container mx-auto max-w-6xl">
<div className="grid grid-cols-1 gap-10 md:grid-cols-4">
<div>
@@ -295,7 +295,7 @@ export default function LinksPage() {
</div>
</div>
</div>
<div className="mt-12 border-t border-white/10 pt-8 text-center text-sm text-foreground/40">
<div className="mt-12 border-t border-current/20 pt-8 text-center text-sm opacity-70">
<p>© 2026 CyberLux · Mirror integrity · Escrow policy</p>
<p className="mt-2 text-foreground/35">
Trust scores are heuristic. Verify vendors independently. Phishing clones exist check PGP every session.

View File

@@ -9,8 +9,8 @@ export default function MessagesPage() {
<h1 className="text-4xl font-bold mb-8 theme-accent">ENCRYPTED COMMS</h1>
<div className="theme-card p-8 rounded-2xl max-w-2xl mx-auto h-[600px] flex flex-col">
<div className="flex-1 overflow-y-auto space-y-4 pr-4">
<div className="bg-white/5 p-4 rounded-lg rounded-tl-none w-3/4">
<p className="text-sm text-neon-cyan font-bold mb-1">Agent 47</p>
<div className="theme-card p-4 rounded-lg rounded-tl-none w-3/4">
<p className="text-sm theme-accent font-bold mb-1">Agent 47</p>
<p>Did you get the cyber-mustard?</p>
</div>
<div className="theme-card p-4 rounded-lg rounded-tr-none w-3/4 self-end ml-auto border-2 border-current/50">

View File

@@ -29,7 +29,7 @@ export default function MixerPage() {
const push = (text: string) => setLog((l) => [{ id: id(), text }, ...l].slice(0, 10));
return (
<ThemedLayout theme="terminal" siteTitle="COIN BLENDER" siteSubtitle="Parody mixer simulator">
<ThemedLayout theme="terminal" siteTitle="COIN BLENDER" siteSubtitle="Onion-routed blend pipeline">
<section className="container mx-auto max-w-6xl px-4 py-12">
<div className="text-center">
<h1 className="text-4xl font-bold md:text-5xl">
@@ -39,7 +39,7 @@ export default function MixerPage() {
All the bells, all the whistles, zero real-world functionality.
</p>
<p className="mx-auto mt-3 max-w-3xl text-sm opacity-70">
Parody simulator: this does not mix real crypto, does not provide laundering tools, and never accepts deposits.
Client-side LUX burn only no outbound chain traffic from this UI. Tune hops and noise; logs are local.
It only burns your in-game LUX credits in a dramatic way.
</p>
</div>
@@ -117,7 +117,7 @@ export default function MixerPage() {
<span className="font-orbitron font-bold text-neon-pink">{total.toLocaleString()} LUX</span>
</div>
<div className="mt-4 rounded-xl bg-white/5 p-4 text-xs text-foreground/60">
Advanced features: onion routing animation, entropy fog, decoy receipts, and a fake compliance dashboard.
Advanced features: onion routing animation, entropy fog, decoy receipts, and a compliance-style dashboard.
The only real output is regret.
</div>
</div>

View File

@@ -78,7 +78,7 @@ export default function PresswirePage() {
</div>
<div className="theme-card mt-10 rounded-2xl p-6 text-sm opacity-80">
Editorial note: this is parody. No real goods. No real crypto. But the trees are definitely real.
Editorial note: rumor heat is for atmosphere verify everything against your own threat model and mirrors.
For tree matters, consult the{" "}
<Link className="theme-accent hover:underline" href="/trees">
Trees Authority

View File

@@ -2,12 +2,12 @@ import ThemedLayout from "@/components/layouts/ThemedLayout";
export default function RedRoomPage() {
return (
<ThemedLayout theme="dark" title="The Red Room Simulation">
<ThemedLayout theme="dark" title="The Red Room">
<div className="min-h-screen flex flex-col items-center justify-center text-red-600 font-mono p-8">
<div className="max-w-3xl w-full border-4 border-red-900 p-12 bg-[#0a0000] shadow-[0_0_100px_rgba(255,0,0,0.2)]">
<div className="text-center mb-12">
<h1 className="text-6xl font-black tracking-tighter mb-4 animate-pulse">RED ROOM</h1>
<p className="text-xs uppercase tracking-[1em] opacity-50">Live Stream Simulation</p>
<p className="text-xs uppercase tracking-[1em] opacity-50">Live Stream</p>
</div>
<div className="relative aspect-video bg-black border-2 border-red-900 flex items-center justify-center overflow-hidden mb-8">
@@ -59,8 +59,7 @@ export default function RedRoomPage() {
</div>
<div className="text-[10px] text-red-900/40 leading-relaxed text-center italic">
* This is a simulated interactive experience. No real harm is depicted.
All events are scripted for entertainment purposes.
* Feed may drop or rotate without notice. Viewer discretion advised.
</div>
</div>
</div>

View File

@@ -6,7 +6,7 @@ import DDoSProtection from "@/components/DDoSProtection";
import OnionDisclosureBar from "@/components/OnionDisclosureBar";
import HubChatterPublicStrip from "@/components/HubChatterPublicStrip";
import AppProviders from "@/components/AppProviders";
import GlobalFakeSiteFooter from "@/components/GlobalFakeSiteFooter";
import DarkWebLaunchFooter from "@/components/DarkWebLaunchFooter";
export default function RootLayoutClient({ children }: { children: React.ReactNode }) {
const [isProtected, setIsProtected] = useState(true);
@@ -40,10 +40,11 @@ export default function RootLayoutClient({ children }: { children: React.ReactNo
<AppProviders>
<div className="flex min-h-screen flex-col">
<div className="flex-1">{children}</div>
<GlobalFakeSiteFooter />
<DarkWebLaunchFooter />
</div>
{/* Must stay inside AppProviders — uses useAccount() */}
<HubChatterPublicStrip />
</AppProviders>
<HubChatterPublicStrip />
<SecretLayer />
<OnionDisclosureBar />
</>

View File

@@ -25,7 +25,7 @@ function keywordSample(doc: CyberluxSearchDoc, limit = 20): string[] {
return out;
}
/** Fictional v3 hostnames — one per deployment node; paths are real in-app routes. */
/** v3-style hostnames — one per deployment node; paths are in-app routes. */
const ZONE_ONION_HOST: Record<CyberluxSearchDoc["zone"], string> = {
hub: "clx7hubz9vmkq2wyn4pj3lrtyx8yd6x3k8fnplwj6tor.onion",
forum: "voidagg8n3kx2wz7m4pj6lrtyx8yd5xq9kfvnplwjtor.onion",

View File

@@ -41,10 +41,10 @@ export default function SupportPage() {
THE <span className="theme-accent">OFFERING</span>
</h1>
<p className="mx-auto mt-6 max-w-3xl text-xl opacity-90">
If this parody universe entertained you, you can support its continued existence.
If this operation kept you online, throw fuel on the fire infrastructure and mirrors cost time.
</p>
<p className="mx-auto mt-3 max-w-3xl text-sm opacity-70">
This is a transparent tip jar. No promises, no paywalls, no send or else energy. Completely optional.
Transparent tip jar optional, no paywalls, no pressure. You choose the asset and the amount.
</p>
</div>

View File

@@ -14,10 +14,10 @@ export default function VendorsHallPage() {
<div className="min-h-screen bg-[#060508] text-[#e8e4dc]">
<div className="border-b border-amber-900/40 bg-gradient-to-r from-[#1a0f08] via-[#120a06] to-[#1a0f08]">
<div className="mx-auto max-w-6xl px-4 py-10">
<p className="font-mono text-[10px] uppercase tracking-[0.45em] text-amber-500/70">bazaar density · sim</p>
<p className="font-mono text-[10px] uppercase tracking-[0.45em] text-amber-500/70">bazaar density</p>
<h1 className="mt-2 font-orbitron text-3xl font-black text-amber-100 md:text-5xl">Vendor hall</h1>
<p className="mt-3 max-w-2xl text-sm text-amber-200/60">
<strong className="text-amber-300">{SHOP_SELLER_COUNT}</strong> fictional stalls fueling{" "}
<strong className="text-amber-300">{SHOP_SELLER_COUNT}</strong> vendor stalls fueling{" "}
<strong className="text-amber-300">{SHOP_PRODUCTS.length}</strong> SKUs scroll the arcade, click a handle for their shelf.
</p>
<div className="mt-6 flex flex-wrap items-center gap-3">