commit d392305c0bda987043b6f2f3de9576a5c36f6b52 Author: Local Dev Date: Sat Sep 12 00:07:34 2026 +0200 Initial commit diff --git a/GOTCHAS.md b/GOTCHAS.md new file mode 100644 index 0000000..085a3a7 --- /dev/null +++ b/GOTCHAS.md @@ -0,0 +1,67 @@ +# site/ — gotchas + +Hand-authored static tree for **silentmode.st**. No build step. Served by nginx +from `/opt/silent-mode/site/` on the VPS (ssh alias `silentmode`), and mirrored +to Sia (`s3://bns/silentmode/` → `silentmode.bch`) by the +`silentmode-sia-sync.timer` on the VPS every 5 minutes. Anything that lands in +`/opt/silent-mode/site/` reaches the `.bch` mirror on its own; you do not need to +run `sia-upload.js` for site files any more. + +## Never `rsync --delete` (or blanket-overwrite) `site/` → the VPS + +`/opt/silent-mode/site/` holds far more than this folder: `sirius-x/`, +`deviant/` (the full Deviant site incl. `wallet/`, `artemision/`, `katalogos/`, +`agora/`), `apps/`, `code/`. Those are deployed from **other repos**. In +particular `site/deviant/` here is a **stale Aug-31 copy**; the canonical +source is `D:\Dev\Deviant\site\deviant\` and the VPS already carries the newer +Sep-1 pages. Pushing this folder wholesale would roll them back. + +Ship **individual files**: `scp site/ silentmode:/opt/silent-mode/site/`. + +## The release manifest lives in three places + +- `https://dl.silentmode.st/releases-manifest.json` — canonical + (`/opt/silent-mode/dl/`), what `releases.silentmode.bch` points at. +- `/opt/silent-mode/site/releases-manifest.json` — what `tools/index.html` + links as `../releases-manifest.json`, and what the Sia mirror syncs. +- `site/releases-manifest.json` — the committed source of both. + +The ship checklist (`Ship Theseus …` commits) must scp it to **both** VPS +paths. It was missed for `site/` from 0.3.4 through 0.3.16 (found 2026-09-07): +the HTML pages were current while the JSON next to them still said 0.3.3. + +## Old Theseus builds fill the VPS disk + +`scripts/theseus-vps-archive.sh ` moves everything older than N-1 to +Sia and deletes it from `/opt/silent-mode/dl/`. Run it after every ship; when +it is skipped the 48 GB disk climbs ~245 MB per release. + +## Pages that are not silentmode.st pages + +`hephaestus.x/` is the landing for the `.x` name and is served from Sia via the +gateway (`navigate.st/bns/hephaestus.x/`); the copy under `/opt/silent-mode/site/` +is just parity. `choose/` has no top nav on purpose. + +## CORS on `/js/*.js` — required for BCNR pages + +The shared bundles (`bns-register.js`, `libauth.js`, `wizardconnect.js`) live +under `silentmode.st/js/` and are `import`ed cross-origin by pages served on +their own origin: `sirius.x`, `theseus.x`, any BCNR-served site opened in +Theseus (origin `bns://`). Without CORS the browser refuses to load the +module and every wallet/register/mint flow silently breaks — the launcher +click does nothing. + +The nginx block on VPS (`/etc/nginx/sites-enabled/silentmode-st`) MUST carry: + +``` +location ~ ^/js/.*\.js$ { + add_header Cache-Control "no-cache, must-revalidate" always; + add_header Access-Control-Allow-Origin "*" always; + add_header Access-Control-Allow-Methods "GET, OPTIONS" always; +} +``` + +Added 2026-09-08 after Theseus reported "CORS blocked" from origin +`bns://sirius.x`. If a future nginx-config rebuild drops the `add_header +Access-Control-*` lines, every non-silentmode.st page that imports the bundle +starts failing again with "No 'Access-Control-Allow-Origin' header". diff --git a/apps/index.html b/apps/index.html new file mode 100644 index 0000000..ea9faa0 --- /dev/null +++ b/apps/index.html @@ -0,0 +1,29 @@ + + + + + +Moved — Silent Mode + + + + + + + +
+

Downloads moved.

+

The apps page merged with the tools hub. Everything you were looking for is now at + silentmode.st/tools/. Redirecting you there.

+
+ + diff --git a/brand/avatar.svg b/brand/avatar.svg new file mode 100644 index 0000000..5d8cf53 --- /dev/null +++ b/brand/avatar.svg @@ -0,0 +1,20 @@ + + Silent Mode — avatar (400×400 profile square) + + + + + + + + + + + + + Silent Mode + + diff --git a/brand/banner.svg b/brand/banner.svg new file mode 100644 index 0000000..3f1a52f --- /dev/null +++ b/brand/banner.svg @@ -0,0 +1,28 @@ + + Silent Mode — banner (1500×500 social header) + + + + + + + + + + + + + Silent Mode + + + Decentralized web infrastructure — names, hosting, browsers, search, messaging. + + + silentmode.st · silentmode.bch (on chain) + + diff --git a/brand/index.html b/brand/index.html new file mode 100644 index 0000000..1c58169 --- /dev/null +++ b/brand/index.html @@ -0,0 +1,241 @@ + + + + + +Brand — Silent Mode + + + + + + + + + + + + + + + + + + +
+
+ +
+

Silent Mode — brand

+

Two interlocking chain links, one acid green — the family mark for + every Silent Mode product. Kit below: logo, wordmark, avatar, banner, palette, + usage. Every asset is a scalable SVG; raster it to whatever platform demands + a PNG.

+
+ +
+ + +
+

Assets

+ +
+
Silent Mode logo
+
+

Logo

+

Two interlocking chain links. Use where the mark stands alone — favicons, + app icons, small tile placements. Reads at any size from 16 px up.

+
SVG · viewBox 200×200 · scalable
+
+ SVG + Open +
+
+
+ +
+
Silent Mode wordmark
+
+

Wordmark

+

Mark + "Silent Mode" set at 56 px, letter + spacing 0.4. Use for horizontal placements — page headers, business cards, + email signatures.

+
SVG · viewBox 640×120
+
+ SVG + Open +
+
+
+ +
+
Silent Mode avatar
+
+

Avatar

+

Square 400×400 with radial background, centred mark, wordmark below. + Sized for social profile pictures — X, Mastodon, Nostr, GitHub org avatar. + Rasters cleanly to 200×200 and 100×100.

+
SVG · viewBox 400×400
+
+ SVG + Open +
+
+
+ +
+
Silent Mode banner
+
+

Banner

+

Wide 1500×500 header for X / Mastodon covers, GitHub org banners, OG social + cards. Tagline and second-line URL are text nodes — edit in a vector editor + if you need a different language or campaign.

+
SVG · viewBox 1500×500 · 3:1 aspect
+
+ SVG + Open +
+
+
+ +
+
Silent Mode favicon
+
+

Favicon

+

The same mark, compressed for tab-bar and bookmark rendering. Served from + /favicon.svg. Also works as a 16×16 PNG once + rasterised — the shape holds.

+
SVG · viewBox 32×32
+
+ SVG +
+
+
+
+ + +
+

Palette

+

Small palette on purpose — one accent, one text tone, three greys, + a couple of semantics. Same tokens the whole site's shared.css + exposes as CSS variables.

+ +
+
+
Acid
#d6ff3d
+
The accent — links, marks, active state, one CTA per view.
+
+
Ink (bg)
#0b0e14
+
Page background. Dark by default; a light theme is the exception.
+
+
Panel
#141a24
+
Cards, buttons ghost, elevated surfaces.
+
+
Text
#e7eaf1
+
Body ink.
+
+
Muted
#8b98a9
+
Secondary text, disabled state, muted mark stroke.
+
+
Dim
#5e6678
+
Meta, timestamps, "less important than muted".
+
+
Sia
#b39ddb
+
Storage badge. Only for "content lives on Sia".
+
+
Server
#4fd1a5
+
Server badge. Only for "content lives on an ordinary server".
+
+
+ + +
+

Usage

+
+
+

Where the mark goes

+

Anywhere Silent Mode itself is the subject: project sites, README banners, + social profiles, presentation title slides. If a specific product is the + subject (Theseus, Sirius, Prometheus, Hermes, Helios), prefer that + product's own mark and reserve this one for the umbrella.

+
+
+

Clear space

+

Give the mark clearance equal to one chain-link on every side. On the banner + this is honoured by the left-margin; when placing the logo yourself, respect it.

+
+
+

Colours in prose

+

The word "Mode" is in acid; the rest is body text. Don't reverse — "Silent" + in acid + "Mode" in body doesn't read as this brand.

+
+
+

Rasterising

+

SVG is the canonical format. Any modern image tool can convert it to PNG + at the size you need; Inkscape and rsvg-convert are the free defaults. + Don't distribute a low-fidelity trace as "the logo".

+
+
+ +
+ Don't: +
    +
  • Recolour the mark into the palette of another product or brand.
  • +
  • Distort the chain-link proportions (they read as chain because of the ratio; squished, they don't).
  • +
  • Place the mark on a busy image without a solid backing panel.
  • +
  • Use the mark to endorse a third-party product, service, or claim without written permission.
  • +
+
+
+ +
Related brand kits. Navigate.st has its own mark (a compass + rose in a chain-link ring) at navigate.st/brand/. + Each Silent Mode product (Theseus, Sirius, Prometheus, Hermes, Helios) will + eventually have its own kit; this one is the umbrella.
+ +
+ +
+
Silent Mode — a Deviant project.
+
Brand kit v1 · 2026-08-20. Everything in this kit is licensed for + accurate reference to the Silent Mode project. For commercial use of the mark + outside that scope, ask first.
+
+ + + diff --git a/brand/logo.svg b/brand/logo.svg new file mode 100644 index 0000000..a1ff73e --- /dev/null +++ b/brand/logo.svg @@ -0,0 +1,7 @@ + + Silent Mode — logo + + + diff --git a/brand/og.png b/brand/og.png new file mode 100644 index 0000000..e7dc229 Binary files /dev/null and b/brand/og.png differ diff --git a/brand/wordmark.svg b/brand/wordmark.svg new file mode 100644 index 0000000..853dd91 --- /dev/null +++ b/brand/wordmark.svg @@ -0,0 +1,13 @@ + + Silent Mode — wordmark + + + + + + Silent Mode + + diff --git a/choose/free/index.html b/choose/free/index.html new file mode 100644 index 0000000..50f6318 --- /dev/null +++ b/choose/free/index.html @@ -0,0 +1,148 @@ + + + + + +You took the red one — Silent Mode + + + + + + + + + + + + + + + + +
+ + +

Anonymous by default. Not by exception.

+

Two missing layers, and everything follows from them. The part that + grants permission — and can therefore withdraw it — is absent. So is the part that + could ever be asked who you are, because it never collected the answer. Not held on + your behalf. Not held at all.

+ +
+
A registrar that logs who bought the name→ + A certificate you hold, on a public ledger. Your key, your name — nobody learns you asked for it.
+
A card or bank in the middle of every payment→ + Pay direct in crypto. No processor, no chargeback, and nobody to refuse it on your behalf.
+
An account that can be suspended→ + No account at all. Nothing was granted, so nothing can be revoked.
+
A browser and pages that report home→ + Theseus resolves names straight from the chain — no lookup service in the middle logging what you typed.
+
A host with an acceptable-use policy→ + Your own server, a paid swarm of strangers, or the chain itself.
+
A certificate authority vouching for you→ + A fingerprint you publish on-chain and your browser checks.
+
Reach that belongs to the platform→ + A name that travels with you, because nobody else is holding it.
+
+ +
+ The honest part. Nobody being in charge cuts both ways. There is no support desk, + no password reset and no undo — lose your recovery phrase and the name is gone, with + nobody able to help. Nothing here is moderated, so you will find things you would rather + not. And there is one layer this stack does not remove for you: your IP address. + A server still sees where a request came from, and so does whoever your traffic passes + through. If that matters, add Tor or a paid VPN — the two questions (who you are on the + account, where you are on the network) are independent, and Sirius only answers the + first. This is an alpha on a test network: the coins are free and worth nothing, + which is the honest place to try it before real money is involved. +
+ + + +

+ ← Back to the choice · silentmode.st
+ Second thoughts are allowed. Nothing here has happened yet. +

+ +
+ + + diff --git a/choose/index.html b/choose/index.html new file mode 100644 index 0000000..38124d4 --- /dev/null +++ b/choose/index.html @@ -0,0 +1,258 @@ + + + + + +Choose — Silent Mode + + + + + + + + + + + + + + + + +
+ +

Silent Mode

+

Two internets. Twice over.

+

The web you use every day is owned. Companies decide which names exist, + which pages load, and whose voice carries. Registrars record who bought what. Card + networks and banks sit in the middle of every payment. The browser you are reading this + in reports home, and so does most of what it loads. There are privacy-forward providers + that will hold your identity on your behalf — but they still hold it, and a + court order still reaches them. Sirius removes the surface instead: names you hold by + key, pages nobody can pull, payment with no card and no bank, and a browser with nobody + to report to. Anonymous by default, not by exception. Whether you want to + use it or build on it, it starts the same way: something you install, + and a name that is actually yours.

+ + +
+
+ First choice +

The web you browse

+

Where you read, post, and are read. Pick the one you want to live in.

+
+ + +
+ + +
+
+ Second choice +

The web you build on

+

If you ship things, the question repeats one layer down — and this time the + gatekeepers have invoices, and a record of who paid them.

+
+ +
+ + + +

The blue one

+

Rent it, like everyone.

+
    +
  • Anonymous only by exception. The default path binds the name to your + legal identity — WHOIS/RDAP holds the registrant data, ICANN requires it be + accurate, and the card ties it all together. Privacy providers like Njalla take + Monero and behave well — pair them with Tor or a VPN and the real-world privacy + is genuinely good. Pay with a bank card, and none of it applies. Either way, the + provider still holds what they were told and can be compelled to produce + it.
  • +
  • Renewal is the model, and it is a reasonable one. A yearly fee keeps + the namespace alive — unused names return to the pool instead of being hoarded + forever, and the registrar has a business that survives. That part is fine. + Sirius works the same way for the same reason. What differs is who holds the + record and can be leaned on to change it.
  • +
  • Suspension is a supported feature. Registrars act on court orders, UDRP + rulings and their own policy — by design, not by failure.
  • +
  • Every layer keeps a veto, and a bank sits under all of them. Host, + CDN, certificate authority, payment processor. Any one can decline.
  • +
  • It is genuinely good infrastructure. Fast, cheap, supported, and + someone answers the phone. That is the deal you are making.
  • +
+
+ The conventional stack → +
+ + + +

The red one

+

Own the name outright.

+

Sirius.x — names and hosting, paid in crypto

+
    +
  • Anonymous by default, not by exception. No account, no email, no card, + no bank — because the stack does not support them. Nothing to compel out of a + provider that never held it.
  • +
  • Payment is peer to peer. You pay in crypto, direct to the seller, with + no processor deciding whether you may and no bank keeping a record of the + purchase. Add Tor or a VPN to cover the network layer, which nothing else can + do for you — no stack removes your IP.
  • +
  • The name is a certificate you hold. A CashToken on Bitcoin Cash — your + key controls it, and there is no company in the middle to ask.
  • +
  • Host it however you like. Your own server, the Sia storage network, or + on-chain for something small. Repoint it whenever, for free.
  • +
  • The whole stack is yours to run. Browser, resolver, indexer, registry — + a node plus a small BNS-only indexer fits a one-core VPS. Any TLD works; the + protocol has no allowlist.
  • +
+
+ Find a name on Sirius → +
+ +
+
+ +

+ Running on Bitcoin Cash chipnet — an alpha on a test network, free to try, and + honest about being early.
+ You are reading this on silentmode.st, the + ordinary-web face of the project. The same pages served the other way live at + silentmode.bch. +

+ +
+ + + diff --git a/choose/registrars/index.html b/choose/registrars/index.html new file mode 100644 index 0000000..3d4cac3 --- /dev/null +++ b/choose/registrars/index.html @@ -0,0 +1,157 @@ + + + + + +The conventional stack — Silent Mode + + + + + + + + + + + + + + + + +
+ + +

Rent it, like everyone.

+

This is the stack almost every site on the internet is built on. It is + mature, it is inexpensive, and it is very good at its job. It is also five separate + companies, each of whom can independently decide your project is over — and every one + of them keeps a record that reaches back to you.

+ +
+ The identity bind, and its limits. The default path binds a domain to a verified + legal identity: ICANN's registrar accreditation agreement obliges registrars to hold + accurate registrant data, WHOIS/RDAP publishes some of it, and the card or bank transfer + ties the record together. Privacy-forward registrars like Njalla or MyNymBox exist — + they take Monero, do not require a legal name, and behave well. If you also connect over + Tor or a paid VPN and do not volunteer personal details, the real-world privacy you get + from them is genuinely good.

+ But the mechanism is different. Those providers hold an identity, or a payment, + or a network address on your behalf, and can be compelled to produce what they + have. Anyone who paid with a bank card, or opened an account with an email that reaches + back to them, has not really used the privacy path at all — they have used a privacy + brand attached to the ordinary rails. The conventional stack is + anonymous only by exception, and the exception is compellable. Sirius is + anonymous by default — the identity, the payment record, and the account were + never collected, because the stack cannot collect them. +
+ +

Who holds what

+
+
+
Registrar GoDaddy, Namecheap, Cloudflare
+
Leases you the name, yearly. Can suspend or transfer it on a + court order, a UDRP ruling, or its own policy — and must, by contract with the + registry.
+
+
+
Host AWS, Hetzner, DigitalOcean
+
Runs the machine. Can terminate under acceptable-use terms, + usually with notice, sometimes without.
+
+
+
CDN / proxy Cloudflare, Fastly
+
Sits in front of your traffic. Can stop carrying it — and has, + publicly, for customers who broke no law.
+
+
+
Certificate authority Let's Encrypt, DigiCert
+
Vouches that you are you. Can revoke, at which point browsers + refuse the connection regardless of who is right.
+
+
+
App store / payments Apple, Google, Stripe
+
If money or an app is involved, two more parties with terms and a + right to decline.
+
+
+ +

What it costs

+ + + + + + + +
ItemTypicalNote
.com, first year$1–12usually a promotional rate
.com, renewal$12–20/yrthe real price; wholesale is ~$9.59
Small VPS$4–8/moplus your time
TLS certificate$0Let's Encrypt, genuinely free
Renewalevery yearkeeps the namespace alive; abandon a name and it returns to the pool. Fair enough.
+ +
+ To be fair to it. This stack is fast, well documented, supported at 3am, and + integrates with everything. The vetoes above also remove phishing sites, malware hosts + and worse — they exist for reasons, and most of the time they are used reasonably. If + you are shipping a normal business, this is the sensible default and it is not close. + The alternative gives up the support desk along with the gatekeeper. +
+ +
+

Sirius removes two of these surfaces — the one that decides whether the name + is still yours, and the one that could ever be asked what you paid or who you are. + Not held on your behalf; not held at all. The rest of your choices stay open. Same + day, few cents, no account, no card.

+ See what a name costs there → +
+ +

+ ← Back to the choice · silentmode.st
+ Company names are examples of each layer, not endorsements or accusations. +

+ +
+ + + diff --git a/choose/stay/index.html b/choose/stay/index.html new file mode 100644 index 0000000..d7337a2 --- /dev/null +++ b/choose/stay/index.html @@ -0,0 +1,132 @@ + + + + + +You took the blue one — Silent Mode + + + + + + + + + + + + + + + + +
+ + +

Nothing changes. That is the point.

+

The conventional web is fast, free at the point of use, and mostly + excellent. Billions of people use it every day and are perfectly well served. We are + not going to pretend it is a dystopia — but it is worth being clear about what the + arrangement actually is, because it is easy to forget you made one.

+ +

The bargain, stated plainly

+
+
Your account is a permission, not a possession. + It exists because a company allows it to, under terms they can change. That is + not a conspiracy; it is what a terms-of-service relationship is.
+
Your domain is on the registrar's record. + Registration is yearly — that part is fine, and the same shape as any name + service that needs to recycle unused names. What matters is what a court order or + UDRP ruling can do to it while the registrar holds that record.
+
Attention is the business model. + Services that cost nothing are paid for by measuring what you do and selling + access to your attention. Being observed is not a flaw in that design — it is the + design working.
+
Reach is not portable. + The audience you build lives inside the platform. Leaving does not take it with + you, which is what makes leaving expensive.
+
Every layer keeps a veto. + Registrar, host, CDN, certificate authority, app store, payment processor. Any + one of them can decline, and each of them sometimes does.
+
+ +
+ To be fair to it. Those vetoes also stop fraud, take down malware and remove + genuinely vile material, and the people operating them are mostly trying to get it + right. The support desk is real, the uptime is excellent, and someone answers when it + breaks. A system with nobody in charge gives all of that up too. Anyone selling you the + alternative without mentioning that is selling you something. +
+ +
+

Carry on, then

+

+ No hard feelings. The ordinary web is right through here.

+ +
+ +
+

Still curious what the other one actually does? It costs nothing to look, and + nothing on this machine changes until you install something.

+ Show me the other one → +
+ +

+ ← Back to the choice · silentmode.st +

+ +
+ + + diff --git a/deviant/anthemus/index.html b/deviant/anthemus/index.html new file mode 100644 index 0000000..5356e02 --- /dev/null +++ b/deviant/anthemus/index.html @@ -0,0 +1,252 @@ + + + + + + Anthemus — Native Bitcoin Cash DEX + + + + + + + + + +
+ Deviant + +
+ +
+ + +

Anthemus

+

Decentralized exchange

+ +

One of the two markets under Agora — the trading floor for what the mechanism can't price alone.

+ +
+

Potidaea handles counterparty-free swaps for backed assets — the price is the mechanism, no other participant needed. Anthemus handles everything else: Token-class assets, wrapped foreign coins, cross-chain price discovery — the parts of the ecosystem where a market has to emerge rather than be enforced.

+ +

Order book plus AMM over one engine. Swap is the exchange with order-making automated; the AMM is a maker on the same book. A single Deposit rail brings assets in from every supported chain — asset × chain → unified USD on Bitcoin Cash — without a per-stablecoin pair matrix.

+ +

Native to Bitcoin Cash. No bridges to trust, no custody to grant. The BCH base layer is the settlement layer.

+
+ +

— The Anthemus interface

+
+
+
Swap
+
One-click trade against the order book. Order-making automated; you pick the pair and the amount.
+
+
+
Exchange
+
Pro grid — chart, book, order form. Full-depth market data, limit orders, historical fills.
+
+
+
Deposit
+
Bring assets in from EVM, Tron, Solana, Bitcoin. Ends as unified USD on BCH — one balance, one currency.
+
+
+ + +
+ +
+
Anthemus is a market layer under Deviant · Agora.
+
anthemus.dex · anthemus.bch · deviant.x/anthemus
+
+ + diff --git a/deviant/brand-redirect.html b/deviant/brand-redirect.html new file mode 100644 index 0000000..78b1651 --- /dev/null +++ b/deviant/brand-redirect.html @@ -0,0 +1,15 @@ + + + + +Deviant — Brand assets + + + + + + +

Redirecting to the Deviant brand gallery…

+ + + diff --git a/deviant/brand/README.md b/deviant/brand/README.md new file mode 100644 index 0000000..433307e --- /dev/null +++ b/deviant/brand/README.md @@ -0,0 +1,106 @@ +# Deviant — Brand assets + +Canonical brand assets for the Deviant project. Source of truth for logos, icons, +and social-media cards. All primary assets are **SVG** (resolution-independent, +editable in code); PNG exports live under `source/exports/` when tooling +generates them. + +## Contents + +| Path | Purpose | +|---|---| +| [`palette.md`](palette.md) | Color tokens + typography, extracted from the landing page CSS | +| [`logo/`](logo/) | Wordmarks and combination marks | +| [`icon/`](icon/) | App icons, favicons, the D-mark alone | +| [`social/`](social/) | Open Graph, Twitter card, avatar | +| [`source/`](source/) | Editable working files, exports, raw art | + +## Voice — one paragraph + +> Deviant exists to enable resistance — by giving users on-chain experience that +> intermediation cannot mediate. + +Tagline (short): **Power Your Ideas.** +Tagline (subline): *A response to a default trajectory.* + +## The mark + +The Deviant mark is a **stylized "D" as an orbital crescent** on a starfield, +with a single acid-yellow dot orbiting the outer ring. It reads two ways: +- Letterform: `D` for Deviant. +- Astronomical: a partial planetary disc with a satellite — the "deviation from + the default trajectory" imagery encoded in the logo itself. + +Never redraw the orbital dot inside the ring, never tint it any other color — +the acid yellow (`--acid`) is the load-bearing accent across the whole system. + +## Themes + +Both themes ship — the landing page respects `data-theme="editorial"` in +`localStorage`; assets should exist for both: + +- **signal** (default): starfield ink on cool deep-space blue. Acid `#d6ff3d`. +- **editorial**: near-monochrome charcoal, more graphic. Acid `#c6ff00`. + +See [`palette.md`](palette.md) for exact values. + +## What to use where + +| Surface | Asset | Size | +|---|---|---| +| Browser tab / OS icon | `icon/favicon.svg`, `icon/icon-512.svg` | 64 / 512 | +| App shell splash | `icon/icon-512.svg` | 512 (matches `shells/app/public/icon.svg`) | +| Website header, README | `logo/deviant-wordmark.svg` | 720×180 | +| Print / dark surfaces | `logo/deviant-mark.svg` | 256×256, no background | +| Print / light surfaces | `logo/deviant-mark-onlight.svg` | 256×256, inverted | +| **Open Graph** (Facebook, LinkedIn, Slack unfurls) | `social/og-1200x630.svg` | 1200×630 | +| **Twitter/X post card** (summary_large_image) | `social/twitter-card-1200x675.svg` | 1200×675 (16:9, current spec) | +| **Twitter/X header** (profile banner) | `social/twitter-header-1500x500.svg` | 1500×500 (3:1, with profile-photo safe zone) | +| **Facebook page cover** | `social/facebook-cover-820x312.svg` | 820×312 desktop / 640×360 mobile-safe | +| **LinkedIn company banner** | `social/linkedin-banner-1584x396.svg` | 1584×396 (with profile-photo safe zone) | +| **Instagram feed post** | `social/instagram-square-1080x1080.svg` | 1080×1080 (also works for Discord/Threads) | +| **Social avatar** (X, GitHub, Discord, LinkedIn) | `social/avatar-400x400.svg` | 400×400, round-crop-safe | + +## Fonts + +Every SVG with text loads the website's own faces (Fraunces + DM Sans + +JetBrains Mono) via a `` +block inside the SVG. That means: + +- **In a browser** (opening the SVG directly, or embedding via ``) the + Google fonts fetch and render — same as the website. +- **In `rsvg-convert` / most SVG-to-PNG renderers** the `@import` is IGNORED + (they don't fetch remote CSS) and the fallback stack applies: Georgia for + display, system sans for body. If pixel-perfect PNG exports matter, either + install Fraunces + DM Sans locally on the export machine, or export from a + browser screenshot instead (see `source/README.md`). + +The ` + + + +
+

Deviant brand

+

Logos, icons and social-media assets. All primary files are SVG — scale-independent, editable in code, and (where text appears) load the site's own fonts via @import. Click any file name to open the raw SVG. + Source: brand/README.md · brand/palette.md

+
+ +
+ + +
+

Icons

2 files
+
+
+
512×512 app icon
+
+
App icon (512)
+
OS launcher, PWA install, app-shell splash. Byte-identical to shells/app/public/icon.svg.
+ +
+
+
+
64×64 favicon
+
+
Favicon
+
Browser tab / tiny sizes. Simplified — no starfield, no glow.
+ +
+
+
+
+ +
+

Logos

3 files
+
+ + + +
+
+ +
+

Social — cards & banners

7 files
+
+
+
Open Graph card
+
+
Open Graph
+
Facebook / LinkedIn / Slack link unfurls. The default meta og:image aspect.
+ +
+
+ +
+
Twitter header
+
+
Twitter/X profile header
+
Profile banner — orbital ring on the right, wordmark shifted past the ~200px avatar overlap in the lower-left.
+ +
+
+
+
Twitter header — deviation chart
+
+
Twitter/X header — deviation variant
+
Uses the site's hero deviation chart (same paths from deviant_website.html) on the right. Same avatar-safe copy zone as the primary header.
+ +
+
+ + + +
+
+ +
+

Avatar

1 file · rendered square + round
+
+ +
+
Circular avatar preview
+
+
Circular crop preview
+
How Twitter / X / GitHub / Discord actually display it. The mark is centered with margin so a circle keeps it whole.
+ +
+
+
+
+
+ + + + diff --git a/deviant/brand/logo/deviant-mark-onlight.svg b/deviant/brand/logo/deviant-mark-onlight.svg new file mode 100644 index 0000000..f7ec4f5 --- /dev/null +++ b/deviant/brand/logo/deviant-mark-onlight.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/deviant/brand/logo/deviant-mark.svg b/deviant/brand/logo/deviant-mark.svg new file mode 100644 index 0000000..a877f5c --- /dev/null +++ b/deviant/brand/logo/deviant-mark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/deviant/brand/logo/deviant-wordmark.svg b/deviant/brand/logo/deviant-wordmark.svg new file mode 100644 index 0000000..0df46b0 --- /dev/null +++ b/deviant/brand/logo/deviant-wordmark.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + Deviant + POWER YOUR IDEAS. + diff --git a/deviant/brand/palette.md b/deviant/brand/palette.md new file mode 100644 index 0000000..d3c011d --- /dev/null +++ b/deviant/brand/palette.md @@ -0,0 +1,70 @@ +# Deviant — Palette & Typography + +Extracted from `Parameters/webfiles/deviant_website.html` (`:root` CSS variables). +The landing page is the source of truth; if these values ever drift, the +website wins. + +## Themes + +Two live themes swap via `data-theme` on ``: + +- `data-theme="signal"` — default. Deep-space blue, cool. +- `data-theme="editorial"` — near-monochrome. High-contrast, more graphic. + +## `signal` (default) + +| Token | Hex / value | Role | +|---|---|---| +| `--sky-deep` | `#050810` | Page ground — the deepest black | +| `--sky-mid` | `#0a0f1c` | Elevated surfaces (cards, hero) | +| `--sky-rim` | `#131a2a` | Borders, dividers | +| `--ink-soft` | `#b8c2d4` | Secondary text | +| `--ink` | `#d6dde9` | Primary text | +| `--ink-bright` | `#f1f4fa` | Headings, emphasis | +| `--muted` | `#6a7488` | Captions, timestamps | +| `--acid` | `#d6ff3d` | Load-bearing accent — CTAs, orbital dot, focus rings | +| `--acid-glow` | `rgba(214,255,61,0.55)` | Halo behind the acid dot | +| `--acid-halo` | `rgba(214,255,61,0.22)` | Softer diffusion | +| `--acid-dim` | `rgba(214,255,61,0.08)` | Idle-state tint | +| `--rust-deep` | `#6b2a1c` | Rare warning / archival accent | +| `--star-faint` | `rgba(255,255,255,0.22)` | Starfield — background layer | +| `--star-mid` | `rgba(255,255,255,0.38)` | Starfield — mid layer | +| `--star-bright` | `rgba(255,255,255,0.58)` | Starfield — near-foreground | + +## `editorial` + +| Token | Hex / value | Role | +|---|---|---| +| `--sky-deep` | `#050505` | Page ground | +| `--sky-mid` | `#0a0a0a` | Elevated surfaces | +| `--sky-rim` | `#161616` | Borders | +| `--ink` | `#f2f2f2` | Primary text | +| `--ink-bright` | `#ffffff` | Headings | +| `--ink-soft` | `#d2d2d2` | Secondary text | +| `--muted` | `#9a9a9a` | Captions | +| `--acid` | `#c6ff00` | Accent — slightly cooler than signal's | +| `--acid-glow` | `rgba(198,255,0,0.60)` | | +| `--acid-halo` | `rgba(198,255,0,0.34)` | | +| `--acid-dim` | `rgba(198,255,0,0.16)` | | + +## Typography + +| Face | Where | Weights loaded | +|---|---|---| +| **Fraunces** | Display headlines, hero, wordmark | 300, 400, 500, 600 (opsz 9..144) | +| **DM Sans** | Body, UI, buttons, nav | 400, 500, 600, 700, 800 | +| **JetBrains Mono** | Code, hashes, addresses (technical surface) | 400, 500 | +| **DM Mono** | Numeric readouts, receipts, tote-style data | 400, 500 | + +Load line (Google Fonts): + +```html + +``` + +## Print / static asset defaults + +For assets shipped as SVG (icons, social cards, logos) that must render without +CSS-var lookups: **hard-code the `signal` values above.** The `data-theme` +mechanism is HTML/CSS-only; a raw SVG loaded into Slack or a Twitter feed does +not carry the palette with it. diff --git a/deviant/brand/social/avatar-400x400.svg b/deviant/brand/social/avatar-400x400.svg new file mode 100644 index 0000000..17df1ea --- /dev/null +++ b/deviant/brand/social/avatar-400x400.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deviant/brand/social/facebook-cover-820x312.svg b/deviant/brand/social/facebook-cover-820x312.svg new file mode 100644 index 0000000..5eb617d --- /dev/null +++ b/deviant/brand/social/facebook-cover-820x312.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Deviant + POWER YOUR IDEAS. + A response to a default trajectory. + diff --git a/deviant/brand/social/instagram-square-1080x1080.svg b/deviant/brand/social/instagram-square-1080x1080.svg new file mode 100644 index 0000000..401bbd4 --- /dev/null +++ b/deviant/brand/social/instagram-square-1080x1080.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Deviant + POWER YOUR IDEAS. + A response to a default trajectory. + deviant.x + diff --git a/deviant/brand/social/linkedin-banner-1584x396.svg b/deviant/brand/social/linkedin-banner-1584x396.svg new file mode 100644 index 0000000..e0a4e19 --- /dev/null +++ b/deviant/brand/social/linkedin-banner-1584x396.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Deviant + POWER YOUR IDEAS. + On-chain experience that intermediation cannot mediate. + diff --git a/deviant/brand/social/og-1200x630.svg b/deviant/brand/social/og-1200x630.svg new file mode 100644 index 0000000..ca0ca2a --- /dev/null +++ b/deviant/brand/social/og-1200x630.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Deviant + POWER YOUR IDEAS. + A response to a default trajectory. + On-chain experience that intermediation cannot mediate. + deviant.x + / navigate.st/bns/deviant.x + diff --git a/deviant/brand/social/twitter-card-1200x675.svg b/deviant/brand/social/twitter-card-1200x675.svg new file mode 100644 index 0000000..515a838 --- /dev/null +++ b/deviant/brand/social/twitter-card-1200x675.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Deviant + POWER YOUR IDEAS. + A response to a default trajectory. + On-chain. Backed. Yours. + deviant.x + diff --git a/deviant/brand/social/twitter-header-1500x500.svg b/deviant/brand/social/twitter-header-1500x500.svg new file mode 100644 index 0000000..600a55e --- /dev/null +++ b/deviant/brand/social/twitter-header-1500x500.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Deviant + POWER YOUR IDEAS. + A response to a default trajectory. + On-chain experience that intermediation cannot mediate. + diff --git a/deviant/brand/social/twitter-header-deviation-1500x500.svg b/deviant/brand/social/twitter-header-deviation-1500x500.svg new file mode 100644 index 0000000..7cfe3fc --- /dev/null +++ b/deviant/brand/social/twitter-header-deviation-1500x500.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Deviant + POWER YOUR IDEAS. + A response to a default trajectory. + + + + + + + + + + + + + + + + + + + + + + + + DEFAULT TRAJECTORY + + + DEVIATION + + + diff --git a/deviant/brand/source/README.md b/deviant/brand/source/README.md new file mode 100644 index 0000000..c496385 --- /dev/null +++ b/deviant/brand/source/README.md @@ -0,0 +1,41 @@ +# Working files & exports + +Author SVGs edit-in-place under `brand/{logo,icon,social}/`. This directory is +for **derivative** files that shouldn't clutter the primary directories. + +## Structure + +- `exports/` — PNGs generated from the primary SVGs. Do not check in unless a + specific delivery pipeline requires them. +- `sketches/` — WIP art, alternates, rejected variants (kept for provenance). + +## Exporting to PNG + +Any of these work; pick what's installed. + +```bash +# rsvg-convert (librsvg — smallest, fastest) +rsvg-convert -w 1200 -h 630 ../social/og-1200x630.svg -o exports/og-1200x630.png + +# Inkscape CLI (higher-fidelity text rendering) +inkscape ../social/og-1200x630.svg --export-type=png --export-filename=exports/og-1200x630.png --export-width=1200 + +# ImageMagick (falls back if the above aren't installed) +magick -density 300 -background none ../social/og-1200x630.svg -resize 1200x630 exports/og-1200x630.png +``` + +**Font gotcha:** Fraunces and DM Sans are Google Fonts. If the renderer does +not have them installed locally, the PNG will show the fallback (Georgia / +system sans). For high-fidelity social exports, install both: + +```bash +# Ubuntu / Debian +sudo apt-get install fonts-liberation +# Then drop Fraunces + DM Sans .ttf files into ~/.fonts/ and run fc-cache -fv +``` + +Or export from a browser (`file://` open + screenshot at the target size) — +Chrome/Firefox honour the Google Fonts `` if the SVG references it, +though our brand SVGs use plain `` with a system-safe stack, so the +Fraunces + DM Sans rendering happens only when those faces are locally +available. diff --git a/deviant/brand/source/exports/avatar-1024.png b/deviant/brand/source/exports/avatar-1024.png new file mode 100644 index 0000000..69bb390 Binary files /dev/null and b/deviant/brand/source/exports/avatar-1024.png differ diff --git a/deviant/brand/source/exports/avatar-400.png b/deviant/brand/source/exports/avatar-400.png new file mode 100644 index 0000000..b944e78 Binary files /dev/null and b/deviant/brand/source/exports/avatar-400.png differ diff --git a/deviant/brand/source/exports/facebook-cover-820x312.png b/deviant/brand/source/exports/facebook-cover-820x312.png new file mode 100644 index 0000000..e81eb82 Binary files /dev/null and b/deviant/brand/source/exports/facebook-cover-820x312.png differ diff --git a/deviant/brand/source/exports/favicon-32.png b/deviant/brand/source/exports/favicon-32.png new file mode 100644 index 0000000..4651327 Binary files /dev/null and b/deviant/brand/source/exports/favicon-32.png differ diff --git a/deviant/brand/source/exports/favicon-64.png b/deviant/brand/source/exports/favicon-64.png new file mode 100644 index 0000000..b2a1508 Binary files /dev/null and b/deviant/brand/source/exports/favicon-64.png differ diff --git a/deviant/brand/source/exports/icon-512.png b/deviant/brand/source/exports/icon-512.png new file mode 100644 index 0000000..02b96bc Binary files /dev/null and b/deviant/brand/source/exports/icon-512.png differ diff --git a/deviant/brand/source/exports/instagram-1080.png b/deviant/brand/source/exports/instagram-1080.png new file mode 100644 index 0000000..417127d Binary files /dev/null and b/deviant/brand/source/exports/instagram-1080.png differ diff --git a/deviant/brand/source/exports/linkedin-banner-1584x396.png b/deviant/brand/source/exports/linkedin-banner-1584x396.png new file mode 100644 index 0000000..d3c3de0 Binary files /dev/null and b/deviant/brand/source/exports/linkedin-banner-1584x396.png differ diff --git a/deviant/brand/source/exports/mark-512.png b/deviant/brand/source/exports/mark-512.png new file mode 100644 index 0000000..d1226ae Binary files /dev/null and b/deviant/brand/source/exports/mark-512.png differ diff --git a/deviant/brand/source/exports/mark-onlight-512.png b/deviant/brand/source/exports/mark-onlight-512.png new file mode 100644 index 0000000..9e3e8f4 Binary files /dev/null and b/deviant/brand/source/exports/mark-onlight-512.png differ diff --git a/deviant/brand/source/exports/og-1200x630.png b/deviant/brand/source/exports/og-1200x630.png new file mode 100644 index 0000000..103c0c1 Binary files /dev/null and b/deviant/brand/source/exports/og-1200x630.png differ diff --git a/deviant/brand/source/exports/twitter-card-1200x675.png b/deviant/brand/source/exports/twitter-card-1200x675.png new file mode 100644 index 0000000..ee86b47 Binary files /dev/null and b/deviant/brand/source/exports/twitter-card-1200x675.png differ diff --git a/deviant/brand/source/exports/twitter-header-1500x500.png b/deviant/brand/source/exports/twitter-header-1500x500.png new file mode 100644 index 0000000..e48476a Binary files /dev/null and b/deviant/brand/source/exports/twitter-header-1500x500.png differ diff --git a/deviant/brand/source/exports/twitter-header-deviation-1500x500.png b/deviant/brand/source/exports/twitter-header-deviation-1500x500.png new file mode 100644 index 0000000..b805d2b Binary files /dev/null and b/deviant/brand/source/exports/twitter-header-deviation-1500x500.png differ diff --git a/deviant/brand/source/exports/wordmark-1440.png b/deviant/brand/source/exports/wordmark-1440.png new file mode 100644 index 0000000..886e312 Binary files /dev/null and b/deviant/brand/source/exports/wordmark-1440.png differ diff --git a/deviant/deviant_mindmap.html b/deviant/deviant_mindmap.html new file mode 100644 index 0000000..ad46519 --- /dev/null +++ b/deviant/deviant_mindmap.html @@ -0,0 +1,537 @@ + + + + + +Deviant — The Map + + + + + + + + + + +
+ +
+
Marketing Mindmap · Bitcoin Cash · v2
+
+

Deviant

+
A tectonic shift in finance.
+
A non-custodial Bitcoin Cash wallet on the MBA Standard
+
+

+ The core distinction is what Deviant introduces: MBA backing + (intrinsic, consensus-enforced, redeemable with no counterparty) and the + counterparty-free ASM. BCH's UTXO + PoW + CashScript design is the + enabling substrate — not the differentiator. And one reframing underneath it all: + Bitcoin Cash satoshis are a unit of account, not a price. +

+
+ +
+ Marketing pillar + Tap any branch to expand · acid-green = the words that carry the pitch +
+ +
+ +
+
+ +
+ + +
+
01
+
The Paradigm
+
What Deviant actually is
+
+
+
    +
  • Every existing asset — fiat, equity, real estate, crypto tokens — has a single point of failure: an issuer, custodian, or counterparty who can fail, freeze, or disappear.
  • +
  • Deviant removes it by construction — not by regulation, not by trust. A gold standard done by mathematics.
  • +
  • The differentiator is MBA backing + counterparty-free ASM. Consensus-enforced and economical at scale.
  • +
+
+ + +
+
02
+
The Mechanism · ASM
+
How it works
+
+
+
    +
  • ASM — Automated Swap Mechanism. Swap any open-mint asset into any other with no DEX, no AMM, no oracle, no operator.
  • +
  • Every unit is self-backed — it carries its own BCH inside the UTXO at a fixed rate. Redemption is a plain spend; swaps are atomic single transactions enforced by consensus.
  • +
  • Universal Exchange Rate: rate A ÷ rate B — deterministic, no market needed.
  • +
+
+ + +
+
03
+
The MBA
+
Not a token. A new asset class.
+
+
+
    +
  • An MBA (Mathematically / Minted Backed Asset) carries intrinsic, consensus-enforced BCH backing — unilaterally redeemable at a fixed rate, no custodian, no counterparty, purely by mathematics.
  • +
  • Properties: a guaranteed on-chain floor value; the rate is fixed and immutable at genesis; redemption is available 24/7 with no off-switch and no permission.
  • +
  • How it differs: a classical token has no locked peg and leans on intermediary trust and market sentiment. An MBA's value is enforced by the protocol with non-reversible rules.
  • +
+
+ + +
+
04
+
The Zero Properties
+
The pitch, in single words
+
+
+
    +
  • Zero counterparty · zero intermediary · zero trust required.
  • +
  • Zero liquidity ceiling — any user, any amount, any time; supply expands to meet demand.
  • +
  • Zero fungibility barriers — every open-mint MBA shares one measurement system, interchangeable at an exact rate.
  • +
  • Zero complexity for founders · zero maintenance · zero ongoing contribution · zero dependence · zero friction. Don't trust, verify.
  • +
+
+ + +
+
05
+
Founders' Revenue
+
Earn without selling the asset
+
+
+
    +
  • Founder fee on mint only (immutable after genesis). Redemption is free. Set at 1% on both sides, it creates a mathematically enforced ~2% round-trip spread.
  • +
  • Automated, perpetual revenue — the founder earns from activity, not from selling or holding the asset. No treasury to dump, no insider allocation.
  • +
  • A Revenue Acquisition Mechanism, not a sale: users acquire from the algorithm; the founder only collects the fee.
  • +
  • The 5% cap is a wallet/template guardrail, not a protocol ceiling — the protocol imposes no fee limit.
  • +
+
+ + +
+
06
+
Agora
+
A market with no analogue
+
+
+
    +
  • Agora is what emerges when ASM and MBA launch work in combination — an emergent market that has no analogue anywhere.
  • +
  • Users swap directly at the protocol level — with no counterparty: no order book, no market maker, no listing gate. The market exists the moment the asset does.
  • +
  • Founders create an asset and earn — without ever selling it. Acquisition comes from the algorithm (ASM), not from a seller.
  • +
  • Liquidity is Poseidon — deep as an ocean: the protocol is the immutable liquidity provider, native, instant, and unlimited. Zero bootstrap, zero ceiling.
  • +
+
+ + +
+
07
+
The Proof
+
A working mechanism, not a claim
+
+
+
    +
  • Validated on Bitcoin Cash chipnet across 135 snapshots. Live
  • +
  • ~445 tests — the majority exercising MBAs across use cases, configurations, and adversarial / vulnerability scenarios: what MBAs can do, and whether they break. (The early 129 atomic swaps were the first proof the mechanism works.)
  • +
  • Result across all of it: 0 exploits · 100% peg integrity. Wallet core feature-complete; PWA beta live (chipnet/testnet, mainnet structurally absent).
  • +
  • The CTA asks the reader to verify a mathematical claim, not to pledge: Verify the contract · Read the spec · Audit the snapshots.
  • +
+
+ + +
+
08
+
Positioning
+
Why Deviant wins its lane
+
+
+
    +
  • vs conventional tokens (ERC-20, BEP-20, and the like): they're financially and structurally disconnected from their base layer. MBAs are tied to it — one asset's success amplifies the whole ecosystem.
  • +
  • vs stablecoins: the bankruptcy-protection floor — on-chain recoverable value if the issuer fails, where a conventional stablecoin recovers $0.
  • +
  • vs DEX/exchanges: no order matching, no liquidity to bootstrap, no counterparty to wait for.
  • +
  • The volatility paradox: the asset marketed as "safe" fails its advertised property under stress; an MBA promises nothing it cannot keep.
  • +
+
+ + +
+
09
+
Platform Revenue
+
How Deviant earns — no fundraise
+
+
+
    +
  • Revenue streams: ~0.5% fee on asset mint, voluntary marketing revenue-share · premium features for sophisticated users.
  • +
  • Olympic tier ladder — founders opt into promotion via Agora: Free → Bronze → Silver → Gold → Laurel.
  • +
  • (Possible) additional revenue from dApps, integrations and partnerships.
  • +
  • Deviant lets users generate revenue — as Bitcoin lets miners — but with less complexity. The platform's revenue is earned (only) from real economic activity.
  • +
+
+ + +
+
10
+
Platform Alignment
+
Inverting the extraction model
+
+
+
    +
  • Public commitment: 25–50% of platform revenue to Bitcoin Cash infrastructure, scaling toward the higher figure.
  • +
  • Structural recognition of dependency, not philanthropy — "most projects extract from their chain; Deviant inverts that."
  • +
  • Direct, 24/7 transparent. Two tracks: protocol-level (nodes, CashScript) now; application-level later.
  • +
  • The base layer is the environment — predetermined, permanent, unaffected by what evolves within it.
  • +
+
+ + +
+
11
+
The Origin
+
Discovered, not created
+
+
+
    +
  • The question that produced everything: "Is it possible to back assets without a counterparty?" — the same constraint Satoshi applied, followed honestly, without compromise, to its singular conclusion. No intermediaries, no counterparties, no trust assumptions.
  • +
  • The concept preceded the technology. Nothing accidental, nothing coincidence — the domain was discovered, not created.
  • +
  • The most important distinction: Deviant did not create these mathematical relationships — it discovered them. They existed before; the question navigated to them; the technology made them accessible — the CashScript upgrade on Bitcoin Cash.
  • +
+
+ + +
+
12
+
The Story
+
Go-to-market & narrative
+
+
+
    +
  • The hero declares the negative first: "This is not a fundraise." It's a demonstration of a new paradigm.
  • +
  • Community first: reach the Bitcoin Cash community, then a wider audience with a product they've never experienced.
  • +
  • Founders must deliver first — usefulness generates revenue. The opposite of the 2017 ICO model that sold promises and delivered garbage.
  • +
  • Agora, the MBA and the ASM combination is a tectonic shift relative to the conventional financial system — consequences are unpredictable, and you are welcome to experience the new trajectory.
  • +
+
+ +
+ +
Discovered truths are permanent.
+ + +
+
8
Asset classes
+
~445
Tests passing
+
0
Exploits
+
100%
Peg integrity
+
+ +
+
The protocol rate is the gravitational center. Market prices orbit around it.
+
+
Deviant
+
Power Your Ideas.
+
+
+ +
+ + + + + diff --git a/deviant/deviant_website.html b/deviant/deviant_website.html new file mode 100644 index 0000000..fa66a82 --- /dev/null +++ b/deviant/deviant_website.html @@ -0,0 +1,15 @@ + + + + +Deviant — Power Your Ideas + + + + + + +

Redirecting to deviant.x…

+ + + diff --git a/deviant/index.html b/deviant/index.html new file mode 100644 index 0000000..4d2c875 --- /dev/null +++ b/deviant/index.html @@ -0,0 +1,939 @@ + + + + + + Deviant — Power Your Ideas + + + + + + + + + + + + + + + + + +
+ +
+
+
+
A response to a default trajectory
+
+

When the institutional, technical, economic, and rhetorical forces all point in the same direction, the outcome they point toward becomes the default trajectory. Deviation from the trajectory requires active resistance. In a captured information environment with limited resistance capacity, the default trajectory is what occurs.

+
+
+

Deviant exists to enable that resistance — by giving users on-chain experience that intermediation cannot mediate.

+
+
+ + +
+
+ +
+
What this is
+ +
+

Deviant is the first wallet for an asset class that exists nowhere else — a Bitcoin‑Cash‑backed asset you can redeem at a fixed rate, at any time, with no issuer, no custodian, and no counterparty. Enforced by mathematics, not trust.

+
+ +
+

Permissionless mint, fixed rate, unlimited reservoir — the contract replaces the market maker, the liquidity provider, and the counterparty at once. Mint from a permissionless covenant; exit by burning your output back to its Bitcoin‑Cash floor; swap to any other permissionless‑mint asset in a single atomic transaction. No pool. No oracle. No one to ask.

+
+ +
+
Artemision
Create. Genesis in one transaction — core parameters sealed, irreversible.
+
Katalogos
The asset list. Every class, filterable across the backed ↔ non-backed spectrum and by use-case.
+
Agora
The market hub. Home to Potidaea — a counterparty-free automated swap mechanism — and Anthemus, a decentralized exchange.
+
+ +
+
No issuerNo custodianNo counterpartyNo token sale
+

Not a fundraise, not a pre‑mine. The contract is small enough to read end to end in an evening — read it, replay the chain, break it or trust it. The wallet reports facts the chain has already settled; it never asks you to trust it.

+
+ +
+ +
+
The mechanism · ASM
+
+

Every unit is self‑backed — it carries its own Bitcoin Cash inside the UTXO at a fixed rate. Redemption is a plain spend; a swap is a single atomic transaction, settled by consensus.

+
+
+

The Automated Swap Mechanism prices every exchange by the Universal Exchange Rate — rate A ÷ rate B — derived from genesis constants alone. No DEX, no AMM, no oracle, no operator. There is no approximately: the floor is an equality the contract enforces at consensus level. Deterministic, not probabilistic.

+
+
+
No counterpartyNo oracleNo poolNo operator
+
+
+ +
+
Agora — the market hub
+
+

Two markets under one roof. Potidaea is the native-BCH ASM — counterparty-free swaps priced by the Universal Exchange Rate, backing enforced at consensus level. Anthemus is the DEX — order-book and AMM for token-class assets and cross-chain price discovery. Together they cover every asset the wallet can hold.

+
+
+

Potidaea's market exists the moment an MBA does — no order book, no listing gate; a founder can create an asset and earn without ever selling it. Anthemus adds the trading floor for everything the mechanism can't price alone — Token-class assets, wrapped foreign coins, cross-chain settlement.

+
+
+ +
+
The proof
+
+

Not a hypothesis — a working mechanism, validated on the Bitcoin Cash chipnet across 287 snapshots.

+
+
+
564
Tests passing
+
52,998
Chipnet swaps
+
0
Exploits
+
100%
Peg integrity
+
+
+

The early atomic swaps proved the mechanism works; the bulk of the suite then exercised MBAs across use cases, configurations, and adversarial scenarios — what the assets can do, and whether they break. The wallet core is feature‑complete and a PWA beta is live on chipnet. The contract is small enough to read in an evening: verify it, replay the chain, break it or trust it.

+
+
+ +
+
Why it is different
+
+

A conventional token is disconnected from its base layer; an MBA is tied to it — so one asset's success amplifies the whole ecosystem.

+
+
+
Conventional tokens · ERC-20, BEP-20, …
No locked peg. Value rests on issuer reputation, demand, and traded liquidity — disconnected from any base‑layer floor.
+
The MBA
Value enforced by the protocol, not promised by an issuer. Price cannot fall below the mathematical floor.
+
Stablecoins
When the issuer fails, a conventional stablecoin recovers $0. An MBA carries an on‑chain bankruptcy‑protection floor.
+
DEX / exchanges
No order matching, no liquidity to bootstrap, no counterparty to wait for — the protocol is the exchange.
+
+
+

The volatility paradox: the asset marketed as "safe" fails its advertised property under stress. An MBA promises nothing it cannot keep — and because supply expands only against locked Bitcoin Cash, every asset launched amplifies the scarcity of the base layer rather than diluting it.

+
+
+ +
+
The economics — no fundraise
+
+

Revenue is earned from real activity, never raised. Like Bitcoin's own launch: no pre‑mine, no token sale.

+
+
+
Founder revenue
A mint‑only fee, immutable after genesis. Set at 1% on both sides, it creates a mathematically enforced ~2% round‑trip spread — automated revenue from activity, not from selling the asset.
+
Platform revenue
Three streams: a voluntary marketing revenue‑share on the Olympic tier ladder (Free → Bronze → Silver → Gold → Laurel), a ~0.5% wallet swap fee, and premium features.
+
+
+ +
+
Bitcoin Cash alignment
+
+

Most projects extract from their chain. Deviant inverts that — a public commitment of 25–50% of platform revenue to Bitcoin Cash infrastructure, scaling toward the higher figure.

+
+
+

Structural recognition of dependency, not philanthropy. The base layer is the environment — predetermined, permanent, unaffected by what evolves within it. Stars hang without visible support; planets wander yet hold their courses, bound by an unseen force. So here: mathematics, not authority, holds the system together.

+
+
+ +
+
Where to begin
+ + +
+ +
Power Your Ideas.
+ +
+ + +
+
+ + + + diff --git a/deviant/potidaea/index.html b/deviant/potidaea/index.html new file mode 100644 index 0000000..b2f2dec --- /dev/null +++ b/deviant/potidaea/index.html @@ -0,0 +1,283 @@ + + + + + + Potidaea — Native-BCH Automated Swap Mechanism + + + + + + + + + +
+ Deviant + +
+ +
+ + +

Potidaea

+

Counterparty-free automated swap mechanism

+ +

One of the two markets under Agora — the one where the price is the mechanism.

+ +
+

Potidaea handles counterparty-free swaps for backed assets. Every exchange is priced by the Universal Exchange Rate — rate A ÷ rate B, derived from genesis constants alone — and settled by consensus. No pool. No oracle. No one to ask.

+ +

The contract is the market maker, the liquidity provider, and the counterparty at once. Mint from a permissionless covenant; exit by burning your output back to its Bitcoin Cash floor; swap to any other permissionless-mint asset in a single atomic transaction.

+ +

Named after Ποτίδαια — the city of Poseidon — because the liquidity behaves like ocean: MBA↔MBA depth is infinite from moment zero. Backing is liquidity, elastic-mint. There is no bootstrap, no seeding, no thin-pairs, no slippage in the usual sense.

+
+ +

— The Potidaea flow

+
+
+
Genesis
+
One transaction seals the core parameters — backing rate, category, mint policy. Immutable after mint; no upgrade key, no admin.
+
+
+
Swap
+
Any address can claim against the reservoir. Sequencer + sharded reservoir + auto-assign — measured at 196 swaps/sec on a local BCHN node.
+
+
+
Redeem
+
Burn the output back to its BCH floor at any time. The floor is an equality the contract enforces at consensus level — not an approximation.
+
+
+ +
+
52,998
Chipnet swaps
+
0
Exploits
+
100%
Peg integrity
+
~52k
Per 32 MB block
+
+ + +
+ +
+
Potidaea is a market layer under Deviant · Agora.
+
potidaea.asm · deviant.x/potidaea
+
+ + diff --git a/favicon.svg b/favicon.svg new file mode 100644 index 0000000..d963e50 --- /dev/null +++ b/favicon.svg @@ -0,0 +1,9 @@ + + + Silent Mode + + + diff --git a/helios/index.html b/helios/index.html new file mode 100644 index 0000000..494b548 --- /dev/null +++ b/helios/index.html @@ -0,0 +1,128 @@ + + + + + +Helios — searching the decentralized web — Silent Mode + + + + + + + + + + + + + + + + + +
+
☀️
+

Helios + designed · not yet built +

+

A search engine for the decentralized web — no central crawler to + trust, no authority to rank, no advertiser to serve. Named for the sun, which + sees everything and takes no side. Reads what the chain says exists and lets you + find it by name, by tag, by content, by who you trust.

+
+ +
+ +
+

The problem

+

Every search engine that matters today is one company deciding what the + web looks like. It crawls what it wants, indexes what it chooses, ranks by what pays + it, and drops what its lawyers dislike. On the ordinary web that is livable — most + sites are on cooperating hosts and there is a shared understanding of what "the + open web" means. On a network where nobody hosts anything centrally and nobody + approves what gets published, a company-run search would recreate exactly the + gatekeeper the network was built to escape.

+

A search engine for the decentralized web has to be built with the + same rules as the network it searches: no crawler that any single party runs, no + ranking any single party decides, and no listing any single party can remove. + That is Helios.

+
+ +
+

How Helios will work

+
    +
  1. The chain is the truth about what exists. + Every BNS name registered on Bitcoin Cash is a piece of a public index — + no crawler needed to find them. Helios reads the same records every resolver + reads, plus the on-chain APS1 app listings from + Prometheus, plus any signed metadata records + (title, description, tags) that publishers attach to their names.
  2. +
  3. Content indexing is opt-in. + For the bytes behind a name (an HTML page, a document), Helios only + indexes what the publisher marks as indexable — a signed + idx record with a category and tag list. Nobody + crawls anyone. If a site does not want to be searchable, it isn't.
  4. +
  5. Ranking is by signed endorsement, not by an algorithm nobody understands. + Names on your trust list carry weight for you. Names on nobody's trust + list appear at the bottom. Nothing paid ever floats. Change trust lists, change + results — the ranking is transparent because it is yours.
  6. +
  7. The frontend can run anywhere. + Helios's index is data on chain plus data on Sia — a spec, not a service. + The reference frontend runs at helios.silentmode.bch, + but any client can build its own index and its own UI from the same public + substrate. If Silent Mode's Helios goes down, another Helios exists tomorrow.
  8. +
+
+ +
+

What it will NOT do

+
+
+

Track you

+

No accounts, no cookies, no per-user history. Every search is the same request + shape; the server has nothing to profile.

+
+
+

Rank by payment

+

There is no sponsored-result slot, no bidding, no advertising surface at all. + Storage costs money; searches don't.

+
+
+

Moderate content

+

Helios shows you what your trust list vouches for. Filtering out categories or + publishers is your subscription choice, not the engine's policy.

+
+
+

Depend on one operator

+

The index is public. If Silent Mode stops hosting Helios tomorrow, the data + and the spec are still there — anyone can run their own.

+
+
+
+ +
Status: designed, not built. This page is a placeholder for + the intent. The record types (idx, tag) + need to be specified in the BNS protocol addendum, the reference frontend needs to be + built, and a trust-list subscription format needs to be settled with + Hermes so both use the same shape. Watch this page.
+ +
+ +
+
Silent Mode — a Deviant project.
+
Named for Helios, who saw everything from the sun's chariot and took + no side. Distinct from any Helios monitoring, security, or blockchain project — the + name is a common one from the same source.
+
+ + + diff --git a/hephaestus.x/forge/index.html b/hephaestus.x/forge/index.html new file mode 100644 index 0000000..72d21bf --- /dev/null +++ b/hephaestus.x/forge/index.html @@ -0,0 +1,142 @@ + + + + + +Hephaestus — the forge + + + + + + +
+ +
+
⚒️
+

the forge

+

Public code on Hephaestus. Click through to read, or sign in with your wallet to push your own.

+ +
+ +
+

Public repositories

+

Fetched live from Hephaestus. Sign in to see private orgs you belong to.

+ +
+
Loading from code.silentmode.st…
+
+ +

+ Clone URL patterns: + git clone https://code.silentmode.st/<owner>/<repo>.git (HTTPS with a personal token) +  ·  + git clone ssh://git@code.silentmode.st:2222/<owner>/<repo>.git (SSH with your registered key) +

+
+ +
+ + + + + + diff --git a/hephaestus.x/forgejo/index.html b/hephaestus.x/forgejo/index.html new file mode 100644 index 0000000..72d21bf --- /dev/null +++ b/hephaestus.x/forgejo/index.html @@ -0,0 +1,142 @@ + + + + + +Hephaestus — the forge + + + + + + +
+ +
+
⚒️
+

the forge

+

Public code on Hephaestus. Click through to read, or sign in with your wallet to push your own.

+ +
+ +
+

Public repositories

+

Fetched live from Hephaestus. Sign in to see private orgs you belong to.

+ +
+
Loading from code.silentmode.st…
+
+ +

+ Clone URL patterns: + git clone https://code.silentmode.st/<owner>/<repo>.git (HTTPS with a personal token) +  ·  + git clone ssh://git@code.silentmode.st:2222/<owner>/<repo>.git (SSH with your registered key) +

+
+ +
+ + + + + + diff --git a/hephaestus.x/index.html b/hephaestus.x/index.html new file mode 100644 index 0000000..2bf2df5 --- /dev/null +++ b/hephaestus.x/index.html @@ -0,0 +1,451 @@ + + + + + +Hephaestus.X — the forge on Bitcoin Cash + + + + + + + + + + + + + + + + + + + + + +
+ +
+
⚒️
+

The forge on Bitcoin Cash.

+

Hephaestus is the code host for the BCH ecosystem — Cauldron contributors, Sirius developers, wallet + authors, indexer maintainers. Sign in with a wallet, push a repo, host a release. No email, no password reset, + no middleman.

+ + +
+ +
+

How it works

+

Three moving parts, no magic. Forgejo does the git and issue tracking, an auth-proxy translates + Bitcoin Cash message signatures into OpenID Connect tokens Forgejo understands, and Caddy fronts the whole + thing behind the two hostnames — hephaestus.x for BCNR-aware browsers, code.silentmode.st + as a public DNS mirror.

+
+
+

🔑 Wallet is the account

+

Generate or import a BCH wallet in the browser. Sign one BIP-137 "Bitcoin Signed Message" challenge, + and Forgejo auto-provisions bch_<first-20-of-your-cashaddr>. Rename it later — even to a + plain name like BitcoinCash. The private key never leaves your device.

+
+
+

💾 Cold blobs on Sia

+

Live git repos + Postgres stay on the VPS SSD for speed. LFS objects, release archives, container images, + package registry blobs and issue attachments spill to the Sia + network via s3.silentmode.st:8600. Encrypted client-side, sharded across independent hosts.

+
+
+

🌐 Two hostnames, one instance

+

hephaestus.x is the primary — an on-chain BCNR certificate, chipnet, owner-controlled, TLS via the + Silent Mode CA. code.silentmode.st is the public-DNS mirror for browsers without a BCNR resolver. + Same Forgejo, same accounts, same repos.

+
+
+

🧭 Standard git, nothing weird

+

git clone, git push, PRs, issues, releases, container/npm registries, the + Forgejo API. Bring your existing muscle memory — the only unusual bit is that you signed in with a wallet + instead of an email.

+
+
+
+ +
+

Sign in in three steps

+

Nothing to install, nothing to remember except your recovery phrase.

+
    +
  1. Pick your route. Sign up (create a new wallet in the browser), Sign in (import a 12/24-word + phrase you already have), or WizardConnect (sign with an external wallet — Cashonize, Paytaca — over an + encrypted relay).
  2. +
  3. Set a browser passphrase. Used to encrypt the wallet in your browser's localStorage. + Minimum 8 characters. Never leaves your device.
  4. +
  5. Sign the challenge. Your browser signs a one-time message, the auth-proxy verifies the signature + against your Bitcoin Cash address, and Forgejo hands you a session cookie. You land in the dashboard.
  6. +
+ +
+ +
+

See the source. Verify the deploy.

+

The whole forge — the Docker Compose stack, the Caddyfile, the auth-proxy that verifies wallet + signatures, the Forgejo Dockerfile with our CA baked in, every helper script — is on Hephaestus itself. + Clone it, read it, run it.

+ +
+
+

📖 silentmode/hephaestus

+

The full stack. docker-compose.yml, caddy/Caddyfile, + auth-proxy/ (Fastify OIDC provider), forgejo/Dockerfile, + scripts/, PROTOCOL.md.

+ +
+
+

🔐 auth-proxy

+

The wallet-to-OIDC bridge. ~250 lines of TypeScript that produces an Ed25519-signed id_token + after verifying a BIP-137 signature against a claimed CashAddr. The whole crypto path is in + src/verify.ts.

+ +
+
+

📜 PROTOCOL.md

+

Wallet-auth flow, message format, replay-protection, prefix handling (bitcoincash / bchtest / bchreg). + The document a third-party wallet needs to add native support.

+ +
+
+ +

Run your own

+

Nothing here needs Hephaestus.X's operator — the same compose stack runs on any Linux box with + Docker. Bring your own domain, a TLS cert, and a Sia bucket (the sia.storage free tier is enough for a small + forge). Then docker compose up.

+
# 1. clone
+git clone https://code.silentmode.st/silentmode/hephaestus.git
+cd hephaestus
+
+# 2. configure — copy .env.example, fill in your domain, Sia S3 creds, and OIDC secret
+cp .env.example .env
+$EDITOR .env
+
+# 3. run — Caddy + Postgres + Forgejo + auth-proxy come up together
+docker compose up -d
+
+# 4. first wallet signs in and takes the admin seat
+open https://your-domain.example/user/oauth2/hephaestus-wallet
+ +
Open source, MIT. Every commit is signed, every dependency is pinned. If you find + something you want to fix or improve, open a PR — or just fork it and run your own instance. That is the + point.
+
+ +
+

The Silent Mode pantheon

+

Hephaestus is one of seven sibling .x names. Each project is its own on-chain certificate, + each site is reachable through any BCNR resolver, plus the silentmode.st gateway for browsers without one.

+
+
+

⛓️ Silentmode.X

+

The project umbrella. Redirects to silentmode.st where every pillar has its own landing.

+ +
+
+

⭐ Sirius.X

+

Names on Bitcoin Cash — register, resolve, verify, manage TLDs and names.

+ +
+
+

🧭 Theseus.X

+

The browser that speaks BCNR natively — Chromium build with the resolver baked in, no OS-level daemon.

+ +
+
+

⚒️ Hephaestus.X you're here

+

The forge. Forgejo instance for the ecosystem's git repos, backed by BCH wallet auth. This site.

+ +
+
+

🔮 Prometheus.X

+

Fire from the chain. Foresight and experimentation layer. Redirects to silentmode.st/prometheus/.

+ +
+
+

☀️ Helios.X

+

Public gaze — analytics, dashboards, transparency. Redirects to silentmode.st/helios/.

+ +
+
+

✉️ Hermes.X

+

Messenger. Nostr-based messaging bound to a BCNR name via the np + nr records.

+ +
+
+
+ +
+

Verify this page against the chain

+

You do not have to trust that hephaestus.x is served by anyone specific. The name's + certificate is on the Bitcoin Cash chain; the records point to a specific IP and a specific Sia bucket; every + path is independently checkable.

+ +

1. Reach this site via more than one route

+

The same content should be served from at least two independent paths. If one mirror disappears, + the others still work. If two disagree, the on-chain record is the tiebreaker.

+
    +
  • Via any BCNR resolver: https://hephaestus.x/ (requires the local root CA)
  • +
  • Via the public gateway: https://navigate.st/bns/hephaestus.x
  • +
  • Via silentmode.st mirror: https://silentmode.st/hephaestus/
  • +
  • Public DNS mirror of the forge itself: https://code.silentmode.st/
  • +
+ +

2. Where it lives

+
+
forge
hephaestus.x (primary) · code.silentmode.st (public-DNS mirror) — same Forgejo 10 instance, dual-hostname
+
this name
hephaestus.x — on-chain BCNR certificate, chipnet, owner-controlled, TLS via the Silent Mode CA
+
storage
Sia network via s3.silentmode.st:8600, client-side encrypted · static landing mirrored to a Sia bucket as DR backup
+
source
silentmode/hephaestus — docker-compose, auth-proxy, Caddyfile, the whole stack
+
protocol
BIP-137 "Bitcoin Signed Message" over BCH secp256k1 — any wallet that speaks Sign Message can log in
+
+
+ +
+ + + + + + + diff --git a/hephaestus.x/js/theme.js b/hephaestus.x/js/theme.js new file mode 100644 index 0000000..96d90d1 --- /dev/null +++ b/hephaestus.x/js/theme.js @@ -0,0 +1,63 @@ +// Sirius.X font picker — reader chooses between Fraunces (Silent Mode +// family — editorial serif, default) and Ubuntu (Bitcoin Cash brand +// font — humanist sans). Persisted in localStorage under 'sirius-font'. +// +// The runtime attribute goes on — pages that want to opt out +// simply omit the include. The actual font-swap CSS is defined per +// page (in each page's + + + + +
+ +
+ hephaestus.x / silentmode / __REPO__ +
+ +
+

silentmode/__REPO__

+

loading …

+

+ +
+ +
+

README

+
Loading README from the forge…
+
+ +
+

Recent commits

+
Loading…
+
+ +
+

Clone

+
HTTPS (with a personal access token)
+
git clone https://<you>:<token>@code.silentmode.st/silentmode/__REPO__.git
+
SSH (with a key registered under your account)
+
git clone ssh://git@code.silentmode.st:2222/silentmode/__REPO__.git
+
+ +
+ + + + + + diff --git a/hephaestus.x/silentmode/ariadne/index.html b/hephaestus.x/silentmode/ariadne/index.html new file mode 100644 index 0000000..814cad0 --- /dev/null +++ b/hephaestus.x/silentmode/ariadne/index.html @@ -0,0 +1,228 @@ + + + + + +silentmode/ariadne — Hephaestus + + + + + + +
+ +
+ hephaestus.x / silentmode / ariadne +
+ +
+

silentmode/ariadne

+

loading …

+

+ +
+ +
+

README

+
Loading README from the forge…
+
+ +
+

Recent commits

+
Loading…
+
+ +
+

Clone

+
HTTPS (with a personal access token)
+
git clone https://<you>:<token>@code.silentmode.st/silentmode/ariadne.git
+
SSH (with a key registered under your account)
+
git clone ssh://git@code.silentmode.st:2222/silentmode/ariadne.git
+
+ +
+ + + + + + diff --git a/hephaestus.x/silentmode/hephaestus/index.html b/hephaestus.x/silentmode/hephaestus/index.html new file mode 100644 index 0000000..a49fc7c --- /dev/null +++ b/hephaestus.x/silentmode/hephaestus/index.html @@ -0,0 +1,228 @@ + + + + + +silentmode/hephaestus — Hephaestus + + + + + + +
+ +
+ hephaestus.x / silentmode / hephaestus +
+ +
+

silentmode/hephaestus

+

loading …

+

+ +
+ +
+

README

+
Loading README from the forge…
+
+ +
+

Recent commits

+
Loading…
+
+ +
+

Clone

+
HTTPS (with a personal access token)
+
git clone https://<you>:<token>@code.silentmode.st/silentmode/hephaestus.git
+
SSH (with a key registered under your account)
+
git clone ssh://git@code.silentmode.st:2222/silentmode/hephaestus.git
+
+ +
+ + + + + + diff --git a/hephaestus.x/silentmode/index.html b/hephaestus.x/silentmode/index.html new file mode 100644 index 0000000..9aabcc0 --- /dev/null +++ b/hephaestus.x/silentmode/index.html @@ -0,0 +1,128 @@ + + + + + +silentmode/* — Hephaestus + + + + + + +
+ +
+ hephaestus.x / silentmode +
+ +
+
🛠
+

silentmode/*

+

Public repositories under the silentmode org. Click through for a per-repo overview or straight into the full forge.

+
+ +
+
Loading from the forge…
+
+ +
+ + + + + + diff --git a/hephaestus.x/silentmode/sirius/index.html b/hephaestus.x/silentmode/sirius/index.html new file mode 100644 index 0000000..a7ee518 --- /dev/null +++ b/hephaestus.x/silentmode/sirius/index.html @@ -0,0 +1,228 @@ + + + + + +silentmode/sirius — Hephaestus + + + + + + +
+ +
+ hephaestus.x / silentmode / sirius +
+ +
+

silentmode/sirius

+

loading …

+

+ +
+ +
+

README

+
Loading README from the forge…
+
+ +
+

Recent commits

+
Loading…
+
+ +
+

Clone

+
HTTPS (with a personal access token)
+
git clone https://<you>:<token>@code.silentmode.st/silentmode/sirius.git
+
SSH (with a key registered under your account)
+
git clone ssh://git@code.silentmode.st:2222/silentmode/sirius.git
+
+ +
+ + + + + + diff --git a/hephaestus.x/silentmode/theseus/index.html b/hephaestus.x/silentmode/theseus/index.html new file mode 100644 index 0000000..19b8a75 --- /dev/null +++ b/hephaestus.x/silentmode/theseus/index.html @@ -0,0 +1,228 @@ + + + + + +silentmode/theseus — Hephaestus + + + + + + +
+ +
+ hephaestus.x / silentmode / theseus +
+ +
+

silentmode/theseus

+

loading …

+

+ +
+ +
+

README

+
Loading README from the forge…
+
+ +
+

Recent commits

+
Loading…
+
+ +
+

Clone

+
HTTPS (with a personal access token)
+
git clone https://<you>:<token>@code.silentmode.st/silentmode/theseus.git
+
SSH (with a key registered under your account)
+
git clone ssh://git@code.silentmode.st:2222/silentmode/theseus.git
+
+ +
+ + + + + + diff --git a/hephaestus/index.html b/hephaestus/index.html new file mode 100644 index 0000000..c3a5d3d --- /dev/null +++ b/hephaestus/index.html @@ -0,0 +1,343 @@ + + + + + +Hephaestus — decentralized code forge for Silent Mode + + + + + + + + + + + + + + + + + +
+ +
+
⚒️
+

Hephaestus — the forge

+

A code host you sign into with a Bitcoin Cash wallet. Repositories on your own VPS, cold blobs on the Sia network. No email. No password reset. No middleman.

+ +
+ +
+

What Hephaestus is

+

A friction-free GitHub alternative for people who want to hold their own identity. Under the hood it's Forgejo (a soft-fork of Gitea) with a wallet-authentication layer bolted on and cold storage moved from disk to Sia.

+ +
+
+

Wallet is your identity

+

Generate or import a BCH wallet in your browser. Sign a one-time challenge to prove control. That's your account — nothing to remember except your recovery phrase.

+
+
+

Cold storage on Sia

+

Every LFS object, release archive, package registry blob and issue attachment lives on the Sia network via s3.silentmode.st:8600. Live git repos + Postgres stay on the VPS SSD for speed.

+
+
+

Standard git — push over HTTPS or SSH

+

Nothing weird. git clone, git push, PRs, issues, releases, container registry, the works. Bring your existing muscle memory.

+
+
+
+ +
+

Sign in — 30 seconds

+
    +
  1. Open the forge. Go to code.silentmode.st and click Sign in, then Sign in with hephaestus-wallet.
  2. +
  3. Generate or import a wallet. Pick "Generate new" for a fresh BIP-39 12-word recovery phrase, or "Import existing" if you already have one. Write it down — lose it and the account is gone.
  4. +
  5. Set a browser passphrase (min 8 chars). Used to encrypt the wallet in your browser's localStorage. Never leaves your device.
  6. +
  7. Click "Create wallet & sign in". The browser signs a challenge, the server verifies, Forgejo auto-provisions you as bch_<first-20-of-your-cashaddr>. You land in the dashboard.
  8. +
+

Why no email? Nothing to leak, nothing to phish, no password-reset flow to hijack. The trade: if you lose your recovery phrase there is no support form to send you back in. Back the phrase up. Twice. On paper.

+
+ +
+

For CLI & programmatic access read before debugging

+

If you're driving the sign-in from a CLI, CI job, or any scripted client without a real browser, read this first. It heads off two misdiagnoses we've already hit.

+ +

Misdiagnosis #1: "The login shell page is only 510 bytes — it's a broken stub"

+

It's not a stub — it's a deliberately small bootstrap page that renders the wallet UI client-side via a JS module (standard SPA pattern). Size ≠ brokenness. The full UI (mnemonic generation, passphrase encryption, sign flow) is inside wallet.js, not the shell. Test by requesting wallet.js instead:

+
curl -sI https://code.silentmode.st/auth/static/wallet.js
+# expect: HTTP 200, ~10 KB, Content-Type: application/javascript
+ +

Misdiagnosis #2: "static/wallet.js returns 404 at every path"

+

It only 404s if you drop the /auth/ prefix. Caddy path-multiplexes: /auth/* goes to the auth-proxy, everything else goes to Forgejo. Forgejo has no /static/wallet.js, so that path is expected-404. The real paths are:

+ + + + + + + + + + + + +
URLServed byPurpose
/auth/authorizeauth-proxyLogin shell HTML (SPA bootstrap)
/auth/static/wallet.jsauth-proxyWallet UI + signing logic (~10 KB)
/auth/static/login.cssauth-proxyStyles for the login card
/auth/challengeauth-proxyPOST cashaddr → get nonce + signed message
/auth/verifyauth-proxyPOST nonce + signature → get OAuth code
/auth/.well-known/openid-configurationauth-proxyOIDC discovery
/user/oauth2/hephaestus-walletForgejoKicks off the OAuth handshake (307 → /auth/authorize)
/user/oauth2/hephaestus-wallet/callbackForgejoReceives the OAuth code, mints session
/api/v1/versionForgejoPublic: returns Forgejo version
/api/v1/userForgejoRequires an API token (not a session cookie) — returning 401 in a browser is not a bug
+ +

Testing the sign-in flow end-to-end without a real browser

+

The wallet signing is easiest to reproduce in Node/Deno or a headless browser — the crypto is BIP-137 "Bitcoin Signed Message" over BCH secp256k1. But the server-side pieces alone can be smoke-tested with curl:

+
ISSUER=https://code.silentmode.st/auth
+
+# 1. discovery document lists all endpoints
+curl -s "$ISSUER/.well-known/openid-configuration" | jq .
+
+# 2. request a challenge for any cashaddr (server just holds it 5 min)
+curl -s -X POST -H 'content-type: application/json' \
+  -d '{"cashaddr":"bitcoincash:qq00000000000000000000000000000000000000q"}' \
+  "$ISSUER/challenge"
+# → returns {"nonce": "...", "message": "code.silentmode.st wants you to sign in..."}
+
+# 3. any BCH wallet that speaks "Sign Message" can produce a valid signature
+#    for that exact message. Then POST it:
+curl -s -X POST -H 'content-type: application/json' \
+  -d '{"nonce":"THE_NONCE","signature":"BASE64_SIG"}' \
+  "$ISSUER/verify"
+# → returns {"redirect": "https://code.silentmode.st/user/oauth2/hephaestus-wallet/callback?code=..."}
+

For the JS side (which is what the browser does), inspect auth-proxy/public/wallet.js in the repo — it's ~250 lines and does exactly this: generateBip39Mnemonic → deriveHdPath("m/44'/145'/0'/0/0") → sign(magicHash(message)). Nothing exotic.

+ +

Common browser-side checks

+

If your CLI drives a real browser (Playwright, Puppeteer, curl-with-cookies) and you want to know if you're actually signed in:

+
// The URL bar isn't reliable when Forgejo shows Security or Settings pages —
+// they render for logged-in users but don't have "Dashboard" in the title.
+// Best check: does the profile menu render, and is there no "Sign in" link?
+
+const signedIn = !document.querySelector('a[href*="/user/login"]')
+              && !!document.querySelector('[aria-label*="Profile"], .user-menu, .avatar');
+
+// The username, if you're on the Dashboard:
+document.title.match(/^(bch_\w+)/)?.[1];
+ +

Do not test with fetch('/api/v1/user') unless you have an API token. That endpoint requires token auth even when you're signed into the web UI. Session cookies get you into Forgejo pages; they don't get you into the token-scoped API. A 401 there means "no token" — it does not mean "not signed in."

+
+ +
+

Push some code

+

Two paths, either works. Pick whichever fits your setup.

+ +

Over HTTPS (with an access token)

+

Log in, open Settings → Applications → Generate New Token, give it write:repository scope. Then:

+
git clone https://your_bch_username:YOUR_TOKEN@code.silentmode.st/your_bch_username/your-repo.git
+cd your-repo
+echo "Hello, forge" > README.md
+git add README.md && git commit -m "hello"
+git push
+ +

Over SSH (with your existing key)

+

Add your public key to Settings → SSH / GPG Keys → Add Key. Then use port 2222:

+
git clone ssh://git@code.silentmode.st:2222/your_bch_username/your-repo.git
+

Your key is only trusted for git-over-SSH; there's no shell access.

+
+ +
+

How it fits together

+
            you (browser)
+                │
+       https://code.silentmode.st/
+                │
+     ┌──────────┴──────────┐
+     │        Caddy        │  ← Let's Encrypt cert, HTTP/3
+     │   (path-based mux)  │
+     └──┬───────────────┬──┘
+        │               │
+        │/auth/*        │/
+        ▼               ▼
+   auth-proxy       Forgejo ── Postgres      (live git repos + DB
+   (OIDC provider) ───┬───                    on local VPS SSD)
+   Node/Fastify       │
+   libauth for        │ storage backend
+   BCH signature      ▼
+   verification    s3.silentmode.st:8600  ← s3d gateway
+                       │
+                       ▼
+                  Sia network hosts
+                  (LFS, attachments,
+                   packages, archives)
+ + + + + + + + + +
ComponentRole
Forgejo 10Web UI, PRs, issues, releases, container/npm registry, git-over-HTTPS + SSH
Postgres 16User records, issues, PRs, permissions, session state
Caddy 2Reverse proxy + automatic Let's Encrypt TLS + HTTP/3
auth-proxyOIDC provider (Node/Fastify + libauth). Issues signed challenges, verifies BCH signatures, mints OAuth codes.
s3d → SiaCold storage. Files are encrypted client-side, sharded via Reed-Solomon, scattered across independent hosts.
resticNightly encrypted snapshots (Postgres + /data/git) to a separate Sia bucket. Systemd timer at 03:15 UTC.
+
+ +
+

Wallet-auth protocol

+

Any BCH wallet that speaks Bitcoin Signed Message can produce a signature Hephaestus will accept. There is no Hephaestus-specific signing format.

+ +
Message the wallet signs:
+─────────────────────────────
+code.silentmode.st wants you to sign in with your Bitcoin Cash account:
+bitcoincash:qzkc695pm4r3p7kcq36sh0t3fdu5e6ua7u2ar36vea
+
+By signing, you prove you control this address. This request will not
+trigger a blockchain transaction or cost any fees.
+
+Domain: code.silentmode.st
+Nonce: e65d80b51d3f1baa2efb8d952d827104
+Issued At: 2026-08-29T17:50:12.655Z
+ +

Signature is standard BIP-137-style recoverable ECDSA over the SHA256(SHA256(varint(magic) || magic || varint(msg) || msg)) digest, base64-encoded. The server recovers the pubkey, derives the cashaddr, and matches it against the address you claimed. Nonces expire after 5 minutes and are single-use.

+ +

OIDC id_token claims: sub = full cashaddr, preferred_username = "bch_" + first-20-of-address, plus a custom cashaddr claim carrying the full address for downstream tools. Signed with EdDSA (Ed25519).

+
+ +
+

For operators self-host your own

+

Hephaestus is a docker-compose stack. Everything you need is in the silentmode monorepo under Hephaestus/. To stand up your own instance:

+ +
    +
  1. Get a Linux VPS with Docker (2 GB RAM, ~10 GB free disk minimum). A domain name pointing at it. Ports 80/443/2222 open.
  2. +
  3. Clone the repo, copy the env template +
    git clone ssh://git@code.silentmode.st:2222/silentmode/silentmode.git
    +cd silentmode/Hephaestus
    +cp .env.example .env
    +# fill in real values — see .env.example for what each field means
  4. +
  5. Bring it up +
    docker compose up -d
    + First run pulls ~500 MB of images and builds the auth-proxy. Give it a few minutes.
  6. +
  7. Complete Forgejo install via POST to / with your admin creds (see PROTOCOL.md in the repo for the exact field list — Forgejo's --config path prevents the CLI installer working, so it has to be the HTTP path).
  8. +
  9. Register the wallet OIDC provider +
    docker compose exec forgejo forgejo \
    +    --config /data/gitea/conf/app.ini admin auth add-oauth \
    +    --provider openidConnect \
    +    --name hephaestus-wallet \
    +    --key "$AUTH_PROXY_CLIENT_ID" --secret "$AUTH_PROXY_CLIENT_SECRET" \
    +    --auto-discover-url "$AUTH_PROXY_ISSUER/.well-known/openid-configuration" \
    +    --scopes "openid profile"
  10. +
+ +

Gotchas we hit — save yourself the same debugging

+
    +
  • Forgejo's docker entrypoint re-writes app.ini from env vars on every start — sed edits inside the container get clobbered. Everything must come from FORGEJO__section__KEY env vars in docker-compose.yml.
  • +
  • DISABLE_REGISTRATION=true blocks OIDC auto-provisioning too, not just the local form. Use DISABLE_REGISTRATION=false + ALLOW_ONLY_EXTERNAL_REGISTRATION=true + SHOW_REGISTRATION_BUTTON=false.
  • +
  • Forgejo needs [oauth2_client] ENABLE_AUTO_REGISTRATION=true AND USERNAME=preferred_username AND an email claim on the id_token (auth-proxy synthesizes one).
  • +
  • Forgejo usernames are [a-zA-Z0-9-_.]+, max 40 chars. Raw cashaddrs (54 chars, colon) don't fit — auth-proxy sends bch_<first-20> as the username while keeping the full cashaddr in sub.
  • +
  • When serving auth-proxy under a /auth/* path prefix behind a reverse proxy, all client-side asset paths and fetch URLs must be path-relative (no leading slash), otherwise the browser resolves them to origin root and hits the wrong service.
  • +
+
+ +
+

Status

+ + + + + + + + + +
Live atcode.silentmode.st
SignupOpen (wallet-only; local registration disabled)
StorageSia network for cold blobs, VPS SSD for hot path
BackupsNightly restic → separate Sia bucket, encrypted client-side
Sourcesilentmode/silentmode (private — request access from an admin), or the local checkout under Hephaestus/
LicenseForgejo is GPL-3.0. Auth-proxy + Caddyfile + docker-compose scaffolding is part of the Silent Mode monorepo.
ChainChipnet (Bitcoin Cash test network) alpha
BCNR namehephaestus.x — minted on chipnet, points at https://code.silentmode.st/. Resolve via navigate.st gateway or any BCNR-aware browser (Theseus, Ariadne).
+ +

Report an issue. Open one at silentmode/silentmode/issues once you have access, or ping in the usual Silent Mode channels.

+
+ +
+ +
+
+ Silent Mode — a Deviant project · Hephaestus is one of the Silent Mode tools · silentmode.st +
+
+ + + diff --git a/hermes/index.html b/hermes/index.html new file mode 100644 index 0000000..923821e --- /dev/null +++ b/hermes/index.html @@ -0,0 +1,162 @@ + + + + + +Hermes — messaging by name — Silent Mode + + + + + + + + + + + + + + + + + +
+
⛓️✉️
+

Hermes designed · not yet built

+

End-to-end encrypted DMs over Nostr, addressed by your + .bch name instead of a public-key string. Same wallet + is your identity — no email, no phone number, no company, no server that can delete + your account.

+
+ +
+ +
+

The one idea that makes this different

+

Every existing Nostr client has the same wart: identity is + npub1q8s7f3k… gibberish. The human-name fix — NIP-05 — + resolves alice@example.com through a DNS domain and a + web server. That is exactly the ICANN + server chain Silent Mode exists to escape. + Decentralized messaging bolted onto centralized identity.

+ +
The Hermes pitch.
+ alice.bch publishes her Nostr pubkey as an on-chain + record. Her name certificate is her verified, seizure-resistant identity. + Message anyone by their .bch name — no phone number, no + email, no ICANN, no company, no server that can delete your account.
+
+ +
+

How it works

+
    +
  1. Your name owns your key. + Register any name you like on the chain (or reuse one you already own), + publish your Nostr pubkey to it as a new np record. + The key is derived from the same wallet seed as the name itself, so one seed + backs both.
  2. +
  3. Find people by name. + Type bob.bch. The client resolves it against + the chain, pulls np (Nostr pubkey) and + nr (preferred relays). No directory server involved.
  4. +
  5. Send the message sealed. + NIP-17 gift-wrapped DMs — the relay sees neither sender nor content, only + that a wrap addressed to some pubkey exists. Route over Tor to also hide your + IP; Theseus already can.
  6. +
  7. The name shows, not the pubkey. + Incoming messages reverse-resolve pubkey → name where possible, so your + chat list looks like a normal chat list — not a wall of hex.
  8. +
+
+ +
+

Where it will live

+
+
+

In Theseus desktop

+

A Messages panel inside the browser you already have. Routes relay traffic over + Tor. Reuses the built-in wallet's seed as the messaging identity.

+
+
+

In Ariadne mobile phone

+

A Messages screen in the existing Android app. Same seed, same identity — you + can message from either device without a linked-account handshake.

+
+
+
+ +
+

Where your history lives

+

Three modes, one toggle. The default assumes no cloud at all — every + later option is opt-in, and none of them let anyone but you read your messages.

+
+
+

Local only default

+

The client keeps your message history on the device. Nothing else knows it + exists. Same seed on Theseus and Ariadne gives you two-device redundancy for + free — lose one, restore from the other. Lose both, history is gone. Signal's + model, on purpose.

+
+
+

Silent Mode cloud backup opt-in

+

Toggle on and the client encrypts your message history with a key derived + from your wallet seed, then backs it up to decentralized cloud storage on + the Sia network. Only you can read it. Text messages only — no + pictures, no video, no attachments.

+
+
+

Your own Sia account advanced

+

Prefer to own the storage yourself? Hermes sets up your own Sia account + and routes your backups there instead. Same encryption from your wallet + seed — and this time media backup is on the table too.

+
+
+
+ +
+

Honest boundaries

+
+
+

Messaging, not email

+

No Gmail interop — by design. A separate anonymous-mailbox product covers + "sign up on services without leaking a real address."

+
+
+

Metadata resistance is good, not perfect

+

NIP-17 hides sender and content from relays. Relays still see the recipient + pubkey, timing, and your connection IP unless you route over Tor. The UI will + tell you when it's on.

+
+
+

Relays are Nostr's soft spot

+

A message lives only while some relay keeps it. Silent Mode runs one relay on + the same anonymous VPS as the gateway, and writes to a few public relays for + reach and redundancy.

+
+
+
+ +
Status: designed, not built. The full protocol design is + in Hermes/DESIGN-hermes.md + (mirror). Nothing to install yet — this page exists to say what is coming, and to + make it possible to ask for updates in the messaging panel of a future Theseus or + Ariadne build.
+ +
+ +
+
Silent Mode — a Deviant project.
+
Named for the messenger of the gods. Not yet built. Contents subject + to change until the first client ships.
+
+ + + diff --git a/home-cards.json b/home-cards.json new file mode 100644 index 0000000..b280b5e --- /dev/null +++ b/home-cards.json @@ -0,0 +1,11 @@ +[ + { "title": "hello.bch", "url": "https://hello.bch/", "sub": "A small page on the blockchain itself.", "badge": "on-chain" }, + { "title": "siatest.bch", "url": "https://siatest.bch/", "sub": "A page with no server, backed by Sia.", "badge": "Sia" }, + { "title": "SilentMode.X", "url": "https://silentmode.x/", "sub": "Infrastructure development for a decentralized web.", "badge": "Infrastructure" }, + { "title": "Theseus.X", "url": "https://theseus.x/", "sub": "The Web Navigator — this browser's own address.", "badge": "Navigator" }, + { "title": "Sirius.X", "url": "https://sirius.x/", "sub": "Register and manage BCDN names.", "badge": "Registrar" }, + { "title": "Hephaestus.X", "url": "https://hephaestus.x/", "sub": "The forge — Silent Mode's code host.", "badge": "Code host" }, + { "title": "Prometheus.X", "url": "https://prometheus.x/", "sub": "Decentralized App Marketplace.", "badge": "App store" }, + { "title": "Helios.X", "url": "https://helios.x/", "sub": "Search engine for the decentralized web (in design).", "badge": "Search" }, + { "title": "Hermes.X", "url": "https://hermes.x/", "sub": "Messaging — end-to-end encrypted over Nostr.", "badge": "Messaging" } +] diff --git a/index.html b/index.html new file mode 100644 index 0000000..e9afc09 --- /dev/null +++ b/index.html @@ -0,0 +1,170 @@ + + + + + +Silent Mode — decentralized web infrastructure + + + + + + + + + + + + + + + + + +
+
+

Silent Mode

+

A development department for the decentralized web. We build names, + hosting, apps, search, messaging, and the clients that reach them — everything you + need to run a site nobody can seize, and everything you need to visit one.

+ +

+ New to any of this? Start with the choice → +

+
+ +
+ Theseus Navigator showing https://hello.bch with the BCDN badge in the address bar — the page loaded with no DNS lookup and no registrar. +
Theseus opening hello.bch: the name was read from the Bitcoin Cash chain, the page from the network — no DNS was asked, no registrar consulted.
+
+ +
+ + +
+ This page is ordinary web infrastructure. silentmode.st + runs on nginx, a rented server, an ICANN domain, and a Let's Encrypt certificate — because + the point of this page is to talk about the alternative web, and the widest + audience needs no install to read it. +

+ The project's own demonstration lives at silentmode.bch + — same project, hosted with the tools it describes. No centralized host, no registrar + entity, no DNS, no certificate authority. + + Any resolver installed? Try it natively: https://silentmode.bch/ + +
+ + +
+

What we build

+

Seven pieces, each named for a figure whose role matches its function. + Each solves one part of the "how do we run a web without gatekeepers" problem, and + all of them interoperate around one thing: a name on the Bitcoin Cash chain.

+ +
+ +
+ alpha +

Theseus browsers & resolvers

+

Two flagship browsers, one brand across platforms — Ariadne resolver built in. + Also: the public relay (no install), the Firefox extension, and a standalone + Ariadne Resolver for system-wide BNS in every browser.

+

See all tools →

+
+ +
+ live +

Sirius names

+

Domain names on Bitcoin Cash — permanent, no renewal, no registrar. Register a + name in one transaction, hold it in your wallet, point it at any content on any + network.

+

Register a name →

+
+ +
+ live +

Hephaestus code

+

A code forge you sign into with a Bitcoin Cash wallet. Forgejo UI, repos on the + host, LFS/releases/packages on Sia. No email, no password reset, no middleman. + Live at code.silentmode.st.

+

See Hephaestus →

+
+ +
+ designed +

Prometheus apps

+

Home for apps and programs published on chain, hosted on Sia. Categories, + signed endorsements, verified installs. Anyone can publish; nobody can gatekeep.

+

Browse Prometheus →

+
+ +
+ designed +

Helios search

+

A search engine for the decentralized web. No central crawler to trust, no + authority to rank, no advertiser to serve. Ranking by trust list, not algorithm.

+

How it will work →

+
+ +
+ designed +

Hermes messages

+

End-to-end encrypted messaging over Nostr, addressed by your BNS name instead + of a public-key string. Same wallet is your identity — no email, no phone number, + no company.

+

Read the design →

+
+ +
+ designed +

Argo hosting pact

+

The incentive layer nobody pays for today. Independent hosts pooling to keep + your site up, paid by a covenant on chain. The piece that turns "you can host + it" into "someone will keep hosting it."

+
+ +
+
+ + +
+

One thread through all of them

+

Everything above depends on one thing: a name registered on the + Bitcoin Cash chain, held in a wallet you control. That name is your address on + Prometheus, your identity on Hermes, your ranking signal on Helios, and the URL + Tools resolve. Register once; use it everywhere. Nobody issues it, nobody revokes + it, and no service you use here needs an account.

+ +
+ +
Verify everything, trust nothing. Every download published here is + fingerprinted with SHA-256; the canonical list is at /releases/. + Alpha software on a test network — expect it to change, and check hashes before you + install.
+ +
+ +
+
Silent Mode — a Deviant project.
+
A development department for the decentralized web. Nothing here is a + service, product guarantee, or investment. Verify against the chain; trust nothing + that cannot be checked.
+
+ + + diff --git a/js/bns-register.js b/js/bns-register.js new file mode 100644 index 0000000..4df7f7a --- /dev/null +++ b/js/bns-register.js @@ -0,0 +1,7 @@ +import{generateBip39Mnemonic as ae,deriveSeedFromBip39Mnemonic as Lt,deriveHdPrivateNodeFromSeed as ce,deriveHdPath as le,secp256k1 as de,hash160 as ue,encodeCashAddress as un,lockingBytecodeToCashAddress as he,cashAddressToLockingBytecode as hn,binToHex as pe,hexToBin as pn,utf8ToBin as Ht,binToBase64 as xt,base64ToBin as bt}from"@bitauth/libauth";var at="bchtest";var fe="m/44'/145'/0'",ge=5,ht="bns.wallet.v1";function Mt(e){let t=ue(e);return Uint8Array.from([118,169,20,...t,136,172])}function Ct(e,t,n){let s=he({bytecode:Mt(e),prefix:t,tokenSupport:n});if(typeof s=="string")throw new Error(`address encoding failed: ${s}`);return s.address}var St=class e{constructor(t,n,s=at){this.mnemonic=t,this.prefix=s,this._root=ce(n),this._keys=new Map,this._derive()}static async create(t=at){let n=ae();return new e(n,await Lt(n),t)}static async fromMnemonic(t,n=at){let s=String(t).trim().toLowerCase().replace(/\s+/g," "),o=await Lt(s);if(typeof o=="string")throw new Error(`invalid recovery phrase: ${o}`);return new e(s,o,n)}_derive(){this.receive=[],this.change=[];for(let[t,n]of[[0,this.receive],[1,this.change]])for(let s=0;st.address)}keyFor(t){let n=this._keys.get(t);return n?{privateKey:n.privateKey,publicKey:n.publicKey}:null}async encrypt(t){let n=crypto.getRandomValues(new Uint8Array(16)),s=crypto.getRandomValues(new Uint8Array(12)),o=await Ut(t,n),r=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:s},o,Ht(this.mnemonic)));return JSON.stringify({v:1,kdf:"PBKDF2-SHA256",iterations:kt,prefix:this.prefix,salt:xt(n),iv:xt(s),ct:xt(r)})}static async decrypt(t,n){let s=typeof t=="string"?JSON.parse(t):t,o=await Ut(n,bt(s.salt),s.iterations??kt),r;try{r=await crypto.subtle.decrypt({name:"AES-GCM",iv:bt(s.iv)},o,bt(s.ct))}catch{throw new Error("wrong password")}return e.fromMnemonic(new TextDecoder().decode(r),s.prefix??at)}async save(t,n=globalThis.localStorage){n.setItem(ht,await this.encrypt(t))}static async load(t,n=globalThis.localStorage){let s=n.getItem(ht);return s?e.decrypt(s,t):null}static exists(t=globalThis.localStorage){return!!t?.getItem(ht)}static forget(t=globalThis.localStorage){t.removeItem(ht)}},kt=25e4;async function Ut(e,t,n=kt){let s=await crypto.subtle.importKey("raw",Ht(String(e)),"PBKDF2",!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"PBKDF2",salt:t,iterations:n,hash:"SHA-256"},s,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}var pt=["wss://silentmode.st/electrum","wss://chipnet.bch.ninja:50004","wss://chipnet.imaginary.cash:50004","wss://tbch4.loping.net:62002"],vt=class{constructor(t,n){this.url=t,this.WS=n||globalThis.WebSocket,this.id=0,this.pending=new Map,this.buf=""}connect(){return new Promise((t,n)=>{let s=new this.WS(this.url);this.ws=s;let o=async()=>{try{await this.call("server.version",["bns-web","1.4.2"]),t(this)}catch(i){n(i)}},r=i=>n(new Error("electrum ws error: "+(i?.message||this.url))),a=i=>this._onData(typeof i.data=="string"?i.data:i.data.toString());s.addEventListener?(s.addEventListener("open",o),s.addEventListener("error",r),s.addEventListener("message",a)):(s.onopen=o,s.onerror=r,s.onmessage=a)})}_handle(t){let n=this.pending.get(t.id);n&&(this.pending.delete(t.id),t.error?n.reject(new Error(JSON.stringify(t.error))):n.resolve(t.result))}_onData(t){this.buf+=t;let n;for(;(n=this.buf.indexOf(` +`))>=0;){let o=this.buf.slice(0,n).trim();if(this.buf=this.buf.slice(n+1),o)try{this._handle(JSON.parse(o))}catch{}}let s=this.buf.trim();if(s)try{let o=JSON.parse(s);this._handle(o),this.buf=""}catch{}}call(t,n=[]){let s=++this.id;return new Promise((o,r)=>{this.pending.set(s,{resolve:o,reject:r}),this.ws.send(JSON.stringify({id:s,method:t,params:n})+` +`),setTimeout(()=>{this.pending.has(s)&&(this.pending.delete(s),r(new Error(`electrum timeout: ${t}`)))},2e4)})}close(){try{this.ws.close()}catch{}}};async function Wt(e=pt,t){let n=[];for(let s of e)try{return await new vt(s,t).connect()}catch(o){n.push(`${s}: ${o?.message??o}`)}throw ye(e.length,n)}function ye(e,t){let n=new Error(`no electrum server reachable (tried ${e}). These use non-standard ports, which some networks and VPNs block: + ${t.join(` + `)}`);return n.code="NO_ELECTRUM",n.failures=t,n}import{cashAddressToLockingBytecode as we,lockingBytecodeToCashAddress as me,sha256 as xe,hash160 as wn,binToHex as be,hexToBin as mn}from"@bitauth/libauth";function jt(e){return be(xe.hash(e).slice().reverse())}function S(e){let t=we(e);if(typeof t=="string")throw new Error(`bad address "${e}": ${t}`);return t.bytecode}function Se(e){return jt(S(e))}function F(e){let t=S(e),n=String(e).includes(":")?e.split(":")[0]:"bchtest",s=me({bytecode:t,prefix:n,tokenSupport:!0});if(typeof s=="string")throw new Error(`cannot token-encode "${e}": ${s}`);return s.address}async function Kt(e,t){let n=S(t),s=jt(n);return(await e.call("blockchain.scripthash.listunspent",[s,"include_tokens"])).map(r=>({txid:r.tx_hash,vout:r.tx_pos,satoshis:BigInt(r.value),height:r.height,address:t,lockingBytecode:n,token:r.token_data?{category:r.token_data.category,amount:BigInt(r.token_data.amount??0),nft:r.token_data.nft?{capability:r.token_data.nft.capability,commitment:r.token_data.nft.commitment}:void 0}:void 0}))}async function R(e,t){let n=[];for(let s of t)n.push(...await Kt(e,s));return n}async function q(e,t){return e.call("blockchain.transaction.broadcast",[t])}import{binToHex as At,hexToBin as Y,utf8ToBin as ct,binToUtf8 as ke,encodeTransaction as ve,decodeTransaction as Sn}from"@bitauth/libauth";var Te="BNS1",zt="bchtest:qp8njaa9a3ahg7259s5qajnce526n0rttsq8qwx4jl",qt="bchtest:qzc4c76vtw9nd49g6x8nmvc0jz62uvk4dc7hmpmerh",I=600n,M=1000n,G=546n,Tt="bch",Et=200,Ee=/^[a-z0-9-]{1,32}$/,Gt=/^[a-z0-9-]{1,16}$/;function dt(e){let t=String(e).toLowerCase().trim().replace(/^\.+/,"").replace(/\.+$/,"");if(!Gt.test(t))throw new Error(`invalid TLD "${e}" (allowed: [a-z0-9-]{1,16})`);return t}var ft=class extends Error{constructor(t){super(t),this.name="NoGenesisInputError",this.code="NO_GENESIS_INPUT"}},U=class extends Error{constructor(t,{needSats:n,haveSats:s}={}){super(t),this.name="InsufficientFundsError",this.code="INSUFFICIENT_FUNDS",this.needSats=n,this.haveSats=s}};function P(e){let t=String(e).toLowerCase().trim().replace(/\.$/,"").split(".").filter(Boolean),n,s;if(t.length===0)throw new Error(`invalid name "${e}"`);if(t.length===1?(n=t[0],s=Tt):(s=t[t.length-1],n=t[t.length-2]),!Ee.test(n)||!Gt.test(s))throw new Error(`invalid name "${e}" (allowed: