Personal secrets vault. Next.js 16 static frontend; Cloudflare Workers backend (primary) / Google Apps Script (backup); KV storage; token auth.
⚠️ Secrets are stored in plaintext in KV / the Google Sheet (deliberate trade-off — seedocs/superpowers/specs/2026-06-06-secret-vaults-design.md). Anyone with access to the Cloudflare account, the Google account, or the API token can read everything. Protect all three.
Next.js 16 · React 19 · TypeScript · Tailwind 4 · Radix UI · Zustand · TanStack Query/Table/Form · Zod · Cloudflare Workers (Wrangler) · GAS + clasp (backup) · mise · pnpm
mise install && pnpm install- Create a KV namespace:
pnpm --filter worker exec wrangler kv namespace create secrets - Copy the returned
idintoapps/worker/wrangler.jsonc - Set the API token:
pnpm --filter worker exec wrangler secret put API_TOKEN(e.g.openssl rand -base64 32) mise run worker:dev— local dev server (default http://localhost:8787 http://localhost:8787/cdn-cgi/explorer)mise run worker:deploy— deploy to Cloudflare- Open the web app:
mise run dev→ http://localhost:3000 → enter the workers.dev URL and the API token.
- Follow
apps/gas/README.mdor the original setup inapps/gas/:- Create a Sheet; create a standalone Apps Script project; set Script Properties
SPREADSHEET_IDandAPI_TOKEN; put the Script ID inapps/gas/.clasp.json pnpm --filter gas exec clasp loginmise run gas:push, then deploy in the Apps Script editor: Deploy → New deployment → Web app → Execute as Me / access Anyone. Copy the/execURL.
- Create a Sheet; create a standalone Apps Script project; set Script Properties
- Enter the
/execURL and the API token in the login form.
| Command | What |
|---|---|
mise run dev |
Next.js dev server |
mise run build |
static export → apps/web/out/ |
mise run test |
all unit tests |
mise run worker:dev |
local Worker dev server |
mise run worker:deploy |
deploy Worker to Cloudflare |
mise run gas:push |
build + push GAS code (backup) |
mise run gas:deploy |
new versioned GAS deployment (backup) |
- The frontend sends
Content-Type: text/plainfor GAS compatibility — the Worker accepts it too. - After Worker changes:
mise run worker:deploy. - After GAS code changes:
mise run gas:push, then update the deployment version (Manage deployments → edit → new version) ormise run gas:deploy.