Northwind Checkout
A checkout that is ready before the customer has finished reaching for their card.
Lead frontend developer
>soren hale — frontend developer

// Frontend developer · React, TypeScript, WebGL
Eight years building product interfaces for fintech and developer tools. React, TypeScript, and a stubborn eye on the last hundred milliseconds.
Move over the picture to read the source

// Frontend developer · React, TypeScript, WebGL
Eight years building product interfaces for fintech and developer tools. React, TypeScript, and a stubborn eye on the last hundred milliseconds.
Move over the picture to read the source

// Frontend developer · React, TypeScript, WebGL
Eight years building product interfaces for fintech and developer tools. React, TypeScript, and a stubborn eye on the last hundred milliseconds.
// Shipped for
Shipped for: Northwind, Ledgerline, Kestrel Pay, Tidewater, Halden, Brattvik Bank, Loopdocs, Parcelway
// Shipped for
Shipped for: Northwind, Ledgerline, Kestrel Pay, Tidewater, Halden, Brattvik Bank, Loopdocs, Parcelway
// Shipped for
Shipped for: Northwind, Ledgerline, Kestrel Pay, Tidewater, Halden, Brattvik Bank, Loopdocs, Parcelway
// Selected work
Every case starts with a number that was wrong and ends with the one that shipped. Open any of them for the full write-up.
01 of 05Northwind · 2025
A checkout that is ready before the customer has finished reaching for their card.
Lead frontend developer
Product02 of 05Ledgerline · 2024
Forty internal tools moved into one console, on one design system, with one way to ship.
Frontend architect
Tooling03 of 05Kestrel Pay · 2024
Live payment data on a table of 200,000 rows that still answers a click at once.
Senior frontend developer
Product04 of 05Tidewater · 2023
A charting layer that pans through a million points without dropping a frame.
Frontend and WebGL developer
Experiment05 of 05Halden · 2023
Sixty-two components, one token file and no accessibility exceptions.
Design systems lead
Tooling// Selected work
Every case starts with a number that was wrong and ends with the one that shipped. Open any of them for the full write-up.
01 of 05Northwind · 2025
A checkout that is ready before the customer has finished reaching for their card.
Lead frontend developer
Product02 of 05Ledgerline · 2024
Forty internal tools moved into one console, on one design system, with one way to ship.
Frontend architect
Tooling03 of 05Kestrel Pay · 2024
Live payment data on a table of 200,000 rows that still answers a click at once.
Senior frontend developer
Product04 of 05Tidewater · 2023
A charting layer that pans through a million points without dropping a frame.
Frontend and WebGL developer
Experiment05 of 05Halden · 2023
Sixty-two components, one token file and no accessibility exceptions.
Design systems lead
Tooling// Selected work
Every case starts with a number that was wrong and ends with the one that shipped. Open any of them for the full write-up.
01 of 05Northwind · 2025
A checkout that is ready before the customer has finished reaching for their card.
Lead frontend developer
Product02 of 05Ledgerline · 2024
Forty internal tools moved into one console, on one design system, with one way to ship.
Frontend architect
Tooling03 of 05Kestrel Pay · 2024
Live payment data on a table of 200,000 rows that still answers a click at once.
Senior frontend developer
Product04 of 05Tidewater · 2023
A charting layer that pans through a million points without dropping a frame.
Frontend and WebGL developer
Experiment05 of 05Halden · 2023
Sixty-two components, one token file and no accessibility exceptions.
Design systems lead
Tooling// About

NowUpdated October 2026
// About

NowUpdated October 2026
// About

NowUpdated October 2026
// The numbers
Every launch is measured on a mid-range phone and a throttled connection before it goes out. These are the medians, not the best run of the day.
median of the last 12 launches
01See the launches behind them01Performance
98of 100
02Accessibility
100of 100
03Best practices
100of 100
04SEO
100of 100
Core Web Vitalsfield data, 75th percentile
LCPLargest Contentful Paint
0.8 s
0within budgetbudget 2.5 s
INPInteraction to Next Paint
48 ms
0within budgetbudget 200 ms
CLSCumulative Layout Shift
0.01
0within budgetbudget 0.1
// The numbers
Every launch is measured on a mid-range phone and a throttled connection before it goes out. These are the medians, not the best run of the day.
median of the last 12 launches
01See the launches behind them01Performance
98of 100
02Accessibility
100of 100
03Best practices
100of 100
04SEO
100of 100
Core Web Vitalsfield data, 75th percentile
LCPLargest Contentful Paint
0.8 s
0within budgetbudget 2.5 s
INPInteraction to Next Paint
48 ms
0within budgetbudget 200 ms
CLSCumulative Layout Shift
0.01
0within budgetbudget 0.1
// The numbers
Every launch is measured on a mid-range phone and a throttled connection before it goes out. These are the medians, not the best run of the day.
median of the last 12 launches
01See the launches behind them01Performance
98of 100
02Accessibility
100of 100
03Best practices
100of 100
04SEO
100of 100
Core Web Vitalsfield data, 75th percentile
LCPLargest Contentful Paint
0.8 s
0within budgetbudget 2.5 s
INPInteraction to Next Paint
48 ms
0within budgetbudget 200 ms
CLSCumulative Layout Shift
0.01
0within budgetbudget 0.1
// The stack
The tools I would pick again tomorrow. Point at a key, or tab across the board, to see how long it has been there and what it is for.
16 tools · 4 groups
02The full stackLanguages04
Frameworks04
Tooling04
Testing04
key 01 of 16Languages
TypeScript
8years on the board
UsedDaily
Strict mode, no any. Types are the first draft of the docs.
key 02 of 16Languages
JavaScript
8years on the board
UsedDaily
The platform underneath everything else, and still where the bugs live.
key 03 of 16Languages
CSS
8years on the board
UsedDaily
Grid, container queries and custom properties before any library.
key 04 of 16Languages
GLSL
4years on the board
UsedWeekly
Shaders for charts and the occasional hero that earns its place.
key 05 of 16Frameworks
React
8years on the board
UsedDaily
Server components where they help, plain state where they do not.
key 06 of 16Frameworks
Next.js
6years on the board
UsedDaily
The default for products that need a server and a deadline.
key 07 of 16Frameworks
Astro
3years on the board
UsedWeekly
For docs and content sites that should ship almost no JavaScript.
key 08 of 16Frameworks
Svelte
2years on the board
UsedComfortable
Small tools and prototypes; I read it more often than I write it.
key 09 of 16Tooling
Vite
5years on the board
UsedDaily
Fast feedback is a feature. Builds measured in seconds, not coffee.
key 10 of 16Tooling
Node.js
7years on the board
UsedWeekly
Build scripts, small APIs and the glue between services.
key 11 of 16Tooling
Storybook
6years on the board
UsedWeekly
Every component in isolation, with its states written down.
key 12 of 16Tooling
Figma
7years on the board
UsedWeekly
I read design files fluently and push tokens back into them.
key 13 of 16Testing
Playwright
5years on the board
UsedDaily
End-to-end tests on the flows that make money, on every pull request.
key 14 of 16Testing
Vitest
4years on the board
UsedDaily
Unit tests that run before I have switched windows.
key 15 of 16Testing
Testing Library
6years on the board
UsedWeekly
Tests that use the interface the way a person does.
key 16 of 16Testing
Lighthouse CI
5years on the board
UsedWeekly
A performance budget the build enforces, so nobody has to argue.
// The stack
The tools I would pick again tomorrow. Point at a key, or tab across the board, to see how long it has been there and what it is for.
16 tools · 4 groups
02The full stackLanguages04
Frameworks04
Tooling04
Testing04
key 01 of 16Languages
TypeScript
8years on the board
UsedDaily
Strict mode, no any. Types are the first draft of the docs.
key 02 of 16Languages
JavaScript
8years on the board
UsedDaily
The platform underneath everything else, and still where the bugs live.
key 03 of 16Languages
CSS
8years on the board
UsedDaily
Grid, container queries and custom properties before any library.
key 04 of 16Languages
GLSL
4years on the board
UsedWeekly
Shaders for charts and the occasional hero that earns its place.
key 05 of 16Frameworks
React
8years on the board
UsedDaily
Server components where they help, plain state where they do not.
key 06 of 16Frameworks
Next.js
6years on the board
UsedDaily
The default for products that need a server and a deadline.
key 07 of 16Frameworks
Astro
3years on the board
UsedWeekly
For docs and content sites that should ship almost no JavaScript.
key 08 of 16Frameworks
Svelte
2years on the board
UsedComfortable
Small tools and prototypes; I read it more often than I write it.
key 09 of 16Tooling
Vite
5years on the board
UsedDaily
Fast feedback is a feature. Builds measured in seconds, not coffee.
key 10 of 16Tooling
Node.js
7years on the board
UsedWeekly
Build scripts, small APIs and the glue between services.
key 11 of 16Tooling
Storybook
6years on the board
UsedWeekly
Every component in isolation, with its states written down.
key 12 of 16Tooling
Figma
7years on the board
UsedWeekly
I read design files fluently and push tokens back into them.
key 13 of 16Testing
Playwright
5years on the board
UsedDaily
End-to-end tests on the flows that make money, on every pull request.
key 14 of 16Testing
Vitest
4years on the board
UsedDaily
Unit tests that run before I have switched windows.
key 15 of 16Testing
Testing Library
6years on the board
UsedWeekly
Tests that use the interface the way a person does.
key 16 of 16Testing
Lighthouse CI
5years on the board
UsedWeekly
A performance budget the build enforces, so nobody has to argue.
// The stack
The tools I would pick again tomorrow. Point at a key, or tab across the board, to see how long it has been there and what it is for.
16 tools · 4 groups
02The full stackLanguages04
Frameworks04
Tooling04
Testing04
key 01 of 16Languages
TypeScript
8years on the board
UsedDaily
Strict mode, no any. Types are the first draft of the docs.
key 02 of 16Languages
JavaScript
8years on the board
UsedDaily
The platform underneath everything else, and still where the bugs live.
key 03 of 16Languages
CSS
8years on the board
UsedDaily
Grid, container queries and custom properties before any library.
key 04 of 16Languages
GLSL
4years on the board
UsedWeekly
Shaders for charts and the occasional hero that earns its place.
key 05 of 16Frameworks
React
8years on the board
UsedDaily
Server components where they help, plain state where they do not.
key 06 of 16Frameworks
Next.js
6years on the board
UsedDaily
The default for products that need a server and a deadline.
key 07 of 16Frameworks
Astro
3years on the board
UsedWeekly
For docs and content sites that should ship almost no JavaScript.
key 08 of 16Frameworks
Svelte
2years on the board
UsedComfortable
Small tools and prototypes; I read it more often than I write it.
key 09 of 16Tooling
Vite
5years on the board
UsedDaily
Fast feedback is a feature. Builds measured in seconds, not coffee.
key 10 of 16Tooling
Node.js
7years on the board
UsedWeekly
Build scripts, small APIs and the glue between services.
key 11 of 16Tooling
Storybook
6years on the board
UsedWeekly
Every component in isolation, with its states written down.
key 12 of 16Tooling
Figma
7years on the board
UsedWeekly
I read design files fluently and push tokens back into them.
key 13 of 16Testing
Playwright
5years on the board
UsedDaily
End-to-end tests on the flows that make money, on every pull request.
key 14 of 16Testing
Vitest
4years on the board
UsedDaily
Unit tests that run before I have switched windows.
key 15 of 16Testing
Testing Library
6years on the board
UsedWeekly
Tests that use the interface the way a person does.
key 16 of 16Testing
Lighthouse CI
5years on the board
UsedWeekly
A performance budget the build enforces, so nobody has to argue.
// Services
Fixed scope, a written plan before any code, and a price you know up front. Open a row to see what is in it.
I join your team or work from a design file and take the frontend the whole way: architecture, components, state, tests and the release pipeline. You get working software every week, not a big reveal at the end.
See the serviceIncludes
I profile your product on real devices and on your real traffic, then hand you a ranked list: the change, the expected gain and the effort. The first three fixes come as pull requests.
See the serviceIncludes
I build the system with your designers and the teams who will use it: tokens, accessible components, documentation and the process for changing it. Adoption is part of the job, not an afterthought.
See the serviceIncludes
For teams with a deadline, a rewrite or a gap to cover. I take on the hard parts, review code, and leave your developers faster than I found them.
See the serviceIncludes
// Services
Fixed scope, a written plan before any code, and a price you know up front. Open a row to see what is in it.
I join your team or work from a design file and take the frontend the whole way: architecture, components, state, tests and the release pipeline. You get working software every week, not a big reveal at the end.
See the serviceIncludes
I profile your product on real devices and on your real traffic, then hand you a ranked list: the change, the expected gain and the effort. The first three fixes come as pull requests.
See the serviceIncludes
I build the system with your designers and the teams who will use it: tokens, accessible components, documentation and the process for changing it. Adoption is part of the job, not an afterthought.
See the serviceIncludes
For teams with a deadline, a rewrite or a gap to cover. I take on the hard parts, review code, and leave your developers faster than I found them.
See the serviceIncludes
// Services
Fixed scope, a written plan before any code, and a price you know up front. Open a row to see what is in it.
I join your team or work from a design file and take the frontend the whole way: architecture, components, state, tests and the release pipeline. You get working software every week, not a big reveal at the end.
See the serviceIncludes
I profile your product on real devices and on your real traffic, then hand you a ranked list: the change, the expected gain and the effort. The first three fixes come as pull requests.
See the serviceIncludes
I build the system with your designers and the teams who will use it: tokens, accessible components, documentation and the process for changing it. Adoption is part of the job, not an afterthought.
See the serviceIncludes
For teams with a deadline, a rewrite or a gap to cover. I take on the hard parts, review code, and leave your developers faster than I found them.
See the serviceIncludes
// git log --career
Six teams, one direction: closer to the people who use the thing. The short version is below, the long one is a page away.
HEAD → mainSoren Hale · Oslo
Product builds, performance work and design systems for fintech and developer tool teams across Europe.
Kestrel Pay · Oslo
Led the merchant dashboard: live data, a new table engine and the performance budget every team now ships against.
Ledgerline · Stockholm
Designed the shell and the shared library that replaced forty internal tools with one console.
Tidewater · Copenhagen
Built the GPU charting layer for sensor data and the accessible table view behind every chart.
Pilcrow Studio · Oslo
Shipped marketing sites and two web apps for clients in publishing and travel. Learned to estimate.
initial commitBrygge Digital · Bergen
First job: email templates, landing pages and the build script nobody else wanted to touch.
// git log --career
Six teams, one direction: closer to the people who use the thing. The short version is below, the long one is a page away.
HEAD → mainSoren Hale · Oslo
Product builds, performance work and design systems for fintech and developer tool teams across Europe.
Kestrel Pay · Oslo
Led the merchant dashboard: live data, a new table engine and the performance budget every team now ships against.
Ledgerline · Stockholm
Designed the shell and the shared library that replaced forty internal tools with one console.
Tidewater · Copenhagen
Built the GPU charting layer for sensor data and the accessible table view behind every chart.
Pilcrow Studio · Oslo
Shipped marketing sites and two web apps for clients in publishing and travel. Learned to estimate.
initial commitBrygge Digital · Bergen
First job: email templates, landing pages and the build script nobody else wanted to touch.
// git log --career
Six teams, one direction: closer to the people who use the thing. The short version is below, the long one is a page away.
HEAD → mainSoren Hale · Oslo
Product builds, performance work and design systems for fintech and developer tool teams across Europe.
Kestrel Pay · Oslo
Led the merchant dashboard: live data, a new table engine and the performance budget every team now ships against.
Ledgerline · Stockholm
Designed the shell and the shared library that replaced forty internal tools with one console.
Tidewater · Copenhagen
Built the GPU charting layer for sensor data and the accessible table view behind every chart.
Pilcrow Studio · Oslo
Shipped marketing sites and two web apps for clients in publishing and travel. Learned to estimate.
initial commitBrygge Digital · Bergen
First job: email templates, landing pages and the build script nobody else wanted to touch.
// Open source and experiments
Small libraries, command line tools and sketches. Most started as a fix for one project and stayed useful.
Libraryuse-latencyA React hook that measures how long every interaction really takes, in production.2,140stars48,200downloadsOpen
ExperimentglyphfieldDraws any picture as source code on a canvas. It runs the portrait at the top of this site.1,260stars9,400downloadsOpen
LibrarytinyflipLayout animations in 1.1 kB, using the FLIP technique and nothing else.890stars12,600downloadsOpen
Toola11y-probeA command line check that tabs through your page and tells you where focus got lost.640stars8,900downloadsOpen
Tooltokens-to-cssTurns a design token file into typed CSS custom properties, with dark mode built in.410stars6,300downloadsOpen
Experimentshader-notesForty small WebGL sketches, each one under fifty lines and explained line by line.320starsOpen// Open source and experiments
Small libraries, command line tools and sketches. Most started as a fix for one project and stayed useful.
Libraryuse-latencyA React hook that measures how long every interaction really takes, in production.2,140stars48,200downloadsOpen
ExperimentglyphfieldDraws any picture as source code on a canvas. It runs the portrait at the top of this site.1,260stars9,400downloadsOpen
LibrarytinyflipLayout animations in 1.1 kB, using the FLIP technique and nothing else.890stars12,600downloadsOpen
Toola11y-probeA command line check that tabs through your page and tells you where focus got lost.640stars8,900downloadsOpen
Tooltokens-to-cssTurns a design token file into typed CSS custom properties, with dark mode built in.410stars6,300downloadsOpen
Experimentshader-notesForty small WebGL sketches, each one under fifty lines and explained line by line.320starsOpen// Open source and experiments
Small libraries, command line tools and sketches. Most started as a fix for one project and stayed useful.
Libraryuse-latencyA React hook that measures how long every interaction really takes, in production.2,140stars48,200downloadsOpen
ExperimentglyphfieldDraws any picture as source code on a canvas. It runs the portrait at the top of this site.1,260stars9,400downloadsOpen
LibrarytinyflipLayout animations in 1.1 kB, using the FLIP technique and nothing else.890stars12,600downloadsOpen
Toola11y-probeA command line check that tabs through your page and tells you where focus got lost.640stars8,900downloadsOpen
Tooltokens-to-cssTurns a design token file into typed CSS custom properties, with dark mode built in.410stars6,300downloadsOpen
Experimentshader-notesForty small WebGL sketches, each one under fifty lines and explained line by line.320starsOpen// Code review
The people who merged the work, in their own words.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Ingrid SolvangVP Engineering · NorthwindWe had been tuning the backend for a year. Soren found two seconds in the browser in his first week, and checkout conversion has not been below the old record since.Approved
Marcus OyelaranEngineering manager · Kestrel PayHe writes the kind of pull request you learn from. Our juniors started copying his commit messages, then his tests, then his habit of measuring before arguing.Approved
Hana TakedaHead of design · HaldenThe design system shipped on time, and more to the point, people use it. Soren spent as much effort on the teams as on the components.Approved
Jonas LindqvistFounder · LoopdocsI gave him a vague brief and a hard date. I got a plan in two days, a working build every Friday and no surprises at the end.Approved
Amara NwosuProduct lead · TidewaterOur analysts stopped exporting data to look at it. A million points, sixty frames a second, and it still works with a keyboard.Approved
// Code review
The people who merged the work, in their own words.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Ingrid SolvangVP Engineering · NorthwindWe had been tuning the backend for a year. Soren found two seconds in the browser in his first week, and checkout conversion has not been below the old record since.Approved
Marcus OyelaranEngineering manager · Kestrel PayHe writes the kind of pull request you learn from. Our juniors started copying his commit messages, then his tests, then his habit of measuring before arguing.Approved
Hana TakedaHead of design · HaldenThe design system shipped on time, and more to the point, people use it. Soren spent as much effort on the teams as on the components.Approved
Jonas LindqvistFounder · LoopdocsI gave him a vague brief and a hard date. I got a plan in two days, a working build every Friday and no surprises at the end.Approved
Amara NwosuProduct lead · TidewaterOur analysts stopped exporting data to look at it. A million points, sixty frames a second, and it still works with a keyboard.Approved
// Code review
The people who merged the work, in their own words.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
Ingrid SolvangVP Engineering · NorthwindWe had been tuning the backend for a year. Soren found two seconds in the browser in his first week, and checkout conversion has not been below the old record since.Approved
Marcus OyelaranEngineering manager · Kestrel PayHe writes the kind of pull request you learn from. Our juniors started copying his commit messages, then his tests, then his habit of measuring before arguing.Approved
Hana TakedaHead of design · HaldenThe design system shipped on time, and more to the point, people use it. Soren spent as much effort on the teams as on the components.Approved
Jonas LindqvistFounder · LoopdocsI gave him a vague brief and a hard date. I got a plan in two days, a working build every Friday and no surprises at the end.Approved
Amara NwosuProduct lead · TidewaterOur analysts stopped exporting data to look at it. A million points, sixty frames a second, and it still works with a keyboard.Approved
// Writing
Short, specific posts about performance, tooling and the unglamorous parts of shipping an interface.
// Writing
Short, specific posts about performance, tooling and the unglamorous parts of shipping an interface.
// Writing
Short, specific posts about performance, tooling and the unglamorous parts of shipping an interface.
// Questions
The things most teams want to know before we talk. If yours is not here, ask it directly.
I take on one main project at a time and usually book four to six weeks ahead. The status line at the top of the site is kept up to date.
Both. I am often the only frontend developer on a small product, and just as often I join an existing team for a few months. For design and backend I work with people I have shipped with before.
A fixed range for a defined scope, or a monthly rate for an embed. Every quote lists what is included and the two or three things that could change it.
React and TypeScript are where I am fastest. I have shipped with Svelte, Vue and plain web components, and I will tell you early if your stack is one I should not be learning on your budget.
Yes. I can build from wireframes and a brand guide, and I make the detailed decisions in the browser where they can be tested. For a full visual identity I bring in a designer.
That is most of my work. I start with a short audit so we both know what is there, then follow your conventions unless there is a measured reason to change one.
You get the code, the tests, written documentation and a recorded walkthrough. I stay available for questions for thirty days at no charge.
Central European time, with a fixed overlap until 18:00 for teams in the Americas. I reply to messages within one working day.
// Questions
The things most teams want to know before we talk. If yours is not here, ask it directly.
I take on one main project at a time and usually book four to six weeks ahead. The status line at the top of the site is kept up to date.
Both. I am often the only frontend developer on a small product, and just as often I join an existing team for a few months. For design and backend I work with people I have shipped with before.
A fixed range for a defined scope, or a monthly rate for an embed. Every quote lists what is included and the two or three things that could change it.
React and TypeScript are where I am fastest. I have shipped with Svelte, Vue and plain web components, and I will tell you early if your stack is one I should not be learning on your budget.
Yes. I can build from wireframes and a brand guide, and I make the detailed decisions in the browser where they can be tested. For a full visual identity I bring in a designer.
That is most of my work. I start with a short audit so we both know what is there, then follow your conventions unless there is a measured reason to change one.
You get the code, the tests, written documentation and a recorded walkthrough. I stay available for questions for thirty days at no charge.
Central European time, with a fixed overlap until 18:00 for teams in the Americas. I reply to messages within one working day.
// Questions
The things most teams want to know before we talk. If yours is not here, ask it directly.
I take on one main project at a time and usually book four to six weeks ahead. The status line at the top of the site is kept up to date.
Both. I am often the only frontend developer on a small product, and just as often I join an existing team for a few months. For design and backend I work with people I have shipped with before.
A fixed range for a defined scope, or a monthly rate for an embed. Every quote lists what is included and the two or three things that could change it.
React and TypeScript are where I am fastest. I have shipped with Svelte, Vue and plain web components, and I will tell you early if your stack is one I should not be learning on your budget.
Yes. I can build from wireframes and a brand guide, and I make the detailed decisions in the browser where they can be tested. For a full visual identity I bring in a designer.
That is most of my work. I start with a short audit so we both know what is there, then follow your conventions unless there is a measured reason to change one.
You get the code, the tests, written documentation and a recorded walkthrough. I stay available for questions for thirty days at no charge.
Central European time, with a fixed overlap until 18:00 for teams in the Americas. I reply to messages within one working day.
// Start a project
Three quick picks so the first reply is useful. You finish the message on the contact page.
// Start a project
Three quick picks so the first reply is useful. You finish the message on the contact page.
// Start a project
Three quick picks so the first reply is useful. You finish the message on the contact page.