Messages only two people can read.
End-to-end encrypted chat. Every message is sealed on your device with the
Signal protocol before it touches the network — the server relays ciphertext
and understands none of it.
Visit the landing page · Open the app
One message, followed from Bob's phone to Kate's — the whole page is that journey.
![]() The whole story. Runs in your browser, installs as an app, free. |
![]() Fully responsive. Same journey, one hand. |
Every capture above is the live page — type in the hero terminal and the ciphertext line re-seals with your words; they even ride along into the journey's chat bubbles.
The source of Umbra's landing page — the site's business card, served at
fireplace.ignorelist.com/welcome/.
It's a single static page, built by hand:
- Astro (static output) + Lenis smooth scroll — no page framework, no GSAP.
- Hand-rolled canvas modules: a draggable dot-globe, a live "what our server sees" encryption demo, and an 800vh scroll-driven journey of a message — a custom scroll-progress engine that walks one message from a sender's phone, through the relay, to the recipient, seal intact the whole way.
- Interactive on purpose: type in the hero terminal and watch your words turn
into the real
3:PreKey envelope shape; write in the phone composer and send the message yourself.
The Umbra app itself (Flutter PWA + NestJS backend) lives in the main
Lentach/Fireplace repository.
The page makes no claim the product can't back:
- No fake trust signals — no download counts, no testimonials.
- "Public source", not "open source" — there is no LICENSE file yet; upgrade the wording only after adding one.
- The relay machine transforms nothing: same ciphertext in, same ciphertext out.
| Path | What it is |
|---|---|
src/pages/index.astro |
The whole page: nav, globe hero, journey, features, ledger, outro |
src/scripts/globe.ts |
Hero dot-globe (drag to rotate, Ctrl+scroll to zoom) |
src/scripts/journey.ts |
The spine: scroll-driven journey of a message; interactive send |
src/scripts/encrypt.ts |
"What our server sees" hero terminal demo |
src/scripts/util.ts |
Shared math/canvas helpers |
src/styles/landing.css |
All styling |
brand/ |
Logo sources (SVG + rendered PNGs) |
npm install
npm run dev # http://localhost:4321/welcome
npm run build && npm run preview.\deploy-landing.ps1Builds, uploads to a staging dir on the VM, atomic-swaps into the nginx-served
directory, and verifies the live URL + asset hashes. One-time nginx setup and
operational details: CLAUDE.md.
nginx block (one-time server setup)
Add to the host config, alongside the existing blocks (landing assets live
under /welcome/assets/):
location = /welcome { return 301 /welcome/; }
location ^~ /welcome/ {
alias /home/ubuntu/fireplace/landing-build/;
index index.html;
}No try_files on purpose — alias + try_files is an nginx footgun and a
single static page needs no SPA fallback. Then sudo nginx -t && sudo systemctl reload nginx. Subsequent deploys are file-only, no reload needed.
Built by one guy. Sealed on your device. See for yourself.





