You know the feeling: you open something to think, and the software starts performing (offering, suggesting, nudging) until the room for your own pace shrinks. Useful automation has its place elsewhere; in a notes app, that itch to always do something next can mistake motion for thinking.
Nota treats your attention as something to protect, not to harvest. It gives you a steady place to write and arrange ideas, and it steps back when you pause so your mind can do the unglamorous part: wandering, revising, waiting for the right phrase without the product trying to entertain the lull.
We leave silence alone on purpose. Boredom at the cursor is the sound of a thought catching up.
Nota is a personal notes app built as an Nx monorepo.
The main client (apps/nota) is a Next.js App Router app with React 19. It also serves the API routes under src/app/api/* (entitlement, link previews, semantic search, assistive capture).
Notes use Supabase (Postgres, Storage, and row-level security) with Clerk for sign-in (third-party JWTs). The editor is TipTap (ProseMirror).
Subscriptions use Clerk Billing (in-app checkout; server-side entitlement checks in the Next route handlers).
An Electron desktop shell wraps the same build—see apps/nota-electron/README.md. The public marketing site lives in apps/nota-marketing (Astro).
- Node.js 22 or newer (see root
package.jsonengines) - pnpm 10.x (see root
packageManagerinpackage.json;pnpm-workspace.yamllists workspace packages)
From the repository root:
corepack enable pnpm
pnpm installCopy apps/nota/.env.example to apps/nota/.env and set at least:
NEXT_PUBLIC_SUPABASE_URL— your Supabase project URLNEXT_PUBLIC_SUPABASE_ANON_KEY— your Supabase publishable key (sb_publishable_…)
For Clerk sign-in and subscription flows, follow the same file for NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY and the server-only secrets (CLERK_SECRET_KEY, SUPABASE_SECRET_KEY, etc.—never commit real values, never prefix them NEXT_PUBLIC_). Schema, RLS policies, and migrations are applied in Supabase from the SQL in this repo—environment variables alone do not create the database.
SQL migrations live under supabase/migrations/ at the repository root. If you use the Supabase CLI, link your project and apply migrations with your usual workflow (for example supabase db push against a linked project, or local supabase start for development).
pnpm exec nx dev @nota/nota(pnpm exec nx dev nota resolves to the same project.)
The Next dev server listens on http://localhost:3000.
pnpm exec nx run @nota/nota-marketing:devpnpm exec nx build @nota/nota
pnpm exec nx test @nota/notaTests use Vitest via the Nx Vitest plugin.
The desktop app expects the web dev server at http://localhost:3000 (DEV_PORT in apps/nota-electron/src/app-load-url.ts). From the repository root you can run:
pnpm run electron:dev— Electron only (start the web app in another terminal withpnpm exec nx dev @nota/nota, or runpnpm exec nx run-many -t devto start the web app and Electron together)
More detail: apps/nota-electron/README.md.
| Path | Purpose |
|---|---|
apps/nota/ |
Main Next.js app (notes, auth, TipTap, API routes) |
apps/nota-electron/ |
Electron shell |
apps/nota-marketing/ |
Astro marketing site |
supabase/ |
Supabase config and SQL migrations |
assets/ |
Shared assets (e.g. screenshots for docs) |
Apache License 2.0 — see LICENSE and package.json.
