Remove framer-motion from the site
"Reduce unused JavaScript" has named the same 35.4 KB chunk in every report, and it is Framer Motion. It is not an eager script on the homepage, which is why it...
Resolve the org's icons on the server and preconnect the origin
Lighthouse named theme.kamocrm.com as an unconnected origin worth 300 ms while also reporting no origins preconnected, and last round I read that as a stale com...
Make the server actually able to read the theme path
Completes the change 48493ae shipped half of. That commit swept four in-flight files — layout.tsx, DynamicMetaLoader, TouchOptimized and ThemedBackground — into...
Stop gating the referral beacon, and report the visit properly
Two corrections to what shipped, both restoring the behaviour this feature was asked for. The beacon was gating itself on the analytics consent record. That re...
Stop three route bundles being prefetched onto the homepage
Lighthouse's 103 KiB of "unused JavaScript" named four chunks, two of them essentially 100% unused. None of them appear in the homepage's HTML — they are other ...
Name the backdrop widths, and read the theme config on the server
Two findings, both of which were doing something other than what the code said. THE BACKDROP WAS FETCHING THE 1920 CANDIDATE. 149 KB, for a decorative picture ...
Honour a partner link and report what it brought
A visitor who follows https://www.<apex>?mrt=<code> gets two first-party cookies from the edge middleware — an opaque GUID that lasts two years and the code its...
Compress the images harder, hold the cards still, drop duplicate requests
Images. Every quality setting on the page goes down a step, and the allow-list in next.config.ts goes to [30, 50] so nothing can quietly ask for more: hero...
Split the hero, and take the last two libraries off the page
Step C. Neither GSAP nor Framer Motion is on the homepage any more, and the `home` message namespace is no longer sent to the browser at all. JS 24...
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...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.