6.3 KiB
6.3 KiB
FlixCooks Project Brain
This document summarizes architectural knowledge, conventions, and learnings for humans and AI agents working on this repo.
1. Project Architecture & Stack
- Backend: Vanilla PHP. No heavy frameworks.
- Database: PostgreSQL required (
DATABASE_URLin.env). Normalized tables inscripts/schema.sql;load_recipes()/save_recipe()andload_site_settings()/save_site_settings()inhelpers.php. Recipes read at runtime only from Postgres. One-time import of sample data:php scripts/db-seed.phpfromdata/recipes.json. - Site settings (legal pages): Stored in Postgres table
site_settings; no flat-file fallback. - Admin Panel (
admin.php): Lightweight CMS. Textareas use one line per array element (ingredients,steps,step_videos,step_timers). - Frontend: Server-rendered PHP (
index.php,recipe.php, …), Vanilla JS/CSS. Profile/favorites viaassets/fc-local.js. - Config:
config.phploads.env,get_db_connection(). Never commit.env(see.gitignore).
2. Design & Aesthetics
- CSS: Custom properties (
var(--ease-out-expo),var(--surface-1)), glassmorphism,FloemaLayoutGrid. - Lenis: Call
lenis.stop()when opening fullscreen overlays (e.g. Cooking Mode);lenis.start()on close. - Preloader:
CapitoliumPreloaderon homepage; once per session viasessionStorage('flixcooks_preloader_seen').
3. Antigravity Agent Configuration
- Workspace Rules:
.agents/rules/withalways_on: trueandglob: "*"in frontmatter. - Custom Skills:
.agents/skills/(e.g.close_feature.jsonfor Git merge workflow).
4. GitHub Actions & CI/CD
- Gemini PR review:
petarzarkov/gemini-code-review-action; secrets viaenv:notwith:; pin action versions; use full model names (e.g.gemini-2.0-flash-lite).
5. PostgreSQL — Schema & Data Flow
Relational schema (scripts/schema.sql)
Created by ensure_recipe_schema() on first DB use. Legacy JSONB/file fallbacks are not supported.
| Table | Role |
|---|---|
recipes |
slug, hero, times, servings, nutrition columns, featured, coming_soon |
recipe_translations |
title, description, category, difficulty (en/de) |
recipe_tags, recipe_ingredients, recipe_utensils, recipe_steps |
Ordered lists per language |
site_settings |
imprint/privacy fields per language |
PHP still exposes the same nested arrays (i18n, nutrition, …) via hydrate_recipes_from_db().
Runtime flow
DATABASE_URLrequired →require_database()or HTTP 503 (maintenance/db-unavailable.php).load_recipes()→ SQL → PHP arrays for templates.- Admin:
save_recipe(),delete_recipe(),clear_featured_recipes(). - One-time import:
php scripts/db-seed.phpfromdata/recipes.json.
config.php functions
load_env()— parses.env.get_db_connection()— PDO ornull.DatabaseUnavailableException— thrown when DB is required but missing.
6. Local Development — Docker Postgres
Files
docker-compose.dev.yml— Postgres 16 Alpine, containerflixcooks-postgres-dev, port5432..env.example— template including localDATABASE_URL.scripts/db-check.php— CLI: connect,init_db(), print recipe count + sample slugs/titles.
Docker credentials (dev only)
POSTGRES_USER=flixcooks
POSTGRES_PASSWORD=flixcooks_dev
POSTGRES_DB=flixcooks_dev
DATABASE_URL="postgresql://flixcooks:flixcooks_dev@127.0.0.1:5432/flixcooks_dev"
Commands
docker compose -f docker-compose.dev.yml up -d # start
docker compose -f docker-compose.dev.yml ps # health
docker compose -f docker-compose.dev.yml down # stop (data kept)
docker compose -f docker-compose.dev.yml down -v # stop + wipe volume → re-seed on next hit
docker exec -it flixcooks-postgres-dev psql -U flixcooks -d flixcooks_dev
# psql: \dt , \d recipes , SELECT slug FROM recipes; , \q
PHP requirements (WSL/Linux)
- Extension
php-pgsql(orphp8.5-pgsql) required; without it the site cannot connect. - Install interactively:
sudo apt install php8.5-pgsql(sudo in non-interactive agent shells may timeout). - Verify:
php -m | grep pgsql→ expectpdo_pgsql,pgsql.
App server
php -S localhost:8000
php scripts/db-check.php # after .env + pgsql OK
.env rules for agents
- Copy from
.env.example; never commit.env. - Local: use
127.0.0.1Docker URL above. DATABASE_URLis mandatory for recipe pages; omitting it shows the DB unavailable page.
Environment separation (important)
- One database per environment (local Docker / staging / production).
- Never point a dev branch
.envat production Postgres. - Export/import between envs:
pg_dump/psqlwhen needed; document URLs in hosting secrets, not in repo.
7. Troubleshooting (known issues)
| Symptom | Cause | Fix |
|---|---|---|
| HTTP 503, database unavailable | No DATABASE_URL or Postgres down |
Fix .env, start Docker, php scripts/db-check.php |
Log: could not find driver |
php-pgsql not installed |
sudo apt install php8.5-pgsql |
| DB OK but 0 recipes | Empty tables | php scripts/db-seed.php |
8. Completed Milestones
- Phase 3 (Nutrition):
calories,protein,carbs,faton recipes; admin + UI. - Phase 4 (Cooking Mode):
step_videos,step_timers; fullscreen overlay. - Phase 6 (Postgres): Normalized SQL tables;
db-seed.php; no runtime JSON recipes. - Local dev Postgres:
docker-compose.dev.yml, README section,scripts/db-check.php,.env.examplewithDATABASE_URL. - Local profile data: Favorites/goals via
assets/fc-local.js(localStorage). Newsletter viamailto:.
9. Next Steps
See .agents/TODO.md (e.g. PWA & offline support). README Local Postgres (Docker) and Postgres in diesem Projekt sections mirror setup for humans.
10. Key file map (data layer)
| File | Purpose |
|---|---|
config.php |
.env, Firebase config, PDO |
helpers.php |
init_db, load_recipes, save_recipe, site settings |
data/recipes.json |
Seed data for recipes (imported by scripts/db-seed.php) |
docker-compose.dev.yml |
Local Postgres |
scripts/db-check.php |
Connection + seed smoke test |
partials/head.php |
Firebase init via get_firebase_config() |