A collaborative web application for managing shopping lists and recipes with shared, canonical item catalogs.
- π Shopping Lists - Create and manage multiple shopping lists with automatic item creation
- π¨βπ³ Recipes - Store recipes with ingredients, instructions, and images
- π’ Workspaces - Share lists and recipes with household members or teams
- π Smart Items - Automatic icon matching and deduplication for ingredients
- π Secure - Email magic link authentication with row-level security
- π± Responsive - Works seamlessly on mobile, tablet, and desktop
- Framework: Next.js 16 (App Router)
- Language: TypeScript
- Database: Supabase (PostgreSQL)
- Authentication: Supabase Auth
- UI Components: shadcn/ui (Radix UI)
- Styling: Tailwind CSS
- Icons: Lucide React
- Testing: Vitest + Playwright
- Node.js 20+
- npm or pnpm
- Docker Desktop (for local Supabase)
git clone https://github.com/yourusername/bringer.git
cd bringernpm installnpx supabase startThis will start local Supabase services. Note the credentials shown:
- API URL:
http://127.0.0.1:54321 - Anon key: (copy this for next step)
- Mailpit URL:
http://127.0.0.1:54324(for viewing magic link emails)
cp .env.local.example .env.localEdit .env.local and add your credentials from the previous step:
NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_anon_key_here
NEXT_PUBLIC_SITE_URL=http://localhost:3000npm run devOpen http://localhost:3000 in your browser.
During local development, magic link emails are sent to Mailpit at: http://127.0.0.1:54324
bringer/
βββ src/
β βββ app/ # Next.js app router pages
β β βββ login/ # Authentication
β β βββ w/ # Workspace routes
β β βββ [workspaceId]/
β β βββ lists/ # Shopping lists
β β βββ recipes/ # Recipes
β βββ components/ # React components
β β βββ ui/ # shadcn/ui components
β βββ lib/ # Utilities and helpers
β βββ supabase/ # Supabase clients
βββ supabase/
β βββ migrations/ # Database migrations
βββ tests/
β βββ components/ # Component tests (Vitest)
β βββ e2e/ # End-to-end tests (Playwright)
βββ public/ # Static assets
npm run dev # Start development server
npm run build # Build for production
npm run start # Start production server
npm run lint # Run ESLint
npm run test # Run unit/component tests
npm run test:ui # Run tests with UI
npm run test:e2e # Run end-to-end testsnpx supabase status # View running services
npx supabase db reset # Reset local database
npx supabase migration new # Create new migration
npx supabase db push # Push migrations to remoteRun component tests:
npm testRun E2E tests:
npm run test:e2eRun tests with coverage:
npm run test:coverage- Workspaces: Sharing boundary for all data
- Items: Canonical catalog of ingredients/products (workspace-scoped)
- Shopping Lists: Collections of items with notes and checked status
- Recipes: Collections of items with instructions and images
- Icons: Global icon mappings (Lucide icons)
When you type an item name, the system:
- Normalizes the name (lowercase, trim, collapse spaces)
- Checks if it already exists in the workspace
- If not found, creates it with an auto-matched icon
- Returns the canonical item ID
Uses PostgreSQL pg_trgm similarity to match item names with icon descriptions. Fallback to letter avatar if no good match found.
All database tables use RLS policies based on workspace membership. Users can only access data from workspaces they belong to.
See DEPLOYMENT.md for detailed production deployment instructions.
- Push your code to GitHub
- Connect to Vercel
- Set environment variables:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYNEXT_PUBLIC_SITE_URL
- Deploy!
See AGENTS.md for detailed contribution guidelines and architecture rules.
- Follow the coding style in the codebase
- Write tests for new features
- Update documentation
- Run
npm run lintbefore committing - Keep changes small and focused
- AGENTS.md - Architecture and agent guidelines
- DEPLOYMENT.md - Production deployment guide
- IMPROVEMENTS.md - Improvement recommendations
- spec.md - Product specification
MIT
For questions or issues, please open a GitHub issue.