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-08 07:30:16 +00:00
- 1759+ 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-10 08:21:55 +00:00
### 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 |
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-10 08:21:55 +00:00
| [editor-reorganisation.md ](docs/plans/editor-reorganisation.md ) | Planned |
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 |