A free, open-source platform for price comparison and collaborative shopping lists
π Live Demo β’ π Documentation β’ π Report Bug β’ π‘ Request Feature
Deazl is a community-driven price comparison platform that helps you save money on your groceries and daily purchases. Compare prices across different stores, create collaborative shopping lists, and track price trends - all completely free and open source.
This project uses an automated release system with semantic versioning:
# Check release status make status # Promote staging to production make promote # Deploy to staging make deploy # View unreleased changes make changelog- Development β Feature branches merged to
dev - Staging β Auto pre-releases on
dev(e.g.,1.2.0-beta.1) - Production β Promote stable releases to
master
See Release Documentation for detailed workflow information.
- π Real-time Price Comparison: Compare prices between different stores instantly
- π± Barcode Scanner: Quickly add products by scanning barcodes
- π Smart Shopping Lists: Create, share, and collaborate on shopping lists in real-time
- π₯ Collaboration: Share lists with family and friends with role-based permissions
- π Price History: Track price changes over time with detailed charts
- π Price Alerts: Get notified when prices drop
- π Community-Driven: Prices verified and updated by an active community
- π± PWA Support: Install as a mobile app for the best experience
- π Multi-language: Available in English and French
- π¨ Modern UI: Beautiful, responsive interface with dark/light mode
- Framework: Next.js 15 with App Router
- Language: TypeScript
- Styling: Tailwind CSS 4
- UI Components: HeroUI
- State Management: React Server Components + Server Actions
- Internationalization: Lingui
- PWA: @ducanh2912/next-pwa
- Database: PostgreSQL with Prisma ORM
- Authentication: NextAuth.js
- File Storage: Vercel Blob
- Search: Algolia
- Deployment: Vercel
- Pattern: Clean Architecture with Domain-Driven Design (DDD)
- Repository Pattern: Separated domain logic from infrastructure
- CQRS: Command Query Responsibility Segregation
- API: RESTful with OpenAPI documentation
- Code Quality: Biome for linting and formatting
- Testing: Jest with Testing Library
- Type Safety: Strict TypeScript with Zod validation
- Database: Prisma migrations and type-safe queries
- CI/CD: GitHub Actions with automated testing and deployment
The application follows Clean Architecture principles with Domain-Driven Design:
src/ βββ applications/ # Application layer (use cases) β βββ ShoppingLists/ # Shopping list domain β β βββ Api/ # Server actions (controllers) β β βββ Application/ # Application services β β βββ Domain/ # Domain entities, value objects, services β β βββ Infrastructure/# Repositories, mappers β β βββ Ui/ # React components β βββ Prices/ # Price comparison domain β βββ Authentication/ # User authentication β βββ ... βββ components/ # Shared UI components βββ libraries/ # External service integrations βββ views/ # Page-level components - Repository Pattern: Clean separation between domain logic and data access
- Domain Services: Business logic encapsulated in domain services
- Application Services: Orchestrate use cases and handle cross-cutting concerns
- Value Objects: Ensure data integrity with typed value objects
- Entity Aggregates: Maintain consistency within domain boundaries
- Node.js 22+ and yarn
- PostgreSQL database
- Git for version control
-
Clone the repository
git clone https://github.com/Deazl-Comparator/deazl.git cd pcomparator -
Install dependencies
yarn install
-
Environment setup
cp .env.example .env.local
Configure your environment variables:
# Database DATABASE_URL="postgresql://username:password@localhost:5432/deazl" # NextAuth NEXTAUTH_SECRET="your-secret-key" NEXTAUTH_URL="http://localhost:3001" # OAuth providers (optional) GOOGLE_CLIENT_ID="your-google-client-id" GOOGLE_CLIENT_SECRET="your-google-client-secret" # External APIs ALGOLIA_APP_ID="your-algolia-app-id" ALGOLIA_API_KEY="your-algolia-api-key" OPEN_FOOD_FACT_API_ENDPOINT="https://world.openfoodfacts.org"
-
Database setup
npx prisma migrate dev npx prisma generate
-
Start development server
yarn dev
Open http://localhost:3001 in your browser.
| Command | Description |
|---|---|
yarn dev | Start development server with Turbo |
yarn build | Build for production |
yarn start | Start production server |
yarn test | Run test suite |
yarn lint | Lint code with Biome |
yarn format:check | Check code formatting |
yarn typescript:check | Type check without emitting |
yarn translation:extract | Extract translation strings |
yarn storybook | Start Storybook development |
- Create & Manage: Organize your shopping with smart lists
- Real-time Collaboration: Share with family/friends with role-based access
- Quick Add: Use natural language input (e.g., "2kg apples β¬3.50")
- Progress Tracking: Monitor completion status and spending
- Barcode Integration: Scan products directly into lists
- Multi-store Comparison: Compare prices across different retailers
- Historical Data: 30-day price history with trend analysis
- Community Verified: Prices validated by the user community
- Price Alerts: Get notified when products go on sale
- Proof System: Photo verification for price accuracy
- Crowdsourced Data: Community-maintained price database
- Product Database: 10,000+ products with detailed information
- Store Network: Major French retailers and local stores
- User Contributions: Easy price submission with verification
- Progressive Web App: Install on mobile devices
- Offline Support: Basic functionality works offline
- Camera Integration: Barcode scanning and price proof photos
- Touch Optimized: Designed for mobile-first experience
-- Users and Authentication User (id, email, name, phone, image) Account (provider, providerAccountId, userId) Session (sessionToken, userId, expires) -- Product Catalog Product (id, barcode, name, description, categoryId, brandId) Category (id, name, description, parentCategoryId) Brand (id, name, description, websiteUrl) Store (id, name, location, websiteUrl) -- Price Tracking Price (id, productId, storeId, amount, currency, dateRecorded, proofImage) -- Shopping Lists ShoppingList (id, name, description, userId, isPublic, shareToken) ShoppingListItem (id, shoppingListId, productId, quantity, unit, customName, price, isCompleted) ShoppingListCollaborator (id, listId, userId, role)- Google OAuth: Quick social login
- OWNER: Full control over shopping lists
- EDITOR: Can modify list items and settings
- VIEWER: Read-only access to shared lists
- Session Management: Secure JWT-based sessions
- CSRF Protection: Built-in security measures
- Rate Limiting: API abuse prevention
- Data Validation: Comprehensive input sanitization
Deazl supports multiple languages using Lingui:
- English (en): Primary language
- French (fr): Fully localized
-
Extract strings:
yarn translation:extract
-
Add new locale in
lingui.config.ts -
Translate strings in
src/translations/messages/{locale}.po -
Compile translations:
yarn compile
# Unit Tests yarn test # Component Tests yarn test -- --testPathPattern=components # Integration Tests yarn test -- --testPathPattern=integration- Unit Tests: Domain logic and utilities
- Integration Tests: API endpoints and database operations
- Component Tests: React component behavior
- E2E Tests: Critical user journeys
- Connect repository to Vercel
- Configure environment variables
- Deploy: Automatic deployment on push to main
# Database DATABASE_URL="postgresql://..." # NextAuth NEXTAUTH_SECRET="production-secret" NEXTAUTH_URL="https://your-domain.com" # Storage BLOB_READ_WRITE_TOKEN="vercel-blob-token" # Search ALGOLIA_APP_ID="production-app-id" ALGOLIA_API_KEY="production-key"# Build application yarn build # Start production server yarn start- Server-Side Rendering: Fast initial page loads
- Image Optimization: Automatic image compression and lazy loading
- Code Splitting: Bundle optimization with Next.js
- Caching: Aggressive caching strategies
- PWA: Offline functionality and app-like experience
- Error Tracking: Built-in error boundaries
- Performance Metrics: Core Web Vitals monitoring
- Database Monitoring: Query performance tracking
- User Analytics: Privacy-friendly usage analytics
We welcome contributions from the community! Here's how you can help:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes following the coding standards
- Add tests for new functionality
- Run the test suite:
yarn test - Lint your code:
yarn lint - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
- TypeScript: Strict type checking enabled
- Biome: Consistent code formatting and linting
- Conventional Commits: Semantic commit messages
- Clean Architecture: Follow established patterns
- Test Coverage: Maintain test coverage above 80%
- π Bug Fixes: Help us squash bugs
- β¨ New Features: Implement requested features
- π Translations: Add support for new languages
- π Documentation: Improve docs and guides
- π¨ UI/UX: Enhance user experience
- β‘ Performance: Optimize application performance
- π§ͺ Testing: Improve test coverage
This project is licensed under the MIT License - see the LICENSE file for details.
- Open Food Facts: Product database and API
- Community Contributors: Thanks to all who contribute prices and feedback
- Open Source Libraries: Built on the shoulders of giants
- π Bug Reports: GitHub Issues
- π‘ Feature Requests: GitHub Discussions
- π§ Contact: clement.muth@deazl.fr
- π¦ Updates: Follow us on social media
- Version: 4.9.0
- Status: Active Development
- Users: 2+ active users
- Products: 10+ tracked products
- Stores: Major French retailers supported
Made with β€οΈ by the Deazl community
Help us make price comparison accessible to everyone
