YomU (ΧΧΧ-You) is a mobile-first web application that aggregates and displays personal birthday benefits, deals, and freebies for users in Israel. The platform helps users never miss a birthday deal again by consolidating information they would otherwise have to find manually.
- Birthday Benefits Tracking: Centralized platform for all birthday benefits
- Membership Management: Easy management of loyalty program memberships
- Real-time Notifications: Push notifications for new benefits and expiring deals
- Multi-language Support: Full Hebrew and English interface with 10 additional beta languages
- Dark Mode: Global dark mode support
- Mobile-First Design: Responsive design optimized for mobile devices
- Admin Dashboard: Complete CRUD interface for managing brands and benefits
- Language Management: Advanced language selector with RTL/LTR support
- Onboarding & Profile Setup: Simple sign-up with Date of Birth requirement
- My Memberships Screen: Checklist of popular Israeli brands and loyalty clubs
- Dashboard: Card-based layout showing active and upcoming benefits
- Benefit Details: Full descriptions, terms & conditions, and redemption methods
- Search & Filter: Advanced search and filtering capabilities
- Custom Memberships: Add and manage custom membership programs
- Language Selection: Choose from 12 supported languages with native names and flags
- Brand Management: Add, edit, delete, and toggle brands
- Benefit Management: Create and manage benefits with full validation
- Bulk Operations: Import/export data via command-line tools
- Status Control: Toggle active/inactive status for brands and benefits
- Data Integrity: Automatic cascade deletion for related records
- Fully Supported: Hebrew (Χ’ΧΧ¨ΧΧͺ), English
- Beta Languages: Arabic (Ψ§ΩΨΉΨ±Ψ¨ΩΨ©), Russian (Π ΡΡΡΠΊΠΈΠΉ), French (FranΓ§ais), Spanish (EspaΓ±ol), German (Deutsch), Italian (Italiano), Portuguese (PortuguΓͺs), Japanese (ζ₯ζ¬θͺ), Korean (νκ΅μ΄), Chinese (δΈζ)
- Food & Restaurants: McDonald's, Starbucks, KFC, Buckaroo, Shegev, James, Little Prague, Humongous, Giraffe
- Fashion: Fox, H&M, Max, Shilav
- Health & Beauty: Super-Pharm LifeStyle
- Transport: Isracard
- Home & DIY: BBB, Manam DIY
- Grocery: Shufersal, Mika Convenience Stores
- Entertainment: Escape Room
- Node.js 18+
- npm or yarn
- Git
-
Clone the repository
git clone <repository-url> cd yomu
-
Install dependencies
npm install
-
Set up environment variables
cp .env.example .env
Update
.envwith your configuration:DATABASE_URL=file:./dev.db NEXTAUTH_URL=http://localhost:3000 NEXTAUTH_SECRET=your-secret-key-here-change-in-production GOOGLE_CLIENT_ID=your-google-client-id-here GOOGLE_CLIENT_SECRET=your-google-client-secret-here
-
Set up the database
npx prisma generate npx prisma db push
-
Run the development server
npm run dev
-
Open your browser Navigate to http://localhost:3000
-
Clone the repository
git clone <repository-url> cd yomu
-
Run the setup script
./scripts/docker-setup.sh setup
-
Start the application
# Production mode ./scripts/docker-setup.sh start # Development mode (with hot reload) ./scripts/docker-setup.sh start-dev
-
Initialize the database
./scripts/docker-setup.sh init-db
-
Access the application
- Production: http://localhost:3000
- Development: http://localhost:3001
The same commands work with Podman. The setup script automatically detects and uses Podman if Docker is not available.
# Start production services
docker-compose up -d
# Start development services
docker-compose --profile dev up -d
# View logs
docker-compose logs -f app
# Stop services
docker-compose down
# Rebuild images
docker-compose build --no-cache# Start production services
podman-compose up -d
# Start development services
podman-compose --profile dev up -d
# View logs
podman-compose logs -f app
# Stop services
podman-compose downFor detailed Docker/Podman documentation, see docs/DOCKER.md.
- 71/71 unit test suites passing (100%)
- 255/255 individual tests passing (100%)
- Comprehensive E2E test suite with Playwright
- Accessibility testing compliance
- Mobile responsiveness testing
# Run all unit tests
npm test
# Watch mode for development
npm run test:watch
# Generate coverage report
npm run test:coverage# Run all E2E tests
npm run test:e2e
# Run with browser UI visible
npm run test:e2e:headed
# Debug mode (step-by-step)
npm run test:e2e:debug
# Mobile-specific tests
npm run test:e2e:mobile
# Accessibility tests
npm run test:e2e:accessibility
# View test reports
npm run test:e2e:report# Lint code quality
npm run lint
# Translation checks
npm run test:translations
# Docker smoke test
npm run test:docker
# Partnership tests
npm run test:partnerships- Unit Tests:
tests/unit/- Component, page, and utility testing - E2E Tests:
tests/e2e/- Full user journey testing - Integration Tests:
tests/integration/- API and system integration - Accessibility: Automated ARIA compliance and keyboard navigation
- Mobile Testing: Responsive design and touch interactions
- Next.js 15: React framework with App Router
- TypeScript: Type-safe development
- Tailwind CSS: Utility-first CSS framework
- Lucide React: Beautiful icons
- NextAuth.js: Authentication solution
- Node.js: JavaScript runtime
- Prisma ORM: Database toolkit
- SQLite: Local development database
- bcryptjs: Password hashing
- SQLite: Local development (can be switched to PostgreSQL for production)
- NextAuth.js: Email/password and Google OAuth
- JWT: Session management
- Email/password registration and login
- Google OAuth integration
- Secure session management
- Password hashing with bcrypt
- Pre-configured popular Israeli brands
- Custom membership creation
- Search and filter functionality
- Free vs. paid membership indicators
- Cost details for paid memberships
- Active benefits display
- Upcoming benefits preview
- Copy-to-clipboard functionality for promo codes
- Detailed benefit information
- Brand logos and descriptions
- Global dark mode support
- Persistent user preference
- System preference detection
- Toggle available on all pages
- Full Hebrew and English support
- RTL (Right-to-Left) layout support
- Language switching functionality
- Context-based translation management
- Mobile-First: Designed for mobile screens first, then desktop
- Clean & Intuitive: Minimalist design avoiding clutter
- Festive but Mature: Pleasant color palette hinting at celebration
- Visual Hierarchy: Clear typography and brand logos
- Accessibility: Proper contrast ratios and screen reader support
yomu/
βββ src/
β βββ app/ # Next.js App Router pages
β β βββ api/ # API routes
β β βββ auth/ # Authentication pages
β β βββ dashboard/ # Main dashboard
β β βββ memberships/ # Membership management
β β βββ settings/ # User settings
β β βββ globals.css # Global styles
β βββ components/ # Reusable components
β β βββ ui/ # UI components
β βββ contexts/ # React contexts
β βββ lib/ # Utility functions
β βββ types/ # TypeScript types
βββ prisma/ # Database schema
βββ public/ # Static assets
β βββ images/ # Brand logos
βββ package.json # Dependencies
We use a single, unified seed entry point that covers brands, partnerships, and benefits.
- Main script:
scripts/seed.js - Run locally:
# Prisma generate + schema push (first run)
npx prisma generate && npx prisma db push
# Seed everything (clears existing data)
npm run db:seedModes:
- Fresh install (wipe + seed):
node scripts/seed.js --mode=fresh
- Upsert/update without wipe (safe for existing DBs):
node scripts/seed.js --mode=upsert
- Seed a subset of brands only (comma-separated):
node scripts/seed.js --mode=upsert --brands="Giraffe,Nono & Mimi"
What it does (fresh):
- Clears
benefits,userMemberships,brand_partnerships, andbrands - Creates all brands and partnerships
- Seeds a comprehensive set of benefits (including co-branded examples)
What it does (upsert):
- Does NOT wipe data
- Upserts brands by name and benefits by (brandId + title)
- Creates missing partnerships if needed
Advanced: partial brand/benefit imports
- Use
scripts/admin-helper.jsto import/export JSON for brands/benefits without wiping the DB.
Production/Shared envs
- Prefer running seed only on fresh databases
- For updates, use the Admin UI or the admin helper instead of reseeding
DATABASE_URL: Database connection stringNEXTAUTH_URL: NextAuth.js base URLNEXTAUTH_SECRET: JWT encryption secretGOOGLE_CLIENT_ID: Google OAuth client IDGOOGLE_CLIENT_SECRET: Google OAuth client secret
The application uses Prisma with the following main models:
User: User accounts and profilesBrand: Brand information and logosBenefit: Birthday benefits and detailsUserMembership: User's active membershipsNotification: User notificationsCustomMembership: User-defined membership programsBrandPartnership: Brand partnership relationships
Access the admin interface at /admin to manage brands and benefits:
- Brand Management: Add, edit, delete, and toggle brands
- Benefit Management: Create and manage benefits with validation
- Real-time Updates: Immediate reflection of changes
- Data Integrity: Automatic cascade deletion
Use the admin helper script for bulk operations:
# Import brands from JSON file
node scripts/admin-helper.js import-brands brands.json
# Export current brands to JSON
node scripts/admin-helper.js export-brands
# List all brands
node scripts/admin-helper.js list-brands
# Toggle brand status
node scripts/admin-helper.js toggle-brand <brand-id>
# Similar commands for benefits
node scripts/admin-helper.js import-benefits benefits.json
node scripts/admin-helper.js export-benefits
node scripts/admin-helper.js list-benefits
node scripts/admin-helper.js toggle-benefit <benefit-id>The application supports 12 languages with automatic RTL/LTR detection:
- Language Detection: Browser language, localStorage, or manual selection
- RTL Support: Automatic text direction for Arabic and Hebrew
- Translation Fallbacks: Robust fallback chain (current β English β Hebrew β key)
- Beta Languages: 10 additional languages in beta with partial translations
- Connect your GitHub repository to Vercel
- Configure environment variables
- Deploy automatically on push to main branch
- Netlify: Static site hosting
- Railway: Full-stack deployment
- Heroku: Traditional hosting
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Contributors: The team behind YomU
- Brand Partners: All the brands providing birthday benefits
- Open Source Community: For the amazing tools and libraries used
For support, email support@yomu.app or create an issue in this repository.
If you find this project helpful, you can support the work here:
- Buy Me A Coffee: https://buymeacoffee.com/maxim_united
YomU - Never miss a birthday deal again! π