Cairn landing page / product website: marketing + docs entry, customer login, license purchase and account-linked license management. Talks to cairn-license-server.
Find a file
2026-09-06 01:31:48 +00:00
.forgejo/workflows Phone-home wording keyed to the licence, not the seat count 2026-09-05 05:35:34 +00:00
design RailScroll canonical snippet: v2 (delegated + lazy) 2026-09-06 02:27:52 +02:00
account.html Buy-seats totals: three missed dollar literals to CHF (#23 follow-up) 2026-09-06 03:31:31 +02:00
admin.html Rail scrollbar v2: delegated + lazy, survives app re-renders (#25) 2026-09-06 02:27:29 +02:00
docs.html Rail scrollbar v2: delegated + lazy, survives app re-renders (#25) 2026-09-06 02:27:29 +02:00
enter.html Phone-home stragglers: enter.html and account.html carried the false claim 2026-09-06 01:27:07 +02:00
favicon.svg redesign: favicon (paper/ink palette) 2026-08-21 17:50:49 +00:00
index.html Set the sandbox client-side token (#23) 2026-09-06 03:23:35 +02:00
og.svg redesign: OG share image (struck removals, files survives) 2026-08-21 17:51:04 +00:00
README.md Phone-home wording keyed to the licence, not the seat count 2026-09-05 05:35:34 +00:00
reset.html feat: password reset page (license-server #5) 2026-07-30 00:11:15 +00:00

cairn-site

Landing page / product website for Cairn (#26). Static HTML, same visual identity as the app UI (high-alpine palette, cairn mark).

Live at www.swisscairn.ch (Infomaniak VPS, Caddy auto-TLS; apex swisscairn.ch 301-redirects to www).

  • index.html — marketing: pitch, features, pricing (free ≤50 users / commercial above), honest licensing explainer (offline verification, no phone-home without a key; licensed instances check in monthly, licence id only).
  • account.html — customer area, fully wired to the license server at license.swisscairn.ch: register / sign in (bearer sessions), license list with copyable CAIRN1.… keys (seats, expiry, revoked badge), and the buy flow — Paddle overlay checkout (sandbox) with the account email passed in custom_data, so the webhook-issued license appears in the list automatically after payment. The Paddle client-side token embedded here is public by design (it can only start checkouts). It also covers organizations (rename, invite members by email with roles, accept or revoke invites, change roles, remove members), billing/receipts (past Paddle transactions with invoice-PDF links), and password self-service (change password, plus forgot-password via reset.html).

Deploy

deploy.yml (manual dispatch) ships the static files to /var/www/cairn-site on the VPS over SSH. The Caddy vhosts live with the license server's provision.yml (canonical) and on the box at /etc/caddy/Caddyfile.

Before public launch

  1. Swap Paddle sandbox → live: real client token in account.html (Paddle.Environment.set("sandbox") line goes away), live API key/webhook secret on the license server, real per-seat price (current catalog price is a placeholder).
  2. Docs page — done: docs.html (quick start, configuration reference, identity, WebDAV clients & sync, licensing).
  3. Goes public together with the Cairn GitHub mirror (gated on the v0.4 milestone closing).