feat(deviant.x): /wallet/ download landing page

Dedicated hub at deviant.x/wallet/ (Sia-hosted, mirrored on
silentmode.st/apps/deviant/wallet/) with APK + PWA install cards, live
manifest fetch for SHA-256 + size + published date, "what's in it" summary,
and a chipnet warning.

Picked /wallet over /dl for SEO (keyword alignment with "deviant wallet"
searches), content-hub potential (room for /wallet/ios/, /wallet/docs/),
and consistency with the rest of the site's word paths (/potidaea/,
/artemision/, /katalogos/).

APK + manifest stay at silentmode.st (fast HTTP, 32 MB per release is
expensive on Sia); the download page uses absolute URLs so clicks resolve
the same whether the HTML was served from Sia or silentmode.st.

Template preserved at Parameters/webfiles/deviant_wallet_download.html so
future updates have a tracked source.

See snapshots/0277-wallet-download-page-deviant-x-wallet.md.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Local Dev 2026-10-23 16:36:47 +03:00
parent 0a9c768001
commit 600f4e7873
3 changed files with 380 additions and 2 deletions

View file

@ -0,0 +1,316 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Deviant Wallet — download</title>
<meta name="description" content="Download the Deviant wallet — a chipnet-first BCH wallet with ASM/Potidaea swaps, Anthemus DEX, Agora, BNS resolution, and multisig cosign. APK, PWA, source.">
<link rel="icon" href="https://silentmode.st/deviant/brand/icon/favicon.svg" type="image/svg+xml">
<link rel="canonical" href="https://deviant.x/wallet/">
<meta property="og:title" content="Deviant Wallet">
<meta property="og:description" content="Chipnet-first Bitcoin Cash wallet. APK, PWA, source — all on deviant.x.">
<meta property="og:image" content="https://silentmode.st/deviant/brand/source/exports/icon-512.png">
<meta property="og:url" content="https://deviant.x/wallet/">
<meta name="twitter:card" content="summary_large_image">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600&family=DM+Sans:wght@400;500;600;700&family=DM+Mono:wght@400;500&display=swap">
<style>
:root {
--sky-deep: #050810;
--sky-mid: #0a0f1c;
--sky-rim: #131a2a;
--ink-soft: #b8c2d4;
--ink: #d6dde9;
--ink-bright: #f1f4fa;
--muted: #6a7488;
--acid: #d6ff3d;
--acid-glow: rgba(214, 255, 61, 0.55);
--acid-halo: rgba(214, 255, 61, 0.22);
--acid-dim: rgba(214, 255, 61, 0.08);
--card: rgba(255, 255, 255, 0.04);
--card-border: rgba(255, 255, 255, 0.08);
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
background: radial-gradient(ellipse at top, var(--sky-rim) 0%, transparent 60%),
radial-gradient(ellipse at bottom right, var(--sky-mid) 0%, transparent 50%),
var(--sky-deep);
background-attachment: fixed;
color: var(--ink);
font-family: 'Fraunces', Georgia, serif;
font-weight: 400;
min-height: 100vh;
overflow-x: hidden;
padding: 32px 20px 80px;
}
a { color: var(--acid); text-decoration: none; }
a:hover { text-decoration: underline; }
.wrap { max-width: 820px; margin: 0 auto; }
nav.top {
display: flex; justify-content: space-between; align-items: center;
margin-bottom: 48px; font-family: 'DM Sans', sans-serif; font-size: 14px;
}
nav.top .brand {
display: inline-flex; align-items: center; gap: 10px;
color: var(--ink-bright); font-weight: 500;
}
nav.top .brand img { width: 28px; height: 28px; }
nav.top .links a { color: var(--ink-soft); margin-left: 20px; }
nav.top .links a:hover { color: var(--acid); text-decoration: none; }
header.hero { text-align: center; padding: 20px 0 44px; }
header.hero .mark { width: 96px; height: 96px; margin: 0 auto 20px; display: block; }
header.hero h1 {
font-family: 'Fraunces', serif; font-weight: 400;
font-size: clamp(2rem, 6vw, 3.4rem); letter-spacing: -0.02em;
color: var(--ink-bright);
margin-bottom: 12px;
}
header.hero h1 .g { color: var(--acid); }
header.hero p.lede {
color: var(--ink-soft); font-size: 1.1rem; max-width: 560px;
margin: 0 auto; line-height: 1.6;
}
.version-pill {
display: inline-flex; align-items: center; gap: 8px;
margin-top: 20px; padding: 6px 14px; border-radius: 999px;
background: var(--acid-dim); border: 1px solid var(--acid-halo);
font-family: 'DM Mono', monospace; font-size: 12px; color: var(--acid);
}
.version-pill .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--acid); box-shadow: 0 0 8px var(--acid-glow); }
.install-grid {
display: grid; grid-template-columns: 1fr 1fr; gap: 16px;
margin-top: 32px;
}
@media (max-width: 640px) { .install-grid { grid-template-columns: 1fr; } }
.install {
background: var(--card); border: 1px solid var(--card-border);
border-radius: 14px; padding: 22px 20px;
transition: border-color 0.15s, transform 0.15s;
}
.install:hover { border-color: var(--acid-halo); transform: translateY(-1px); }
.install .platform {
font-family: 'DM Sans', sans-serif; font-size: 11px; letter-spacing: 0.1em;
text-transform: uppercase; color: var(--muted); margin-bottom: 8px;
}
.install h2 {
font-family: 'Fraunces', serif; font-weight: 500; font-size: 1.4rem;
color: var(--ink-bright); margin-bottom: 6px;
}
.install p { font-size: 14px; color: var(--ink-soft); line-height: 1.6; margin-bottom: 16px; }
.install .btn {
display: inline-flex; align-items: center; gap: 8px;
padding: 10px 18px; border-radius: 8px;
font-family: 'DM Sans', sans-serif; font-weight: 600; font-size: 14px;
background: var(--acid); color: #0b0e14;
text-decoration: none;
}
.install .btn:hover { opacity: 0.9; text-decoration: none; }
.install .btn.ghost {
background: transparent; color: var(--acid);
border: 1px solid var(--acid-halo);
}
.install .meta {
display: flex; flex-wrap: wrap; gap: 10px;
margin-top: 10px; font-family: 'DM Mono', monospace;
font-size: 11px; color: var(--muted);
}
.install .meta code {
background: rgba(0,0,0,0.3); padding: 2px 6px; border-radius: 4px;
color: var(--ink-soft);
word-break: break-all;
}
section.what {
margin-top: 56px; padding: 28px;
background: var(--card); border: 1px solid var(--card-border);
border-radius: 14px;
}
section.what h3 {
font-family: 'Fraunces', serif; font-weight: 500; font-size: 1.4rem;
color: var(--ink-bright); margin-bottom: 14px;
}
section.what ul { list-style: none; padding: 0; }
section.what li {
padding: 6px 0; color: var(--ink-soft); font-size: 15px; line-height: 1.6;
display: flex; gap: 10px; align-items: baseline;
}
section.what li::before {
content: "⌁"; color: var(--acid); font-size: 14px; flex: none;
}
section.what li b { color: var(--ink-bright); font-weight: 500; }
section.safety {
margin-top: 24px; padding: 20px 24px;
background: rgba(255, 165, 0, 0.04);
border: 1px solid rgba(255, 165, 0, 0.18);
border-radius: 12px;
font-size: 13.5px; line-height: 1.6; color: var(--ink-soft);
}
section.safety b { color: #ffb74d; font-weight: 500; }
section.history {
margin-top: 40px;
}
section.history h3 {
font-family: 'Fraunces', serif; font-weight: 500; font-size: 1.2rem;
color: var(--ink-bright); margin-bottom: 14px;
}
section.history .rel {
display: flex; justify-content: space-between; align-items: baseline;
padding: 12px 0; border-top: 1px solid var(--card-border);
font-family: 'DM Sans', sans-serif; font-size: 14px;
}
section.history .rel .ver { color: var(--acid); font-weight: 500; }
section.history .rel .date { color: var(--muted); font-size: 12px; }
section.history .rel a { color: var(--ink-soft); font-size: 12px; }
footer {
margin-top: 72px; padding-top: 24px;
border-top: 1px solid var(--card-border);
display: flex; justify-content: space-between; align-items: center;
font-family: 'DM Sans', sans-serif; font-size: 12px; color: var(--muted);
}
footer a { color: var(--muted); }
footer a:hover { color: var(--acid); }
</style>
</head>
<body>
<div class="wrap">
<nav class="top">
<a class="brand" href="https://silentmode.st/deviant/">
<img src="https://silentmode.st/deviant/brand/icon/icon-512.svg" alt="">
<span>Deviant</span>
</a>
<div class="links">
<a href="https://silentmode.st/deviant/">Home</a>
<a href="https://silentmode.st/deviant/potidaea/">Potidaea</a>
<a href="https://silentmode.st/deviant/anthemus/">Anthemus</a>
<a href="https://code.silentmode.st/silentmode/deviant">Source</a>
</div>
</nav>
<header class="hero">
<img class="mark" src="https://silentmode.st/deviant/brand/icon/icon-512.svg" alt="Deviant">
<h1>Deviant <span class="g">Wallet</span></h1>
<p class="lede">
A chipnet-first Bitcoin Cash wallet. Native ASM swaps via Potidaea, the Anthemus DEX, Agora liquidity, BNS resolution,
and interoperable multisig cosign.
</p>
<div class="version-pill">
<span class="dot"></span>
<span id="version-text">v0.1.2 · beta · chipnet</span>
</div>
</header>
<!-- INSTALL -->
<div class="install-grid">
<div class="install">
<div class="platform">Android</div>
<h2>APK</h2>
<p>Debug build. Direct install — enable "Install from unknown sources" on first launch.</p>
<a class="btn" id="apk-link" href="https://silentmode.st/apps/deviant/releases/deviant-wallet-latest.apk" download>⬇ Download APK</a>
<div class="meta">
<span>SHA-256:</span><code id="apk-sha">loading…</code>
</div>
<div class="meta">
<span>Size:</span><code id="apk-size">—</code>
<span>Updated:</span><code id="apk-date">—</code>
</div>
</div>
<div class="install">
<div class="platform">Browser</div>
<h2>Web app</h2>
<p>Progressive web app — open it, add to home screen, use. No install, auto-updates.</p>
<a class="btn ghost" href="https://silentmode.st/apps/deviant/">↗ Open the PWA</a>
<div class="meta">
<span>Works offline after first load.</span>
</div>
</div>
</div>
<!-- SAFETY -->
<section class="safety">
<b>Chipnet only.</b> Mainnet is selectable but this is pre-release software — fund it with chipnet test coins only.
Keys never leave the device; the whole stack is open-source and reproducible from the forge.
</section>
<!-- WHAT -->
<section class="what">
<h3>What's in it</h3>
<ul>
<li><b>Native BCH wallet.</b> Send, Receive, Sweep, Consolidate with the Aegis 600-coin cap and largest-first selection.</li>
<li><b>Potidaea · ASM swaps.</b> Counterparty-free BCH ↔ MBA via covenant pricing — no order book, no slippage, infinite depth at the mark.</li>
<li><b>Anthemus DEX.</b> P2P swaps for CashTokens with pair discovery.</li>
<li><b>Agora.</b> Public order book across the installed asset set.</li>
<li><b>BNS Send.</b> Type <code style="font-family:'DM Mono',monospace;background:rgba(0,0,0,0.3);padding:1px 5px;border-radius:3px">alice.bch</code> or <code style="font-family:'DM Mono',monospace;background:rgba(0,0,0,0.3);padding:1px 5px;border-radius:3px">sirius.x</code> — resolves via Ariadne, broadcasts to the resolved address.</li>
<li><b>Multisig cosign.</b> aegis.cosign.v1 inbox over Nostr NIP-59 — spec-interoperable with Aegis wallets.</li>
<li><b>WalletConnect.</b> Both WC (v2) and WizardConnect for BCH-native dApps.</li>
<li><b>Multi-account keystore.</b> Many wallets under one PIN (the Bitcoin.com model), independent + HD-account kinds.</li>
</ul>
</section>
<!-- HISTORY -->
<section class="history">
<h3>Release history</h3>
<div class="rel">
<div><span class="ver">v0.1.2</span> &nbsp;·&nbsp; <span>BNS Send, multisig inbox, 600-coin cap</span></div>
<div><span class="date">2026-10-23</span></div>
</div>
<div class="rel">
<div><span class="ver">v0.1.1</span> &nbsp;·&nbsp; <span>Dedicated Add-wallet flow, auto-update, beta banner retired</span></div>
<div><span class="date">2026-10-23</span></div>
</div>
</section>
<footer>
<div>
<a href="https://code.silentmode.st/silentmode/deviant">Source</a>
&nbsp;·&nbsp;
<a href="https://silentmode.st/deviant/">deviant.x</a>
&nbsp;·&nbsp;
<a href="https://silentmode.st/apps/deviant/releases/latest.json">manifest</a>
</div>
<div>MIT · deviant.x</div>
</footer>
</div>
<script>
// Fetch the live manifest and populate the APK hash + size + timestamp so this
// page always reflects the current release without a redeploy. The APK link
// itself points at `deviant-wallet-latest.apk` (symlink), so even an older
// cached page still downloads the right file.
(async () => {
try {
const r = await fetch('https://silentmode.st/apps/deviant/releases/latest.json?' + Math.floor(Date.now()/60000), { cache: 'no-store' });
if (!r.ok) return;
const m = await r.json();
if (m.version) document.getElementById('version-text').textContent =
`v${m.version} · ${m.channel || 'beta'} · chipnet`;
if (m.apk?.sha256) document.getElementById('apk-sha').textContent = m.apk.sha256;
if (m.apk?.bytes) document.getElementById('apk-size').textContent =
(m.apk.bytes / (1024 * 1024)).toFixed(1) + ' MB';
if (m.publishedAt) document.getElementById('apk-date').textContent =
m.publishedAt.slice(0, 10);
if (m.apk?.url) {
// Use the versioned URL from the manifest so share links are stable.
document.getElementById('apk-link').href = m.apk.url;
}
} catch {}
})();
</script>
</body>
</html>

View file

@ -0,0 +1,60 @@
---
domain: wallet
summary: deviant.x/wallet download landing page — Sia-hosted + silentmode.st mirror, live manifest fetch.
tags: wallet, deviant.x, download, sia, bns, seo, release-channel
---
# 0277 — deviant.x/wallet download landing
New marketing surface at `deviant.x/wallet/` collecting every install path in
one place.
## Why `/wallet` not `/dl`
Picked `/wallet` over `/dl` for SEO + hub potential:
- **Keyword alignment** — "deviant wallet" searches match the URL directly.
- **Content hub** — room to grow with `/wallet/ios/`, `/wallet/docs/`, release
notes, without reserving the whole site under a cryptic prefix.
- **Site consistency** — deviant.x already uses word paths (`/potidaea/`,
`/artemision/`, `/katalogos/`). `/dl` would be the odd one out.
## Where it's hosted
- **Primary (BNS)**: `s3://bns/deviant.x/wallet/index.html` (Sia), served via
`navigate.st/bns/deviant.x/wallet/` → the BNS gateway and any native BNS
resolver (Theseus, Ariadne's Thread) answer with the Sia blob.
- **Mirror**: `silentmode.st/apps/deviant/wallet/` (nginx), same content.
APK + manifest stay at `silentmode.st/apps/deviant/releases/...` — 32 MB on
Sia per release would be expensive, and the fast HTTP path is already
proven. The download page uses absolute URLs so clicks work the same
whether the HTML was served from Sia or from silentmode.st.
## Page shape
- Hero with the brand mark + a live version pill fed by `/releases/latest.json`
(shows current version · channel · network).
- Two install cards:
- **Android APK** — direct download, SHA-256 + size + published date fetched
live from the manifest so the page never shows stale integrity data.
- **Web app (PWA)** — opens the Capacitor shell served from
`/apps/deviant/`.
- "What's in it" list: BCH, Potidaea ASM, Anthemus, Agora, BNS Send, multisig
cosign, WalletConnect, multi-account keystore.
- Chipnet warning + MIT/open-source footer.
- Release history (static — rewrite with each snapshot).
Design mirrors the main deviant.x marketing site (Fraunces serif, acid-green
accent, dark theme) so the download page doesn't look like a different site.
Template saved to [Parameters/webfiles/deviant_wallet_download.html](Parameters/webfiles/deviant_wallet_download.html)
for traceability.
## How updates flow
Each release pushes a new `latest.json` to
`silentmode.st/apps/deviant/releases/`. The download page's JS fetches it on
load, so the SHA-256, size, and version pill always match the latest APK
without re-uploading the HTML to Sia. Only the Release history block below
the fold needs a manual tap on new releases.

View file

@ -10,7 +10,7 @@
> Duplicate snapshot numbers exist (0018, 0019, 0022, 0027, 0053, 0054, 0057, 0062, 0083, 0084,
> 0144, 0145, 0153, 0164) — they are distinct files, disambiguated below by slug.
_326 snapshots · 326 tagged · 8 domains · regenerate after adding one._
_327 snapshots · 327 tagged · 8 domains · regenerate after adding one._
## Quick-find — all snapshots (Ctrl-F by №, domain, tag, or word)
@ -338,12 +338,13 @@ _326 snapshots · 326 tagged · 8 domains · regenerate after adding one._
| [0276](0276-potidaea-chart-tab-plan.md) | wallet | potidaea ui chart oracle price-history plan | Design for a Potidaea Chart tab — historical price chart of any asset in USD, powered by a lean off-chain oracle history + on-chain covenant rate for MBAs |
| [0276](0276-wallet-bns-multisig-consolidate-cap.md) | wallet | wallet bns multisig aegis cosign nostr consolidation sweep 0.1.2 | BNS Send targets (alice.bch), Multisig cosign inbox (aegis.cosign.v1 interop), 600-coin cap on Sweep + Consolidate. |
| [0277](0277-potidaea-orbital-swap-retry-adaptation.md) | asm | asm potidaea orbital-swap retry zero-contention chipnet wallet-parity | Potidaea dApp (navigate.st/bns/potidaea.asm) adopts the tier-4 client-side optimistic chain + retry pattern shipped in the beta wallet AsmCore (snapshot 0272): claimViaWc / claimViaLocalSigner / claimViaLocalSignerShare wrapped with silent re-broadcast on txn-mempool-conflict, retry-status banner in pendingSheet, resolved-via-N badge on doneSheet. tsc clean, dApp built. |
| [0277](0277-wallet-download-page-deviant-x-wallet.md) | wallet | wallet deviant.x download sia bns seo release-channel | deviant.x/wallet download landing page — Sia-hosted + silentmode.st mirror, live manifest fetch. |
| [0278](0278-asm-sequencer-service-drafted-and-proved.md) | asm | asm potidaea orbital-swap sequencer tier-2 zero-contention chipnet proof daemon relay | Tier-2 ASM sequencer service drafted as a coordinator-funded HTTP relay + tested end-to-end on chipnet. 5 simultaneous /claim requests → 5/5 accepted with the daemon-assigned order forming a single reservoir chain (each tx spent the previous tx's reservoir output). Complements the tier-4 wallet retry from 0272/0275/0277 by adding the low-latency relay path with the wallet retry as fallback. |
| [0279](0279-asm-sequencer-full-stack-userfunded-wallet-wire-systemd.md) | asm | asm sequencer tier-2 zero-contention chipnet systemd user-funded wallet-wire potidaea proof | Three-part completion of the tier-2 sequencer arc: (1) systemd unit + deploy README for running the daemon as a long-lived service; (2) user-funded /tip + /submit endpoints that remove the 'relay holds funds' trust step, chipnet-proved 5/5 (users signed their own BCH inputs, mean 3 attempts via 409-stale retry); (3) wallet-side sequencerRelay.ts client in both shells/app and design/potidaea with probe-first-then-commit race-free dispatch. Plus a chipnet-fund-from-h.mjs helper that topped up A/C/E/F/G from wallet H. |
| [0280](0280-asm-sequencer-settings-ui-toggle.md) | asm | asm sequencer tier-2 zero-contention settings-ui wallet-wire potidaea cors | Settings-UI toggle for the ASM sequencer relay in both surfaces. Beta wallet gets a new 'ASM sequencer relay' group in SettingsScreen with URL input + live reachability probe. Potidaea's dynamic walletMenu gains the same input + status chip (drafted, not yet committed — needs the DEA session's co-mingled main.ts/app.html changes to land first). Server gained permissive CORS so browser probes succeed. Browser-verified reachable↔unreachable transitions against a live chipnet daemon. |
| [0281](0281-wallet-potidaea-balance-flash-overlay-removed.md) | wallet | potidaea bug-fix cleanup balance-paint theseus | Potidaea's "0.82 BCH flash → empty" balance race fixed by removing the pending-swap optimistic overlay layer (−251 lines) and the wc.on('idle') auto-wipe. |
## Wallet UI (shells/app) `(106)`
## Wallet UI (shells/app) `(107)`
- [0023-wallet-display-layer](0023-wallet-display-layer.md) — wallet display layer — D-1/D-2/D-4/D-6 surfaced in one structure · _wallet_
- [0024-wallet-send-import-d5](0024-wallet-send-import-d5.md) — Phase 2 Step 5 — tier-B send + import flows with D-5 · _wallet_
@ -450,6 +451,7 @@ _326 snapshots · 326 tagged · 8 domains · regenerate after adding one._
- [0275-wallet-auto-update-published](0275-wallet-auto-update-published.md) — Auto-update banner on-launch + published release channel on deviant.x (manifest + APK). · _wallet, auto-update, release, deviant.x, capacitor_
- [0276-potidaea-chart-tab-plan](0276-potidaea-chart-tab-plan.md) — Design for a Potidaea Chart tab — historical price chart of any asset in USD, powered by a lean off-chain oracle history + on-chain covenant rate for MBAs · _potidaea, ui, chart, oracle, price-history, plan_
- [0276-wallet-bns-multisig-consolidate-cap](0276-wallet-bns-multisig-consolidate-cap.md) — BNS Send targets (alice.bch), Multisig cosign inbox (aegis.cosign.v1 interop), 600-coin cap on Sweep + Consolidate. · _wallet, bns, multisig, aegis, cosign, nostr, consolidation, sweep, 0.1.2_
- [0277-wallet-download-page-deviant-x-wallet](0277-wallet-download-page-deviant-x-wallet.md) — deviant.x/wallet download landing page — Sia-hosted + silentmode.st mirror, live manifest fetch. · _wallet, deviant.x, download, sia, bns, seo, release-channel_
- [0281-wallet-potidaea-balance-flash-overlay-removed](0281-wallet-potidaea-balance-flash-overlay-removed.md) — Potidaea's "0.82 BCH flash → empty" balance race fixed by removing the pending-swap optimistic overlay layer (−251 lines) and the wc.on('idle') auto-wipe. · _potidaea, bug-fix, cleanup, balance-paint, theseus_
## ASM / Orbital Swap / Potidaea / Anthemus `(45)`