Simple, safe, secure password manager built with Next.js and Supabase.
- Provides sign-up and login flows with session cookies.
- Stores and manages password entries per user.
- Supports search across titles, URLs, usernames, and emails.
- Includes a built-in password generator for stronger credentials.
Authentication & sessions
- JWT-backed sessions stored in an HTTP-only cookie.
- Login attempt throttling using recent IP login history.
Password vault
- Create, update, delete, and list password entries.
- Search with multi-keyword matching and de-duplication.
UI & UX
- Responsive dashboard with drawer/dialog forms.
- 3D hero animation powered by React Three Fiber.
- Toast notifications and animated route transitions.
- Next.js 14 (App Router), React 18, TypeScript
- Tailwind CSS + tailwindcss-animate
- Supabase (Postgres + JS client)
- JWT + bcrypt
- Radix UI + shadcn/ui primitives, lucide-react icons
- Framer Motion, React Three Fiber/@react-three/drei, Three.js
The app uses Next.js App Router for pages and API routes, with Supabase as the backend database. Authentication relies on JWTs stored in HTTP-only cookies and verified in middleware and API handlers.
Browser
└─ Next.js App Router (pages + API routes)
├─ Auth routes (sign-up, login, verify, sign-out)
├─ Password routes (CRUD, search)
└─ Supabase client (Postgres)
- Node.js
- pnpm (recommended by
packageManager) or npm
pnpm installnpm installCreate a .env.local file with:
NEXT_PUBLIC_PORT=http://localhost:3000/
NEXT_PUBLIC_SUPABASE_URL=your-supabase-url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-supabase-anon-key
SECRET=your-jwt-secretNotes:
NEXT_PUBLIC_PORTis concatenated directly with route paths (for example,api/auth/login), so include a trailing slash.SECRETsigns and verifies JWT sessions.
pnpm devnpm run dev- Visit
/auth/sign-upto create an account. - Log in at
/auth/loginto establish a session cookie. - Use
/dashboardto create, search, edit, and delete password entries. - Use the password generator when creating or editing entries.
Tables used by the API routes:
users
id(uuid),username(text),email(varchar),password(text),ip(json)
passwords
id(uuid),title(text),userId(uuid),url(text),username(varchar),email(varchar),password(text)
logins
token(text),userId(uuid),date(timestamptz),ip(text),success(bool),loginId(uuid)
- Linting:
pnpm lintornpm run lint - No automated tests are present in the repository.
Target: Vercel.
Set the same environment variables in Vercel before deploying:
NEXT_PUBLIC_PORT=https://your-domain/
NEXT_PUBLIC_SUPABASE_URL=your-supabase-url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-supabase-anon-key
SECRET=your-jwt-secret- Add row-level security (RLS) policies in Supabase.