NoAppStore is a template for an E2EE SvelteKit PWA. With this template you can deploy an E2EE app cross platform to any device!!!
The demo hosts the client on github pages and stores end-to-end encrypted notes in a Convex backend. The server only sees ciphertext and metadata — the data encryption key (DEK) and plaintext never leave the client.
npm install
npx convex dev
This will create a .env.local file with your CONVEX_URL.
To enable TOTP during registration, set a 32-byte base64 secret for Convex so TOTP secrets can be encrypted at rest. You only need to set this once per Convex environment; changing it later will prevent existing TOTP secrets from decrypting.
npx convex env set TOTP_ENCRYPTION_KEY "<32-byte-base64>"
For production, set the variable on your production Convex deployment (e.g.
via the Convex dashboard or npx convex env set while targeting the prod
deployment) and keep it stable across deploys.
Create .env (or .env.local) in the repo root:
VITE_CONVEX_URL="<your-convex-url>"
npm run dev
Visit http://localhost:5173
The app version lives in src/lib/version.ts and is bumped automatically by the GitHub workflow. You can do it manually by using the following npm scripts to manage version updates:
npm run version:major
npm run version:minor
npm run version:patch
main. The included GitHub Actions workflow builds the app and deploys the build/ output to GitHub Pages.If you are hosting at https://<user>.github.io/<repo>/, set a repository variable named BASE_PATH to /<repo>.
For custom domains, leave BASE_PATH unset so assets resolve from /.
Add either a repository variable or an environment variable named VITE_CONVEX_URL with your Convex deployment URL so the build can complete.
Only one is needed.
Use a repository variable if the value is the same for every deployment and you want the simplest setup.
Use an environment variable if you need different values per environment (for example, preview vs. production) or if you use environment protection rules like required reviewers.
(VITE_CONVEX_URL is typically public, so a variable is appropriate—not a secret.)
To enable deployment of Convex from the GitHub workflow, set:
CONVEX_DEPLOY_KEY (from the Convex dashboard; required for non-interactive CI auth)VITE_CONVEX_URL with your Convex deployment URLThe workflow runs npx convex deploy --url "$VITE_CONVEX_URL" before the frontend build.
e2eeSalt and (if enabled) a TOTP secret.e2eeSalt + session token.pendingNotes store while offline.argon2-browser with configurable parameters.convex/ # Convex backend functions + schema
src/lib/crypto/ # Key derivation and encryption helpers
src/lib/storage/ # IndexedDB helpers (offline cache + device keys)
src/routes/ # SvelteKit pages
static/ # PWA icons