- /account/add-funds: full rebuild as Deposit Desk
- 3-step how-it-works explainer: you send crypto → we hold it →
you shop with USD credit → we pay vendors with your crypto
- Coin selector: BTC (auto-verify), ETH (manual review), XMR (manual review)
- Each coin shows deposit address from env var with copy button
- BTC: immediate on-chain verify via /api/btc/verify (mempool.space)
- ETH/XMR: submit txhash to /api/pending-deposit for manual review
- Pending deposit history stored in localStorage with status
- Important notes block explaining custody, no-withdrawal, confirmations
- Back-links to checkout, wallets, dashboard
- /api/pending-deposit: new route to log ETH/XMR manual review requests
(logs to console, ready to wire to DB/webhook)
- DepositWidget component: reusable compact + full variants
- compact: balance + "Deposit crypto →" CTA (used in checkout)
- full: balance + how-it-works summary (used in dashboard)
- Dashboard: replace balance section with DepositWidget + stats
- Checkout: add compact DepositWidget above CheckoutFlow, fix back link
from "Sanctuary" → "Market", update feature cards to be accurate
- .env.example: document all three coin address env vars + optional
payment processor URL
- .env.example: add NEXT_PUBLIC_ETH_ADDRESS, NEXT_PUBLIC_XMR_ADDRESS
Made-with: Cursor
CYBERLUX
The clearnet is a showroom. The onion is the door. One engine behind every door.
We did not build forty-three repos. We built one Next.js stack and refused to fracture it—then we projected it through Tor until every vertical had its own v3 address, its own myth, its own entry point. Nginx sits in the middle like a bouncer; Tor does the rest. Same codebase. Same deploy. Different .onion front doors with host-aware rewrites (proxy.ts + X-Cyberlux-Node).
This is not a route demo. It is infrastructure with intent: stable HiddenServiceDir names, backup and restore for onion keys, Tor + nginx generated from one JSON source of truth. It is built to boot, survive operator mistakes, and stay legible when everything else is on fire.
The thesis
- One truth, many masks — one build, dozens of onions; no fork army.
- Identity persists — keys and dirs are first-class; restarts don’t erase your address book.
- Loopback only — Next and nginx don’t audition on the public internet; Tor publishes what you mean to publish.
- Verify or rot —
npm run verifyis the line between shipping and LARP.
Operator controls
| Command | What |
|---|---|
./start.sh |
Full pipeline: generate → build → Tor/nginx → print every .onion URL → next start on 127.0.0.1:3000 |
npm run onions:list |
Print all http://….onion URLs from /var/lib/tor/*/hostname (use sudo if needed) |
npm run health:stack |
Terminal A: keep npm run start:onion running · Terminal B: curl Tor/nginx/Next loopbacks |
npm run onions:status |
URLs + HTTP probe each nginx vhost |
sudo bash scripts/install-systemd.sh |
Install cyberlux.service for boot-time Next |
DEPLOY.md |
Firewall posture, compliance reminder, full systemd notes |
Tor on a phone: Onion Browser (iOS) or Tor Browser for Android — Safari and Chrome will never resolve .onion. Paste the full http:// + 56-char host + .onion. Some carriers fight Tor; Wi‑Fi often wins.
What ships in the box
43Tor v3 services- stable loopback range
127.0.0.1:8080–8122 - Next bound only to
127.0.0.1:3000 - one
.onionper major surface - persistent hidden-service identity keyed by
HiddenServiceDir - self-healing backup / restore of onion key directories
What it does (the map)
CyberLux boots one Next.js app and projects it through multiple onion entry points.
hub— main storefrontforum— Void Aggregateexchange— classifieds stackmarket— full catalog verticalsearch— Void Crawlerwiki— hidden-wiki layerw— syndicate shell network- dozens more dedicated onions map to top-level app routes
The routing layer uses host-aware rewrites so a dedicated onion feels like its own property without splitting the app into forty-three deployments.
One-command launch
Install system deps on Debian/Ubuntu:
sudo apt install tor nginx
Then:
chmod +x start.sh
./start.sh
What ./start.sh does:
- regenerates Tor / nginx / app route maps from
scripts/onion-nodes.json - runs
git pull --ff-onlyif the repo has.git(failure is non-fatal) - runs
npm install - repairs
.nextownership if a root-owned build left it unwritable - runs a production build
- restores backed-up onion keys if any hidden-service directories are missing
- installs Tor + nginx config only when it actually changed
- waits for all onion hostname files, not just the hub
- refreshes the onion key backup set
- prints every live
.onionURL - starts Next on
127.0.0.1:3000
Open in Tor Browser:
http://<56-char-v3-address>.onion
Persistent onion addresses
Yes — the onion addresses are meant to persist.
Each service uses a fixed Tor directory:
HiddenServiceDir /var/lib/tor/<service-dir>
HiddenServicePort 80 127.0.0.1:<loopback-port>
The .onion stays stable as long as:
torDirnames inscripts/onion-nodes.jsondo not change/var/lib/tor/<service-dir>is preserved- or the backup set can restore those directories
Normal app restarts, rebuilds, and standard Tor restarts do not rotate addresses by design.
Self-healing onion identity
scripts/backup-onion-keys.shscripts/restore-onion-keys.sh
Backup location:
/var/backups/cyberlux-onion-keys/current
After boot, ready onion service directories are backed up. If a service dir is missing from /var/lib/tor next boot, it is restored from backup. That is the gap between screenshotware and survives a tired operator.
Tor / nginx topology
Source of truth: scripts/onion-nodes.json
Generated artifacts:
tor/cyberlux-nodes.confnginx/cyberlux-onion-servers.inclib/onionRoutes.generated.tsscripts/generated/tor-dirs.txtscripts/generated/onion-labels.tsvscripts/generated/onion-port-range.txt
Install path:
/etc/tor/cyberlux-nodes.conf/etc/nginx/cyberlux-server-common.inc/etc/nginx/cyberlux-onion-servers.inc/etc/nginx/sites-available/cyberlux-onion
Runtime:
- Next.js:
127.0.0.1:3000 - nginx onion vhosts:
127.0.0.1:8080–8122 - Tor exposes the public
.onionendpoints
Manual ops
Install or refresh Tor/nginx config:
sudo bash scripts/install-tor-onion.sh
Back up onion keys:
sudo bash scripts/backup-onion-keys.sh
Restore missing onion keys:
sudo bash scripts/restore-onion-keys.sh
Local-only, skip Tor/nginx:
CYBERLUX_SKIP_TOR=1 ./start.sh
Start app without the helper:
npm run build
npm run start:onion
Boot at startup (systemd)
Generate the unit with your Unix user and repo path:
sudo CYBERLUX_USER=$USER bash scripts/install-systemd.sh
sudo systemctl enable --now tor.service nginx.service cyberlux.service
# use `tor@default.service` instead of `tor.service` if your distro names it that way
The installer writes /etc/systemd/system/cyberlux.service and /etc/default/cyberlux. Legacy template notes live in scripts/cyberlux.service (prefer the generator).
Tor + nginx must already be configured (./start.sh or sudo bash scripts/install-tor-onion.sh at least once).
Verification
npm run verify
Checks: onion config generation, TypeScript, shell syntax for boot/install/backup/restore scripts, full Next production build.
Common failure: .next permission hell
If you built with sudo, .next may be root-owned and Next fails with EACCES.
sudo bash scripts/fix-next-perms.sh
./start.sh
Security (read twice)
CyberLux is hardened for a demo stack, not sold as magic invisibility.
- Next and nginx bind to loopback only
- Tor exposes the onion endpoints
- do not publish
3000or8080–8122to the public internet - optional host firewall:
sudo bash scripts/classroom-ufw.sh - bad application logic stays bad behind Tor
- operational mistakes beat branding every time
Tor obscures reachability better than raw-IP hosting. It does not forgive bad code, bad habits, or bad judgment.
Site map
Core verticals:
/hub storefront/marketfull catalog/forumVoid Aggregate/exchangeclassifieds/barterAsh Pit/searchVoid Crawler/hidden-wikiwiki layer/darknet-atlastaxonomy / atlas/syndicateshell network/dashboardpersonal relay/account/hidden-servicesmirror map
Additional dedicated onions exist for many top-level routes beyond these.
Stack
- Next.js
16 - React
19 - Tailwind CSS
4 - nginx
- Tor hidden services
- generated route / host mapping
Final word
If you are running this, you are past cosplay. The stack exists to:
- keep onion identities across rebuilds when you respect
torDirnames and backups - expose only what Tor publishes — not your loopback to the raw internet
- fail loud in verification instead of silently rotting
Read DEPLOY.md before you point real people at it. You own jurisdiction, opsec, and what you ship. The network does not owe you anonymity; you owe the network discipline.
This README is the product’s declaration of intent. The code is the rest.