From 1812b2612fd3246a9f3af81c331cc57fde5065ad Mon Sep 17 00:00:00 2001 From: Local Dev Date: Thu, 17 Sep 2026 18:56:21 +0200 Subject: [PATCH] Initial commit --- .dockerignore | 6 + Dockerfile | 42 +++++++ README.md | 57 +++++++++ index.html | 314 ++++++++++++++++++++++++++++++++++++++++++++++++++ js/theme.js | 63 ++++++++++ 5 files changed, 482 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 index.html create mode 100644 js/theme.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..b8ed04d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +Dockerfile +.dockerignore +.git +.gitignore +README.md +*.md diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f0d1c91 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,42 @@ +# fly.x landing — static site served by nginx-alpine. +# Small (~25 MB), no build step, no state. +# +# Build: +# docker build -t code.silentmode.st/silentmode/fly:latest . +# +# Push (after `docker login code.silentmode.st`): +# docker push code.silentmode.st/silentmode/fly:latest +# +# Deploy on Flux/Orbit: image = code.silentmode.st/silentmode/fly:latest, port 80. + +FROM nginx:1.27-alpine + +# Drop the default nginx welcome page. +RUN rm -rf /usr/share/nginx/html/* + +# Ship the site. +COPY index.html /usr/share/nginx/html/ +COPY js/ /usr/share/nginx/html/js/ + +# Tighten nginx defaults for a static-only workload: +# - long cache on the fonts + js +# - short cache on the HTML so we can ship a redeploy fast +# - gzip on for text/css/js +RUN printf '%s\n' \ + 'server {' \ + ' listen 80 default_server;' \ + ' root /usr/share/nginx/html;' \ + ' index index.html;' \ + ' gzip on;' \ + ' gzip_types text/plain text/css text/html application/javascript application/json image/svg+xml;' \ + ' location = / { add_header Cache-Control "no-cache, must-revalidate"; try_files /index.html =404; }' \ + ' location = /index.html { add_header Cache-Control "no-cache, must-revalidate"; }' \ + ' location /js/ { add_header Cache-Control "public, max-age=86400"; }' \ + ' location /favicon.svg { access_log off; try_files $uri =404; }' \ + ' location / { try_files $uri $uri/ =404; }' \ + '}' > /etc/nginx/conf.d/default.conf + +EXPOSE 80 + +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=2 \ + CMD wget -qO- --tries=1 http://localhost/ >/dev/null || exit 1 diff --git a/README.md b/README.md new file mode 100644 index 0000000..b5d33c3 --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +# fly.x + +Static landing page for `fly.x` — a decentralized flight-search entry point on +Bitcoin Cash. This repo holds the landing HTML + the Dockerfile that packages +it for Flux (or any container host). + +## Development + +Just open `index.html` in a browser. Nothing to build. + +## Build the container + +```bash +docker build -t code.silentmode.st/silentmode/fly:latest . +``` + +Verify locally: + +```bash +docker run --rm -p 8080:80 code.silentmode.st/silentmode/fly:latest +# → open http://localhost:8080 +``` + +## Publish to Hephaestus registry + +Hephaestus (Forgejo 10) exposes an OCI registry at `code.silentmode.st`. First +time you push, log in with a personal access token that has the `write:package` +scope — see Settings → Applications on your Hephaestus account. + +```bash +docker login code.silentmode.st -u +docker push code.silentmode.st/silentmode/fly:latest +``` + +## Deploy on Flux (Orbit) + +1. Go to . +2. Image reference: `code.silentmode.st/silentmode/fly:latest`. +3. Port: `80` (HTTP). +4. Resources: minimum — the container is stateless and idle-cheap. +5. Deploy. Flux gives you a URL back plus the assigned IP. + +## Wire fly.x to the deployment + +Once Flux hands you an IP, update the fly.x records on Sirius: + +- `ip` → the Flux-assigned IP +- `s3` → Sia bucket key for the static-mirror backup (optional) +- `tls` → Silent Mode CA fingerprint (already set on mint) + +Verify: + +```bash +curl -s https://silentmode.st/api/dns/fly.x | jq +curl -sk https://fly.x/ | head -5 # via Theseus/Ariadne +curl -sk https://navigate.st/bns/fly.x | head -5 # via gateway +``` diff --git a/index.html b/index.html new file mode 100644 index 0000000..0bce893 --- /dev/null +++ b/index.html @@ -0,0 +1,314 @@ + + + + + +Fly.X — flights, priced in Bitcoin Cash + + + + + + + + + + + + + + + + + + + + + +
+ +
+
✈️
+

Flights, priced in Bitcoin Cash.

+

Find a flight, pay from your wallet. No account to create, no email to hand over — one + signature books the seat and the receipt lives on the chain.

+ + +
+ +
+

Why fly.x

+

Four things a regular flight search does not do.

+
+
+

Pay from your wallet

+

Book with Bitcoin Cash. The provider is paid in BCH; the exchange happens under the hood, + but you never hand a card number to anyone. Refunds go back to the same wallet.

+
+
+

No account, no email

+

Sign in with your wallet. Your itineraries are yours to keep, encrypted with a passphrase you + set in your browser. No fly.x database of who's flying where.

+
+
+

On-chain receipt

+

Every booking hash is written to Bitcoin Cash as an OP_RETURN. If the airline + and fly.x both vanished tomorrow, the seat you paid for is still provably yours.

+
+
+

Just a name on the chain

+

fly.x is a BCNR name — an on-chain certificate you can look up without asking + DNS or ICANN. Any BCNR resolver reaches this page directly; the gateway is a fallback.

+
+
+
+ +
+

How it works

+

Three steps to book a seat.

+
    +
  1. Search a route. Type your origin and destination. Fly.x queries a network of + travel-provider APIs and returns fares in BCH — priced live at the fill rate we hit at book + time, not marked up.
  2. +
  3. Pick a fare, sign the intent. Your wallet signs a booking intent that names the + exact fare and expiry. The intent is broadcast to the fly.x relay; a settlement covenant on + BCH atomically pays the provider and mints your receipt NFT to the same address.
  4. +
  5. Show the receipt. At the airport, present the QR code from the receipt NFT. + The airline's fly.x plugin resolves it against the on-chain record. The seat is yours from + any wallet that holds the NFT.
  6. +
+
Alpha: route search + booking intent are wired end-to-end on chipnet; the + provider network and the settlement covenant are in review. Join the waitlist below and we'll + ping you the day mainnet opens.
+
+ +
+

Join the alpha

+

One tap. No email needed — your wallet address is the identifier.

+ +
+ +
+

The Silent Mode pantheon

+

Fly.X is a sibling under Silent Mode's .x umbrella. Each project is its own + on-chain certificate; each site is reachable through any BCNR resolver.

+
+
+

⭐ Sirius.X

+

Names on Bitcoin Cash — where fly.x was minted. Register a name, edit records, + mint a TLD.

+
+
+

🧭 Theseus.X

+

The browser that speaks BCNR natively. Type fly.x in the address bar; it just + resolves.

+
+
+

⚒️ Hephaestus.X

+

The forge. Fly.X's source and container image live here — open source, self-hostable, no + middleman.

+
+
+

✈️ Fly.X you're here

+

Flight search on Bitcoin Cash. This site.

+
+
+
+ +
+

Where it lives

+
+
this name
fly.x — BCNR certificate on Bitcoin Cash chipnet, owner-controlled
+
hosting
Container image on silentmode/fly, deployed to Flux (decentralized compute — decommission-resistant)
+
tls
Silent Mode Argonautica CA — trusted by Theseus/Ariadne users; other browsers can reach fly.x through navigate.st
+
source
silentmode/fly — this landing + the Dockerfile
+
+
+ +
+ + + + + + + + diff --git a/js/theme.js b/js/theme.js new file mode 100644 index 0000000..96d90d1 --- /dev/null +++ b/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