Cantina is a modern web application for planning and managing your household's weekly menus. Plan meals for upcoming days, manage your dish library, and keep everyone on the same page β no login required.
- View menus for up to 7 days at a glance
- Each daily menu displays four categories:
- π² Soup
- π Main dish
- π₯ Side dish
- π₯ Salad
- Add dishes to any category for any day
- Remove dishes from the menu with a single click
- Automatically expands to show days with dishes assigned
- Add additional days to your schedule on demand
Organize your household's dish library by category:
- Add new dishes to any category (soup, main, side, salad)
- Edit existing dishes to update names or categories
- Delete dishes you no longer use
- Visual category cards with emoji icons
- Real-time dish count badges
- Quick-add buttons for each category
- Rotating dish pool: Automatically suggests different dishes each week
- Persistent storage: All menus and dishes are saved
- Error handling: Toast notifications for all operations
- Responsive design: Works seamlessly on desktop, tablet, and mobile
- No authentication: Simple and instant access for all household members
- No login required: Instant access for everyone in your household
- Collaborative: Shared menu planning made simple
- Persistent: Never lose your menu plans or dish library
- Fast & intuitive: Minimal clicks to plan your week
- Category-based: Organized by meal components for balanced planning
- Frontend: React 18 + TypeScript
- Styling: TailwindCSS + Material-UI
- State Management: Zustand with persistence
- Build Tool: Vite
- Backend: my-json-server (JSON-based API)
- Server: Express with SSR support
- Node.js 18+
- npm or yarn
-
Clone the repository:
git clone https://github.com/JGEsteves89/cantina.git cd cantina -
Install dependencies:
npm install
-
Create a
.envfile for local development:PORT=3001 MY_JSON_SERVER_URL=http://localhost:3000 MY_JSON_SERVER_API=YOUR_TOKEN_HERE
-
Start the development server:
npm run dev:client # Frontend (Vite) npm run dev:server # Backend (Express)
-
Open your browser at
http://localhost:5173
npm run build
npm run serveCantina uses my-json-server as its backend. Both services must share the same Docker network.
docker network create my-json-server-netCreate my-json-server/docker-compose.yml:
version: '3.9'
services:
my-json-server-service:
image: ijimiguel/my-json-server:latest
networks:
- my-json-server-net
ports:
- '4123:3000'
environment:
ALLOWED_ORIGIN: '*'
RATE_LIMIT_WINDOW_MS: 60000
RATE_LIMIT_MAX: 100
volumes:
- ./data:/usr/src/app/data
- ./myApiKeys.json:/usr/src/app/apiKeys.json:ro
restart: always
networks:
my-json-server-net:
external: trueCreate cantina/docker-compose.yml:
version: '3.9'
services:
cantina:
image: ijimiguel/cantina:latest
container_name: cantina
restart: unless-stopped
networks:
- my-json-server-net
ports:
- '7456:3001'
environment:
NODE_ENV: production
PORT: 3001
MY_JSON_SERVER_URL: 'http://my-json-server-service:3000'
MY_JSON_SERVER_API: 'YOUR_TOKEN_HERE'
networks:
my-json-server-net:
external: truedocker-compose -f my-json-server/docker-compose.yml up -d
docker-compose -f cantina/docker-compose.yml up -dAccess Cantina at http://localhost:7456
| Variable | Description | Default |
|---|---|---|
PORT |
Server port | 3001 |
NODE_ENV |
Environment mode | development |
MY_JSON_SERVER_URL |
Backend API URL | http://localhost:3000 |
MY_JSON_SERVER_API |
API authentication token | - |
npm run dev:client- Start Vite dev servernpm run dev:server- Start Express dev servernpm run build- Build for productionnpm run serve- Serve production buildnpm run typecheck- Run TypeScript type checkingnpm run format- Format code with Prettier
Contributions are welcome! Feel free to:
- Report bugs via GitHub Issues
- Suggest new features
- Submit pull requests
- Improve documentation
MIT License
Built with modern web technologies and powered by my-json-server for simple, file-based data persistence.
