# Whoooop Ltd > IT consultancy and full-stack web development studio with 15+ years of experience, specialising in TypeScript, React, Node.js and serverless architecture. Builds and maintains websites and web apps for businesses across Stoke-on-Trent and North Staffordshire. ## Pages - [Whoooop Ltd — Full-Stack Development](https://whoooop.co.uk/): Home page: services overview, experience and contact details for Whoooop Ltd, a TypeScript/React/Node.js consultancy. - [Blog](https://whoooop.co.uk/blog): Index of write-ups on JavaScript tooling and the web platform — pnpm, Yarn, Turborepo, ESM migration and hosting choices. Individual posts are listed separately below. - [Web Development in Stoke-on-Trent](https://whoooop.co.uk/stoke-on-trent-web-development): Local web development for Stoke-on-Trent and North Staffordshire businesses — responsive sites, e-commerce and ongoing maintenance. - [Web Development in Newcastle-under-Lyme](https://whoooop.co.uk/newcastle-under-lyme-web-development): Web development for Newcastle-under-Lyme businesses — marketing sites, online shops and web apps built and maintained locally. - [Web Development in Stafford](https://whoooop.co.uk/stafford-web-development): Web development for Stafford and surrounding villages — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Leek](https://whoooop.co.uk/leek-web-development): Web development for Leek and the Staffordshire Moorlands — websites, online shops and booking tools built and looked after by a full-stack developer. - [Web Development in Crewe](https://whoooop.co.uk/crewe-web-development): Web development for Crewe and south Cheshire — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Sandbach](https://whoooop.co.uk/sandbach-web-development): Web development for Sandbach and south Cheshire — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Congleton](https://whoooop.co.uk/congleton-web-development): Web development for Congleton and east Cheshire — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Uttoxeter](https://whoooop.co.uk/uttoxeter-web-development): Web development for Uttoxeter and east Staffordshire — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Stone](https://whoooop.co.uk/stone-web-development): Web development for Stone and mid-Staffordshire — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Eccleshall](https://whoooop.co.uk/eccleshall-web-development): Web development for Eccleshall and the North Staffordshire countryside — websites, online shops and booking tools built and looked after by a full-stack developer. - [Web Development in Macclesfield](https://whoooop.co.uk/macclesfield-web-development): Web development for Macclesfield and the Cheshire East area — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Burton upon Trent](https://whoooop.co.uk/burton-upon-trent-web-development): Web development for Burton upon Trent and East Staffordshire — websites, online ordering and trade accounts built and looked after for retail, trade and supply-chain firms. - [Web Development in Lichfield](https://whoooop.co.uk/lichfield-web-development): Web development for Lichfield and south-east Staffordshire — websites, online sales and ongoing support for independents, hospitality and professional firms. - [Web Development in Tamworth](https://whoooop.co.uk/tamworth-web-development): Web development for Tamworth and south-east Staffordshire — websites, online shops and web apps built and looked after for retail, leisure and trade businesses. - [Web Development in Cannock](https://whoooop.co.uk/cannock-web-development): Web development for Cannock and Cannock Chase — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Market Drayton](https://whoooop.co.uk/market-drayton-web-development): Web development for Market Drayton and north Shropshire — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Shrewsbury](https://whoooop.co.uk/shrewsbury-web-development): Web development for Shrewsbury and central Shropshire — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Kidsgrove](https://whoooop.co.uk/kidsgrove-web-development): Web development for Kidsgrove and North Staffordshire — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Biddulph](https://whoooop.co.uk/biddulph-web-development): Web development for Biddulph and the Staffordshire Moorlands — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Northwich](https://whoooop.co.uk/northwich-web-development): Web development for Northwich and mid-Cheshire — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Knutsford](https://whoooop.co.uk/knutsford-web-development): Web development for Knutsford and Cheshire — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Telford](https://whoooop.co.uk/telford-web-development): Web development for Telford and the Wrekin — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Nantwich](https://whoooop.co.uk/nantwich-web-development): Web development for Nantwich and south Cheshire — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Chester](https://whoooop.co.uk/chester-web-development): Web development for Chester and Cheshire West businesses — websites, online shops and bespoke web apps built and looked after by a full-stack developer. - [Web Development in Warrington, Cheshire](https://whoooop.co.uk/warrington-web-development): Web development for Warrington and the surrounding Cheshire towns between Liverpool and Manchester — websites, online shops and custom web apps. - [Web Development in Lymm, Cheshire](https://whoooop.co.uk/lymm-web-development): Web development for Lymm and the villages around it — websites, online shops and web apps for independents and the commuter trade, near Warrington. - [Web Development in Widnes, Cheshire](https://whoooop.co.uk/widnes-web-development): Web development for Widnes and the Halton towns across the Mersey from Runcorn — websites, online shops and custom web apps built and maintained locally. - [Web Development in Runcorn, Cheshire](https://whoooop.co.uk/runcorn-web-development): Web development for Runcorn on the Mersey — websites, online shops and custom web apps for businesses across the New Town estates and the old town. - [Web Development in Winsford](https://whoooop.co.uk/winsford-web-development): Web development for Winsford and mid-Cheshire businesses — websites, online shops and web apps, a few minutes off the A54. - [Web Development in Middlewich](https://whoooop.co.uk/middlewich-web-development): Web development for Middlewich and mid-Cheshire — websites, online shops and web apps built and maintained by a full-stack developer. - [Web Development in Holmes Chapel](https://whoooop.co.uk/holmes-chapel-web-development): Web development for Holmes Chapel and mid-Cheshire businesses — websites, online shops and web apps built and maintained near the M6. - [Web Development in Alsager](https://whoooop.co.uk/alsager-web-development): Web development for Alsager and east Cheshire businesses — websites, online shops and web apps built and looked after locally. - [Web Development in Tarporley](https://whoooop.co.uk/tarporley-web-development): Web development for Tarporley and the heart of rural Cheshire — websites, online shops and booking systems for shops, restaurants and rural firms. - [Web Development in Frodsham](https://whoooop.co.uk/frodsham-web-development): Web development for Frodsham — fast websites, online shops and booking tools for the independent shops, hospitality and trades along Main Street and the surrounding villages. - [Web Development in Ellesmere Port](https://whoooop.co.uk/ellesmere-port-web-development): Web development for the trades, shops and small firms across Ellesmere Port and the Wirral edge of Cheshire West — websites, online shops and booking systems. - [Web Development in Neston](https://whoooop.co.uk/neston-web-development): Web development for the shops, cafés, trades and small firms across Neston, Parkgate and the Wirral edge of Cheshire West — websites, online shops and booking systems. - [Web Development in Wilmslow](https://whoooop.co.uk/wilmslow-web-development): Web development for Wilmslow and north-east Cheshire businesses — websites, online shops and web apps built and maintained by a full-stack developer. - [Web Development in Alderley Edge](https://whoooop.co.uk/alderley-edge-web-development): Web development for Alderley Edge — websites, online shops and booking tools for the restaurants, boutiques and professional firms of the Cheshire commuter belt. - [Web Development in Poynton](https://whoooop.co.uk/poynton-web-development): Web development for the shops, salons, trades and service firms around Poynton and the east Cheshire commuter belt — websites, online shops and booking systems. - [Web Development in Bollington](https://whoooop.co.uk/bollington-web-development): Web development for the independent shops, pubs and trades of Bollington and the villages on the edge of the Peak District — fast websites, online shops and booking tools. - [Web Development in Cheadle](https://whoooop.co.uk/cheadle-web-development): Web development for Cheadle and the Staffordshire Moorlands — websites, online shops and web apps built and looked after by a full-stack developer. - [Web Development in Rugeley](https://whoooop.co.uk/rugeley-web-development): Web development for Rugeley and Cannock Chase — fast, mobile-ready websites, online shops and web apps from one experienced developer. - [Web Development in Hednesford](https://whoooop.co.uk/hednesford-web-development): Web development for businesses across Hednesford, Heath Hayes and the Cannock Chase coalfield — fast, mobile-friendly websites, online shops and web apps. - [Web Development in Burntwood](https://whoooop.co.uk/burntwood-web-development): Web development for businesses across Burntwood, Chasetown and Chase Terrace on the southern edge of Cannock Chase — websites, online shops and web apps. - [Web Development in Penkridge](https://whoooop.co.uk/penkridge-web-development): Web development for Penkridge and the South Staffordshire villages — websites, online shops and web apps, just off the A449. - [Web Development in Shifnal](https://whoooop.co.uk/shifnal-web-development): Web development for Shifnal and east Shropshire — fast, mobile-ready websites, online shops and web apps from one experienced developer. - [Web Development in Newport, Shropshire](https://whoooop.co.uk/newport-shropshire-web-development): Web development for Newport and east Shropshire — fast, mobile-friendly websites, online shops and web apps from one developer. - [Web Development in Oswestry](https://whoooop.co.uk/oswestry-web-development): Web development for Oswestry and north-west Shropshire along the Welsh border — fast, mobile-ready websites, online shops and web apps. - [Web Development in Whitchurch, Shropshire](https://whoooop.co.uk/whitchurch-shropshire-web-development): Web development for Whitchurch and the north Shropshire borders — fast, mobile-friendly websites, online shops and web apps. - [Web Development in Wem, Shropshire](https://whoooop.co.uk/wem-web-development): Web development for Wem and across north Shropshire — websites, online shops and custom web apps for businesses with a rural catchment. - [Web Development in Ellesmere, Shropshire](https://whoooop.co.uk/ellesmere-web-development): Web development for Ellesmere and north Shropshire — websites, online shops and booking systems for canal-town and Mere-side businesses. - [Web Development in Bridgnorth](https://whoooop.co.uk/bridgnorth-web-development): Web development for Bridgnorth and south Shropshire — the High Town independents, riverside hospitality and rural trades. - [Web Development in Ludlow](https://whoooop.co.uk/ludlow-web-development): Web development for Ludlow and south Shropshire — the independent shops, restaurants, hotels and food producers behind the local food reputation. - [Web Development in Church Stretton](https://whoooop.co.uk/church-stretton-web-development): Web development for Church Stretton and the Shropshire Hills — the B&Bs, holiday lets, cafés and shops serving walkers. - [Web Development in Craven Arms](https://whoooop.co.uk/craven-arms-web-development): Web development for Craven Arms and south-west Shropshire — the farms, shops, trades and visitor businesses across the Clun Valley and Shropshire Hills. - [Web Development in Derby](https://whoooop.co.uk/derby-web-development): Web development for Derby businesses in manufacturing, supply chain and retail — websites, web apps and online shops built to be found and worth finding. - [Web Development in Ashbourne](https://whoooop.co.uk/ashbourne-web-development): Web development for Ashbourne and the Derbyshire Dales — websites and web apps for tourism, independent retail, rural trades and B&B bookings. - [Web Development in Matlock](https://whoooop.co.uk/matlock-web-development): Web development for Matlock and the A6 corridor — websites, online shops and web apps for tourism, professional services and rural businesses. - [Web Development in Chesterfield](https://whoooop.co.uk/chesterfield-web-development): Web development for Chesterfield and the North Derbyshire market — websites, online shops and custom web apps for local firms. - [Web Development in Buxton](https://whoooop.co.uk/buxton-web-development): Web development for Buxton and the High Peak — websites, online shops and booking tools for tourism, trades and professional services built and looked after by a full-stack developer. - [E-commerce Web Development](https://whoooop.co.uk/ecommerce-web-development): E-commerce web development — Shopify and bespoke online shops with secure payments, stock control and the speed to handle busy sale days. - [Shopify Development](https://whoooop.co.uk/shopify-development): Shopify development — theme customisation, custom features, integrations and migrations for shops that run on Shopify. - [Bespoke Web Application Development](https://whoooop.co.uk/web-application-development): Custom web application development — internal tools, customer portals, dashboards and APIs built in TypeScript, React, Node.js and AWS. - [Booking System Development](https://whoooop.co.uk/booking-system-development): Custom online booking and appointment systems — live availability, deposits, SMS reminders and staff calendars built around how a business takes bookings. - [Membership Website Development](https://whoooop.co.uk/membership-website-development): Membership and subscription website development — member logins, gated content and recurring Stripe billing for clubs, associations and course providers. - [Progressive Web App Development](https://whoooop.co.uk/progressive-web-app-development): Progressive web app development — installable, offline-capable apps built in React and TypeScript that feel native on any device without separate app-store builds. - [Website Maintenance and Support Services](https://whoooop.co.uk/website-maintenance-services): Ongoing website maintenance and support — security updates, bug fixes, content changes and performance work, including sites built by someone else. - [Website Redesign and Rebuild Services](https://whoooop.co.uk/website-redesign-services): Website redesign and rebuild — turning a slow, dated or hard-to-update site into a fast, modern one that brings in enquiries without losing search rankings. - [Website Speed Optimisation Services](https://whoooop.co.uk/website-speed-optimisation): Website speed optimisation for existing sites — Core Web Vitals, image and code fixes and faster mobile loading, improving rankings and conversions without a full rebuild. - [Website Security and Hardening Services](https://whoooop.co.uk/website-security-services): Website security for business sites — SSL, software updates, server hardening, backups and malware removal, both as prevention and as clean-up after a breach. - [API Development and Integration](https://whoooop.co.uk/api-development-integration): API development and integration — REST and GraphQL APIs that connect your website, app and third-party tools so they share data reliably. - [React Development](https://whoooop.co.uk/react-development): React development — single-page apps, dashboards and interactive front-ends built in React and TypeScript. - [Next.js Development](https://whoooop.co.uk/nextjs-development): Next.js development — server-rendered React apps, static sites and full-stack builds in Next.js and TypeScript. - [Node.js Development](https://whoooop.co.uk/nodejs-development): Node.js back-end development — APIs, real-time features and background jobs built in Node.js and TypeScript, the server-side pair to React front-ends. - [TypeScript Development](https://whoooop.co.uk/typescript-development): TypeScript development — type-safe web development, from greenfield builds to migrating an existing JavaScript codebase. - [Database Design and Development](https://whoooop.co.uk/database-design-development): Database design, development and optimisation — sound data models, faster queries and safe migrations in PostgreSQL, MongoDB and similar databases. - [Cloud Hosting and Deployment](https://whoooop.co.uk/cloud-hosting-deployment): Cloud hosting and deployment for websites and web apps — AWS, serverless, CI/CD pipelines, backups, SSL and monitoring set up and looked after for you. - [Serverless Development with AWS](https://whoooop.co.uk/serverless-development): Serverless development on AWS — event-driven backends on Lambda, SQS and DynamoDB that stay up when traffic spikes and cost nothing sitting idle. - [Website Accessibility and WCAG Compliance](https://whoooop.co.uk/website-accessibility-wcag-compliance): Website accessibility audits and fixes — finding keyboard, screen-reader and colour-contrast barriers on an existing site and bringing it up to WCAG standards. - [CMS Development for Editable Websites](https://whoooop.co.uk/cms-development): CMS and headless CMS development — building sites your own team can update (pages, news, images) without calling a developer for every change. - [WordPress Development](https://whoooop.co.uk/wordpress-development): WordPress development — themes, plugins and WooCommerce stores built properly, not assembled from a page builder. - [Responsive Web Design](https://whoooop.co.uk/responsive-web-design): Responsive, mobile-friendly web design — sites that read clearly and tap easily on any screen, plus fixes for layouts that break on mobile. - [SEO Services](https://whoooop.co.uk/seo-services): Technical and on-page SEO for existing sites — clearing what stops search engines and local customers in Staffordshire and Cheshire finding you. ## Blog - [Shopify Theme Check in CI: Fail on What Matters](https://whoooop.co.uk/blog/shopify-theme-check-ci): Run shopify theme check in CI with the right fail level, the asset size checks the recommended preset leaves off, and a baseline for older themes. - [Next.js Middleware to Proxy: What the Rename Changes](https://whoooop.co.uk/blog/nextjs-middleware-to-proxy): Next.js 16 renames middleware.ts to proxy.ts and pins it to Node.js, so here is the codemod, the renamed flags and when to keep middleware. - [Shopify Draft Order API: Quote to Paid Order](https://whoooop.co.uk/blog/shopify-draft-order-api): Shopify's draft order API turns a quote into a paid order in four mutations: create, calculate, invoice, complete, without losing stock. - [Shopify Predictive Search API: Build a Search Box](https://whoooop.co.uk/blog/shopify-predictive-search-api): The predictiveSearch query returns up to ten products, collections, pages and query suggestions per request; here is how to wire one up. - [Declarative Shadow DOM: SSR Without the Flash](https://whoooop.co.uk/blog/declarative-shadow-dom-ssr): Declarative Shadow DOM ships shadow roots in the HTML itself, so server-rendered web components paint their styles before any JavaScript runs. - [Hydrogen Cart Handler: One Route, Every Mutation](https://whoooop.co.uk/blog/hydrogen-cart-handler): How Hydrogen's cart handler wires a cart ID cookie, one /cart action route and optimistic line updates into a headless Shopify storefront. - [Import Discount Codes Into Shopify in Bulk](https://whoooop.co.uk/blog/import-discount-codes-into-shopify): Shopify has no CSV import for discount codes, so moving a WooCommerce or Magento coupon list across takes two Admin GraphQL mutations and batches of 250. - [Partitioned Cookies: CHIPS for Third-Party Embeds](https://whoooop.co.uk/blog/partitioned-cookies-chips): Set Partitioned on a cross-site cookie and CHIPS gives it a separate jar per top-level site, which is how an embedded widget keeps its session. - [Shopify API Version Upgrade: The Quarterly Job](https://whoooop.co.uk/blog/shopify-api-version-upgrade): Shopify ships an API version every quarter and supports each for 12 months, so pin the version, read the health report and upgrade on a schedule. - [Shopify Optional Scopes: Ask When You Need Them](https://whoooop.co.uk/blog/shopify-optional-scopes): Shopify optional scopes let your app request read_orders in context instead of at install, and revoke it when the merchant turns the feature off. - [Animate height: auto in CSS: interpolate-size or Grid](https://whoooop.co.uk/blog/css-animate-height-auto): interpolate-size: allow-keywords animates height: auto in Chromium only, so here is the grid fallback to ship for Firefox and Safari. - [Shopify Checkout Branding API: What Replaced It](https://whoooop.co.uk/blog/shopify-checkout-branding-api): The Shopify checkout branding API moved to checkoutAndAccountsConfigurationUpdate, one configuration covering checkout, customer accounts and sign-in. - [Shopify Collection Filters in Liquid: Links or Form](https://whoooop.co.uk/blog/shopify-collection-filters-liquid): Shopify collection filters in Liquid come from the filter object: a GET form to pick values, url_to_remove links to clear them, and one URL contract. - [JavaScript String Length Lies About Emoji](https://whoooop.co.uk/blog/javascript-string-length-emoji): JavaScript string length counts UTF-16 code units, so one family emoji reads as 11; Intl.Segmenter counts the characters a user actually sees. - [Shopify Payment Customization Function: Hide COD](https://whoooop.co.uk/blog/shopify-payment-customization-function): How to hide, rename or reorder checkout payment methods with a Shopify payment customization function, and where it silently will not run. - [Shopify Storefront API Variant Selection at 2048](https://whoooop.co.uk/blog/shopify-storefront-api-variant-selection): Shopify products can hold 2048 variants now, so resolve the shopper's choice with selectedOrFirstAvailableVariant instead of fetching the whole list. - [JavaScript Iterator Helpers: Drop the Spread](https://whoooop.co.uk/blog/javascript-iterator-helpers): Iterator helpers put map, filter and take on any Map, Set or generator, so the chain runs lazily and never builds an intermediate array. - [Hydrogen Analytics Events: Subscribe, Don't Re-Track](https://whoooop.co.uk/blog/hydrogen-analytics-events): Hydrogen publishes eight analytics events; subscribe to them once with useAnalytics instead of hand-rolling a view event in every route. - [Shopify Session Token Verification in Node](https://whoooop.co.uk/blog/shopify-session-token-verification): Verify a Shopify session token yourself: the HS256 signature check, the four claims to validate, and which forged tokens it rejects. - [Sec-Fetch-Site: Block Cross-Site POSTs Early](https://whoooop.co.uk/blog/sec-fetch-site-csrf): Sec-Fetch-Site lets your server reject cross-site POSTs before auth runs, for CSRF protection that needs no token and no client changes. - [Shopify productSet Mutation: Upsert by Custom ID](https://whoooop.co.uk/blog/shopify-productset-mutation): Shopify's productSet mutation writes a product's whole state in one call, so know what it deletes, how to upsert by custom ID, and which statuses to poll. - [Shopify changeFromQuantity: Update Stock Safely](https://whoooop.co.uk/blog/shopify-changefromquantity): Shopify removed compareQuantity in API version 2026-04, so here is how to pass changeFromQuantity and an idempotency key when syncing stock. - [Style a Real Select With appearance: base-select](https://whoooop.co.uk/blog/appearance-base-select): appearance: base-select styles a native select in Chrome 135 and Safari 27, and falls back to the platform control everywhere else. - [Shopify Section Rendering API: Let Liquid Render It](https://whoooop.co.uk/blog/shopify-section-rendering-api): Shopify's Section Rendering API returns rendered theme section HTML from any storefront URL, up to five sections a request, and cart calls can bundle it. - [Shopify Cart Validation Functions: Block Checkout](https://whoooop.co.uk/blog/shopify-cart-validation-function): A Shopify cart validation function blocks checkout server-side: the run target, error targets, buyer journey gating and the limits that bite. - [URLPattern: Routing Without path-to-regexp](https://whoooop.co.uk/blog/urlpattern-routing): URLPattern has been Baseline since September 2025, so you can do routing with named groups in the browser, Node and Workers without a library. - [Shopify Fulfillment Order API: Fulfil or Request](https://whoooop.co.uk/blog/shopify-fulfillment-order-api): Your app's access scopes decide whether the Shopify Fulfillment Order API lets you create a fulfillment or only request one from a 3PL. - [Shopify Selling Plans API: Your App Owns Billing](https://whoooop.co.uk/blog/shopify-selling-plans-api): The Shopify selling plans API defines the subscription offer, but your app has to trigger every recurring charge after the first order. - [Transition display: none Without Breaking Firefox](https://whoooop.co.uk/blog/css-transition-display-none): A CSS transition on display: none needs allow-discrete and @starting-style, and Firefox still refuses to animate the exit. - [Shopify Customer Account API: Log Customers In](https://whoooop.co.uk/blog/shopify-customer-account-api-auth): How Shopify Customer Account API authentication works: discovery endpoints, the OAuth code flow with PKCE, and refresh tokens. - [Import Historical Orders Into Shopify With orderCreate](https://whoooop.co.uk/blog/import-historical-orders-into-shopify): To import historical orders into Shopify you need the Admin API's orderCreate mutation, because the admin's CSV importer only exports orders. - [CSS Carousels Without JavaScript: What Ships Today](https://whoooop.co.uk/blog/css-carousel-without-javascript): Chrome and Edge 135 build carousels with no JavaScript using ::scroll-button() and ::scroll-marker, but Safari and Firefox support neither. - [Shopify Web Pixels: App Pixel or Custom Pixel?](https://whoooop.co.uk/blog/shopify-web-pixel-extension): App pixels run in a strict web-worker sandbox and read settings from the Admin API, while custom pixels run in a lax iframe: how to choose. - [Shopify Theme App Extensions: App Blocks or Embeds](https://whoooop.co.uk/blog/shopify-theme-app-extension): Script tags stop running on 1 March 2027, so here is how a Shopify theme app extension works: app blocks, app embeds, limits and deep links. - [Import Maps vs a Bundler: When to Skip the Build](https://whoooop.co.uk/blog/import-maps-vs-bundler): Import maps resolve bare specifiers in the browser with no build step, but they never replace a bundler's tree-shaking, chunking or minification. - [Shopify Cart Transform Functions: Bundles at Checkout](https://whoooop.co.uk/blog/shopify-cart-transform-function): A Shopify cart transform function rewrites cart lines at checkout with three operations: expand a bundle, merge lines, or update price and title. - [Shopify Storefront API @inContext: Local Prices](https://whoooop.co.uk/blog/shopify-storefront-api-incontext): The Storefront API's @inContext directive sets country and language per query, but carts ignore the country argument and take buyerIdentity instead. - [CSS @scope Is Baseline: Scope Styles Without a Build](https://whoooop.co.uk/blog/css-scope-at-rule): CSS @scope became Baseline in March 2026: how the scope root, donut limits and scope proximity behave, and what still breaks in Safari. - [Migrate Customers to Shopify Without Losing Consent](https://whoooop.co.uk/blog/migrate-customers-shopify): To migrate customers to Shopify, upsert each record with customerSet, then write marketing consent and its original date in a separate mutation. - [Shopify Hydrogen Caching: Sub-Requests and Full Pages](https://whoooop.co.uk/blog/shopify-hydrogen-caching): Shopify Hydrogen caching works in two layers: CacheShort or CacheLong on each sub-request, and Oxygen-Cache-Control for whole pages. - [command and commandfor: Open a Dialog, No JS](https://whoooop.co.uk/blog/html-command-commandfor): The command and commandfor attributes open a dialog or popover from a button with no JavaScript, and they went Baseline in December 2025. - [Migrate to Shopify Expiring Offline Access Tokens](https://whoooop.co.uk/blog/shopify-expiring-offline-access-tokens): Public Shopify apps must use expiring offline access tokens from 1 January 2027: how to switch, cycle existing tokens and handle refresh failures. - [Shopify Checkout UI Extensions: What Runs Where](https://whoooop.co.uk/blog/shopify-checkout-ui-extensions): Where a Shopify checkout UI extension can render, which capabilities it needs, and why blocking checkout now takes a validation function. - [content-visibility: auto Without the Layout Shift](https://whoooop.co.uk/blog/content-visibility-auto): content-visibility: auto skips rendering for offscreen page sections; here is how to size them so the scrollbar stays put, and when to leave it off. - [Shopify Bulk Operations: Export Without Throttling](https://whoooop.co.uk/blog/shopify-bulk-operations-graphql): Run a Shopify bulk operation in Admin GraphQL to export every product as JSONL, poll it properly, and import at scale. - [Shopify Theme Blocks vs Section Blocks: The Rules](https://whoooop.co.uk/blog/shopify-theme-blocks-vs-section-blocks): Theme blocks live in /blocks, nest, and work across sections; section blocks are local to one section and cannot be mixed with them. - [Navigation API vs History API: What to Replace](https://whoooop.co.uk/blog/navigation-api-vs-history-api): The Navigation API became Baseline in January 2026: here is what it replaces in a History API router, and what still needs a fallback. - [Shopify Webhook HMAC Verification, Then Dedupe](https://whoooop.co.uk/blog/shopify-webhook-hmac-verification): How to verify a Shopify webhook HMAC against the raw request body, respond inside five seconds, and skip duplicate deliveries. - [TypeScript's using Keyword: Cleanup on Every Exit](https://whoooop.co.uk/blog/typescript-using-keyword): The using keyword calls Symbol.dispose when the scope exits, closing connections and file handles even on a throw, and Node 24 supports it natively. - [Shopify Metaobjects vs Metafields: Which to Use](https://whoooop.co.uk/blog/shopify-metaobjects-vs-metafields): A metafield adds one custom value to an existing Shopify resource; a metaobject is a standalone record with its own fields and its own URL. - [WooCommerce to Shopify Redirects: The 301 Map](https://whoooop.co.uk/blog/woocommerce-to-shopify-redirects): WooCommerce URLs do not map onto Shopify's fixed paths cleanly, so build the 301 redirect map first and bulk import it through the Admin API. - [Next.js on Cloudflare Workers: vinext or OpenNext?](https://whoooop.co.uk/blog/nextjs-on-cloudflare-workers): Two ways to run Next.js on Cloudflare Workers: the stable OpenNext adapter or the beta Vite-based vinext. What each supports and which to pick. - [TanStack Start vs Next.js: How to Choose in 2026](https://whoooop.co.uk/blog/tanstack-start-vs-nextjs): Pick TanStack Start for interactive apps that need typed routing and portable deploys; pick Next.js for content-heavy sites built on Server Components. - [Container Queries vs Media Queries: When to Use Which](https://whoooop.co.uk/blog/container-queries-vs-media-queries): Media queries belong to page layout and container queries to components; here is how to pick container-type, use cqi units and ship style queries safely. - [Astro 7 Upgrade: Two Hops From 5, One From 6](https://whoooop.co.uk/blog/astro-7-upgrade): Upgrading to Astro 7 from 5 means going via 6: content collections and Cloudflare break in 6, then the Rust compiler and Sätteri Markdown change in 7. - [Shopify Storefront API Cart: Create, Mutate, Checkout](https://whoooop.co.uk/blog/shopify-storefront-api-cart): How to build a basket on the Shopify Storefront API cart: cartCreate, cartLinesAdd, buyer identity, checkoutUrl and which access token to use. - [Astro Actions: Form Validation That Survives JS](https://whoooop.co.uk/blog/astro-actions-form-validation): Astro Actions form validation gives HTML forms typed server checks, field errors and zero-JavaScript submission without a hand-written API route. - [Node.js Fetch Timeout: Cancel the Whole Request](https://whoooop.co.uk/blog/nodejs-fetch-timeout): Set a Node.js fetch timeout with AbortSignal, preserve caller cancellation, and keep the deadline active while reading the response body. - [Serverless Postgres Connection Pooling: Pick One](https://whoooop.co.uk/blog/serverless-postgres-connection-pooling): Transaction-mode pooling, RDS Proxy or Hyperdrive: how to stop serverless Postgres running out of connections, and what each choice breaks. - [stale-while-revalidate: Cache-Control for CDNs](https://whoooop.co.uk/blog/stale-while-revalidate-cache-control): How stale-while-revalidate actually behaves in Cache-Control, why s-maxage can silently disable it, and what CDN-Cache-Control fixes. - [React Compiler: How to Adopt It Incrementally](https://whoooop.co.uk/blog/react-compiler-incremental-adoption): React Compiler 1.0 is stable, but on an existing app scope it to one directory or a runtime gate first, and fix the lint errors before you compile. - [Nuxt 5 Upgrade: What to Fix Before It Lands](https://whoooop.co.uk/blog/nuxt-5-upgrade): Nuxt 5 is not released yet, but future.compatibilityVersion: 5 lets you fix most of the breaking changes now, before Nitro 3 lands. - [Vitest Browser Mode: When to Replace jsdom](https://whoooop.co.uk/blog/vitest-browser-mode): Vitest Browser Mode runs component tests in a real Chromium instead of jsdom, and here is what it fixes, what it costs and when jsdom still wins. - [AsyncLocalStorage: Request Context in Node.js](https://whoooop.co.uk/blog/asynclocalstorage-node-request-context): AsyncLocalStorage gives Node.js request-scoped context without passing an argument through every function: the setup, the pitfalls and the cost. - [npm Trusted Publishing: OIDC Instead of Tokens](https://whoooop.co.uk/blog/npm-trusted-publishing): npm trusted publishing swaps stored tokens for short-lived OIDC credentials from CI. The GitHub Actions setup, the traps, and what it leaves open. - [SvelteKit Remote Functions: Worth the Flag?](https://whoooop.co.uk/blog/sveltekit-remote-functions): SvelteKit remote functions replace load functions and form actions with typed server calls, but they are still behind an experimental flag. - [Web Push Notifications on iOS: Safari's Rules](https://whoooop.co.uk/blog/web-push-notifications-ios-safari): Web push works on iOS only for web apps added to the Home Screen, and Safari revokes permission if a push arrives showing nothing. - [Popover API vs dialog: How to Choose an Overlay](https://whoooop.co.uk/blog/popover-api-vs-dialog): Use dialog with showModal when the page behind must go inert, and the Popover API for menus, tooltips and toasts that never block it. - [CSS Scroll-Driven Animations: Ship Them Safely](https://whoooop.co.uk/blog/css-scroll-driven-animations): animation-timeline works in Chrome, Edge and Safari but not Firefox stable, so ship scroll-driven CSS animations behind a feature query. - [Node.js Permission Model: What It Really Blocks](https://whoooop.co.uk/blog/nodejs-permission-model): Node's --permission flag blocks the file system, child processes and addons: what the Node.js permission model covers, where it leaks, how to audit it. - [Drizzle vs Prisma: Which ORM Fits Your Stack](https://whoooop.co.uk/blog/drizzle-vs-prisma): Drizzle vs Prisma, settled on release status and migrations: which version you can install today and which ORM fits your stack. - [Cloudflare KV vs D1 vs Durable Objects](https://whoooop.co.uk/blog/cloudflare-kv-vs-d1-vs-durable-objects): Workers KV is eventually consistent, D1 is single-threaded SQLite, and a Durable Object gives one writer per key. How to pick the right store. - [Next.js after(): Background Work Without a Queue](https://whoooop.co.uk/blog/nextjs-after-background-work): Next.js after() runs background work once the response is sent: where it is allowed, which request APIs work inside it, and when you need a queue. - [Astro Content Layer: Writing a Custom Loader](https://whoooop.co.uk/blog/astro-content-layer-custom-loader): How to write a custom Astro content loader for a headless CMS: the data store, digests for incremental builds, and when live collections win. - [Speculation Rules API: Prefetch or Prerender?](https://whoooop.co.uk/blog/speculation-rules-api): The Speculation Rules API prefetches or prerenders next pages for instant navigation, and prefetch is the safer default for most sites. - [Web Components in React 19: What Actually Works](https://whoooop.co.uk/blog/web-components-in-react): React 19 passes every Custom Elements Everywhere test, so web components in React work without a wrapper, but the property, typing and SSR edges remain. - [Content Security Policy: Nonces vs Hashes](https://whoooop.co.uk/blog/content-security-policy-nonce): Nonces need per-request HTML and hashes do not, so your Content Security Policy choice decides whether pages can stay cached. - [React Router v8 Upgrade: Flags First, Then Bump](https://whoooop.co.uk/blog/react-router-v8-upgrade): React Router v8 makes middleware, ESM and split route modules the default, so upgrade by enabling the v7 future flags first. - [The JavaScript Temporal API: Adopt It or Wait](https://whoooop.co.uk/blog/javascript-temporal-api): Temporal ships natively in Chrome 144, Firefox 139 and Node 26 but not Safari, so the JavaScript Temporal API still needs a polyfill in the browser. - [Shopify's New Discount Function API: How to Migrate](https://whoooop.co.uk/blog/shopify-discount-function-api-migration): Shopify's Product, Order and Shipping discount function APIs are deprecated: here is what changes when you migrate to the unified Discount API. - [OpenTelemetry Node.js Setup That Actually Traces](https://whoooop.co.uk/blog/opentelemetry-nodejs-setup): A working OpenTelemetry Node.js setup needs four packages, two startup flags and a sampling decision, and ESM apps need one flag more. - [Standard Schema: TypeScript Validation Without Adapters](https://whoooop.co.uk/blog/standard-schema-typescript): Standard Schema lets a TypeScript tool accept Zod, Valibot or ArkType through one property, and here is what quietly breaks when you swap. - [Server-Sent Events vs WebSockets: How to Choose](https://whoooop.co.uk/blog/server-sent-events-vs-websockets): SSE gives you automatic reconnection and event replay over plain HTTP, while WebSockets buy a client-to-server channel most streaming features never use. - [node:sqlite vs better-sqlite3: When to Switch](https://whoooop.co.uk/blog/node-sqlite-vs-better-sqlite3): node:sqlite matches better-sqlite3 for everyday queries and drops the native build step, but it is still a release candidate with no transaction helper. - [Passkeys in Node.js Without Locking Users Out](https://whoooop.co.uk/blog/passkeys-nodejs): How to add passkeys to a Node.js app with @simplewebauthn, from registration and conditional-UI login to the credential lifecycle that prevents lockouts. - [Astro Server Islands: Cache the Page, Not the User](https://whoooop.co.uk/blog/astro-server-islands): Astro server islands defer one component with server:defer so the rest of the page stays static and CDN-cacheable, plus the traps to avoid. - [CSS Anchor Positioning: Replace Floating UI](https://whoooop.co.uk/blog/css-anchor-positioning): CSS anchor positioning now ships in Chrome, Firefox and Safari, so dropdowns and tooltips can follow their trigger without Floating UI. - [TypeScript 7 Migration: Fix Your tsconfig First](https://whoooop.co.uk/blog/typescript-7-migration): TypeScript 7 removes a dozen deprecated compiler options, flips eight tsconfig defaults and ships no API, so here is the upgrade order. - [Vite 8 Rolldown Migration: What Actually Breaks](https://whoooop.co.uk/blog/vite-8-rolldown-migration): Vite 8 replaces esbuild and Rollup with Rolldown; the migration breaks build.rollupOptions, manualChunks, decorators and the esbuild minifier. - [Node's Built-In Test Runner: Ready to Replace Jest?](https://whoooop.co.uk/blog/node-built-in-test-runner): Node's built-in test runner handles suites, mocking, snapshots and coverage with no dependencies, though watch mode and module mocking are experimental. - [Hydrogen vs Next.js for a Shopify Storefront](https://whoooop.co.uk/blog/hydrogen-vs-nextjs-shopify-storefront): Hydrogen hands you Shopify's cart, caching and customer accounts on Oxygen; Next.js hands you a runtime choice and the rest of the work. - [How to Fix INP: Diagnose It Before You Optimise](https://whoooop.co.uk/blog/fix-inp-interaction-to-next-paint): How to fix INP: use web-vitals attribution and the Long Animation Frames API to name the slow script, then fix the phase that dominates. - [Next.js use cache: Keys, Lifetimes and Limits](https://whoooop.co.uk/blog/nextjs-use-cache-directive): How Next.js builds a use cache key, what the cacheLife profiles actually mean, and why cookies() inside a cached scope throws. - [Oxlint vs Biome: Picking an ESLint Replacement](https://whoooop.co.uk/blog/oxlint-vs-biome): Oxlint is lint-only and runs real tsc type checking through tsgolint, while Biome bundles the formatter and infers types without a compiler. - [Cloudflare Pages vs Workers: Which to Deploy On](https://whoooop.co.uk/blog/cloudflare-pages-vs-workers): Cloudflare now says to start new projects on Workers, not Pages: what Static Assets changes, what breaks, and when Pages still wins. - [Run TypeScript in Node Without ts-node or tsx](https://whoooop.co.uk/blog/run-typescript-in-node-without-ts-node): Node can run TypeScript without ts-node by stripping types from .ts files, as long as you avoid the four syntax forms it refuses. - [Cross-Document View Transitions Without a Router](https://whoooop.co.uk/blog/cross-document-view-transitions): Cross-document view transitions animate navigation between plain HTML pages with one CSS at-rule, and no client-side router. - [Mastering Efficient JavaScript Development with PNPM: Beyond the Basics](https://whoooop.co.uk/blog/mastering-efficient-java-script-development-with-pnpm-beyond-the-basics): Following our introduction to PNPM's groundbreaking approach to package management, this article delves deeper into the advanced capabilities and… - [Turbo Repo: Streamlining Your JavaScript Projects for Peak Efficiency](https://whoooop.co.uk/blog/turbo-repo-streamlining-your-java-script-projects-for-peak-efficiency): In the dynamic world of software development, efficiency and scalability are paramount. This is especially true in the JavaScript ecosystem, where… - [Evaluating Vercel for Web Development: Pros and Cons](https://whoooop.co.uk/blog/evaluating-vercel-for-web-development-pros-and-cons): Vercel is a cloud platform for static sites and Serverless Functions that aims to simplify the development and deployment process for developers. It's… - [Overcoming Challenges: Migrating to ESM Modules with Incompatible Dependencies](https://whoooop.co.uk/blog/overcoming-challenges-migrating-to-esm-modules-with-incompatible-dependencies): The shift towards ECMAScript Modules (ESM) represents a significant evolution in JavaScript development, promising more efficient, scalable, and… - [Navigating the Transition: Migrating a Large Serverless Monorepo Project to ESM Modules](https://whoooop.co.uk/blog/navigating-the-transition-migrating-a-large-serverless-monorepo-project-to-esm-modules): The JavaScript ecosystem is continually evolving, and one of the most significant shifts in recent years has been the adoption of ECMAScript Modules… - [Accelerating JavaScript Development with Turbo Repo: The High-Performance Build System](https://whoooop.co.uk/blog/accelerating-java-script-development-with-turbo-repo-the-high-performance-build-system): In the ever-evolving landscape of JavaScript development, efficiency and scalability have become paramount. Developers and teams are constantly on the… - [Navigating Next-Level JavaScript Development with Turbo Repo: A Deep Dive](https://whoooop.co.uk/blog/navigating-next-level-java-script-development-with-turbo-repo-a-deep-dive): In the quest for efficiency and scalability in JavaScript development, Turbo Repo has emerged as a transformative tool, reshaping how developers approach… - [Elevating JavaScript Projects with Yarn: The Fast, Reliable Package Manager](https://whoooop.co.uk/blog/elevating-java-script-projects-with-yarn-the-fast-reliable-package-manager): In the fast-paced world of JavaScript development, choosing the right package manager can significantly influence the efficiency, reliability, and… - [Revolutionizing JavaScript Development: The Power of PNPM](https://whoooop.co.uk/blog/revolutionizing-java-script-development-the-power-of-pnpm): In the realm of JavaScript development, managing dependencies efficiently is paramount to ensuring project scalability, performance, and developer… - [The Differences Between pnpm and npm: A Comprehensive Guide](https://whoooop.co.uk/blog/the-differences-between-pnpm-and-npm-a-comprehensive-guide): In the vast ecosystem of JavaScript, package managers play a pivotal role in project development, offering streamlined ways to manage dependencies and… - [Embracing the Future of JavaScript with ES Modules (ESM)](https://whoooop.co.uk/blog/embracing-the-future-of-java-script-with-es-modules-esm): The dynamic world of web development constantly seeks innovation, efficiency, and scalability. Amidst these evolving demands, ECMAScript Modules (ESM)… - [Using an eSIM When Travelling to the USA: A Comprehensive Guide](https://whoooop.co.uk/blog/using-an-e-sim-when-travelling-to-the-usa-a-comprehensive-guide): The future of connectivity has arrived, and it's embodied by eSIM technology. As an international traveler, navigating the complex world of phone plans… - [Quirky Hype Products from the Past: A Nostalgic Look at Pop Culture Phenomena](https://whoooop.co.uk/blog/quirky-hype-products-from-the-past-a-nostalgic-look-at-pop-culture-phenomena): A scroll down memory lane reveals a world of quirky hype products that once captured our collective imaginations and dictated pop culture trends. From… - [The Rising Phenomenon of Hype Culture: A Deep Dive into Contemporary Consumer Trends](https://whoooop.co.uk/blog/the-rising-phenomenon-of-hype-culture-a-deep-dive-into-contemporary-consumer-trends): Hype culture, an increasingly pervasive influence in our globalized world, is a concept that reverberates through the realms of fashion, technology… - [The Quest for High-Demand Sneakers: Why Raffles Offer a More Equitable Distribution Method](https://whoooop.co.uk/blog/the-quest-for-high-demand-sneakers-why-raffles-offer-a-more-equitable-distribution-method): The sneaker world has seen explosive growth in recent years, with sneakerheads and casual fans alike clamoring for the latest limited-edition releases… - [Enhancing Fairness: How Raffles Help Prevent Duplicate Entries](https://whoooop.co.uk/blog/enhancing-fairness-how-raffles-help-prevent-duplicate-entries): A significant advantage of raffles over FCFS sales is their ability to address the issue of duplicate entries. Retailers can implement checks and…