# Berrypod Progress

> Single source of truth for project status and task tracking.

## Current status

Tier 1 MVP complete. Tier 2 production readiness complete (except Litestream and e2e tests). Tier 3 compliance and quality complete. Tier 3.5 business tools mostly complete (activity log, order lookup, abandoned cart all done). Tier 4 growth and content mostly complete (page editor, legal pages, media library, custom CMS pages all done). Newsletter and product page improvements remain.

**What's working:**
- Complete shop: home, collections, products, cart, checkout, about, contact, custom CMS pages, legal pages
- Unified on-site editing (page/theme/settings in 3-tab panel, URL state sync, browser back support)
- Theme editor with 8 presets, instant switching, full customisation
- Image optimisation pipeline (AVIF/WebP/JPEG responsive variants)
- Printify + Printful integration (sync, orders, shipping, webhooks, mockup enrichment)
- Stripe Checkout with order persistence, webhook handling, shipping costs
- Session-based cart (cross-tab sync, drawer + page, quantity controls)
- FTS5 full-text search with live modal, keyboard nav, ARIA
- Privacy-first analytics with comparison mode, filtering, CSV export
- Database-driven page builder with 26 block types, undo/redo, live editing
- Custom CMS pages with data-driven navigation, page templates, SEO
- Media library with alt text, usage tracking, orphan management
- Activity log with real-time global feed, order timeline, contextual retry
- URL redirects with auto-redirect on slug change, dead link monitoring
- Legal page generator with auto-regeneration from settings
- Abandoned cart recovery (GDPR-compliant, single email)
- Favicon generation from source image (PNG variants, SVG dark mode, webmanifest)
- Complete SEO (OG/Twitter cards, JSON-LD, sitemap, canonical URLs, meta descriptions)
- Email settings admin with 6 adapter options, no-JS support, and test email
- No-JS support across all key flows
- Fully Tailwind-free CSS (12 KB gzipped shop+theme, 95 KB gzipped admin total)
- CI pipeline (compile warnings, format, credo, dialyzer, tests)
- Deployed on Fly.io with observability (LiveDashboard, ErrorTracker, structured logging)
- 1759+ tests passing, 99-100 PageSpeed mobile

## Next up

### Admin CSS refactor ([plan](docs/plans/css-migration.md)) — Complete

All 4 phases done. Tailwind utility clone deleted, all templates migrated to semantic classes, layout primitives added, `@layer` cascade in place. Post-refactor cleanup: dead CSS removal (9 classes), color-mix token extraction (5 `--admin-text-*` tokens replacing 80 inline calls), and theme CSS extracted into standalone `theme.css` bundle shared across all page types (eliminates 28 KB duplication). Image optimizer hardened against tiny placeholder stubs. Theme editor mobile overlay bug fixed.

### Profit-aware pricing & sales ([plan](docs/plans/profit-aware-pricing.md))

| # | Task | Depends on | Est | Status |
|---|------|------------|-----|--------|
| 63 | Fix Printful cost sync (cross-reference catalog API for variant costs) | — | 45m | planned |
| 64 | Cost snapshot on orders (`unit_cost` on order_items, `total_cost`/`gross_profit` on orders) | 63 | 1.5h | planned |
| 65 | Exact Stripe fees (fetch from Balance Transaction API post-payment, not estimated) | 64 | 45m | planned |
| 66 | Tax toggle + Stripe Tax (shop country, registered Y/N, `automatic_tax` on checkout) | 65 | 1.5h | planned |
| 67 | Admin profit dashboard (per-product margins, per-order profit, overall P&L) | 64, 65, 66 | 3h | planned |
| 68 | Profit-aware price editor (show margin/profit when setting prices, warn on low margin) | 67 | 2h | planned |
| 69 | Sales & promotions (% or fixed discount, scoped to catalogue/category/products, scheduled) | 68 | 3h | planned |
| 70 | Margin guard on sales (prevent discounts that breach minimum profit threshold) | 69 | 1h | planned |
| 71 | Announcement bar (dismissable shop banner for active sales) | 69 | 1.5h | planned |

### Onboarding UX v2 ([plan](docs/plans/onboarding-ux.md)) — Complete

Based on usability testing (March 2026). Reworks the entire setup flow into a single guided journey with progress bar, forgiving validation, and contextual prompts.

| # | Task | Est | Status |
|---|------|-----|--------|
| A | Simplify initial setup to account creation only (email, password, shop name) | 1.5h | done |
| B | Guided setup flow with progress bar (multi-step, skippable, explains "why") | 4h | done |
| C | Forgiving API key validation (strip whitespace, format checks, helpful errors) | 1.5h | done |
| D | Email provider setup UX rework (6 adapters, no-JS, `:has(:checked)` CSS, test email) | 2h | done |
| E | Contextual prompts for skipped steps (products, checkout, order detail) | 2h | done |
| F | Dashboard checklist and messaging rework | 2h | done |
| G | Coming soon page fixes (logo layout, admin login link) | 30m | done |
| H | External links UX (new tabs, icons, aria labels) | 1h | done |
| I | Input styling — WCAG AA/AAA compliance | 1h | done |

### Notification system overhaul ([plan](docs/plans/notification-overhaul.md)) — Complete

Replaced floating toast/flash messages with inline feedback and persistent top banners. Form saves use inline "Saved" checkmarks, page-level outcomes use document-flow banners (not fixed overlays).

| # | Task | Est | Status |
|---|------|-----|--------|
| 1 | Build inline feedback component | 1.5h | done |
| 2 | Build persistent top banner component (replaces flash) | 1.5h | done |
| 3 | Migrate admin forms to inline feedback (theme, pages, settings, email, providers) | 3h | done |
| 4 | Migrate remaining admin pages (media, products, activity, newsletter, redirects, nav) | 2h | done |
| 5 | Migrate shop pages (cart, contact, checkout, auth) | 2h | done |
| 6 | Migrate setup wizard notifications | 1h | done |
| 7 | Remove old flash/toast CSS and JS | 30m | done |

### Unified on-site editing ([plan](docs/plans/unified-editing-mode.md)) — Complete

Extend the existing page editor (PageEditorHook + editor_sheet) to include theme editing. Admin clicks "Theme" → taken to actual shop with a 3-tab panel (Page | Theme | Settings). See changes live on the real site instead of a fake preview.

| Phase | Description | Est | Status |
|---|---|---|---|
| 1 | Add theme editing state to PageEditorHook | 2h | done |
| 2 | Add 3-tab UI to editor panel (Page/Theme/Settings) | 2h | done |
| 3 | Extract theme editor into reusable component | 3h | done |
| 3b | Create settings editor component | 2h | done |
| 4 | Image upload handling in hook context | 2h | done |
| 5 | URL-based mode activation (?edit=theme) | 1h | done |
| 6 | Admin routing redirect | 30m | done |
| 7 | Polish and testing | 2h | done |

### Quick fixes (from usability testing)

| # | Task | Est | Status |
|---|---|---|---|
| 1 | Fix double radio button dots in theme editor | 30m | done |

### Editor panel reorganisation ([plan](docs/plans/editor-reorganisation.md))

Restructure the 3-tab editor panel for better discoverability. Replace Settings tab with Site tab for site-wide content (announcement bar text, social links, nav items, footer content). Move branding from Theme to Site. Merge page settings inline into Page tab.

| # | Task | Est | Status |
|---|------|-----|--------|
| 1-4 | Data model + Site tab skeleton | 3h | planned |
| 5-7 | Announcement bar (editable text, link, styles) | 1.5h | planned |
| 8-9 | Social links editor | 2h | planned |
| 10-14 | Header & footer navigation editors | 3h | planned |
| 15-16 | Footer content (about, copyright, newsletter toggle) | 1.25h | planned |
| 17-18 | Move branding from Theme to Site | 1.5h | planned |
| 19-20 | Merge page settings into Page tab, remove Settings tab | 1h | planned |
| 21-22 | Polish and testing | 2h | planned |

### Draft-then-publish workflow ([plan](docs/plans/draft-publish-workflow.md))

Auto-save drafts, explicit publish. No more lost work or `beforeunload` warnings. Visitors always see published version.

| Phase | Description | Depends on | Est | Status |
|-------|-------------|------------|-----|--------|
| 1 | Page drafts (auto-save, publish/discard) | unified-editing-mode | 5h | planned |
| 2 | Theme drafts | Phase 1 | 4h | planned |
| 3 | Settings drafts | Phase 2 | 4h | planned |
| 4 | Polish (age indicator, conflict handling) | Phase 3 | 5h | planned |

### Platform site

| # | Task | Depends on | Est | Status |
|---|------|------------|-----|--------|
| 73 | Platform/marketing site — brochure, pricing, sign-up | — | TBD | planned |
| 74 | Separation of concerns: platform site vs AGPL open source core | 73 | TBD | planned |

## Future enhancements

Tracked in [ROADMAP.md](ROADMAP.md) — includes Litestream backup, e2e/a11y tests, AGPL licensing, security, newsletter, product reviews, hosted platform infrastructure, i18n, data export/import.

## Plan files

All plans in [docs/plans/](docs/plans/). Completed plans are kept as architecture references.

| Plan | Status |
|------|--------|
| [admin-redesign.md](docs/plans/admin-redesign.md) | Complete |
| [admin-font-loading.md](docs/plans/admin-font-loading.md) | Complete |
| [admin-ux-polish.md](docs/plans/admin-ux-polish.md) | Complete |
| [setup-wizard.md](docs/plans/setup-wizard.md) | Complete |
| [setup-and-launch.md](docs/plans/setup-and-launch.md) | Complete |
| [setup-auto-confirm.md](docs/plans/setup-auto-confirm.md) | Complete |
| [email-settings.md](docs/plans/email-settings.md) | Complete |
| [search.md](docs/plans/search.md) | Complete |
| [shipping-sync.md](docs/plans/shipping-sync.md) | Complete |
| [printful-integration.md](docs/plans/printful-integration.md) | Complete |
| [printify-integration-research.md](docs/plans/printify-integration-research.md) | Reference |
| [provider-strategy.md](docs/plans/provider-strategy.md) | Reference |
| [css-migration.md](docs/plans/css-migration.md) | Complete |
| [analytics-v2.md](docs/plans/analytics-v2.md) | Complete |
| [page-builder.md](docs/plans/page-builder.md) | Complete |
| [media-library.md](docs/plans/media-library.md) | Complete |
| [custom-pages.md](docs/plans/custom-pages.md) | Complete |
| [image-optimization.md](docs/plans/image-optimization.md) | Complete |
| [products-context.md](docs/plans/products-context.md) | Complete |
| [dry-refactor.md](docs/plans/dry-refactor.md) | Complete |
| [abandoned-cart.md](docs/plans/abandoned-cart.md) | Complete |
| [activity-log.md](docs/plans/activity-log.md) | Complete |
| [favicon.md](docs/plans/favicon.md) | Complete |
| [legal-page-generator.md](docs/plans/legal-page-generator.md) | Complete |
| [url-redirects.md](docs/plans/url-redirects.md) | Complete |
| [onboarding-ux.md](docs/plans/onboarding-ux.md) | Complete |
| [notification-overhaul.md](docs/plans/notification-overhaul.md) | Complete |
| [live-site-editor.md](docs/plans/live-site-editor.md) | Superseded by unified-editing-mode |
| [unified-editing-mode.md](docs/plans/unified-editing-mode.md) | Complete |
| [profit-aware-pricing.md](docs/plans/profit-aware-pricing.md) | Planned |
| [security-hardening.md](docs/plans/security-hardening.md) | Planned |
| [draft-publish-workflow.md](docs/plans/draft-publish-workflow.md) | Planned |
| [editor-reorganisation.md](docs/plans/editor-reorganisation.md) | Planned |
