Work nah
platform

Solstice

Credit-only white-label document signing — invitation-only orgs, a live Firma signing integration, a hardened Windows desktop shell, and an encrypted secrets vault in one monorepo.

Solstice (rebranded from the "Nah" working name this repo still carries internally) is a $0.50-flat-per-document signing platform: a credit-only, white-label surface for firms that want their own brand on the signing workflow without per-seat fees. One monorepo ships a Go backend, a SvelteKit portal + super-admin, and the public marketing site. The architecture's hard rule is that the backend is the only process that will ever hold privileged upstream keys — an encrypted secrets vault with role-based access and rotation tooling backs it. Firma is now wired in for real: per-org signing workspaces provision on demand and a signed webhook receiver verifies, spools, and dispatches events. The send path is walkable end to end — a template studio, a send screen priced against the org's credit balance, and a document page with the audit trail and the stored, hash-verified copies. Onboarding is invitation-only: public signup was deleted in favour of a request-access queue a platform admin approves. The workspace now also ships as a hardened Electron shell for Windows that loads the same app, checks for updates and never installs anything itself; passkey sign-in, org-wide skins, and a bring-your-own-key assistant that answers only from the help pages (off per org until an admin turns it on) round out the surface. Deploys are atomic symlink swaps on a pull-mode server.

Versiondesktop-v0.1.1 Last updateOct 23, 2026 PrimaryGo
  • Go
  • SQLite
  • Stripe
  • pdfcpu
  • SvelteKit
  • Svelte 5
  • TypeScript
  • Tailwind CSS
  • Vite
  • pnpm
  • Playwright
  • Electron
  • WebAuthn
  • Apache
Solstice — Credit-only white-label document signing — invitation-only orgs, a live Firma signing integration, a hardened Windows desktop shell, and an encrypted secrets vault in one monorepo.
Solstice media
Solstice media

Solstice (this repo's working name is still "Nah") is a credit-only, white-label document signing platform — a web portal, a super-admin, and a public marketing site, all in one monorepo. $0.50 flat per document, no per-seat fees, no surprise overages. The platform owner keeps the brand; the user keeps the workflow; the upstream signing provider keeps the cryptographic side.

Why credit-only?

Per-seat e-signature pricing punishes intermittent users — every paralegal who signs three documents a quarter pays the same $40/mo as the partner who signs 200. Credit-only flips that: load credits when you need them, pay flat per document, no recurring bill, no contract review. The pricing model is the point of the platform.

The monorepo, in five drawers

  • backend/ — Go API, single static binary on CGO-free SQLite. The only process that will ever talk to upstream signing, billing, or AI providers; the only thing that holds privileged keys.
  • web/ — SvelteKit bundle shared by the customer /portal, the super /admin, and the desktop shell.
  • desktop/ — Solstice for Windows: a hardened Electron window (fuses verified at build) that loads the production app, so it is always the same product as the browser. Native save-as and open for PDFs, an offline page that retries on its own, and an update check that shows a download button and never installs anything itself.
  • marketing/ — public site, static HTML, deployed independently of the app surface.
  • ops/ + tests/e2e/ — server-side deploy/rollback/migrate scripts, Apache vhost, Playwright end-to-end suite.

The hard rules

  • No destructive git, no destructive SQL, no secrets in repo.
  • Server is pull-mode after initial setup. Deploys are atomic symlink swaps, never edits in place.
  • Frontend never holds privileged keys — backend is the only thing that talks to upstream services.
  • Files ≤150 lines, functions ≤30 lines, by policy — and a 2026 cleanup pass brought every file back under budget rather than letting the rule rot.

What ships today

The portal and super-admin run on the production hostname. Onboarding is invitation-only: the public endpoint writes a request-access row and nothing else, and a platform admin either approves it — which creates the org and invites its first admin — or onboards a customer directly. Self-serve signup was deleted rather than left behind a feature flag. Seats inside an approved org stay self-service: email-verified teammate invites and org switching. On top of that sit a per-tenant credits ledger, document audit, white-label configuration, and per-tenant branding. Behind /admin sits an encrypted secrets vault with role-based access, key-rotation tooling, and a written recovery runbook.

The Firma signing integration is live, not just wired for later: each org gets its own signing workspace provisioned on demand, and a signed webhook receiver verifies, spools, and dispatches events with replay protection, secret rotation, and an admin re-dispatch console. The whole send path is walkable — upload a document into the template studio, place roles and fields in the embedded editor, then a send screen that prices the send against the org's balance and confirms against the backend's facts rather than the form's. Every signed copy is stored locally, re-hashed on read, and shown on a document page with its audit trail, per-signer status, resend and cancel. Prepaid credit packs through Stripe are built — checkout, webhook and success-page fulfilment, credited exactly once under three independent guards — and wait on the Stripe account being connected in production; until then credits are admin-granted. A public /stack page publishes the deployed commit and build time straight from the server, so "is prod current with the repo?" is a URL, not a question.

The roadmap items have since landed. The Windows desktop shell ships as an installer with a download page (version, size, SHA-256) mirrored from the release, and a /whats-new page renders the changelog in both the browser and the app. Passkeys sign a user in with a fingerprint, face or security key and re-confirm before sensitive changes. Org-wide skins carry two accents, an appearance and a logo to every member, behind a readability guard that keeps every control at 4.5:1. And the assistant is in the app as a docked panel, bring-your-own-key by design: it answers only from the help pages and the changelog, sees a member's own documents and the org's balance and nothing else, stores no question or answer, and sits behind daily allowances, a passkey check, a classifier and an independent misuse watch — every org off until an admin switches it on.

Straight from the source

The project's own README.

Rendered in place — every link, image, and code block carried over from the repo. The page below is what a contributor would see opening the project for the first time.

Nah

Credit-only, white-labeled wrapper over the Firma.dev signing API. Desktop (Electron), web portal, public marketing site, and super-admin in one monorepo. $0.50 flat per document.

Quick start

just doctor         # verify toolchain
just dev            # run backend + web concurrently
just test           # backend unit + vitest + playwright
just lint           # gofmt + eslint + svelte-check

See just --list for the full recipe catalog.

Layout

  • backend/ — Go API (single static binary)
  • web/ — SvelteKit bundle shared by /portal, /admin, and the Electron shell
  • desktop/ — planned Electron wrapper around web/build (Phase 5; not scaffolded yet)
  • marketing/ — public site, static HTML
  • ops/ — server-side deploy/rollback/migrate scripts + Apache vhost
  • tests/e2e/ — Playwright
  • docs/agent/ — prompts and notes for future agents

Hard rules

See BOOTSTRAP.md §1. The short version:

  1. No destructive git, no destructive SQL, no secrets in repo.
  2. Server is pull-mode after initial setup. Deploys are atomic symlink swaps.
  3. Frontend never holds privileged keys — backend is the only thing that talks to Firma / Stripe / OpenRouter / Postmark.
  4. Files ≤150 lines, functions ≤30 lines.
  5. Ask before inventing — add to QUESTIONS.md and pause the thread.

Build something like this

Want a tool like this for your shop?

We've shipped this kind of thing before. Twenty-minute intro call, no slides.