2026-02-18 21:23:15 +00:00
# Berrypod Progress
2026-01-31 14:06:07 +00:00
> Single source of truth for project status and task tracking.
2026-03-01 17:15:18 +00:00
## 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
2026-03-09 22:00:18 +00:00
- Unified on-site editing (page/theme/settings in 3-tab panel, URL state sync, browser back support)
2026-03-01 17:15:18 +00:00
- 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)
2026-03-04 23:10:37 +00:00
- Email settings admin with 6 adapter options, no-JS support, and test email
2026-03-01 17:15:18 +00:00
- No-JS support across all key flows
2026-03-02 01:02:24 +00:00
- Fully Tailwind-free CSS (12 KB gzipped shop+theme, 95 KB gzipped admin total)
2026-03-01 17:15:18 +00:00
- CI pipeline (compile warnings, format, credo, dialyzer, tests)
- Deployed on Fly.io with observability (LiveDashboard, ErrorTracker, structured logging)
2026-03-28 10:13:03 +00:00
- 1800+ tests passing, 99-100 PageSpeed mobile
2026-03-01 17:15:18 +00:00
## Next up
2026-03-02 01:02:24 +00:00
### Admin CSS refactor ([plan](docs/plans/css-migration.md)) — Complete
2026-03-01 19:39:22 +00:00
2026-03-02 01:02:24 +00:00
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.
2026-03-01 19:39:22 +00:00
2026-03-01 17:15:18 +00:00
### Profit-aware pricing & sales ([plan](docs/plans/profit-aware-pricing.md))
2026-02-11 22:58:58 +00:00
| # | Task | Depends on | Est | Status |
|---|------|------------|-----|--------|
add canonical URLs, robots.txt, and sitemap.xml
Canonical: all shop pages now assign og_url (reusing the existing og:url
assign), which the layout renders as <link rel="canonical">. Collection
pages strip the sort param so ?sort=price_asc doesn't create a duplicate
canonical.
robots.txt: dynamic controller disallows /admin/, /api/, /users/,
/webhooks/, /checkout/. Removed robots.txt from static_paths so it
goes through the router instead of Plug.Static.
sitemap.xml: auto-generated from all visible products + categories +
static pages, served as application/xml. 8 tests.
Also updates PROGRESS.md: marks tasks 55, 58, 59, 61, 62 as done.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 21:47:35 +00:00
| 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 |
2026-03-01 17:15:18 +00:00
| 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 |
add canonical URLs, robots.txt, and sitemap.xml
Canonical: all shop pages now assign og_url (reusing the existing og:url
assign), which the layout renders as <link rel="canonical">. Collection
pages strip the sort param so ?sort=price_asc doesn't create a duplicate
canonical.
robots.txt: dynamic controller disallows /admin/, /api/, /users/,
/webhooks/, /checkout/. Removed robots.txt from static_paths so it
goes through the router instead of Plug.Static.
sitemap.xml: auto-generated from all visible products + categories +
static pages, served as application/xml. 8 tests.
Also updates PROGRESS.md: marks tasks 55, 58, 59, 61, 62 as done.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 21:47:35 +00:00
| 70 | Margin guard on sales (prevent discounts that breach minimum profit threshold) | 69 | 1h | planned |
2026-03-01 17:15:18 +00:00
| 71 | Announcement bar (dismissable shop banner for active sales) | 69 | 1.5h | planned |
2026-01-31 14:06:07 +00:00
2026-03-10 07:57:40 +00:00
### Onboarding UX v2 ([plan](docs/plans/onboarding-ux.md)) — Complete
2026-03-03 22:45:41 +00:00
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 |
|---|------|-----|--------|
2026-03-10 07:57:40 +00:00
| 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 |
2026-03-04 14:02:49 +00:00
| C | Forgiving API key validation (strip whitespace, format checks, helpful errors) | 1.5h | done |
2026-03-04 23:10:37 +00:00
| D | Email provider setup UX rework (6 adapters, no-JS, `:has(:checked)` CSS, test email) | 2h | done |
2026-03-04 14:02:49 +00:00
| E | Contextual prompts for skipped steps (products, checkout, order detail) | 2h | done |
2026-03-10 07:57:40 +00:00
| F | Dashboard checklist and messaging rework | 2h | done |
2026-03-04 00:41:15 +00:00
| G | Coming soon page fixes (logo layout, admin login link) | 30m | done |
add external link UX: icons, rel attributes, screen reader labels
New external_link component in core_components handles target="_blank",
rel="noopener noreferrer", external-link icon, and sr-only "(opens in
new tab)" text. Migrated admin providers form, settings (Stripe),
order tracking, onboarding setup links to use it. Fixed rel="noopener"
to "noopener noreferrer" on remaining links (email settings, product
show, core_components card radio). Added sr-only text to shop social
link cards and aria-label to page renderer tracking link.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 00:55:09 +00:00
| H | External links UX (new tabs, icons, aria labels) | 1h | done |
2026-03-04 00:48:08 +00:00
| I | Input styling — WCAG AA/AAA compliance | 1h | done |
2026-03-03 22:45:41 +00:00
2026-03-08 07:42:53 +00:00
### Notification system overhaul ([plan](docs/plans/notification-overhaul.md)) — Complete
2026-03-03 22:45:41 +00:00
2026-03-08 07:42:53 +00:00
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).
2026-03-03 22:45:41 +00:00
| # | Task | Est | Status |
|---|------|-----|--------|
2026-03-07 21:01:54 +00:00
| 1 | Build inline feedback component | 1.5h | done |
| 2 | Build persistent top banner component (replaces flash) | 1.5h | done |
2026-03-08 07:30:16 +00:00
| 3 | Migrate admin forms to inline feedback (theme, pages, settings, email, providers) | 3h | done |
2026-03-08 07:34:17 +00:00
| 4 | Migrate remaining admin pages (media, products, activity, newsletter, redirects, nav) | 2h | done |
2026-03-08 07:42:53 +00:00
| 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 |
2026-03-03 22:45:41 +00:00
2026-03-09 22:00:18 +00:00
### Unified on-site editing ([plan](docs/plans/unified-editing-mode.md)) — Complete
2026-03-03 22:45:41 +00:00
2026-03-08 23:09:51 +00:00
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.
2026-03-03 22:45:41 +00:00
| Phase | Description | Est | Status |
|---|---|---|---|
2026-03-09 09:01:21 +00:00
| 1 | Add theme editing state to PageEditorHook | 2h | done |
| 2 | Add 3-tab UI to editor panel (Page/Theme/Settings) | 2h | done |
2026-03-09 15:38:06 +00:00
| 3 | Extract theme editor into reusable component | 3h | done |
| 3b | Create settings editor component | 2h | done |
2026-03-09 19:45:43 +00:00
| 4 | Image upload handling in hook context | 2h | done |
2026-03-09 20:30:33 +00:00
| 5 | URL-based mode activation (?edit=theme) | 1h | done |
| 6 | Admin routing redirect | 30m | done |
2026-03-09 21:18:29 +00:00
| 7 | Polish and testing | 2h | done |
2026-03-03 22:45:41 +00:00
### Quick fixes (from usability testing)
| # | Task | Est | Status |
|---|---|---|---|
2026-03-04 00:14:57 +00:00
| 1 | Fix double radio button dots in theme editor | 30m | done |
2026-03-03 00:56:01 +00:00
2026-03-13 13:34:36 +00:00
### Competitive gaps ([plan](docs/plans/competitive-gaps.md))
Close critical gaps identified in the competitive analysis. Phased approach: core commerce first, then retention/growth, then scale.
**Phase 1: Core commerce gaps**
| # | Task | Depends on | Est | Status |
|---|------|------------|-----|--------|
| 75 | Customer authentication schema | — | 2h | planned |
| 76 | Customer auth flows (login, register, reset) | 75 | 3h | planned |
| 77 | Link orders to customers | 75, 76 | 1.5h | planned |
| 78 | Customer account dashboard | 76 | 2h | planned |
| 79 | Saved addresses | 76 | 1.5h | planned |
| 80 | Guest checkout linking | 75, 76 | 1h | planned |
| 81 | PayPal SDK integration | — | 2h | planned |
| 82 | PayPal checkout flow | 81 | 3h | planned |
| 83 | PayPal webhooks | 82 | 1.5h | planned |
| 84 | Reviews schema | — | 1.5h | planned |
| 85 | Review submission | 84 | 2h | planned |
| 86 | Review moderation | 84 | 1.5h | planned |
| 87 | Reviews display | 84 | 1.5h | planned |
| 88 | Review schema markup | 87 | 1h | planned |
| 89 | Provider stock sync | — | — | done (already existed) |
| 90 | Availability display | 89 | 1h | done |
**Phase 2: Retention & growth**
| # | Task | Depends on | Est | Status |
|---|------|------------|-----|--------|
| 91 | Returns schema | — | 1.5h | planned |
| 92 | Return request flow | 91, 78 | 2h | planned |
| 93 | Return admin | 91 | 2h | planned |
| 94 | Return policy settings | 91 | 1h | planned |
| 95 | Email sequence schema | — | 2h | planned |
| 96 | Sequence triggers & sending | 95 | 3h | planned |
| 97 | Sequence admin | 95 | 2h | planned |
| 98 | Customer data export (GDPR) | 75 | 1.5h | planned |
| 99 | Customer data deletion (GDPR) | 75 | 2h | planned |
**Phase 3: Scale**
| # | Task | Depends on | Est | Status |
|---|------|------------|-----|--------|
| 100 | Blog post type | — | 3h | planned |
| 101 | Staff accounts & RBAC | — | 4h | planned |
2026-03-28 10:09:33 +00:00
### Editor panel reorganisation ([plan](docs/plans/editor-reorganisation.md)) — In Progress
2026-03-10 08:21:55 +00:00
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 |
|---|------|-----|--------|
2026-03-28 10:09:33 +00:00
| 1-4 | Data model + Site tab skeleton | 3h | done |
| 5-7 | Announcement bar (editable text, link, styles) | 1.5h | done |
2026-03-28 10:13:03 +00:00
| 8-9 | Social links editor (CRUD, reorder, platform detection, URL normalization) | 2h | done |
2026-03-28 22:19:48 +00:00
| 10-14 | Header & footer navigation editors | 3h | done |
2026-03-28 10:09:33 +00:00
| 15-16 | Footer content (about, copyright, newsletter toggle) | 1.25h | done |
2026-03-28 23:40:48 +00:00
| 17-18 | Move branding from Theme to Site | 1.5h | done |
2026-03-28 23:54:04 +00:00
| 19-20 | Merge page settings into Page tab, remove Settings tab | 1h | done |
2026-03-10 08:21:55 +00:00
| 21-22 | Polish and testing | 2h | planned |
2026-03-28 23:54:04 +00:00
Custom page settings (title, slug, meta description, published, navigation options) now appear inline in the Page tab as a collapsible section. The separate Settings tab has been fully removed along with the SettingsEditor component.
2026-03-28 10:13:03 +00:00
Social links now support 40+ platforms (grouped by category), auto-detect platform from pasted URLs (including deep links like `tg://` and `spotify:` ), normalize bare domains to https://, preserve custom protocols, and filter empty URLs from shop display.
2026-03-28 23:40:48 +00:00
Navigation editors support add/edit/delete/reorder for both header and footer nav items. Page picker dropdown allows linking to system pages (home, about, contact, etc.) or custom published pages. Changes preview immediately with live update in the shop layout. Removed legacy /admin/navigation page — nav editing is now exclusively through the Site tab with live preview.
2026-03-28 22:19:48 +00:00
2026-03-28 10:09:33 +00:00
### Unified editor session ([plan](docs/plans/unified-editor-session.md)) — Complete
Unified "optimistic preview with explicit save" across all editor tabs. Changes show immediately but only persist on Save. Free tab switching without warnings. Navigation blocking with Save/Discard/Cancel modal.
| Phase | Description | Est | Status |
|-------|-------------|-----|--------|
| 1 | Site tab preview without auto-save | 1h | done |
| 2 | Theme tab preview without auto-save | 1.5h | done |
| 3 | Unified Save button (saves all dirty tabs) | 1h | done |
| 4 | Visual indicators (dirty dots on tabs, "Unsaved" text) | 0.5h | done |
| 5 | Navigation warning modal (Save & continue, Discard, Cancel) | 1h | done |
2026-03-10 08:54:15 +00:00
### SEO enhancements ([plan](docs/plans/seo-enhancements.md))
Comprehensive SEO tooling to rival Yoast/RankMath. Per-page SEO controls, enhanced schema, SEO preview panel, focus keyword with scoring, FAQ schema, Search Console integration.
| # | Task | Est | Status |
|---|------|-----|--------|
| 1-4 | Per-page SEO controls (noindex/nofollow, meta descriptions) | 2h | planned |
| 5-8 | Enhanced Organization schema (business info, social profiles) | 2h | planned |
| 9 | Image sitemap entries | 1h | planned |
| 10-13 | SEO preview panel (Google search + social card) | 4h | planned |
| 14-18 | Focus keyword & SEO score/checklist | 4h | planned |
| 19-21 | FAQ block with FAQPage schema | 2h | planned |
| 22-25 | Google Search Console integration | 6h | planned |
2026-03-09 11:07:46 +00:00
### 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 |
2026-03-01 17:15:18 +00:00
### Platform site
2026-02-07 18:04:18 +00:00
2026-03-01 17:15:18 +00:00
| # | 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 |
2026-01-31 14:06:07 +00:00
2026-03-01 17:15:18 +00:00
## 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 |
2026-03-10 07:57:40 +00:00
| [onboarding-ux.md ](docs/plans/onboarding-ux.md ) | Complete |
| [notification-overhaul.md ](docs/plans/notification-overhaul.md ) | Complete |
2026-03-08 23:09:51 +00:00
| [live-site-editor.md ](docs/plans/live-site-editor.md ) | Superseded by unified-editing-mode |
2026-03-09 21:18:29 +00:00
| [unified-editing-mode.md ](docs/plans/unified-editing-mode.md ) | Complete |
2026-03-01 17:15:18 +00:00
| [profit-aware-pricing.md ](docs/plans/profit-aware-pricing.md ) | Planned |
2026-03-08 08:58:43 +00:00
| [security-hardening.md ](docs/plans/security-hardening.md ) | Planned |
2026-03-09 11:07:46 +00:00
| [draft-publish-workflow.md ](docs/plans/draft-publish-workflow.md ) | Planned |
2026-03-28 10:13:03 +00:00
| [editor-reorganisation.md ](docs/plans/editor-reorganisation.md ) | In Progress |
2026-03-10 08:54:15 +00:00
| [seo-enhancements.md ](docs/plans/seo-enhancements.md ) | Planned |
2026-03-10 09:46:02 +00:00
| [competitive-gap-analysis.md ](docs/plans/competitive-gap-analysis.md ) | Reference |
2026-03-13 13:34:36 +00:00
| [competitive-gaps.md ](docs/plans/competitive-gaps.md ) | Planned |