Self-hosted, privacy-first recipe management app (MVP)
Go to file
Paul Huliganga 67a9a8ce16 feat(frontend): implement recipe detail/edit page with full CRUD functionality
- Created useRecipe hook for fetching single recipe with loading/error states
- Created RecipeForm component with comprehensive validation
  - Title, ingredients, and instructions marked as required fields
  - One ingredient/instruction per line with textarea inputs
  - Optional metadata: servings, prep time, cook time, source URL, notes
  - Real-time form validation with error messaging
- Implemented RecipeDetailPage with three modes:
  - Create mode: /recipe/new route for adding new recipes
  - View mode: Display recipe with formatted ingredients and instructions
  - Edit mode: Toggle to edit existing recipe with pre-populated form
- Added delete functionality with two-step confirmation
- Included metadata cards for servings, prep time, and cook time
- Added navigation: Cook Mode button, back to list link
- Styled with Tailwind CSS for consistent UI/UX
- Verified TypeScript compilation and Vite build succeed
- Updated TODO.md to mark task complete
2026-03-24 03:27:51 -04:00
docs fix(deps): switch to sql.js to resolve Node v22 compatibility 2026-03-24 00:00:59 -04:00
frontend feat(frontend): implement recipe detail/edit page with full CRUD functionality 2026-03-24 03:27:51 -04:00
src/backend feat(api): implement recipe CRUD API endpoints 2026-03-24 00:13:58 -04:00
.gitignore chore: initialize recipe-manager project with agentic harness 2026-03-23 22:03:14 -04:00
AGENT_INSTRUCTIONS.md fix(harness): improve task clarity and error signaling per agent-harness methodology 2026-03-23 23:39:02 -04:00
ARCHITECTURE.md fix(deps): switch to sql.js to resolve Node v22 compatibility 2026-03-24 00:00:59 -04:00
KICKOFF.md feat(backend): initialize Node.js project with Express 2026-03-23 23:40:36 -04:00
PROJECT.md docs: finalize project decisions and AI features vision 2026-03-23 22:12:58 -04:00
README.md docs: add Gitea repository URL to README 2026-03-24 00:39:25 -04:00
ROADMAP.md chore: initialize recipe-manager project with agentic harness 2026-03-23 22:03:14 -04:00
TODO.md feat(frontend): implement recipe detail/edit page with full CRUD functionality 2026-03-24 03:27:51 -04:00
package-lock.json feat(api): implement recipe CRUD API endpoints 2026-03-24 00:13:58 -04:00
package.json feat(api): implement recipe CRUD API endpoints 2026-03-24 00:13:58 -04:00
tsconfig.json build(backend): set up TypeScript with strict mode and build script 2026-03-23 23:45:09 -04:00

README.md

Recipe Manager

Self-hosted, privacy-first recipe management app

Built with ❤️ by autonomous AI agents for the Huliganga family.

Repository: https://paje.ca/git/paulh/recipe-manager


Status

🚧 In Development — MVP phase
📋 See ROADMAP.md for current milestone


What Is This?

A modern, self-hosted alternative to services like CopyMeThat. Store, organize, and cook from your recipes with full data ownership.

Key Features (MVP)

  • Manual recipe entry
  • Tag-based organization
  • Text search
  • Cook mode (ingredient checklist + step tracking)
  • Self-hosted deployment (Docker)

Planned Features

  • Recipe scraping (browser extension)
  • Serving size scaling
  • Meal planning & shopping lists
  • AI-powered ingredient substitutions
  • Integration with Fintrove (cost tracking)

Quick Start

Prerequisites

  • Node.js 22+
  • Docker & Docker Compose (for deployment)
  • npm or pnpm

Development Setup

# Clone the repo
cd /home/paulh/.openclaw/workspace/projects/recipe-manager

# Install dependencies
npm install

# Start backend (development mode)
npm run dev:backend

# Start frontend (separate terminal)
npm run dev:frontend

# Run tests
npm test

Production Deployment

# Build and start containers
docker-compose up -d

# View logs
docker-compose logs -f

# Stop
docker-compose down

Access at http://localhost:3000 (or https://recipes.paje.ca in production).


Project Structure

recipe-manager/
├── src/
│   ├── backend/          # Express API
│   │   ├── routes/       # API endpoints
│   │   ├── services/     # Business logic
│   │   ├── repositories/ # Database access
│   │   └── types/        # TypeScript types
│   ├── frontend/         # React app
│   │   ├── components/   # UI components
│   │   ├── hooks/        # React hooks
│   │   ├── pages/        # Route pages
│   │   └── services/     # API client
│   └── shared/           # Shared types/utilities
├── tests/
│   ├── unit/             # Unit tests
│   ├── integration/      # API integration tests
│   └── e2e/              # End-to-end tests
├── docs/
│   ├── api.md            # API documentation
│   ├── user-guide.md     # User manual
│   └── ADR-*.md          # Architecture decision records
├── data/                 # SQLite database (gitignored)
├── PROJECT.md            # Product vision
├── ARCHITECTURE.md       # Technical design
├── ROADMAP.md            # Development milestones
├── AGENT_INSTRUCTIONS.md # How agents work on this project
└── docker-compose.yml    # Deployment config

Technology Stack

Backend

  • Node.js + TypeScript — Modern, type-safe JavaScript
  • Express — Minimal, flexible web framework
  • SQLite (better-sqlite3) — Fast, embedded database
  • Zod — Runtime type validation

Frontend

  • React 18 — Component-based UI
  • Vite — Lightning-fast dev server
  • Tailwind CSS — Utility-first styling
  • React Router — Client-side routing

DevOps

  • Docker Compose — Container orchestration
  • Caddy — Reverse proxy with auto-HTTPS
  • Vitest — Fast, modern test runner

Documentation


Development Workflow

This project is built agent-first using OpenClaw autonomous agents:

  1. Agent reads context — PROJECT.md, ARCHITECTURE.md, ROADMAP.md
  2. Agent picks next task — From the current milestone
  3. Agent implements & tests — Following coding standards
  4. Agent commits & documents — Conventional commits + ADRs
  5. Agent reports completion — Or escalates if blocked

Human oversight at milestone boundaries.


Contributing

This is a personal/family project, but contributions welcome!

For Humans

  1. Read PROJECT.md and ARCHITECTURE.md
  2. Check ROADMAP.md for open tasks
  3. Follow patterns in AGENT_INSTRUCTIONS.md
  4. Submit PRs with tests + documentation

For AI Agents

Read AGENT_INSTRUCTIONS.md — it's your operating manual.


Testing

# Run all tests
npm test

# Run tests in watch mode
npm run test:watch

# Generate coverage report
npm run test:coverage

# Run specific test file
npm test -- RecipeService.test.ts

# E2E tests (requires app running)
npm run test:e2e

Coverage goal: >80% on core business logic.


Deployment

Local Development

npm run dev

Access at http://localhost:5173 (frontend) and http://localhost:3000 (API).

Production (paje.ca)

# On server
docker-compose up -d

# Check status
docker-compose ps

# View logs
docker-compose logs -f recipe-manager

Backup & Restore

# Backup database
cp data/recipes.db data/recipes-backup-$(date +%Y%m%d).db

# Restore
cp data/recipes-backup-20260323.db data/recipes.db
docker-compose restart

Environment Variables

Create .env file:

# Backend
NODE_ENV=production
PORT=3000
DATABASE_PATH=/app/data/recipes.db

# Frontend (build-time)
VITE_API_URL=https://recipes.paje.ca/api

Troubleshooting

Database locked

# Check for stale locks
fuser data/recipes.db
# Kill if needed, then restart
docker-compose restart

Port already in use

# Find process using port 3000
lsof -i :3000
# Kill it
kill -9 <PID>

Tests failing

# Clear node_modules and reinstall
rm -rf node_modules package-lock.json
npm install
npm test

License

Private project — All rights reserved (for now).
May open-source later.


Credits

Product Owner: Paul Huliganga
Primary Users: Anne & Elizabeth
Development: Autonomous AI agents (Codex 5.2) via OpenClaw
Human Oversight: Paul

Built as a learning project for agentic engineering and modern web development.


Roadmap Highlights

  • MVP (v0.1): Manual entry, tags, search, cook mode ← You are here
  • v1.0: Recipe scraping, advanced search, multi-device sync
  • v2.0: AI features (meal planning, cost tracking, substitutions)

See ROADMAP.md for details.


Questions? Check docs/ or ask Paul.