>soren hale — frontend developer
// Case study
Northwind Checkout
A checkout that is ready before the customer has finished reaching for their card.
LCP on a mid-range phonefrom 2.9 s→to 0.8 s
- Client
- Northwind
- Year
- 2025
- Role
- Lead frontend developer
- Kind
- Product

The problem
Northwind sells outdoor gear in nine countries, and four in ten carts were abandoned on the payment step. The page waited for three services before it drew anything.
The approach
- The payment form now renders from the server with the cart already in it; the card fields hydrate on their own.
- The whole flow is one state machine, so a slow network can no longer leave the button in two states at once.
- Fonts, the logo and the first product image are the only things in the critical path. Everything else waits.


The result
Largest Contentful Paint on a mid-range Android went from 2.9 s to 0.8 s. Completed checkouts rose 11% in the first full month, and support tickets that mention the word stuck fell by two thirds.
We had been tuning the backend for a year. Soren found the two seconds in the browser in his first week.
Built with
ReactTypeScriptXStateVite
// Case study
Northwind Checkout
A checkout that is ready before the customer has finished reaching for their card.
LCP on a mid-range phonefrom 2.9 s→to 0.8 s
- Client
- Northwind
- Year
- 2025
- Role
- Lead frontend developer
- Kind
- Product

The problem
Northwind sells outdoor gear in nine countries, and four in ten carts were abandoned on the payment step. The page waited for three services before it drew anything.
The approach
- The payment form now renders from the server with the cart already in it; the card fields hydrate on their own.
- The whole flow is one state machine, so a slow network can no longer leave the button in two states at once.
- Fonts, the logo and the first product image are the only things in the critical path. Everything else waits.


The result
Largest Contentful Paint on a mid-range Android went from 2.9 s to 0.8 s. Completed checkouts rose 11% in the first full month, and support tickets that mention the word stuck fell by two thirds.
We had been tuning the backend for a year. Soren found the two seconds in the browser in his first week.
Built with
ReactTypeScriptXStateVite
// Case study
Northwind Checkout
A checkout that is ready before the customer has finished reaching for their card.
LCP on a mid-range phonefrom 2.9 s→to 0.8 s
- Client
- Northwind
- Year
- 2025
- Role
- Lead frontend developer
- Kind
- Product

The problem
Northwind sells outdoor gear in nine countries, and four in ten carts were abandoned on the payment step. The page waited for three services before it drew anything.
The approach
- The payment form now renders from the server with the cart already in it; the card fields hydrate on their own.
- The whole flow is one state machine, so a slow network can no longer leave the button in two states at once.
- Fonts, the logo and the first product image are the only things in the critical path. Everything else waits.


The result
Largest Contentful Paint on a mid-range Android went from 2.9 s to 0.8 s. Completed checkouts rose 11% in the first full month, and support tickets that mention the word stuck fell by two thirds.
We had been tuning the backend for a year. Soren found the two seconds in the browser in his first week.
Built with
ReactTypeScriptXStateVite
// Start a project
Tell me what you are building.
Three quick picks so the first reply is useful. You finish the message on the contact page.
// Start a project
Tell me what you are building.
Three quick picks so the first reply is useful. You finish the message on the contact page.
// Start a project
Tell me what you are building.
Three quick picks so the first reply is useful. You finish the message on the contact page.