Skip to content

Insights

Our reasoning, written down and checkable

Published so you can judge our reasoning before you hire us, in enough detail to disagree with. Every piece is written in-house, takes a position, and names the claims we think are wrong.

  • AI engineering
  • Accessibility
  • Answer engines
  • Cloud
  • Data engineering
  • Generative engines
  • Mobile
  • Performance engineering
  • Search visibility
  • Security
  • Security and privacy
  • Software architecture
  • Software delivery
  • Web engineering
Security and privacy6 min read

A DPDP Act engineering checklist for software teams

India's Digital Personal Data Protection Act 2023 turns several familiar engineering practices into obligations you must be able to demonstrate: knowing where personal data is, deleting it on request, honouring withdrawn consent, and detecting a breach. This is an engineering checklist, not legal advice.

Read the article →
Generative engines6 min read

AI crawlers, llms.txt, and deciding what to allow

Blocking AI crawlers and being cited by AI assistants are mutually exclusive, and the two decisions are usually made by different people who never discuss it. The first step is knowing which agent is which, because a single blanket rule gets one of the two outcomes wrong.

Software delivery6 min read

API design you will not have to version twice

An API is a promise you cannot take back. Once someone integrates, every field you named, every error shape you returned and every implicit ordering becomes something they depend on — usually including the parts you considered internal detail.

Mobile6 min read

App store review: the rejections you can predict

Store review is not arbitrary, and treating it as such is what makes it expensive. Most rejections come from a small, published set of rules that were knowable before the build started — and each one costs a review cycle, which lands at the worst point in a launch plan.

Cloud6 min read

Backups you have actually restored, and the ones you only hope exist

Every organisation has backups. A much smaller number have restored one. The distance between those two positions is usually discovered on the worst day of the year, when someone finds that the nightly job has been failing silently since a credential rotation in March.

Software delivery6 min read

Build or buy, decided on the part that actually differs

The decision is usually framed as a cost comparison and decided on a licence fee, which is the smallest number involved. The questions that determine the outcome are whether this capability is where you compete, what the integration really costs, and what happens the day the supplier changes their pricing.

Web engineering6 min read

Caching: the cheapest performance work, and the easiest to get wrong

No optimisation beats not doing the work. Caching is the highest-leverage performance lever available and the one most often configured by copying headers from a blog post — which is how sites end up serving a signed-in visitor someone else's page, or caching an asset for a year with no way to correct it.

Software architecture6 min read

Choosing a tenancy model before it chooses you

There are three practical isolation models for a SaaS product, and the right one is decided by what your customers require and what your team can operate — not by which is technically purest. Whichever you choose, enforce it in the data-access layer, because isolation maintained by developer discipline eventually fails.

AI engineering6 min read

Choosing a vector store, and when you do not need one

Vector search is a feature of your database before it is a category of product. For most retrieval systems, the extension you already have is sufficient — and the decision that actually affects answer quality is hybrid search and metadata filtering, not which index algorithm you picked.

Answer engines6 min read

Conversational queries, and the shape an answer has to take

Typed search taught people to strip their questions down to keywords. Voice interfaces and assistants let them stop doing that. The queries are longer, more specific, more conditional — and a page optimised for a two-word phrase has nothing to say to them.

Performance engineering6 min read

Core Web Vitals in the Next.js App Router: what actually moves the needle

In an App Router codebase, four decisions dominate Core Web Vitals: where each route renders, where the server-client boundary sits, how the largest image is loaded, and whether space is reserved before content arrives. Almost everything else is noise by comparison.

Search visibility6 min read

Crawl budget, and the sites that actually have a problem

Crawl budget is the most over-diagnosed problem in technical SEO. Most sites do not have one. The sites that do are usually generating URLs combinatorially — filters, parameters, pagination — and spending their crawl allowance on pages nobody should ever see.

Security6 min read

Dependency risk: the code you ship but never wrote

A modest application ships a few hundred packages and a few thousand transitive ones. Almost none were read by anyone on the team, most execute code at install time, and each maintainer is one compromised account away from running arbitrary commands in your build. The exposure is unavoidable; being unable to see or reduce it is not.

Cloud6 min read

Deploys that can be undone, and the ones that cannot

The question that matters about a deployment strategy is not how fast it ships but how quickly a bad change stops affecting users. Most teams can deploy in minutes and cannot roll back at all — because a migration ran, or because rollback was never tested, and both are discovered at the worst possible time.

Web engineering6 min read

Design tokens, and building dark mode that was actually designed

Most dark modes are a light design with the colours flipped, which is why they look muddy and why text lands on the wrong background in edge cases. A token system fixes it structurally: components reference meaning rather than colour, and a theme becomes a set of values rather than a set of overrides.

Data engineering6 min read

Designing an event schema you will not regret in a year

Analytics instrumentation is added quickly, by different people, with names invented at the keyboard. Two years later there are four events for one action, nobody remembers which is current, and every analysis begins by asking which one to trust. The cost of preventing that is one page of conventions.

Answer engines6 min read

Document structure for answer extraction: headings as questions

Passage writing decides whether an individual answer can be lifted. Document structure decides whether it can be found in the first place. A page with one heading and two thousand words of prose contains excellent answers that nothing can locate.

Generative engines6 min read

Entity consistency: making it unambiguous who you are

Before a system can cite you, it has to be confident it knows which organisation you are. A name shared with three other companies, a description that changes between pages and a set of profiles that disagree about your location produce an entity nothing is sure about — and uncertain entities do not get named in answers.

AI engineering7 min read

Evaluating LLM output when there is no single right answer

An AI feature without an evaluation set has no definition of working, which means it cannot be improved deliberately or safely changed. The hard part is not running evaluations — it is deciding what correct means for output that is allowed to vary in wording.

Answer engines6 min read

Finding the questions you have not answered yet

Answer engines reward pages that answer specific questions. The bottleneck is almost never the writing — it is knowing which questions to answer. The best sources are not keyword tools; they are the places where people have already asked, in their own words, and someone on your side had to reply.

Web engineering6 min read

Forms: the highest-stakes, least-designed part of most products

A form is where a visitor becomes a customer, and it is routinely the least considered surface in a product. The failures are consistent and cheap to fix: validation that fires while typing, errors that say what is wrong but not what to do, and a submission failure that discards everything the person entered.

Search visibility6 min read

hreflang, and the four ways it usually breaks

hreflang tells search engines which language or regional version of a page to show which user. It is unusually unforgiving: a cluster with one missing return link, one wrong code or one non-canonical URL is not partially working — it is ignored, and the fallback is whatever the engine guesses.

Cloud6 min read

Infrastructure as code, and the drift that quietly defeats it

Infrastructure as code delivers its promise only while the code describes reality. One console change during an incident, never reflected back, and the repository becomes documentation of what someone intended two quarters ago — at which point the next apply either fails or reverts a fix nobody remembers making.

Search visibility7 min read

JavaScript rendering and whether your content is actually seen

A page can look complete in a browser and be almost empty to a crawler. Google renders JavaScript, but on its own schedule and with no guarantee; most AI answer engines do not render it at all. If your primary content arrives only after hydration, you are gambling on a second pass that may never come.

Answer engines6 min read

Measuring visibility when the answer replaces the click

If an engine answers the question on the results page, the visit that would have measured your success never happens. Traffic falls while visibility rises, and a dashboard built on sessions reports a failure. The measurement has to change, because the mechanism did.

Generative engines6 min read

Measuring whether AI assistants mention you at all

Bing Webmaster Tools now counts how often Copilot cites your pages, and Google includes AI Overviews in Search Console without separating them. Beyond those two, what exists is referral traffic you can identify if you look for it, and a manual audit you can run in an hour a month — unglamorous, but the difference between knowing and assuming.

Software architecture6 min read

Metering architecture for usage-based billing

Usage-based pricing fails in a specific way: the invoice is questioned, and nobody can reconstruct how the number was produced. The fix is architectural rather than commercial — meter at the source, store raw events immutably, and derive every aggregate so it can be rebuilt and defended line by line.

Search visibility7 min read

Migrating a site without discarding its rankings

Most traffic lost in a migration is lost to a handful of avoidable mistakes: URLs nobody inventoried, redirects that chain or land on the wrong page, and a launch nobody monitored closely enough to catch the damage while it was still cheap to fix.

Mobile6 min read

Mobile performance: startup, battery, and the things that get you uninstalled

Nobody uninstalls an app for being 200ms slower than a competitor. They uninstall it for taking four seconds to open, for draining the battery, and for being too large to install on a phone that is already full — three problems that are measurable, fixable, and usually unmeasured.

Data engineering6 min read

Modelling data for analysis, which is not how the application stores it

Pointing a reporting tool at a production database is the fastest way to get analytics and the fastest way to get analytics nobody trusts. The application schema is optimised for writing one row correctly; analysis needs to read millions and group them, and the two shapes are genuinely different.

AI engineering6 min read

Modelling what an AI feature will cost before you build it

AI features have a cost profile most software does not: marginal cost per request that scales linearly with usage. A feature that costs a fraction of a rupee per call is fine at a thousand calls a day and a real line item at a million — and the difference is knowable before you build it.

Software delivery6 min read

Modernising a system that cannot stop running

The system everyone wants replaced is also the one the business runs on, which is why the rewrite gets proposed every eighteen months and abandoned every twenty-four. The alternative is unglamorous and works: replace it a piece at a time, with the old system running until each piece is proven.

Mobile6 min read

Native, cross-platform or web: deciding on what actually differs

The choice is usually argued on performance, which is rarely the deciding factor for the applications most organisations build. What decides it is which platform capabilities you need, what your team can maintain, and whether you can afford to be wrong.

Cloud6 min read

Observability: what to instrument first, and what to stop logging

Most systems produce an enormous volume of logs and cannot answer how long a request took at the ninety-fifth percentile. That combination — over-logged and under-instrumented — is the normal state, and it is expensive in both directions: you pay to store output nobody reads while lacking the signals an incident actually needs.

Mobile6 min read

Offline-first: designing for the network you do not have

Offline support added to a finished application is a rewrite. The reason is that connectivity is not a feature that sits beside the others — it determines where the truth lives, and that decision shapes every screen, every write and every piece of state in the product.

Generative engines6 min read

Original data: the one thing that cannot be summarised from elsewhere

Every general explanation of every well-documented topic can now be produced on demand, at length, for free. What cannot be produced on demand is a measurement somebody actually took. That asymmetry is the most durable content advantage currently available, and it is available to organisations of any size.

Data engineering6 min read

Pipelines you can safely re-run, which is most of pipeline design

A pipeline fails. Someone re-runs it. If that re-run duplicates rows, skips a window or produces a different answer than the first attempt would have, every downstream number becomes unreliable — and the failure that caused it was the ordinary kind, not the exotic kind.

Security and privacy7 min read

Prompt injection: designing for a problem with no clean fix

Prompt injection has no reliable fix at the prompt layer, because a language model cannot distinguish instructions it should follow from instructions embedded in the data it was asked to read. The workable response is architectural: assume injection succeeds, and design so that succeeding achieves little.

AI engineering6 min read

RAG or fine-tuning: deciding with evidence rather than preference

Retrieval and fine-tuning solve different problems, and most business requirements turn out to be retrieval problems wearing a fine-tuning costume. The distinction is simple: retrieval changes what the model knows, fine-tuning changes how it behaves. Deciding without that distinction produces expensive rework.

Search visibility6 min read

Reading server logs to find out what crawlers actually do

Search Console tells you what Google concluded. Server logs tell you what it actually requested, when, and what your server returned. When indexing behaviour makes no sense from the reports alone, the logs almost always contain the answer.

Software architecture6 min read

Row-level security for multi-tenant Postgres

Tenant isolation that depends on every developer remembering a WHERE clause has a defect rate above zero, and the defect is a cross-tenant data leak. Row-level security moves the boundary into the database, so a query that forgets the filter returns nothing instead of returning somebody else's rows.

Software architecture6 min read

Schema migrations without taking every tenant down

In a shared-schema product, one bad migration affects every customer at once. The discipline that prevents it is expand-and-contract: add the new shape, write to both, backfill, switch reads, and only remove the old shape in a later release — never in the same one.

Security6 min read

Secrets management, and what to do the morning a key leaks

Every team has a story about a key in a repository. The interesting question is not how it got there but what happened next — and most teams discover at that moment that they cannot rotate the credential without downtime, do not know everywhere it was used, and have no way to tell whether it was exploited.

Software architecture6 min read

Self-service tenant provisioning that does not need an engineer

A product where onboarding a customer requires manual database work is not yet a product — it is a service with a login page. Provisioning is the boundary: everything a new tenant needs must be created automatically, atomically enough to be safe, and recoverably enough that a half-finished signup is not a support ticket.

Search visibility6 min read

SEO, AEO and GEO: why the foundation comes first

SEO optimises a page's standing in a ranked list. AEO optimises whether a passage can be extracted as a direct answer. GEO optimises whether a generative system describes your organisation accurately and cites you. All three depend on the same technical foundation, which is why the foundation is where the work should start.

Security6 min read

Sessions: the part of authentication that is usually wrong

Login is the part teams test. The session is the part attackers use. A correct password check followed by a token in local storage, no rotation on privilege change, and a logout that only clears the client leaves an authentication system that works perfectly and protects very little.

Mobile6 min read

Shipping mobile: the release you cannot take back

Web deployment has a rollback button. Mobile does not: once a build is installed, it is on the device until the user updates, and some of them never will. That single constraint changes what a release process has to do — every mistake ships to people who cannot be reached.

Search visibility6 min read

Structured data that earns its place

Structured data is worth implementing when it describes something the page genuinely shows and a consuming system genuinely uses. Generate it from the same data that renders the page, keep it to types the content supports, and treat any mismatch between markup and visible content as a defect.

Data engineering6 min read

Testing data, not just the code that moves it

A data pipeline can be fully covered by unit tests and still deliver wrong numbers, because the code was correct and the data was not. The transform did exactly what it was told with a column that started arriving null three weeks ago, and nothing in the test suite was looking at the data.

Security6 min read

Threat modelling in an hour, with four questions and a whiteboard

Threat modelling has a reputation for heavyweight documents nobody reads. The useful version is a one-hour conversation over a diagram, answering four questions, producing a short list of decisions — and it catches the class of flaw that no scanner will ever report, because the code is working exactly as written.

Data engineering6 min read

Warehouse performance: the scan you did not need to run

In a columnar warehouse, cost and latency are usually the same variable wearing two labels. Both are driven by how many bytes the engine had to read, and most of what it read was eliminated by a filter it applied afterwards — which means the work was done and then thrown away.

Accessibility6 min read

WCAG 2.2 AA in practice, past what the scanner finds

Automated accessibility testing catches a lot and misses whole categories. In GOV.UK's test of ten tools against 143 known barriers, 29% were missed by every tool. What they miss are judgement calls — whether alt text is meaningful, whether focus order is logical, whether an error message actually tells someone what to fix. Those need a person and about twenty minutes.

Software architecture6 min read

What enterprise buyers ask before they sign

Enterprise deals are not usually lost on features. They stall in procurement, on a security questionnaire asking for single sign-on, exportable audit logs, a stated recovery objective and a data-residency answer — none of which can be retrofitted in the two weeks before a renewal deadline.

Generative engines6 min read

What makes a source worth citing

When a system composes an answer from several sources, it is choosing. Nobody publishes the criteria, but the pattern is legible from the outcome: sources that say something specific, attributable and checkable get named, and sources that competently restate the consensus get absorbed into it without attribution.

Software delivery6 min read

What you should own when a build ends

The test of a completed software project is not whether it works. It is whether a different team could take it over next month without asking the original supplier for anything. Most projects fail that test, and the failure is usually discovered at the exact moment the relationship has already deteriorated.

Cloud6 min read

Where cloud spend actually goes, and the four lines worth reading

Cloud bills are itemised in units nobody thinks in. A team asks why the bill doubled and receives four hundred line items denominated in GB-months and request-units, which is why the usual response is either to accept it or to cut something visible and hope. Both are avoidable with an afternoon of attribution work.

Software delivery6 min read

Writing a scope that survives contact with the build

Most software disputes are not about quality. They are about two parties holding different beliefs about what was agreed, both sincerely, because the document said "user management" and neither wrote down what that included. The fix is not a longer document — it is a differently shaped one.

Answer engines6 min read

Writing passages an answer engine can lift

An answer engine does not extract your page. It extracts one passage from it. That changes what good writing means at the paragraph level: each passage has to survive being removed from its surroundings and still answer the question on its own.

Disagree with something here?

Good — that is the point of publishing reasoning rather than claims. If one of these arguments does not hold in your context, we would rather hear it than not.

Prefer email? hello@kornspire.com