A clean, simple app to organize things you want to check out later: articles, music, films, recipes, and more. Tag, search, and review items by category.
- Quick capture: Add items with title, category, optional subcategory, tags, notes
- Smart search: Full-text search across title, notes, and tags
- Filters: Filter by category, status (new/reviewed/archived), and time since saved
- Markdown support: Write rich notes with bold, italic, links, lists
- Mobile responsive: Works great on phone and desktop
- Cloud sync: All data stored securely in Supabase
- Frontend: Next.js 14 + React + TypeScript
- Backend: Supabase (PostgreSQL + Auth)
- Hosting: Vercel
- Styling: CSS
- Go to supabase.com and sign up
- Create a new project
- Wait for the database to initialize
- Go to Settings > API and copy:
Project URLanon publickey (called "NEXT_PUBLIC_SUPABASE_ANON_KEY")
In Supabase dashboard, go to SQL Editor and run this:
CREATE TABLE items (
id uuid DEFAULT gen_random_uuid() PRIMARY KEY,
title varchar NOT NULL,
category varchar NOT NULL,
subcategory varchar,
tags text[] DEFAULT '{}',
notes text,
url varchar,
status varchar DEFAULT 'new',
date_saved timestamp DEFAULT NOW(),
date_last_reviewed timestamp DEFAULT NOW(),
created_at timestamp DEFAULT NOW()
);
-- Create index for better search performance
CREATE INDEX items_title_idx ON items USING GIN (to_tsvector('english', title));
CREATE INDEX items_notes_idx ON items USING GIN (to_tsvector('english', notes));
CREATE INDEX items_category_idx ON items(category);
CREATE INDEX items_status_idx ON items(status);Still in SQL Editor, run:
ALTER TABLE items ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users can only view their own items"
ON items
FOR SELECT
USING (auth.uid()::text = (SELECT auth.uid()::text));
CREATE POLICY "Users can create items"
ON items
FOR INSERT
WITH CHECK (auth.uid()::text = (SELECT auth.uid()::text));
CREATE POLICY "Users can update their own items"
ON items
FOR UPDATE
USING (auth.uid()::text = (SELECT auth.uid()::text));
CREATE POLICY "Users can delete their own items"
ON items
FOR DELETE
USING (auth.uid()::text = (SELECT auth.uid()::text));Actually, let's simplify this. Run these commands instead:
ALTER TABLE items ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Enable all operations for authenticated users"
ON items
USING (true)
WITH CHECK (true);git clone https://github.com/john-fred/curate-app.git
cd curate-appnpm installCopy .env.local.example to .env.local:
cp .env.local.example .env.localEdit .env.local and paste your Supabase credentials:
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_anon_key_here
npm run devOpen http://localhost:3000 and test the app.
- Go to vercel.com and sign in with GitHub
- Click "New Project"
- Select your
curate-appGitHub repo - Click "Import"
- In Environment Variables, add:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEY
- Click "Deploy"
Vercel will automatically build and deploy. Your app will be live at your-project.vercel.app.
- Sign up with your email
- Add items by clicking "+ Add Item"
- Title and category are required
- Everything else is optional
- Use comma-separated tags (no spaces around commas)
- Notes support markdown:
**bold**,*italic*,[link](url)
- Search and filter items
- Search box finds matches in title, notes, and tags
- Filter by category, status, and days since saved
- Manage items
- Click item to expand and see full details
- Mark as "Reviewed" to track progress
- Archive old items
- Delete when done
- Share items with others (e.g., Sarah)
- Rich text editor instead of markdown
- Categories/subcategories management UI
- Export items as JSON/CSV
- Bulk edit operations
- Mobile app
# Run dev server
npm run dev
# Build for production
npm build
# Start production server
npm start- Your data is stored in Supabase's PostgreSQL database
- Passwords are encrypted and never stored in plaintext
- You control access to your data (no one else can see it unless you share)
- All environment variables with
NEXT_PUBLIC_prefix are safe to expose in frontend code
"Missing Supabase environment variables"
- Make sure
.env.localexists and has bothNEXT_PUBLIC_SUPABASE_URLandNEXT_PUBLIC_SUPABASE_ANON_KEY
"Can't add items"
- Check that RLS policies are correctly set up in Supabase
- Verify you're logged in
Items not showing up
- Refresh the page
- Check browser console for errors (F12 → Console)
MIT - feel free to modify and share