# 🍽️ Dish Planner A Laravel-based meal planning application that helps households organize and schedule their dishes among multiple users. Built with Laravel, Livewire, and FrankenPHP for a modern, single-container deployment. ## ✨ Features - **Multi-user dish management** - Assign dishes to specific household members - **Smart scheduling** - Automatic schedule generation with recurrence patterns - **Calendar view** - Visual 31-day schedule overview - **Real-time updates** - Livewire-powered reactive interface - **Dark theme UI** - Modern interface with purple/pink accents - **Single container deployment** - Simplified hosting with FrankenPHP ## 🚀 Self-hosting The production image is available at `codeberg.org/dish-planner/app:latest`. ### docker-compose.yml ```yaml services: app: image: codeberg.org/dish-planner/app:latest container_name: dishplanner_app restart: always ports: - "8000:8000" environment: APP_KEY: "${APP_KEY}" APP_URL: "${APP_URL}" DB_DATABASE: "${DB_DATABASE}" DB_USERNAME: "${DB_USERNAME}" DB_PASSWORD: "${DB_PASSWORD}" MAIL_HOST: "${MAIL_HOST:-}" MAIL_PORT: "${MAIL_PORT:-587}" MAIL_USERNAME: "${MAIL_USERNAME:-}" MAIL_PASSWORD: "${MAIL_PASSWORD:-}" MAIL_FROM_ADDRESS: "${MAIL_FROM_ADDRESS:-noreply@example.com}" volumes: - app_storage:/app/storage depends_on: - db healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/up"] interval: 30s timeout: 10s retries: 3 start_period: 40s db: image: mariadb:11 container_name: dishplanner_db restart: always environment: MYSQL_DATABASE: "${DB_DATABASE}" MYSQL_USER: "${DB_USERNAME}" MYSQL_PASSWORD: "${DB_PASSWORD}" MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}" volumes: - db_data:/var/lib/mysql volumes: db_data: app_storage: ``` ### Environment Variables | Variable | Required | Description | |----------|----------|-------------| | `APP_KEY` | Yes | Encryption key. Generate with: `echo "base64:$(openssl rand -base64 32)"` | | `APP_URL` | Yes | Your domain (e.g., `https://meals.example.com`) | | `DB_DATABASE` | Yes | Database name | | `DB_USERNAME` | Yes | Database user | | `DB_PASSWORD` | Yes | Database password | | `DB_ROOT_PASSWORD` | Yes | MariaDB root password | | `MAIL_HOST` | No | SMTP host for email notifications | | `MAIL_PORT` | No | SMTP port (default: 587) | | `MAIL_USERNAME` | No | SMTP username | | `MAIL_PASSWORD` | No | SMTP password | | `MAIL_FROM_ADDRESS` | No | From address for emails | ## 🔧 Development ### NixOS / Nix ```bash git clone https://codeberg.org/dish-planner/app.git cd dish-planner nix-shell ``` The shell will display available commands and optionally start the containers for you. #### Available Commands | Command | Description | |---------|-------------| | `dev-up` | Start development environment | | `dev-down` | Stop development environment | | `dev-restart` | Restart containers | | `dev-rebuild` | Full rebuild (removes volumes) | | `dev-rebuild-quick` | Quick rebuild (keeps volumes) | | `dev-logs [service]` | Follow logs | | `dev-shell` | Enter app container | | `dev-artisan ` | Run artisan commands | | `dev-fix-permissions` | Fix Docker-created file permissions | #### Services | Service | URL | |---------|-----| | App | http://localhost:8000 | | Vite | http://localhost:5173 | | Mailhog | http://localhost:8025 | | MariaDB | localhost:3306 | ### Other Platforms Contributions welcome for development setup instructions on other platforms. ## 📄 License This project is open-source software licensed under the [MIT license](LICENSE.md). ## 📞 Support For issues and questions, please use [Codeberg Issues](https://codeberg.org/dish-planner/app/issues).