PULSENOVA
JOURNAL
EVERY ENTRY CARRIES ITS NUMBERS
Discussed on LinkedIn
Sixty pages in two days. The speed was three years old.
We rebuilt a physiotherapy practice's website in two days: sixty pages, twenty-three commits, one person. Accessibility 100 on every page, and one number that is not green yet.
60 PAGES · 23 COMMITS · 100 A11Y · 3.99 S MOBILE LCP

We rebuilt the website of Physion GmbH in two days. Sixty pages, twenty-three commits, one person. Physion is a physiotherapy practice in Heilbronn and has been a client since November 2023. The site we replaced was mine as well. I built it in Webflow in 2023, with a CMS that was planned but never built, jQuery and three scripts, managed hosting and no backups of our own.
That last sentence is the whole explanation for the speed. Nobody rebuilds a site they have never watched anyone use. I had watched this one for three years.
Why three years of watching made two days possible
A rebuild in two days is not a trick. It is what happens when the person building already knows which pages get read, which ones never did and what the practice needs to change without calling anyone. Three years of living with a site answer those questions better than any workshop.
Most rebuilds lose their first two weeks to questions that sound important. Where does the therapy list go. Does the team page need a filter. Should the blog sit in the main navigation. On this site every one of those questions had already been answered by the people using it. The therapy pages get read. The team page gets read. The rest is support. So the layout was not a debate, it was a transcript of three years of use.
The second reason for the speed is less flattering. I knew exactly where the old site hurt, because I had built the parts that hurt. The CMS that never arrived, the scripts that grew, the hosting that belonged to someone else. A rebuild that starts from your own mistakes has a short list.
What moved across and why every URL stayed
The old site was not thin. Twenty-two therapies, ten team members, four success stories, ten articles and thirteen Google reviews. All of it lived in Webflow's CMS. All of it had to arrive in the new one intact, under the same addresses, so that three years of search results still find their page.
That constraint shaped the whole migration. Thirteen inherited redirects came across first, then the new ones for pages that changed shape. Every content type in Webflow got a matching type in Sanity. Every field that the practice actually fills in got a field. Nothing else did. Migrating content is not the glamorous part of a rebuild. It is the part that decides whether the practice keeps its patients on Monday morning.
The stack, and who touches which part of it
- Astro 7 renders the sixty pages as static HTML. Motion comes from GSAP and Lenis, nothing heavier.
- Sanity holds therapies, team and blog. The practice edits them, not me. Every rich text passes an allowlist sanitiser before it renders.
- Cloudflare delivers the site. A nightly backup of the CMS content runs on GitHub Actions. Every push runs a build check before anything reaches the branch.
Three tools. The practice only ever opens one of them. That is the point of the split. Sanity is where the therapy texts live, so a changed opening hour or a new therapist is a form, not a support ticket. Astro and Cloudflare are mine. The backup exists because the old site had none and because a practice should never depend on one person's laptop.
What the measurement says
Lighthouse 12, desktop preset, run against the production build on 3 September 2026. Five pages. Lab numbers, not field data.
- Home: performance 98, largest contentful paint 0.97 s
- Therapie: performance 100, largest contentful paint 0.67 s
- Team: performance 99, largest contentful paint 0.89 s
- Blog: performance 99, largest contentful paint 0.88 s
- Kontakt: performance 100, largest contentful paint 0.58 s
Accessibility 100 on every page. Best practices 100. SEO 100. Cumulative layout shift 0.000 on all five, which means nothing jumps while the page loads. On a desktop every one of these pages shows its main content in under a second.
I want to be precise about what these numbers are. They come from one machine, one network profile and one run. They tell you the site is built well. They do not tell you how it feels on a five year old phone in a waiting room. That measurement comes further down. It is not green.
Accessibility is the number I care about
People arrive at a physiotherapy site in pain, on a phone, often older than the average visitor. Some of them use a screen reader. Some of them use large text. All of them want the phone number and the therapy list, not an animation.
So the reveal animations on this site fade content in with opacity rather than autoAlpha. The difference sounds technical and it matters. autoAlpha hides an element from assistive technology until the animation finishes. Opacity only changes what you see. Nothing is ever removed from the accessibility tree and a screen reader reaches every word before the animation has finished. A person who cannot see the fade never notices it. A person who relies on a screen reader never waits for it.
The 100 on every page is the result of decisions like that one, made in the build rather than fixed afterwards. It is also the number I would defend first if I had to give the others up.
The number that is not green yet
On mobile the largest contentful paint sits between 3.13 and 3.99 seconds, against a Core Web Vitals threshold of 2.5 seconds. Home 3.16 s with a performance score of 90. Therapie 3.13 s with 92. Team 3.99 s with 86.
Lighthouse names the cause without ambiguity. The hero photograph is served at a larger size than a phone needs. Thirty-three kilobytes are wasted on it. That is a fix, not a rewrite. A correctly sized image set for the hero, delivered before the fonts. Then the mobile number moves under the threshold. It happens before the site goes live.
It is in this note for the same reason it was on slide five of the LinkedIn post. A case study that only shows the green numbers is an advertisement. The mobile number is the one a patient in a waiting room actually feels, so it is the one that deserves to be printed while it is still red.
The part nobody photographs
The practice can now change its own therapy texts, add a therapist and publish a post on its own. Not a new look. A site the client can actually run. That sentence decides whether a rebuild was worth it. It is on none of the screenshots.
The claim on the home page is theirs, written before the first page existed. "Physiotherapie. Nachhaltig. Nah." My job was to build something that could carry it on a phone, in a waiting room, at seven in the morning. The site is built. The domain switch is still to come, so for now the status reads launch in preparation.
If your own site is three years old, send me the link. You get three decisions nobody made on it, in writing, within a week. No strings.
PULSENOVA
NEXT NOTE
3 FALSE FIXES · 1 WIDTH TESTED · 6 REQUIRED
NEWSLETTER
One build note. Every week.
What shipped on a client site, what broke, and the fix that worked. Written from inside the studio, sent once a week. No pitch, no link roundup.
UNSUBSCRIBE FROM ANY EMAIL. STORED WITH KIT.
