License server (separate repo, Go + SQLite on VPS) #25

Open
opened 2026-07-25 16:26:09 +00:00 by Cordy · 1 comment
Owner

ARCHITECTURE §8.1. Issues signed license files and exposes POST /v1/validate for the optional online path (revocation, renewal reminders, activation counts). Separate repo, Go + SQLite behind Caddy on the existing VPS.

Optional online complement to the offline file verification; must never be load-bearing for customer availability.

ARCHITECTURE §8.1. Issues signed license files and exposes `POST /v1/validate` for the optional online path (revocation, renewal reminders, activation counts). Separate repo, Go + SQLite behind Caddy on the existing VPS. Optional online complement to the offline file verification; must never be load-bearing for customer availability.
Author
Owner

Scope expanded (Nikola, 2026-07-26). Repo created: http://192.168.10.245/Cordy/cairn-license-server

Go + SQLite on the VPS. Three surfaces:

  1. Customer accounts — registration/login for the landing page (cairn-site is the frontend; this server owns accounts + sessions). A purchased license is linked to the account, so customers can log in and see/re-download their license key.
  2. Purchase → issuance — payment provider webhook (provider TBD — Stripe/Paddle decision needed, Paddle handles EU VAT as merchant-of-record which likely matters for CH/EU) → generate license (org, seats, expiry), sign with the private Ed25519 key (lives ONLY on this server / in Nikola's custody — never in the Cairn repo), store, email/show to customer.
  3. Check-in APIPOST /v1/checkin with license ID + instance fingerprint: returns valid/revoked/expired. Called by cairnd monthly, only for >50-user deployments (see #24 for the client-side cadence/grace rules). Keep it dumb and boring: no telemetry beyond what enforcement needs (license ID, seat count, version).

Client-side verification stays fully offline (#24); this server exists for issuance, account linkage, and the monthly revocation check.

**Scope expanded (Nikola, 2026-07-26). Repo created: http://192.168.10.245/Cordy/cairn-license-server** Go + SQLite on the VPS. Three surfaces: 1. **Customer accounts** — registration/login for the landing page (cairn-site is the frontend; this server owns accounts + sessions). A purchased license is linked to the account, so customers can log in and see/re-download their license key. 2. **Purchase → issuance** — payment provider webhook (provider TBD — Stripe/Paddle decision needed, Paddle handles EU VAT as merchant-of-record which likely matters for CH/EU) → generate license (org, seats, expiry), sign with the **private** Ed25519 key (lives ONLY on this server / in Nikola's custody — never in the Cairn repo), store, email/show to customer. 3. **Check-in API** — `POST /v1/checkin` with license ID + instance fingerprint: returns valid/revoked/expired. Called by cairnd monthly, only for >50-user deployments (see #24 for the client-side cadence/grace rules). Keep it dumb and boring: no telemetry beyond what enforcement needs (license ID, seat count, version). Client-side verification stays fully offline (#24); this server exists for issuance, account linkage, and the monthly revocation check.
Sign in to join this conversation.
No labels
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Cordy/Cairn#25
No description provided.