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.
- Go
- SQLite
- Stripe
- pdfcpu
- SvelteKit
- Svelte 5
- TypeScript
- Tailwind CSS
- Vite
- pnpm
- Playwright
- Electron
- WebAuthn
- Apache
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.
Work with us
Project briefs & proposals.
Downloadable, branded documents that explain the project end-to-end and how to bid on it. Built for contractors deciding whether and how to take this on.
Complete this repository
Continuation track — take the existing, production-deployed codebase and finish it. Full scope, the secure two-server workflow, and how to bid.
Download PDF PDFGreenfield this repository
Clean-build track — build the same product your way against fixed requirements. Stack-flexible; we reserve the right to reject.
Download PDFStraight 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.
- Prod: https://solstice.nexus
- Repo: github.com/saintpetejackboy/nah (private)
- Bootstrap spec: BOOTSTRAP.md
- Agent collab: AGENTS.md
- Current state + next steps: HANDOFF.md
- Open questions: QUESTIONS.md
- ADR log: DECISIONS.md
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 shelldesktop/— planned Electron wrapper aroundweb/build(Phase 5; not scaffolded yet)marketing/— public site, static HTMLops/— server-side deploy/rollback/migrate scripts + Apache vhosttests/e2e/— Playwrightdocs/agent/— prompts and notes for future agents
Hard rules
See BOOTSTRAP.md §1. The short version:
- No destructive git, no destructive SQL, no secrets in repo.
- Server is pull-mode after initial setup. Deploys are atomic symlink swaps.
- Frontend never holds privileged keys — backend is the only thing that talks to Firma / Stripe / OpenRouter / Postmark.
- Files ≤150 lines, functions ≤30 lines.
- 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.