Cartly is an open-source Next.js 15 PWA built in TypeScript that helps Canadians save money by scanning grocery receipts and comparing prices across local stores in real time. It combines on-device AI, a local SQLite database, and a full-stack local-first architecture to deliver instant price transparency without any cloud backend or subscription.
What is a PWA? A Progressive Web App is a website that behaves like a native mobile app. You can install it to your phone's home screen, use it offline, and access your camera and device features — all from a single web codebase. No App Store, no separate native teams, no approval process.
- 📸 Scan your cart — Take a photo and Cartly identifies every item using Gemini vision
- 💰 Compare prices — See prices across Walmart, No Frills, Loblaws, and more
- 📊 Calculate savings — Know exactly how much you could save by shopping smarter
- 📱 Works offline — Install as a PWA on your phone
This project was built as a passion project and is now open-sourced. If you're interested in taking it forward — whether as a solo project, a startup, or a community effort — the hard parts (OCR, matching, scraping) are solved, and the fun parts (better UX, more stores, price alerts, receipt history) are waiting. See Founders_note.md for the full handoff note.
git clone <repo-url>
cd cartly
npm install
cp .env.example .env.local
# Add your Gemini API key to .env.local
npx drizzle-kit push
npx tsx scripts/seed.ts
npx tsx scripts/seed-grocery.ts
npm run devOpen http://localhost:3000.
Cartly is local-first — it runs entirely on your machine with Next.js API routes and SQLite. No separate backend server is required. See ARCHITECTURE.md for the full design.
See ROADMAP.md for the path to production and 500+ users.
| Document | Purpose |
|---|---|
| ARCHITECTURE.md | System design and decisions |
| ROADMAP.md | Production roadmap |
| docs/GETTING_STARTED.md | Detailed setup guide |
| docs/API.md | API endpoint reference |
| docs/SCRAPERS.md | Price scraper documentation |
MIT — see LICENSE for details.