Skip to content

2026–Present

PlantPal+ Full-Stack Daily Wellness & Plant-Care Platform

Cross-platform app unifying plant care, fitness, and nutrition in one daily dashboard with streaks, reminders, and cloud sync.

functional requirements
228
user stories
119
use cases
89

Problem

Plant care, fitness, and nutrition apps each implement the same daily loop — schedule, remind, log, streak, reflect — separately. PlantPal+ unifies all three domains in one loop, implemented once, across a mobile app, a web app, and a REST API.

The engineering problem underneath is duplication: when a watering calculator or a calorie formula is reimplemented per platform, the implementations drift. This project treats a single shared domain implementation, with bit-for-bit agreement between server and clients, as a hard requirement rather than an aspiration.

Approach

The codebase is a TypeScript monorepo on npm workspaces: packages/shared holds the domain logic used identically by all clients — the watering schedule calculator, the Atwater energy identity, and Mifflin-St Jeor BMR are each implemented once. apps/api is an Express + TypeScript REST service on PostgreSQL, apps/web is React + Vite, apps/mobile is React Native with Expo.

Specification came before implementation. Phase 1 produced 36 documents: 228 functional requirements, 307 business rules, 111 NFRs across 13 quality attributes, 119 user stories with Gherkin acceptance criteria, 89 fully-specified use cases, and 119 Mermaid diagrams. Phase 2 added system architecture, an OpenAPI 3.1 spec, sequence diagrams, and ADRs; Phase 3 mapped artifacts back to requirements for traceability.

Auth uses JWT with a 32+ character access secret, a refresh-token flow, and a 30-day account deletion window that blocks session renewal. Sync is an append-only event log: only three operations queue offline (watering events, workout records, meals), each carrying a client-generated UUID idempotency key that the server upserts by — conflict-free by construction, with no CRDTs or last-write-wins. All other operations require connectivity explicitly.

TypeScript monorepo: React Native (Expo) mobile app, React + Vite web app, Node.js/Express REST API on PostgreSQL; node-cron reminder engine; 11-table JWT auth service with a custom migration runner; GitHub Actions CI.

Unit-tested scientific domain layer (Mifflin-St Jeor/TDEE energy models, workout energy/1RM/volume, species- and season-aware watering intervals); offline-light sync via an append-only event log with client-generated UUID idempotency keys.

  1. spec phase

    36 docs · 228 FRs

  2. shared domain pkg

    one impl, all clients

  3. express + postgres

    JWT · event log

  4. web + mobile

    React · Expo

  5. ci: 307 tests

    Node 20.11 + 22

  6. deploy

    Pages live · Render

PlantPal+ pipeline: spec phase → shared domain package → Express/PostgreSQL API → web + mobile clients → CI (307 tests) → deployment

Decisions

Spec-first, then code
Writing 36 requirements documents before implementation is an unusual amount of specification for a project of this size, but it made the rest checkable: algorithm test vectors come from the specs, and Phase 3 traceability maps artifacts back to requirements. The 53 shared-package tests verify the domain formulas against those spec-derived vectors.
One domain implementation, three clients
The watering calculator is species-, season-, light-, and pot-aware; its canonical test vector is 7 × 0.80 × 1.10 × 0.80 × 1.00 = 4.928, rounded to 5 days. Because the calculator, Mifflin-St Jeor, and Atwater live only in packages/shared, server and clients agree bit-for-bit — there is no second implementation to drift.
Offline sync without CRDTs
Rather than solve general conflict resolution, the design narrows the offline surface to three append-only operations, each idempotent via a client-generated UUID key the server upserts by. That makes sync conflict-free by construction. Everything else explicitly requires connectivity — a documented constraint, not an accident. 24 mobile tests cover the offline outbox.
Adversarial audits as a quality gate
Two adversarial multi-agent audits were run against the system; they found 6 critical and 4 major defects, all fixed. Combined with CI running typecheck plus the full 307-test suite on Node 20.11 and 22 for every push and PR — with a PostgreSQL service container for integration tests — regressions have to get past both.

Evidence

Verifiable numbers for PlantPal+ — Full-Stack Daily Wellness & Plant-Care Platform
Functional requirements228 (+ 307 business rules, 111 NFRs)
Spec documents (Phase 1)36
Use cases / user stories89 / 119 (Gherkin acceptance criteria)
Automated tests307 — 53 shared · 158 API · 24 mobile · 72 web
Audit defects found & fixed6 critical + 4 major
Seeded Indian catalogue94 plant species · 180 foods

Outcome

Today the web app is live on GitHub Pages, and the API deploys via a one-click Render Blueprint — the free tier sleeps after 15 idle minutes, so a keep-alive via UptimeRobot or a GitHub Actions /healthz ping every 10 minutes is documented. Mobile EAS builds are pending. All 307 tests, including the 12-test auth integration suite against real PostgreSQL, run in CI on every push and PR.

The gaps are stated rather than hidden: growth-log photos are links, not uploads, because there is no object storage; no mail provider is wired, so password reset, email verification and the account-deletion notices have tokens and rules but no delivery; the erasure sweep removes rows but has no stored objects to erase; and a reminder whose push fails is not retried. Phase 6 — deployment — is in progress. MIT licensed.

Next

  • Finish Phase 6 (deployment), including EAS builds for mobile

  • Wire a mail provider for password reset, email verification and the account-deletion notices

  • Add object storage for growth-log photos (links only today)

  • Add retry for reminders whose push notification fails

Next: the other case files

  • Warden

    Gives a Python package an allow, warn or block verdict — from what its code does, where it came from, and what is known about it.

  • Proactive Feasibility Scheduler

    An evaluation study of ML-based GPU-cluster job scheduling — and a proven negative result.