A modern, responsive note-taking application built with Next.js and Supabase modeled after Google Keep.
- Frontend: Next.js 14, TypeScript
- Styling: Tailwind CSS, shadcn/ui
- Backend: Supabase (PostgreSQL)
- State Management: React Hooks
- Deployment: Vercel
Used Cursor as a pair-programmer for refactors and multi-file edits; all logic and integrations were implemented, reviewed, and tested by me. Initial UI was drafted with V0, then customized.
- Create, read, update, delete notes
- Pin/unpin notes
- Color-code notes (6 color options)
- Search across note titles and content
- Responsive design
- Modern, clean interface
- Card-based note layout
- Hover interactions
- Toast notifications
- Mobile-friendly
notes-app/
├── app/ # Next.js app router
├── components/ # React components
│ ├── ui/ # Shadcn UI components
│ └── ... # Custom components
├── hooks/ # Custom React hooks
├── lib/ # Utility functions, Supabase client
├── public/ # Static assets
└── styles/ # Global styles
- Real-time data persistence
- Optimistic UI updates
- Error handling
- Type-safe development
- Accessible design
- Performance optimized
- Clone the repository
- Install dependencies
- Set up Supabase project
- Configure environment variables
- Run
npm run dev
npm installCreate .env.local with Supabase credentials
NEXT_PUBLIC_SUPABASE_URL=your_supabase_project_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_keyRun local development server
npm run devnpm run dev (start dev server)
npm run build (production build)
npm run start (run production build locally)-
400 Bad Request on insert/update Make sure your Supabase table has all columns used by the app (color, pinned, etc.). The payload must match column names.
-
“Could not find the 'color' column” Add the color text column (default 'default'), then redeploy/rerun.
-
Cannot update/delete (RLS errors) In dev, use permissive policies (allow all). In prod, write proper auth-based policies.
-
Pinned notes don’t move Ensure the client sorts: pinned first, then created_at desc. (This repo’s page.tsx already does it.)
- Connect repository to Vercel
- Add environment variables:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEY
Contributions are welcome! Please feel free to submit a Pull Request.

