A beautiful, real-time note-taking application with rich-text editing, folder organization, and collaborative features.
Live Deployment : https://notevo-1234.vercel.app/
Rich-text editing — Full formatting support with Tiptap editor Folder organization — Categorize notes with custom colors and icons Tags & search — Find notes instantly with powerful search Pinned notes — Keep important notes at the top Dark mode — Beautiful light and dark themes Real-time sync — Live updates via Socket.IO Collaboration — See who's editing in real-time Share links — Generate public links to share notes Responsive design — Works on desktop and mobile
- Frontend: Next.js 14, React, TypeScript, Tailwind CSS, Tiptap editor
- Backend: Next.js API routes, Supabase
- Database: PostgreSQL (via Supabase)
- Authentication: Supabase Auth
- Real-time: Socket.IO
- Deployment: Vercel
- UI Components: Radix UI, Lucide Icons
notevo/
├── app/ # Next.js app directory
│ ├── api/ # API routes for backend logic
│ ├── (auth)/ # Auth-related pages
│ ├── (dashboard)/ # Protected dashboard pages
│ └── login/ # Login page
├── components/ # React components
│ ├── editor/ # Rich-text editor component
│ ├── layout/ # Layout components
│ ├── notes/ # Note-related components
│ ├── folders/ # Folder management components
│ └── ui/ # Reusable UI components
├── hooks/ # Custom React hooks
│ ├── useNotes.ts # Notes CRUD operations
│ ├── useFolders.ts # Folders CRUD operations
│ └── useSocket.ts # Socket.IO integration
├── lib/ # Utility functions
│ ├── supabase.ts # Client Supabase instance
│ ├── supabase-server.ts # Server Supabase instance
│ └── utils.ts # Helper functions
├── types/ # TypeScript type definitions
├── server/ # Node.js Socket.IO server
└── supabase/ # Database schema
- Node.js 20+
- npm or yarn
- Supabase account (free tier available)
-
Clone the repository
git clone <repository-url> cd notevo
-
Install dependencies
npm install
-
Set up environment variables
cp .env.example .env.local
Update
.env.localwith your Supabase credentials:NEXT_PUBLIC_SUPABASE_URL=your-supabase-url NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key SUPABASE_SERVICE_ROLE_KEY=your-service-role-key NEXT_PUBLIC_SOCKET_URL=http://localhost:3001 SOCKET_SECRET=your-secret NEXT_PUBLIC_APP_URL=http://localhost:3000
-
Start the Socket.IO server (in a separate terminal)
npm run server
-
Start the development server
npm run dev
Open http://localhost:3000 in your browser.
npm run dev— Start Next.js dev servernpm run build— Build for productionnpm start— Start production servernpm run server— Start Socket.IO servernpm run dev:all— Run dev server and Socket.IO together
NEXT_PUBLIC_SUPABASE_URL— Supabase project URLNEXT_PUBLIC_SUPABASE_ANON_KEY— Anonymous API key for frontendNEXT_PUBLIC_SOCKET_URL— Socket.IO server URLNEXT_PUBLIC_APP_URL— Application domain
SUPABASE_SERVICE_ROLE_KEY— Admin key, NEVER expose to frontendSOCKET_SECRET— Socket.IO secret for authentication
Never commit .env.local to version control. Use .env.example as a template.
See DEPLOYMENT.md for comprehensive deployment instructions.
- Push code to GitHub
- Connect repository in Vercel Dashboard
- Add environment variables in Project Settings
- Deploy!
See PRODUCTION_CHECKLIST.md for pre-deployment verification.
The Supabase database includes:
- users — User accounts (managed by Supabase Auth)
- notes — User notes with rich-text content
- folders — Note folders with colors and icons
- shares — Shareable note links
Run migrations from supabase/schema.sql in your Supabase project.
- Email/Password — Standard authentication
- Guest Mode — Temporary access with localStorage (data not saved)
- Row-Level Security — Supabase RLS ensures users only see their own data
Socket.IO provides:
- Live cursor positions
- Real-time content updates
- Presence awareness (see who's editing)
- Conflict-free updates
GET /api/notes— List user's notesPOST /api/notes— Create new notePATCH /api/notes/[id]— Update noteDELETE /api/notes/[id]— Delete note
POST /api/shares— Create share linkGET /api/shares/[slug]— Get shared note (public)
- Ensure Node.js 20+ is installed:
node --version - Clear cache:
rm -rf node_modules package-lock.json && npm install - Check environment variables are set
- Verify Socket.IO server is running
- Check
NEXT_PUBLIC_SOCKET_URLis correct - Ensure server allows connections from your domain
- Verify Supabase URL and keys in
.env.local - Check Supabase project is active
- Ensure your IP isn't blocked (Supabase settings)
- Clear browser cookies: Dev Tools → Application → Cookies
- Check Supabase Auth settings (allowed redirect URLs)
- Verify email confirmation is enabled if using email auth
✅ What we've done:
- All sensitive keys in
.env.local(not in code) .env.localgitignored- Service role key only used server-side
- Anonymous key safely exposed to frontend
- Console logs removed from production code
- No hardcoded secrets in repository
- TypeScript strict mode enabled
- Input validation on API routes
- Row-Level Security on database
- Next.js optimization — Automatic code splitting and optimization
- Image optimization — Next.js Image component for fast loading
- Caching — Server-side caching via API routes
- Real-time updates — Efficient Socket.IO connections
- Database queries — Optimized Supabase queries
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
MIT License — feel free to use this project for personal or commercial purposes.
- Docs: See DEPLOYMENT.md and PRODUCTION_CHECKLIST.md