A modern, server-rendered core
Astro renders pages on the server, with islands only where the page needs to move. Content stays crawlable and quick to first paint — the right foundation for SEO-led retail.
Technical review · biggreenegg.co.uk
A walk through the platform behind www.biggreenegg.co.uk: what is built well, where heat is escaping, and the order in which we would close the vents.
The EGG is famous for doing one thing exceptionally well, for a lifetime. Its storefront should feel the same: quick to respond, dependable under load and simple for the team to care for.
Ceramic domes before glazing. The craft is in what you cannot see.
This review looks under the dome of www.biggreenegg.co.uk. We read the storefront codebase, ran its tests and production build, examined the live site and studied production errors from this week's fetch.
We found a modern foundation, built at pace by a capable team. Astro renders pages on the server, Commerce Layer handles commerce and DatoCMS manages content. That architecture is right for a premium brand, and nothing here argues for starting again.
We also found heat escaping. Live checks still show a broken sitemap and an unusable robots file. Markets and shared templates are paid for twice. Caching, routing and a handful of production faults leak heat the shopper and the team can feel.
None of this is unusual for a platform built at speed, and all of it can be fixed. What follows shows where the heat is leaking and the order in which to close the vents: security and revenue first, then speed and resilience, then the simplification that makes every later change cheaper.
We have written it to be as useful to the commercial team as to engineers. Every finding opens to show its evidence, its business impact and its fix.
lines of application code under review, across 659 files.
components built twice, once in Astro and once in Vue.
Irish page templates that are byte-for-byte copies of the UK ones.
of homepage HTML, before a single image or script loads.
known vulnerable packages, one of them critical.
unresolved error groups in production, recorded by Sentry.
CDN layers between a shopper and the page, with caching bypassed at the last.
unit tests passing, and a clean production build. The good news.
Before the heat map, credit where it is due. These are the decisions we would keep, and they are why the roadmap is a renovation rather than a rebuild.
Astro renders pages on the server, with islands only where the page needs to move. Content stays crawlable and quick to first paint — the right foundation for SEO-led retail.
Commerce Layer owns catalogue, pricing, stock and orders. Market-scoped tokens are the right pattern for UK and Ireland trading side by side.
Consent defaults closed and chat waits on a real choice. It is one of the few journeys already covered by automated checks.
Product, FAQ and recipe structured data already exist, and page heads carry the right language alternates. The patterns are there to extend across the site.
Sentry is wired to the live storefront. This run can name unresolved groups instead of guessing whether the shop is quiet.
Tests and the production build still pass after a clean install. That is the good news, and it is why the work ahead is repair rather than rescue.
Search and accessibility are already holding heat — SEO 92 and accessibility 99 on mobile and desktop — so crawlers and assistive tech are in better shape than the shopper’s wait. Performance is still cold: 51 on mobile, 59 on desktop, with heat leaking through layout shift, long scripts and unused JavaScript. The six lab scores average 82 of 100 — warming, not yet ready to cook.
Select a part to see the layer it stands for and the findings that touch it. Dots show finding counts this run, not estimated health.
Not theory. Each of these is happening on the live site or has been recorded in Sentry. We captured them on 2026-11-04.
Search engines receive a 500 error instead of XML when they request the sitemap.
Crawlers asking for robots.txt get a bad response instead of crawl rules.
The privacy policy URL bounces between apex and www until the client gives up.
Homepage responses show cache bypass at the edge — each miss hits origin harder.
Requests without text/html in Accept are refused — crawlers see 400 on robots.txt.
Some baseline headers are present; Content-Security-Policy and HSTS are missing on the homepage.
Every EGG owner knows the four ways to cook. We have used them to rank the work. Heat is urgency and value; the catalogue still carries effort so quick wins are easy to spot.
9
Direct, fierce heat. Security exposure and live faults that are costing revenue or visibility today. Fix these first.
14
High value at moderate effort. Speed, resilience and accessibility work that customers will feel straight away.
7
Indirect and structural. Consolidation that takes time to do well, and makes everything after it cheaper and safer.
12
Patient, continuous care: quality gates, tests, types and documentation. Start now and never stop.
Numbered by priority. Filter by heat or by part of the EGG, then open any finding for its evidence, its business impact and the fix.
Every finding plotted by the value it unlocks and the effort it takes. Start top-left. Hover a point for a summary, and select it for the detail.
Act now.
Next.
Then.
Ongoing.
Reading the chart 14 sit top-left — start there.
Built for a lifetimeAn EGG is made to be handed down. The platform that sells it deserves the same care.
The principle behind this review
The largest structural drag on the platform is duplication: components written in two frameworks, and a whole market written twice. Every fix is paid for twice, and the copies drift apart.
lines in components that exist as both Astro and Vue (102 pairs).
lines of unused Vue copies (1 component) that this run could not find imported.
lines of Irish page templates duplicated from the UK (19 files).
lines that actually differ between the two markets.
Each tile is one component, sized by its combined line count: the Astro copy in deep green, the Vue copy in sage. Hatched Vue copies are imported by nothing.
Hover over or focus a tile to compare its two copies.
How much of each Irish template is identical to its UK twin. Bar length shows the size of the template; the orange tip is the part that differs.
Same proven ingredients, arranged so heat stays where it belongs: the preview on Cloudflare behind Zero Trust, one CDN that caches, rendering in London, and one way to build each page. The diagram is the recommended shape.
The gates, scores and production signals behind the chapters above. Everything on this page was captured on 2026-11-04.
vitest run51 / 51 passastro buildPasseslint srcNon-zeroprettier --checkNon-zeroastro check29 errorsnpm audit63 vulnsplaywright2 passed| Measure | Today |
|---|---|
| Homepage, mobile lab | Score 51 |
| Homepage, desktop lab | Score 59 |
| Homepage HTML | 798 KB |
| Source size | 659 files, 72,671 lines |
| Known vulnerabilities (npm audit) | 63 (1 critical, 30 high) |
| Unresolved Sentry groups | 33 |
| Unit tests this run | 51 / 51 pass |
| Sitemap (live check) | HTTP 500 (after 1 redirect) |
| robots.txt (live check) | Body: Bad request |
655 commits on this storefront in that window. Bars are this repository’s git log — not copied from the reference review.
| Package | Now | Latest |
|---|---|---|
| jsdom | 27.4.0 | 31.0.0 |
| @types/jsdom | 27.0.0 | 30.0.0 |
| @astrojs/netlify | 6.6.5 | 8.2.12 |
| @astrojs/vue | 5.1.4 | 7.1.2 |
| astro | 5.18.2 | 7.4.7 |
| content-type | 1.0.5 | 3.1.1 |
| eslint-plugin-astro | 1.3.1 | 3.2.1 |
| node-html-parser | 7.0.1 | 9.0.7 |
22 dependencies a major version behind.
| SyntaxError: Unexpected token '(', "(select 19"... is not valid JSON · POST /content-api/newsletter-subscribe | 75 |
| TypeError: fetch failed · GET /p/[slug] | 61 |
| SyntaxError: Unexpected token '(', "(select 19"... is not valid JSON · POST /p/in-stock-notification | 60 |
| Error: [services/recipes/{slug}] "data" is undefined. · GET /r/[slug] | 44 |
| TypeError: Cannot read properties of undefined (reading 'footerContent') · GET /r/[slug] | 38 |
| TypeError: Cannot read properties of undefined (reading 'alertBarText') · GET /[slug] | 36 |
33 unresolved groups this fetch window.
| Slice | Files | Lines |
|---|---|---|
| src total | 659 | 72,671 |
| Vue (.vue) | 210 | 31,373 |
| Astro (.astro) | 199 | 24,748 |
| TypeScript (.ts) | 143 | 9,745 |
| JavaScript (.js) | 56 | 3,956 |
| .json | 2 | 1,143 |
| CSS (.css) | 12 | 857 |
| .svg | 37 | 849 |
| git ls-files (whole repo) | 859 | — |
Counted under this client’s source roots this run. Extensions present in the tree are listed; missing frameworks are omitted, not zero-filled.
| Service | Status | Health | Signal |
|---|---|---|---|
| Commerce Layer | reviewed | needs attention | SDK @commercelayer/sdk ^7.12.1 (major 8 available). Dual axios + SDK clients (finding COM-4). Checkout token pattern COM-1/COM-2. |
| DatoCMS | reviewed | needs attention | GraphQL at graphql.datocms.com (+ /preview non-prod). Used on every getServerInitData navigation/global path. CMS field gaps drive Sentry B9C/B9D (MON-1). |
| BGE Services API | reviewed | needs attention | Storefront calls parseEnvironmentFromRuntime('API_URL') for collections, recipes, routes, checkout content, etc. Not a separate repo pass this quarter. |
| Calibre | reviewed | needs attention | Week 2026-11-02 snapshot 2311 complete. Mobile perf 51, desktop 59, SEO 92, a11y 99. |
| Sentry | reviewed | needs attention | 33 unresolved groups production week ending 2026-11-02. Top noise: injection probes on newsletter/in-stock POST; fetch failed on product pages. |
| Ghost Inspector | reviewed | strong | Production suite [Big Green Egg] 29/29 passing, finished 2026-11-02. Fetch label: All passing. |
| Trustpilot | reviewed | ok | 30 reviews fetched server-side per page via getBusinessUnitReviews; proxied through content-api/trustpilot routes. |
| Netlify (hosting) | reviewed | ok | SSR adapter; NODE 22.23.4 pin; HTML cache bypass on homepage (HOST-2). |
| BunnyCDN (edge) | reviewed | ok | Homepage served via BunnyCDN; max-age=180 on HTML. |
Scope. Storefront at revision adf8322, week 2026-11-02. Live site and production Sentry from fetch. Reference HTML was not overwritten.
How. Collect-all archived fetch, npm ci/test/build/lint/audit/outdated. CodeHealth skills wrote findings; skill 23 mapped reference ids.
Direction. All 37 reference findings have been re-verified in this run (see benParity). Prioritise ROUTE-1, SEO-1, SEC-1, COM-1, and ARCH/bundle debt before major Astro 7 upgrades. Template v2 (immersive chapters) is the remaining UX gap vs Ben's HTML shell.
Coverage. All 37 reference findings re-verified this run.
Confidence. Numbers on this page come from archived JSON. Matrix positions are heat × severity heuristics unless a finding sets value and effort. Part after-health and 1–10 dials are not collected — they need shipped work plus a scoring rubric.
The foundations are sound and the path is clear. Begin with the first course; it closes the risks and builds momentum for everything that follows.