Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 34 additions & 9 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Current Release

**v0.9.27** — Open Product Family Branding Alignment + Vercel Deployment (2026-07-03)
**v1.0.0** — Web + PWA Stable Release (2026-07-07)

## Product Identity

Expand Down Expand Up @@ -36,24 +36,25 @@ Sprout Individual product → apps/web/docs/BRANDING.md

- **Frontend:** Next.js 15 (App Router) + Tailwind CSS v4 + TypeScript
- **Backend:** Supabase (auth, PostgreSQL DB, file storage, edge functions)
- **Mobile:** Capacitor v8 Android (PWA for Windows/desktop)
- **Mobile:** PWA (Installable on all platforms; Android archive preserved at `archive/android/`)
- **AI:** MCP server at `apps/mcp/` — 28 tools, 112 tests
- **Auth:** Google OAuth (email/password disabled via Supabase)
- **Design:** Sora variable font, warm paper light mode, deep botanical dark mode
- **Hosting:** Vercel (web at sprout.kovina.org), Supabase (backend, shared project with OpenSend)
- **CI:** GitHub Actions — Java 21 for Android, Node 24 for web, caching via `setup-node`
- **CI:** GitHub Actions — Node 24 for web, caching via `setup-node`

## Repo Structure

```
opensprout/
├── apps/
│ ├── web/ # Next.js app + Capacitor Android
│ ├── web/ # Next.js app (App Router) + PWA
│ │ ├── src/app/ # App Router pages + API routes
│ │ ├── src/lib/ # Data layer, auth, supabase clients, context
│ │ └── src/components/# UI components
│ └── mcp/ # MCP server (28 tools, HTTP + stdio)
│ └── src/tools/ # 7 tool modules (plants, care, journal, etc.)
├── archive/ # Archived platforms (Android/Capacitor)
├── docs/ # 35+ docs
├── scripts/ # build/release scripts
├── supabase/
Expand Down Expand Up @@ -346,6 +347,34 @@ The Supabase project `rbdyrymtgfqqkdemicdo` is shared between OpenSprout (plant
- All MCP tool files, test mocks, sync cache mappings, and `db.ts` store names updated.
- `delete_account()` RPC function replaced (table `RENAME` doesn't update hardcoded names in function bodies).

## Key Changes in v1.0.0 — Web + PWA Stable Release (2026-07-07)

### Android/Capacitor Archived
- Full Android build preserved at `archive/android/` (120 MB, 2814 files).
- Capacitor config archived at `archive/capacitor.config.ts`.
- 8 `@capacitor/*` npm packages removed from both `package.json` files.
- All 18 Android/Cap scripts removed. Only `rc:web` remains.

### Capacitor Code Cleaned (13 files touched)
- `platform.ts` — simplified to `resolveApiUrl()` and `PRODUCTION_ORIGIN` only.
- `haptics.ts` — Capacitor plugin removed, `navigator.vibrate` only.
- `reminders.ts` — Capacitor LocalNotifications path removed, web-only scheduling.
- `app-context.tsx` — Capacitor `appUrlOpen` listener removed.
- `auth-gate.tsx` — Capacitor native detection removed, always shows public page.
- `photo-picker.tsx` — Capacitor Camera plugin removed, `capture="environment"` only.
- `login/page.tsx` — Capacitor "native" auth branch removed.
- `debug-info.tsx` — Capacitor diagnostics removed.
- `oauth-deeplink-handler.tsx` — deleted (Capacitor-only).
- `capacitor-haptics.d.ts` — deleted.

### Other Changes
- **GeneratedAssets committed** — 324 cross-platform brand icon files.
- **Footer redesigned** — OPEN/Sprout lockup with icon, KOVINA wordmark, no AGPLv3 legalese.
- **About page** — dual dark/light icons, PublicFooter restored.
- **Feature grid** — responsive 1→2→3 column layout.
- **Header** — "View on GitHub" button removed.
- **Version bumped** to 1.0.0.

## Key Changes in v0.9.27 — Open Product Family Branding Alignment (2026-07-02)

### Header Lockup Standardization
Expand Down Expand Up @@ -408,8 +437,6 @@ The Supabase project `rbdyrymtgfqqkdemicdo` is shared between OpenSprout (plant
- No crash reporting / analytics (intentional privacy choice)
- Vercel Hobby plan rate-limited for deployments (24h cooldown)
- Supabase project shared with OpenSend (send.kovina.org) — all tables use `opensprout_` prefix
- Android OAuth requires `opensprout://auth/callback` and `https://sprout.kovina.org/auth/complete` added to Supabase Redirect URLs
- Android APK built in CI has placeholder web assets (no static export) — functional for development only

## Build Commands

Expand All @@ -418,9 +445,7 @@ npm run dev # Dev server at localhost:9999
npm run build # Web production build
npm run typecheck # TypeScript check (builds MCP first)
npm run lint # ESLint
npm run android:debug # Debug APK
npm run android:release # Both signed AAB + APK
npm run -w @opensprout/mcp test # MCP tests
npm run -w @opensprout/mcp test # MCP tests (112)
bash scripts/release.sh # Full release automation
bash scripts/release.sh --check-only # Checks only, no build
```
Expand Down
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,22 @@

All notable changes to OpenSprout will be documented here. The format follows [Keep a Changelog](https://keepachangelog.com/). OpenSprout uses [Semantic Versioning](https://semver.org/).

## 1.0.0 — 2026-07-07

### Changed
- **v1.0.0 stable release** — OpenSprout ships as a web + PWA application.
- **Android/Capacitor archived** — Android build removed from active tree for future revisiting (preserved in `archive/`).
- **Capacitor dependencies removed** — 8 @capacitor/* packages cleaned from both package.json files. Android scripts stripped.
- **Notification system simplified** — Capacitor LocalNotifications path removed; all reminders use Web Notification API (PWA).
- **Auth flow cleaned** — Capacitor native auth branch removed; web + PWA sign-in streamlined.
- **Haptics simplified** — Capacitor Haptics plugin path removed; falls back to navigator.vibrate.
- **Debug page cleaned** — Capacitor detection diagnostics removed.
- **Photo picker simplified** — Capacitor Camera plugin path removed; uses native `capture="environment"` input.
- **Platform utilities simplified** — Capacitor-specific routing removed.
- **GeneratedAssets committed to repo** (324 cross-platform brand icon files).
- **Branding updates** — About page icon fixed with dark/light variants. Footer features OPEN/Sprout lockup with icon, KOVINA wordmark, no AGPLv3 legalese. Landing page feature cards in responsive grid.
- **Header cleaned** — "View on GitHub" button removed.

## 0.9.26 — 2026-06-28

### Added
Expand Down
14 changes: 5 additions & 9 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# OpenSprout v0.9.27
# OpenSprout v1.0.0

**Stack:** Next.js 15 (App Router) · Supabase · Capacitor v8 Android · Tailwind CSS v4 · Sora font
**Stack:** Next.js 15 (App Router) · Supabase · Tailwind CSS v4 · Sora font · PWA
**Deploy:** https://sprout.kovina.org
**Source:** github.com/sparshsam/opensprout
**License:** AGPLv3
Expand All @@ -20,7 +20,7 @@ npm run android:release # Signed AAB + APK
## Project Layout

```
apps/web/ # Next.js + Capacitor Android
apps/web/ # Next.js app + PWA
├── src/app/
│ ├── page.tsx # Public homepage
│ ├── login/ # Google OAuth sign-in (platform-aware: web/PWA/Android)
Expand All @@ -43,7 +43,6 @@ apps/web/ # Next.js + Capacitor Android
│ ├── terms/ # Terms of service
│ ├── mcp/ # AI Access guide
│ └── globals.css # Design tokens, animations, a11y
├── android/ # Capacitor Android project
├── public/
│ ├── sw.js # Service worker (v0.9.27)
│ ├── manifest.webmanifest # PWA manifest
Expand Down Expand Up @@ -85,10 +84,6 @@ supabase/migrations/ # Database migrations (shared project)
| `npm run build` | Web production build |
| `npm run typecheck` | TypeScript check (builds MCP first) |
| `npm run lint` | ESLint |
| `npm run android:debug` | Debug APK |
| `npm run android:release:bundle` | Signed release AAB |
| `npm run android:release:apk` | Signed release APK |
| `npm run android:release` | Both AAB + APK |
| `npm run -w @opensprout/mcp test` | MCP tests (112) |
| `bash scripts/release.sh` | Full release automation (check → build → sign) |
| `bash scripts/release.sh --check-only` | Run all checks without building |
Expand Down Expand Up @@ -135,7 +130,7 @@ Sprout Individual product → apps/web/docs/BRANDING.md
- **Callback:** `/auth/callback` exchanges code server-side via `createServerClient` + `exchangeCodeForSession()` (critical — without this the redirect drops the `code` param causing a sign-in loop)
- **Session:** Auto-refreshed via `@supabase/ssr`
- **CSP:** Security headers disabled in dev mode (Next.js HMR needs `'unsafe-eval'`); production Vercel builds get strict headers
- **Platform awareness:** `AuthGate` detects Capacitor native via `window.Capacitor.isNativePlatform()` — web shows public homepage, native redirects to login
- **Platform awareness:** Web + PWA only. Capacitor native (Android) archived at `archive/`.

## MCP Server

Expand All @@ -155,6 +150,7 @@ Architecture follows the MCP Build Guide: SHA-256 token auth, centralized regist

## Release History

- **v1.0.0** (Jul 7) — **Stable release — Web + PWA.** Android/Capacitor archived, 8 Capacitor packages removed, 13 source files cleaned, footer redesigned, feature grid, KOVINA wordmark, GeneratedAssets committed.
- **v0.9.27** (Jul 3) — Open Product Family branding alignment + Vercel deployment. Header lockups standardized to `[icon] OPEN / Sprout` stacked layout in all three header components (public-nav, shell/top-bar, app-shell). Icons generated from 1024x1024 light + dark masters via Lanczos resampling: 210 assets across Windows ICO, MSIX, Android mipmaps, iOS, macOS, Web/PWA favicons, social OG, GitHub, and header icons. 114 dark mode variant assets generated (including opensprout-icon-header-dark.png). All three header locations use dual-image wrap with `dark:opacity-0`/`dark:opacity-100` CSS transitions for dark/light theming. Generated PNG icons replace the lucide Sprout icon in public-nav.tsx and app-shell.tsx. Lockup styling aligned to OpenPalette canonical spec. Brand hierarchy documented in `apps/web/docs/BRANDING.md`. Build fixes: added eslint-disable comments for `<img>` tags (blocking Vercel build), added missing `import Link from "next/link"` to app-shell.tsx, added root `public/` directory with hard copies for Vercel static file serving. Docs/BRANDING.md created. OpenPalette canonical spec alignment. Vercel deploy live at sprout.kovina.org.
- **v0.9.26** (Jun 28) — CI stabilization + database namespacing. Android CI now builds with Java 21 (fixes AGP 8.13 compile error) and uses normal `next build` (not static export) — all `force-static`/`generateStaticParams` route hacks reverted. All 14 OpenSprout tables renamed to `opensprout_` prefix for shared Supabase project namespacing. Code references, type definitions, MCP tools, and tests updated.
- **v0.9.26** (Jun 28) — Native Google Sign-In + Android Fixes. In-app Chrome Custom Tab for Android, browser-popup login for Windows/PWA, platform-aware sign-in dispatch, API routing for Capacitor static export, adaptive icon fix, white flash fix, debug diagnostics page.
Expand Down
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<div align="center">

[![Website](https://img.shields.io/badge/website-sprout.kovina.org-3ecf8e?style=for-the-badge&logo=vercel)](https://sprout.kovina.org)
[![Google Play](https://img.shields.io/badge/Get%20it%20on-Google%20Play-414141?style=for-the-badge&logo=googleplay&logoColor=white)](https://play.google.com/store/apps/details?id=org.kovina.opensprout)
[![PWA](https://img.shields.io/badge/PWA-Installable-5A0FC8?style=for-the-badge&logo=pwa)](https://sprout.kovina.org)
[![Latest Release](https://img.shields.io/github/v/release/sparshsam/opensprout?sort=semver&style=for-the-badge&label=Release&color=2563eb)](https://github.com/sparshsam/opensprout/releases)
[![Source Code](https://img.shields.io/badge/Source%20Code-GitHub-181717?style=for-the-badge&logo=github&logoColor=white)](https://github.com/sparshsam/opensprout)

Expand Down Expand Up @@ -65,8 +65,8 @@ Most plant care apps eventually become a subscription, a closed data silo, or bo
| **Plant CRUD** — Create, edit, delete, inspect plants | **Care Templates** — 30 built-in species templates with suggested care rhythms |
| **Care Schedules** — Watering and fertilizing schedules from templates or custom inputs | **Care Logs** — Mark plants watered or fertilized and persist logs |
| **Journal Entries** — Title, body, health score, tags, optional photo attachments | **Photo Uploads** — Capture from camera or gallery, stored in private Supabase Storage |
| **JSON Export** — Export your data anytime | **Android App** — Capacitor-based native Android experience |
| **AI Agent Integration (MCP)** — 25 tools for plant management via Claude, Hermes, Cursor | **PWA** — Installable as a standalone web app |
| **JSON Export** — Export your data anytime | **AI Agent Integration (MCP)** — 28 tools for plant management via Claude, Cursor, and any MCP client |
| **PWA** — Installable as a standalone web app on desktop and mobile | **Privacy-first** — No tracking, no ads, no data sales |

</div>

Expand Down Expand Up @@ -104,7 +104,7 @@ Every feature serves one purpose: helping you remember what your plants need. No
<img src="https://img.shields.io/badge/TypeScript-5.x-3178c6?style=for-the-badge&logo=typescript" alt="TypeScript">
<img src="https://img.shields.io/badge/Tailwind%20CSS-4-06B6D4?style=for-the-badge&logo=tailwindcss" alt="Tailwind CSS 4">
<img src="https://img.shields.io/badge/Vercel-deployed-black?style=for-the-badge&logo=vercel" alt="Vercel">
<img src="https://img.shields.io/badge/Capacitor-Android-119EFF?style=for-the-badge&logo=capacitor" alt="Capacitor">
<img src="https://img.shields.io/badge/PWA-Installable-5A0FC8?style=for-the-badge&logo=pwa" alt="PWA">
<img src="https://img.shields.io/badge/MCP-AI%20Agent%20API-FF6F00?style=for-the-badge" alt="MCP">
</p>

Expand All @@ -116,6 +116,7 @@ Every feature serves one purpose: helping you remember what your plants need. No

| Version | Date | Highlights |
|---------|------|------------|
| **v1.0.0** | 2026-07 | **Stable release** — Web + PWA. Android archived. Capacitor removed. |
| **v0.9.0** | 2026-06 | MCP server with 25 AI agent tools, photo uploads |
| **v0.8.0** | 2026-05 | Android app (Capacitor), full Android project |
| **v0.7.0** | 2026-05 | Journal entries, health scores, tag system |
Expand Down
21 changes: 1 addition & 20 deletions apps/web/package.json
Original file line number Diff line number Diff line change
@@ -1,36 +1,17 @@
{
"name": "@opensprout/web",
"version": "0.9.26",
"version": "1.0.0",
"private": true,
"license": "AGPL-3.0-or-later",
"scripts": {
"dev": "next dev -p 9999",
"build": "next build",
"build:mobile": "CAPACITOR_BUILD=true next build && npx cap sync",
"start": "next start",
"lint": "eslint .",
"typecheck": "tsc --noEmit",
"cap:sync": "npx cap sync",
"cap:copy": "npx cap copy",
"cap:open:android": "npx cap open android",
"cap:dev:android": "npx cap run android -l --host=0.0.0.0",
"android:sync": "npx cap sync",
"android:open": "npx cap open android",
"android:debug": "CAPACITOR_BUILD=true next build && npx cap copy android && cd android && ./gradlew assembleDebug",
"android:release:bundle": "CAPACITOR_BUILD=true next build && npx cap copy android && cd android && ./gradlew bundleRelease",
"android:release:apk": "CAPACITOR_BUILD=true next build && npx cap copy android && cd android && ./gradlew assembleRelease",
"android:release": "npm run android:release:bundle && npm run android:release:apk",
"rc:android": "npm run android:debug && echo '--- Release artifacts ---' && npm run android:release",
"rc:web": "npm run build"
},
"dependencies": {
"@capacitor/android": "^8.4.0",
"@capacitor/app": "^8.1.0",
"@capacitor/browser": "^8.0.3",
"@capacitor/camera": "^8.2.0",
"@capacitor/cli": "^8.4.0",
"@capacitor/core": "^8.4.0",
"@capacitor/local-notifications": "^8.2.0",
"@supabase/ssr": "^0.10.3",
"@supabase/supabase-js": "^2.107.0",
"class-variance-authority": "^0.7.1",
Expand Down
10 changes: 10 additions & 0 deletions apps/web/public/kovina-wordmark-monochrome.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading