// build log

Built in the open, including what is still broken

This is the build study of the website you are reading: what it measures, the 6 things a review found wrong in it, and the 3 that are not fixed yet. Everything here is about this site, which means you can check all of it without signing anything.

Every figure on this page carries the date and the tool it came from. Where we could not verify a number we left it out rather than estimate it. The commit count and date range are read from git while the page is being built, not typed in.

// the facts

One measurement decided how this page is built

A server-rendered article on this site paints its largest element in 92–94 ms. The one page that wrapped its hero in an animation library measured 943 ms. That comparison is why this page ships as plain server HTML with no animation library in it.

Largest Contentful Paint · same site, same afternoon
Server-rendered article, no animation library92–94 msLocal trace, 26 Jul 2026
/faq, hero inside an animation library943 msSEO sweep, 26 Jul 2026

/faq now measures 114 ms with the entrance animation replaced by CSS keyframes — a local trace on 27 Jul 2026, under different conditions from the 943 ms. Read the pair as “the hero no longer waits for JavaScript”, not as a measured 8x.

Everything else, with the date and the tool it came from

111
commits on maingit log, read during the build on 26 July 2026. A snapshot — this one keeps moving.
1 Apr 2026 – 26 Jul 2026
first commit to latestgit log, 26 July 2026
22
page routes (17 static, 5 dynamic)find app -name page.tsx, 27 Jul 2026
84
URLs in the sitemapBuilt sitemap.xml, 27 Jul 2026. 66 of these were accepted by Search Console on 26 Jul, before the rebuild added the rest.
100 / 100 / 100
Lighthouse accessibility, SEO, agentic browsingMobile, three page types, 26 Jul 2026
77
Lighthouse best practicesCappedCapped by a third-party marketing cookie. 26 Jul 2026
0.13–0.17
CLS across three page typesStill failingThreshold for "good" is 0.10. Unresolved as of 26 Jul 2026
36
records in the build catalogue9 are runnable applications you can open and use; 27 are navigable reference builds with no live backend

The commit history behind this page is in a private repository, and so are the builds. What you can inspect without us is the running software: this site, and the nine applications in the catalogue you can open and use end to end. We would rather point you at things that work than at a repository you would have to take our word on.

// findings

What we got wrong, and what is still wrong

A review of this site on 26 July 2026 found 6 problems — among them a whole section published with every deep link broken, and three tracking tags that loaded before anyone consented to them. All 6 are below with what changed. 3 more are listed underneath and are not fixed.

They are reported the way we would report them on your build: what was found, why it mattered, what changed.

We presented reference builds as if they were the delivered systems

A visitor clicking through the catalogue could reasonably have believed they were opening a production system somebody is using.

Every record in the catalogue carried a live status, and the copy around them read as though a visitor clicking through was opening the production system a client is using. That is not what the public artefacts are. The client work is real and was paid for, and almost all of it is under NDA, so what we can publish is our own reference build of the same system with sample data in it.

The mobile section had a sharper version of the same problem. It described offline-first stores, background location and on-device vision as implemented architecture, when the screens are hand-built designs and no compiled native app exists.

ChangedThe framing now separates the two. Paid client work is described as paid client work under NDA. Public artefacts are labelled as reference builds, and each entry is marked so you can tell a runnable application you can open and click through from a navigable reference build with no live backend. The repositories themselves are private. Of the 36 records, 9 are the former and 27 are the latter.

The portfolio page kept a second, hand-typed copy of all 36 records

The cards a human saw and the structured data a search engine read came from two different copies of the same records, and nothing forced them to agree.

The catalogue lives in one data file. The portfolio view did not read it. It carried its own duplicate of all 36 records, typed out by hand, several hundred lines long. The structured data emitted for search engines was generated from the real file, while the cards a human saw came from the copy.

Nothing forced the two to agree. A correction made in one would not appear in the other, and the page would have gone on rendering the stale version indefinitely without erroring.

ChangedThe view now derives its cards from the catalogue through a server-side projection. The file went from roughly 805 lines to 210. There is one source for a product record and both the page and the schema read it.

TypeScript build errors were suppressed in the config for four months

For four months a type error introduced by a data-model change would not fail the build. It would deploy, and break at runtime instead.

On 2 April a commit turned off both the TypeScript and the ESLint build gates to get past stale generated-type errors. The comment explaining it was accurate on the day it was written.

It stopped being accurate quickly, and nobody went back. For the rest of the project a type error introduced by a data-model change would not fail the build. It would deploy, and surface as something broken at runtime instead.

ChangedBoth gates are on again in next.config.ts. The type gate went back on first and the tree passes it clean; the ESLint gate followed in a commit on 26 July, once the lint errors it would have caught were cleared. Neither bypass is still in the config.

Three analytics and session-replay tags loaded before anyone consented to them

A site positioning itself on trust was silently recording the people evaluating whether to trust it — form input included.

The layout loaded a marketing automation tag, a session-replay and heatmap tag, and an advertising pixel, unconditionally, on every page. There was no consent banner anywhere in the codebase.

Session replay records form input. So a site positioning itself on trust was silently recording the people evaluating whether to trust it, including anyone typing into the contact form. The privacy page did not name any of the three tools and did not mention replay at all.

ChangedAll three now sit behind an explicit opt-in and nothing loads until a visitor chooses. The advertising pixel was kept only because the offer funnel deduplicates it against a server-side event, and it fires two events rather than tracking page views.

A catalogue record carried a real logistics company’s name

The company name was not only in the copy. It was the record identifier, so it was also the URL, the screenshot directory and the alt text on every image.

One record was named after a listed logistics multinational that sells its own fleet-management software. The string was not only in the copy. It was the record identifier, so it was also the URL of the product page, the folder holding every screenshot, and the alt text on all of them.

The page presented it as a live platform built for a logistics operator. Reviewing the rest of the catalogue for the same class of mistake turned up three more: two well-known apparel brands, a named individual listed with his former employers, and a real leasing firm.

ChangedThe record was renamed across the data, the views, the article that referenced it and the image directories, with a permanent redirect from the old URL. The other three were replaced with role-only descriptions. No third-party name appears in the catalogue now.

A whole section was published with every deep link broken

The most technical claims on the site — model releases, latency figures, accuracy percentages — sat behind links that all returned 404.

An AI Lab section made the most technical claims on the site: model releases, latency figures, accuracy percentages, research abstracts. Every link from it into a model page or a paper returned a 404. It was excluded from search indexing, which hid the problem from crawlers but not from anybody handed the URL directly.

ChangedThe section was unpublished and its routes redirect to the portfolio. It comes back when the pages behind it exist.

3 things on this site are still wrong

Not fixed as of 26 July 2026. Listed because a build study that only contains solved problems is not a build study.

  • CLS measures 0.13 to 0.17 against a 0.10 threshold, and the fix we tried was reverted rather than shipped. It is pre-existing and site-wide, not caused by recent work, and it happens during load rather than while reading. Web fonts are a confirmed contributor: switching the font loading strategy measured 0.17 down to 0.11, but that still misses the threshold and costs slower connections the typeface. The remaining shift is not yet attributed.
  • Lighthouse best practices is capped at 77 by a third-party cookie. The cookie is set by the marketing tag. It is not fixable in code and stays until that tool goes.
  • The domain was registered on 1 June 2026, so search visibility will lag the quality of the site. Regardless of how good the on-page work is, a domain that new has no accumulated link data. There is no version of this where a technical pass fixes that.
// the build log

A long quiet stretch, then a month of concentrated work

111 commits between 1 Apr 2026 and 26 Jul 2026, most of them landing in the final month. The shape of that distribution is honest about how the project actually ran.

The phases below are the ones worth naming rather than every commit, and each one opens onto what actually happened in it. Their commit counts were read on 26 July 2026; the total above is read from git every time this page is built, so the two will drift apart as work continues.

  1. 1–20 April 2026

    A Vite site, then a rewrite in the same week

    Thirteen commits on day one, a move off Vite onto the Next.js App Router in the same week, and the commit that switched the build’s type and lint gates off for the next four months.

    What the first week actually consisted of

    The first commit initialised a React project on Vite with SASS and a handful of page components. Within a day the product-detail page, the contact page, the FAQ, the value props and the industry cards had each been redesigned at least once, which is what a first week actually looks like when nobody has agreed on the visual language yet.

    Later the same day, all of it moved to the Next.js App Router. Imports were rewritten to absolute aliases, the build root was pinned to fix path inference on local machines, and the Vercel config from the Vite era was left behind. Thirteen commits landed on 1 April alone.

    One commit from 2 April matters more than the rest: the build checks for TypeScript and ESLint were switched off to get past stale validation errors. That decision stayed in the config for nearly four months. It is the third finding above.

  2. 4 May – 9 June 2026

    The catalogue grows faster than the framing around it

    Every new record inherited the shape of the last one, including fields the catalogue had no honest way to fill. This is the stretch that created the content problem the review later found.

    How the catalogue was allowed to drift

    Batches of MVP builds were added to the portfolio grid, product pages grew highlights, galleries, outcomes and engagement details, and the whole UI got an overhaul. The AI Lab section was hidden rather than finished.

    This is the stretch where the content problem was created. Each new record inherited the shape of the last one, including fields the catalogue had no honest way to fill. The single commit in June moved NDA projects to the end of the grid, which treated a presentation symptom rather than the data underneath it.

  3. 1 July 2026

    Rebrand and a move to Cloudflare

    The deploy target looked like one line in a plan and took three commits in a terminal to land.

    What the move to Cloudflare took

    The site was rebranded to BuildspaceLabs, the contact form got a real API route, and the hero video, the font stack and a scattered set of accent colours were unified to one brand blue.

    Deployment moved to Cloudflare Pages. That took three commits to land: build artefacts had to stop being committed, dynamic routes had to be forced onto the edge runtime, and the OG image generator had to drop its static params. The deploy target is the kind of thing that looks like one line in a plan and is three commits in a terminal.

  4. 5–6 July 2026

    Design pass, and the first accessibility fix

    The hero was rebuilt three times in two days. Two of the commits were correctness rather than taste: accent text too light to read, and a page loading several live preview iframes at once.

    The three hero rebuilds and the two correctness fixes

    Full light-theme support, real imagery, and a hero that was rebuilt three times in two days: the glass panel became a soft-focus field, a rotating typewriter line went in, then the background image and one piece of copy came out. Generated cover art was replaced with actual screenshots of the builds.

    The /offer scoping funnel was added, with a Turnstile check softened to a non-blocking gate after it started costing real submissions.

    Two fixes in this window were correctness, not taste. Gradient accent text was too light to read against the new light theme and was darkened. And the live preview iframe on product pages was made to mount only when it scrolls into view and unmount when it leaves, because a page carrying several of them was loading several sites at once.

  5. 7–8 July 2026

    The SEO system, and the first honesty corrections

    Three untrue claims came off the site in one pass: government and defence work we had not done, a "first" superlative, and products filed under industries they did not belong to.

    What went into the SEO system, and what came off the site

    A durable SEO system went in: a coordination state file that survives between sessions, a real 404 route, an explicit crawler policy, privacy and terms pages, structured data that describes what the products actually are, FAQ answers that are crawlable rather than trapped behind an accordion, and an llms.txt.

    The same pass caught three claims that were not true. Government and defence work was removed from the industries carousel. A "first" superlative was dropped. And the carousel itself was audited, which turned up products filed under the wrong industry and links pointing at pages that did not exist.

    Vertical landing pages for /solutions were added and differentiated from the carousel so the two were not two routes to the same paragraph.

  6. 9–22 July 2026

    A production bug that took eight commits to kill

    An OTP endpoint returning bare 502s with nothing in the logs, and a conversion-tracking loop that took four commits to end up with less than we started with — which was the right answer.

    The eight commits, in the order they landed

    The /offer funnel got an email OTP gate, CRM sync, and a step where the visitor picks their own path instead of being pushed into one.

    Then the OTP endpoint started returning bare 502s in production and nothing in the logs. Eight commits sit in the history around it: making the failure loud instead of silent when the email provider rejected a send, guarding the dispatch so a throw returns JSON, eliminating async rejections the handler could not catch, adding a temporary key-value step trace to find where the edge runtime was dying, removing that trace once it had done its job, and finally adding a fetch timeout so a hanging provider call could not become a 502 of its own.

    Conversion tracking went through the same loop in public: a pixel was added, removed entirely in favour of a server-side API, re-added and deduplicated against it, then reduced to two events. Four commits to end up with less than we started with, which was the right answer.

  7. From 25 July 2026

    Blog, Search Console, a performance sweep, and a clean-up

    The site had never had a Search Console property at all. There was no indexing data because nobody had ever created one.

    What the sweep changed, item by item

    Thirteen articles were written and shipped as typed data rendered by a server component, not a client one. That choice is why the LCP figures above are what they are.

    Search Console turned up something worth reporting plainly: the site had never had a property at all. There was no indexing data because nobody had ever created one. A property was verified two ways, the sitemap was submitted and accepted at 66 URLs, and indexing was requested.

    A Lighthouse and Core Web Vitals sweep followed, on real traces rather than estimates. Accessibility went from 95 to 100 and agentic browsing from 67 to 100. The muted text colour used across the site failed the contrast floor at 4.11:1 and was corrected in one token across 16 files. White text on the plain accent blue was 3.7:1, so a dedicated CTA colour was added and the five affected buttons were pointed at it. Heading order in the footer was wrong. The llms.txt used bare URLs, which parse as no links at all.

    The commits at the end of this window are the clean-up reported in the findings above, and the one that turned the ESLint build gate back on.

// how we work

Four habits, each visible in the page you are reading

None of these are claims about how we work. Each one is a decision you can see the result of on this page, which is the only reason it is worth printing.

We measure instead of asserting

Every figure above came out of a tool on a date we have written down. The LCP comparison between a server-rendered page and an animated one is the reason this page has no animation library in it.

One source for anything that appears twice

The duplicated catalogue is the clearest example: two copies of the same records meant the page and its structured data could disagree without anything failing. Duplication is not a style preference, it is a correctness bug waiting for a deadline.

Copy is reviewed like code

A real company name inside a record identifier is not a copy problem. It is a route, a directory and a set of image tags. The claims a site makes get audited on the same pass as the code that renders them.

We publish what is still wrong

The open list above is longer than most teams would print, and it shrinks by being fixed rather than by being edited. A build study that only contains resolved items is marketing, and you would be right to discount it.

We will do this to your build

Same method, pointed at your codebase and the claims your site makes about it. You get the findings written the way the ones above are written, whether or not you go on to work with us.

Request a build review

A small senior team, working remotely from India. Replies during business hours, Monday to Friday IST.