Seven sections stop hydrating
Step B. TrustBar, WhatReplacesWhat, HowItWorks, UseCases, Features, CTAStrip and Pricing are server components now. They render to HTML and ship no JavaScript. ...
Take the animation runtime off the homepage entirely
Step A of the hydration work. Framer Motion is gone from the homepage's eager bundle: 798,723 -> 687,593 bytes raw, 245,367 -> 209,422 gzip. That is 35,945 fewe...
Stop rendering eight off-screen sections before the hero can paint
LCP was 4.4 s, and its breakdown said where: 120 ms to first byte, 290 ms of load delay, 390 ms actually downloading the image — and then 1,810 ms of "element r...
Undo the two changes that cost 380ms of blocking time, and quiet the phone
The last two rounds took the score from 87 to 67. Total Blocking Time went from 80 ms to 460 ms and LCP from 3.9 s to 4.4 s. Two of my own changes did that, and...
Move the headline sweep onto the compositor, and the chat widget off load
Two things left over from the last round, both flagged rather than done because each trades something. Doing them now. THE HEADLINE'S LIGHT PASS. It was a seco...
Render themed imagery server-side, and keep brand text readable
Every background on the homepage was being downloaded TWICE. The components rendered the local `/img/bg/N.webp`, then an effect resolved the org's theme path on...
Inline the stylesheet, and drop polyfills nothing can reach
Two Lighthouse findings, both of which stayed open after the last round because I had concluded they were not addressable. They were; I had not looked hard enou...
Name the controls that had no name, and lift the text under 4.5:1
Three separate defects, all of them invisible to the build, the type check, the lint run and both existing guards. UNNAMED CONTROLS — the phone layout's naviga...
Stop shipping 1.8 MB of unresized backgrounds after hydration
ThemedBackground was the most expensive thing left on the homepage, and none of it looked like a bug. It rendered a raw <img> straight at the theme bucket, so t...
Stop the fold waiting on hydration, and clear the load window
The homepage shipped its whole fold invisible. Framer Motion serialises an `initial` prop into the prerendered HTML as an inline style, so the markup arrived wi...
Remove the navigation timing probe
It did its job. The question it was added to answer — whether the remaining delay was network, script or paint — turned out to have a fourth answer the probe fo...
Stop the analytics tracker hijacking every link but Home
Every page except the homepage took seconds to open, and the reason was never in this app's own navigation path: the server prerenders, prefetch payloads are co...
Every route change was animating a scroll back to the top
<html> carried Tailwind's `scroll-smooth` and nothing else. Next suppresses smooth scrolling while it scrolls to a new route, but only for pages that declare it...
Move the video controls to the top right
They sat bottom-left only because the frame used to bleed off the right edge of the viewport, which would have put a control anchored there off screen. The reel...
Measure real navigations and cold loads, not just flagged sessions
Five rounds of fixes have each removed a real defect and none has fixed what is actually being felt, because every diagnosis so far has been inference from outs...
Drop the sitewide loading boundary that only secondary pages paid for
Every page except the homepage felt slow, which points straight at the (pages) subtree — and at something I put there. When 4fae924 added (pages)/loading.tsx ev...
Prerender the changelog count, refresh it on publish instead of on visit
Every visitor was fetching this number themselves. PreviewBanner lives in the shared layout, so on every page it hit /api/changelog/today after hydration, waite...
Stop prefetching a megabyte per page, and stop calling the backend for free
Two costs that were paid on every page, both found by following the reporter's own hunch about i18n and needless backend calls. PREFETCH VOLUME — a regression ...
Add an opt-in navigation timing probe behind ?perf=1
Page switches still feel slow on production, and the server has been ruled out from the reporter's own machine: 55-122ms responses, x-nextjs-cache HIT, prefetch...
Survive a retried image pull, and stop deploying twice per push
The 013faf1 deploy failed on `exceeded its progress deadline` while the rollout itself was fine — the pod came up healthy about 90s in, and prod has been servin...
Stop every page switch waiting on a redirect and a 2s fade-in
The prerendering work in 4fae924 fixed the server and the router, and the site still felt like it took 1-2 seconds to change pages. It was never the network. Tw...
Prerender the routes again and give a navigation something to paint
The locale layout resolved its messages with a bare getMessages(), which reads request headers and so opted the ENTIRE app out of static rendering. With no load...
Carry the heading contrast fix to pricing, security, about and offer
Same defect as the home page, same nine remaining spots: section headings opened on `--color-primary`, which measures 2.61:1 against a mid-green background — un...
Raise section-heading contrast off the green end of the ramp
Every section heading's second line ran `--color-primary` -> `--color-primary-light` -> `--color-secondary`, so it STARTED in the brand green. Measured against ...
Play the kamo13 reel
Points the hero at the new reel's ladder, MP4 fallback and poster. The source is spec-identical to the one it replaces (H.264 720p24, 66s, ~30 MB), so nothing a...
Move the grid out of styled-jsx; drop two dead components
Finishes the styled-jsx sweep started on the preview banner. No `<style jsx>` block remains anywhere in the app. SITEMAP — the grid was an inline `display:grid...
Stop the banner flashing unstyled, make whole feature cards clickable
PREVIEW BANNER — its CSS lived in a `<style jsx>` block inside the component. In the App Router styled-jsx does not server-render CSS for client components, so ...
Centre the reel in its column instead of pushing it to the edge
Two earlier passes had the stage reaching for the page edge — first overhanging the viewport by 1.5–5rem, then sitting flush against it. Overhanging cropped a p...
Wire the offer banner, fix dead Learn more links and the hexagon field
Five fixes, all of them things that looked present but did nothing. OFFER BANNER — HeroOfferBanner was dead code; nothing imported it. Restored, but driven by ...
Rebuild the hero as an editorial split with the reel as an aperture
The reel was a centred rounded rectangle with a drop shadow — an object placed on the design rather than part of it — and it was the ONLY thing in the hero: ff0...
Play the reel as an adaptive HLS ladder instead of a 31.8 MB MP4
The hero pointed a bare <video src> at a single 3.9 Mbps 720p24 MP4, so a phone on a weak connection downloaded exactly the same stream as a desktop on fibre, a...
Polish video hero unit with modern animations and optimizations
- Add poster image for instant visual feedback during video load - Implement loading skeleton with pulsing animation - Start video muted (browser autoplay polic...
Replace hero text unit with autoplay promo video
Swap the homepage hero copy, CTAs, and stats for a looping muted video while keeping the rotating background treatment.
Lift icon contrast where the mark sits on a tinted bubble
The reported case is the brand green on a tint of itself: --color-primary against rgba(107,142,58,0.15) is 3.43:1. That clears the 3:1 WCAG 1.4.11 floor for gra...
Add the 25-year anniversary seal
Two placements, both chosen for where the claim is already being made: Footer — 60px, beside "© 2001–<year> ... established 2025". Site-wide, ...
Show the 2001 copyright range and the incorporation year
Renders "© 2001–<year> KamoCRM. KamoCRM Inc. established 2025. All rights reserved." The range start is hard-coded next to the dynamic end year rather than livi...
Add the meeting and payroll integrations
Zoom and Microsoft Teams for meetings, and the ten payroll vendors — ADP Workforce Now, BambooHR, Dayforce, Gusto, Paychex Flex, Paycor, Paylocity, Rippling, UK...
Count apps and integrations separately with real numbers
"Apps & Integrations" was one tile reading 31+. It is now two, each with a figure that can be re-derived rather than estimated: Apps 64 — Forgejo pro...
Reset the home headline on a display face and one light pass
The h1 stacked four effects: a fade wrapper, mouse parallax on each line, per-character 3D rotation on line one, and a blue/purple/green gradient cycling across...
Read the org's real background count and play order
The hero probed for bg/1.webp and then hardcoded three frames, so an org with more never showed them and the rotation modulo'd by LOCAL_BGS.length regardless of...
Locale-correct structured data, and a robots.txt rule that matched nothing
Every BreadcrumbJsonLd and ItemList URL was hardcoded to /en, so the structured data on /fr/terms told crawlers its breadcrumb parent was the English page — 19 ...
Index the collection detail pages in 19 more languages
The sync finished, so the ~2,400 detail pages that were noindexed for having English body copy now have real translations and can be indexed. Measured across al...
Stop advertising ta as a translated alternate
Key coverage is not translation. TranslateService returns the source text when no provider supports a direction — ProviderRouter logs "No provider supports en->...
Localize the hub cards and stop bundling the English datasets
The four hub pages rendered client components that imported the collection modules directly and took no props, so every card — industry names, integration tagli...
Translate the collection pages instead of hiding them
The 2,400 noindexed detail pages were noindexed because their body copy has no translation: competitors, industries, integrations and glossary keep their prose ...
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
