Shared garden plans that anyone can help tend.
I wanted an app that reminded me when my plants needed watering or feeding, and showed where everything was. It grew into shared gardens: a family, flatmates or a community group all looking after the same space, from one link, with no accounts.
Live: Production: https://fernslop.dakini-labs.com/ · Development: https://dev-fernslop.dakini-labs.com/
| Area | What is here | Details |
|---|---|---|
| Problem and behaviour | What the app is for, what it does, how it should behave | What it does · Product guide |
| Spec and task tracker | A build spec, and one Markdown issue per task with acceptance criteria and a QA verdict | Agent team |
| Agent team | Five roles with their own briefs, and a process for how they work together | Agent team · _docs/process.md |
| Agent context | AGENTS.md with the commands and links to the process and role docs |
AGENTS.md |
| Application | React frontend, FastAPI backend, PostgreSQL | Quick start · Architecture |
| Tests | Unit, integration and end-to-end tests, one command | Tests · Getting started |
| Containers | App, database and monitoring stack with Docker Compose, one command | Quick start |
| Deployment | Dev and prod on AWS, behind HTTPS | Deployment · Deployment guide |
| CI/CD | Tests on every pull request, automatic deploy to dev, manual promotion to prod | Deployment |
| Observability | Traces, metrics and logs that share a trace ID, viewed in Grafana | Observability · Guide |
| Alerting | An alert when users can't find the plant they want to add | Observability · Alert |
| On-call agent | Wakes on an alert, fixes it on a branch or files a GitHub issue | Observability · On-call agent |
- Shared gardens: create one and share its link. Anyone with it can edit, and changes show up live.
- Garden canvas: drag plants to where they grow, and mark areas like a pond or a veg bed.
- Find plants: search about 50 common plants by name, or identify one from a photo.
- Care rings: countdowns for watering, feeding, pruning and harvesting each plant.
- Feed and Undo: every change is logged, and plant and area changes can be undone.
- Weekly email: follow a garden by email and get a summary.
- Works on phones: nothing needs dragging.
| When you... | Fernslop... |
|---|---|
| Create a garden | Opens it and offers a link to share |
| Add a plant by search or photo | Asks you to confirm it, then places it in the middle of the canvas |
| Drag a plant or area | Saves it and shows the move to everyone else live |
| Mark a plant watered | Resets its ring and posts to the feed |
| Click Undo in the feed | Reverts that change, unless a later change touched the same thing |
| Add a 51st plant or an 11th area | Says the garden is full and adds nothing |
| Search for a plant that isn't in the table | Records the miss. Repeated misses raise an alert |
| Go too fast | Says "You're going a bit fast. Try again in N seconds." |
The full list, with screenshots, is in the product guide.
You need Docker (with Compose v2), uv, Node.js 24 and make.
git clone https://github.com/Dakini/fernslop.git
cd fernslop
make upThis builds the image and starts the app, PostgreSQL and the monitoring stack.
- App: http://localhost:8000 (three demo gardens are already there)
- Grafana: http://localhost:3000
make down stops everything and keeps the data. make delete also deletes the database. To run the backend and frontend separately with live reload, see Getting started.
Stack: React 19, FastAPI, PostgreSQL, Docker Compose, AWS, OpenTelemetry, Grafana.
make test-allThis runs backend unit and integration tests (pytest), frontend tests (Vitest) and end-to-end tests in real browsers (Playwright). CI runs them on every pull request. What each suite covers: Getting started.
pull request ──▶ tests ──▶ merge to main ──▶ build image ──▶ deploy to dev (automatic)
│
"Promote to prod" (manual) ──▶ deploy the same image to prod
Dev and prod each run on an AWS EC2 server, defined in CloudFormation. GitHub Actions deploys with OIDC, so no AWS keys are stored. See the deployment guide, and infra/README.md for every setup command.
- Telemetry: traces, metrics and structured logs from OpenTelemetry. They share a trace ID, and you view them in Grafana. No request bodies, headers or personal data are sent.
- Alerting: an alert fires when people keep searching for a plant the app doesn't have, because they can't add it.
- On-call agent: a script checks the alerts every minute. It hands each new alert to a coding agent, which fixes it on a branch or files a GitHub issue for a person.
See Observability, alerts and on-call.
A team of AI agents built Fernslop, working from a written spec and a task tracker.
| Role | Does | Brief |
|---|---|---|
| Orchestrator | Sizes each request, runs the other roles, closes issues after QA passes | _docs/process.md |
| Task manager | Turns a request into issues | tm.md |
| Product manager | Grooms an issue: goal, acceptance criteria, scope | pm.md |
| Software engineer | Implements one groomed issue | software-engineer.md |
| QA engineer | Checks the result against the acceptance criteria: PASS or FAIL | qa-engineer.md |
- Spec:
_docs/plan.mdis the first plan._docs/lovable-spec.mdis the full build spec.audit.mdis a review that led to follow-up issues. - Task tracker:
backlog/has one file per issue, indone/andparked/. Each has a goal, acceptance criteria, the engineer's notes and the QA verdict. Example:222-photos-daily-photo-cap.md. Problems the on-call agent can't fix become GitHub issues labelledon-call. - Agent context:
AGENTS.md, loaded throughCLAUDE.md. Project skills are in.claude/skills/, such asdesign-check, which screenshots the UI at phone, tablet and desktop sizes.
backend/ FastAPI app, tests, seed data (Python, uv)
frontend/ React app and tests (Node, Vite)
e2e/ Playwright end-to-end tests
infra/ CloudFormation templates and deploy scripts
observability/ Collector, Tempo, Prometheus, Loki, Grafana (dashboards, alerts)
on-call-engineer/ Alert poller that hands alerts to a coding agent
.github/workflows/ CI and promotion to prod
docs/ Guides: product, getting started, architecture, deployment, observability
_docs/ Spec, process and agent-team briefs
backlog/ Task tracker
openapi.yaml API contract
Makefile Every command above
- Emails are printed to the console, not sent yet (
110-api-email-sender.md). - Live updates assume one backend process (
090-api-live-multi-worker.md). - There are no database migrations yet (
140-db-migrations.md). - There are no accounts or private gardens, by design. The feed and Undo are the safeguards.