{"id":51726702,"url":"https://github.com/fluse/meinhandwerk","last_synced_at":"2026-07-17T20:07:51.453Z","repository":{"id":369517124,"uuid":"1290082468","full_name":"fluse/meinhandwerk","owner":"fluse","description":null,"archived":false,"fork":false,"pushed_at":"2026-07-05T18:59:06.000Z","size":388,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-05T19:10:03.770Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fluse.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-07-05T15:01:53.000Z","updated_at":"2026-07-05T18:59:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fluse/meinhandwerk","commit_stats":null,"previous_names":["fluse/meinhandwerk"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/fluse/meinhandwerk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluse%2Fmeinhandwerk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluse%2Fmeinhandwerk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluse%2Fmeinhandwerk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluse%2Fmeinhandwerk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fluse","download_url":"https://codeload.github.com/fluse/meinhandwerk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluse%2Fmeinhandwerk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35594165,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-17T02:00:06.162Z","response_time":116,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-17T20:07:50.861Z","updated_at":"2026-07-17T20:07:51.443Z","avatar_url":"https://github.com/fluse.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MeinHandwerk\n\nReact frontend + PocketBase backend, orchestrated with Docker Compose.\n\n```\nfrontend/   Isolated React (Vite + TypeScript) app — see frontend/README.md\nbackend/    Isolated PocketBase environment (migrations, hooks, data)\ndocker-compose.yml   Connects both services\n```\n\nFor coding conventions and architecture rules, see [AGENTS.md](AGENTS.md).\n\n## Prerequisites\n\n- Node.js 22+ and npm (for local frontend dev)\n- Docker Desktop (or compatible) with Compose v2\n\n## Development\n\nIn development the backend runs in Docker while the frontend runs locally via Vite for fast HMR.\n\n1. Start PocketBase:\n\n   ```bash\n   docker compose up -d pocketbase\n   ```\n\n   PocketBase is now reachable at `http://localhost:8090`, and its admin UI at `http://localhost:8090/_/`.\n\n2. On first run, create a superuser account for the admin UI:\n\n   ```bash\n   docker compose exec pocketbase /pb/pocketbase superuser create admin@example.com \u003cpassword\u003e\n   ```\n\n3. Set up the frontend env file (only needed once):\n\n   ```bash\n   cp frontend/.env.example frontend/.env\n   ```\n\n4. Start the frontend dev server:\n\n   ```bash\n   cd frontend\n   npm install\n   npm run dev\n   ```\n\n   The app runs at `http://localhost:5173` and talks to PocketBase via `VITE_POCKETBASE_URL` from `frontend/.env`.\n\nTo stop the backend: `docker compose down` (data persists in `backend/pb_data`, which is bind-mounted and gitignored).\n\n## Production\n\nBoth services run fully containerized:\n\n```bash\ndocker compose up -d --build\n```\n\n- Frontend (built React app served by nginx): `http://localhost:80`\n- PocketBase API + admin UI: `http://localhost:8090`\n\nThe frontend image bakes `VITE_POCKETBASE_URL` in at build time (Vite env vars are static once bundled). Override it via a `VITE_POCKETBASE_URL` environment variable before building if PocketBase is reachable at a different URL for end users (e.g. a public domain instead of `localhost`):\n\n```bash\nVITE_POCKETBASE_URL=https://api.example.com docker compose up -d --build\n```\n\nStop everything with `docker compose down`.\n\n## Backend schema changes\n\nPocketBase migrations live in `backend/pb_migrations/` and custom server-side logic in `backend/pb_hooks/`. Both are copied into the image at build time, so rebuild the `pocketbase` service (`docker compose up -d --build pocketbase`) after changing either.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffluse%2Fmeinhandwerk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffluse%2Fmeinhandwerk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffluse%2Fmeinhandwerk/lists"}