Fruit Plug — Engineering Wiki¶
The source of truth for how Fruit Plug's new stack is built, deployed, and operated.
Where we are
Phase 0 (backend cleanup): complete. Phase 1 MVP (frontend): ~60% shipped. See the Changelog for the full timeline.
What's live right now¶
| Surface | URL | Status |
|---|---|---|
| New PWA (staging) | dev.fruitplug.co.uk | ✅ |
| This wiki | docs.fruitplug.co.uk | ✅ |
| Old WordPress site (still the public face) | fruitplug.co.uk | ✅ (old Butcher theme; cutover pending) |
| WordPress admin | fruitplug.co.uk/wp-admin | ✅ PHP 8.2 · WP 6.9 · WC 10.7 |
| fruitplug-api REST | fruitplug.co.uk/wp-json/fruitplug/v1/* |
✅ 6 controllers · 7 tables |
The stack in one diagram¶
flowchart LR
U[Customer] -->|HTTPS| Caddy[Caddy · this server<br/>147.12.227.117]
A[Ops] --> Caddy
Caddy -->|dev.fruitplug.co.uk| Web[Next.js PWA<br/>fruitplug-web-dev]
Caddy -->|docs.fruitplug.co.uk| Docs[MkDocs]
Web -->|Store API<br/>REST v3<br/>fruitplug/v1| WP
subgraph WPHost [A2 Hosting · 106.0.62.69]
WP[WordPress 6.9 · WC 10.7<br/>PHP 8.2]
WP --- Plugins[ShipStation · WooPayments<br/>Subscriptions · Mailchimp<br/>fruitplug-api · 15 more]
WP --- DB[(MySQL · fruitplu_a2wp705<br/>+ 7 wp_fruitplug_* tables)]
end
WP -->|Stripe| Stripe[(Stripe)]
WP -->|ShipStation API| Ship[(ShipStation)]
Web -->|Graph API · planned| IG[(Instagram)]
Key numbers (measured, not estimated)¶
| Metric | Value | Source |
|---|---|---|
| Lifetime orders | 4,188 (3,546 completed) | Woo reports |
| Customers | 2,216 | Woo reports |
| AOV | £69.31 (median £61.98) | Woo orders sample |
| Products | 46 live (24 fruits · 4 boxes · 10 merch · 3 subs · 5 rare) | Woo · post-cleanup |
| Active plugins | 21 (was 38) | Post Phase 0 |
| 64.4k followers · 349 reels · 151.6M plays | Instagram Graph API | |
| Active subscriptions | 1 · MRR £51.98 | Phase 2 will rebuild this |
| Reviews | 4.76★ / 218 | Customer Reviews for Woo |
Where to start reading¶
- Onboarding a new engineer? → Getting started → Architecture overview
- Building a new feature? → Adding a feature
- Debugging production? → A2 host runbook → Operations
- Tuning the box builder? → Custom Box Builder
- Brand/design work? → Guidelines
Principles¶
- One source of truth per thing. Persistent data → the WordPress MySQL DB. Brand tokens →
globals.css. Environment →.env.local. Don't duplicate. - Don't touch what works. Woo is the commerce engine. ShipStation is the fulfilment engine. We add alongside, we don't replace.
- Headless everywhere. The PWA holds zero durable state. Every feature has a REST endpoint or uses one.
- Dark-mode-first. The brand is black + magenta. Light mode is an override, not the default.
- Mobile-first. 34% of Phase 0 orders paid via Apple Pay. The PWA installs to the home screen.