Pansy v1 tracking epic #20

Closed
opened 2026-07-18 18:20:33 +00:00 by steve · 1 comment
Owner

What pansy is

A self-hostable garden planner: a landscaping-style 2D editor where you drag garden objects (beds, grow bags, containers, trees, paths) onto a real-scale field, click into a bed to place freeform plops of plants (garlic in one corner, basil in another, beans along a side), and zoom out to still see what's planted where. Go backend + embedded React frontend, one static binary, multi-user with owner/editor/viewer sharing, OIDC-first auth (Authentik). Agent-drivable via majordomo/executus ("fill one corner with garlic…").

Architecture, domain model, and all conventions: DESIGN.md.

🎉 v1 complete — all phases shipped

Every issue is merged. The full loop works end-to-end: register/OIDC → create a garden → drag beds/containers → build a plant catalog → focus into a bed and place plops with semantic zoom → share gardens as viewer/editor → polish (imperial, clear-bed, keyboard nudging) → drive it all from an agent.

Phases

Phase 0 — Scaffold (PR #21)

  • #1 Backend scaffold: Go module, config, HTTP server, SQLite store + migrations
  • #2 Frontend scaffold: Vite + React + TypeScript + Tailwind + TanStack Router
  • #3 Single-binary build: embed web dist, SPA fallback, Makefile (needs #1, #2)

Phase 1 — Auth

Phase 2 — Gardens

Phase 3 — Field editor (riskiest phase — test on a phone at the end of it)

Phase 4 — Plant catalog

Phase 5 — Plops (the core vision lands here)

Phase 6 — Sharing

Phase 7 — Polish

Phase 8 — Agent seam

Dependency graph

graph TD
  I1[#1 backend scaffold] --> I3[#3 single binary]
  I2[#2 frontend scaffold] --> I3
  I1 --> I4[#4 local auth] --> I5[#5 OIDC]
  I2 --> I6[#6 auth UI]
  I4 --> I6
  I4 --> I7[#7 gardens API] --> I8[#8 gardens UI]
  I6 --> I8
  I2 --> I9[#9 canvas]
  I7 --> I10[#10 objects API]
  I8 --> I11[#11 field editor]
  I9 --> I11
  I10 --> I11
  I7 --> I12[#12 plants API] --> I13[#13 plants UI]
  I6 --> I13
  I10 --> I14[#14 plantings API]
  I12 --> I14
  I11 --> I15[#15 plops editor]
  I13 --> I15
  I14 --> I15
  I7 --> I16[#16 sharing API] --> I17[#17 sharing UI]
  I8 --> I17
  I15 --> I18[#18 polish]
  I14 --> I19[#19 agent seam]
  I16 -.-> I19

Post-v1 parking lot (deliberately out of scope — see DESIGN.md § Deliberate v1 limits)

Polygon beds/boundaries · season/year scenario layer (planted_at/removed_at already support it) · background/satellite image tracing · grid-snapping toggle · SVG icon set · undo/redo · real-time sync · Authentik group→role mapping · companion-planting-aware fills · mort-style HTTP agent surface (internal/agent is import-ready; wire when an external harness needs HTTP).

## What pansy is A self-hostable garden planner: a landscaping-style 2D editor where you drag garden objects (beds, grow bags, containers, trees, paths) onto a real-scale field, click into a bed to place freeform **plops** of plants (garlic in one corner, basil in another, beans along a side), and zoom out to still see what's planted where. Go backend + embedded React frontend, one static binary, multi-user with owner/editor/viewer sharing, OIDC-first auth (Authentik). Agent-drivable via majordomo/executus ("fill one corner with garlic…"). Architecture, domain model, and all conventions: **[DESIGN.md](https://gitea.stevedudenhoeffer.com/steve/pansy/src/branch/main/DESIGN.md)**. ## 🎉 v1 complete — all phases shipped Every issue is merged. The full loop works end-to-end: register/OIDC → create a garden → drag beds/containers → build a plant catalog → focus into a bed and place plops with semantic zoom → share gardens as viewer/editor → polish (imperial, clear-bed, keyboard nudging) → drive it all from an agent. ## Phases **Phase 0 — Scaffold** ✅ (PR #21) - [x] #1 Backend scaffold: Go module, config, HTTP server, SQLite store + migrations - [x] #2 Frontend scaffold: Vite + React + TypeScript + Tailwind + TanStack Router - [x] #3 Single-binary build: embed web dist, SPA fallback, Makefile *(needs #1, #2)* **Phase 1 — Auth** ✅ - [x] #4 Local auth: users, sessions, register/login/logout/me *(needs #1)* — PR #23 - [x] #5 OIDC login via Authentik: PKCE, JIT provisioning, email linking *(needs #4)* — PR #24 - [x] #6 Auth UI: login/register pages, OIDC button, route guard *(needs #2, #4)* — PR #25 **Phase 2 — Gardens** ✅ - [x] #7 Gardens CRUD + service-layer conventions (actor, version guard, 409) *(needs #4)* — PR #26 - [x] #8 Gardens UI: list page + create/edit *(needs #6, #7)* — PR #27 **Phase 3 — Field editor** ✅ *(riskiest phase — test on a phone at the end of it)* - [x] #9 Canvas foundation: SVG viewport, pan/zoom/pinch, geometry lib *(needs #2)* — PR #29 - [x] #10 Garden objects backend: polymorphic CRUD + /full endpoint *(needs #7)* — PR #28 - [x] #11 Field editor: palette, select/move/resize/rotate, inspector, optimistic sync *(needs #8, #9, #10)* — PR #30 **Phase 4 — Plant catalog** ✅ - [x] #12 Plant catalog backend: CRUD + seeded built-ins *(needs #7)* — PR #31 - [x] #13 Plant catalog UI: /plants page + PlantPicker *(needs #6, #12)* — PR #32 **Phase 5 — Plops** ✅ *(the core vision lands here)* - [x] #14 Plantings backend: plop CRUD, derived counts, removed_at *(needs #10, #12)* — PR #33 - [x] #15 Plops editor: focus mode, place/move/resize, semantic zoom *(needs #11, #13, #14)* — PR #34 **Phase 6 — Sharing** ✅ - [x] #16 Sharing backend: shares CRUD + ACL enforcement everywhere *(needs #7)* — PR #35 - [x] #17 Sharing UI: invite, roles, read-only viewer mode *(needs #8, #16)* — PR #36 **Phase 7 — Polish** ✅ - [x] #18 Polish: imperial display, mobile ergonomics, clear-bed, nudging *(needs #15)* — PR #37 **Phase 8 — Agent seam** ✅ - [x] #19 Agent seam: bulk ops + DefineTool wrappers *(needs #14; do after #16)* — PR #38 ## Dependency graph ```mermaid graph TD I1[#1 backend scaffold] --> I3[#3 single binary] I2[#2 frontend scaffold] --> I3 I1 --> I4[#4 local auth] --> I5[#5 OIDC] I2 --> I6[#6 auth UI] I4 --> I6 I4 --> I7[#7 gardens API] --> I8[#8 gardens UI] I6 --> I8 I2 --> I9[#9 canvas] I7 --> I10[#10 objects API] I8 --> I11[#11 field editor] I9 --> I11 I10 --> I11 I7 --> I12[#12 plants API] --> I13[#13 plants UI] I6 --> I13 I10 --> I14[#14 plantings API] I12 --> I14 I11 --> I15[#15 plops editor] I13 --> I15 I14 --> I15 I7 --> I16[#16 sharing API] --> I17[#17 sharing UI] I8 --> I17 I15 --> I18[#18 polish] I14 --> I19[#19 agent seam] I16 -.-> I19 ``` ## Post-v1 parking lot (deliberately out of scope — see DESIGN.md § Deliberate v1 limits) Polygon beds/boundaries · season/year scenario layer (planted_at/removed_at already support it) · background/satellite image tracing · grid-snapping toggle · SVG icon set · undo/redo · real-time sync · Authentik group→role mapping · companion-planting-aware fills · mort-style HTTP agent surface (`internal/agent` is import-ready; wire when an external harness needs HTTP).
steve added the epic label 2026-07-18 18:20:33 +00:00
Author
Owner

Closing — stale-open tracking epic. The body already declares it: v1 complete, every phase shipped and merged (#1–#19, PRs #21–#38). The parking-lot items are explicitly post-v1 and tracked separately. The "test on a phone at the end of Phase 3" note is now well covered by the v4 mobile-first overhaul (#96). Nothing here is outstanding.

Closing — stale-open tracking epic. The body already declares it: v1 complete, every phase shipped and merged (#1–#19, PRs #21–#38). The parking-lot items are explicitly post-v1 and tracked separately. The "test on a phone at the end of Phase 3" note is now well covered by the v4 mobile-first overhaul (#96). Nothing here is outstanding.
steve closed this issue 2026-07-23 01:15:28 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: steve/pansy#20