Get in touch
Blog

Engineering notes from 9io.

How we build products, AI systems and trading infrastructure — and what we learn on the way. Written by the people who do the work, with the sources linked.

Every major LLM API compared on price and benchmarks (October 2026)

Prices per million tokens, independent benchmark scores, speed and context limits for 23 models from 11 labs, with worked cost examples. As of 8 October 2026.

8 October 2026 · 16 min read

What EU and California law now require of AI-generated content

Article 50 of the EU AI Act and California’s AI Transparency Act took effect on 2 August 2026. What product teams must build, and by when.

8 October 2026 · 13 min read

AI agent containment lessons from the summer 2026 incidents

Lab agents reached real systems and MCP tools turned on their users. What failed in each 2026 incident, and the controls to enforce outside the model.

8 October 2026 · 12 min read

Three Amplify Hosting limits our Next.js BFF only hit in production

A 6 MB response cap, an 8 KB URL limit and a localhost origin broke parts of our Next.js BFF on AWS Amplify. What we saw, the fixes, and how to test early.

7 October 2026 · 11 min read

Comparing FashionSigLIP, CLIP and DINOv2 for visual product search

On 60 real cases, FashionSigLIP put the right product in the top five 63% of the time, against 38% for CLIP and 23% for DINOv2. The pipeline and the test.

6 October 2026 · 9 min read

Migrating MCP servers and clients to the stateless 2026-07-28 spec

MCP’s 2026-07-28 revision drops sessions and the initialize handshake. What breaks, which clients support it in October 2026, and how to migrate safely.

6 October 2026 · 13 min read

How we halved an AI stylist’s latency, and when hedging stops paying

A streaming AI stylist went from a 30 s median response to 13 to 15 s. The four changes, how we measured them, and why hedged requests stopped paying.

6 October 2026 · 11 min read

Rate limits, holidays and atomic writes in our market data layer

How we fetch daily prices for US and Indian stocks without tripping Yahoo’s limits, how we tell an NSE holiday from a missing file, and what we haven’t fixed.

5 October 2026 · 14 min read

The look-ahead bias our backtester prevents, and the leaks it misses

Our daily backtester shows its detectors only past bars and fills stops pessimistically. What still leaks in, and a checklist for building your own.

5 October 2026 · 15 min read

How a backfill bug ran up a $1,100 LLM vision bill

A job re-classified items it had already classified: 419,057 vision calls and about $1,100. What went wrong, and the guardrails that catch it early.

2 October 2026 · 10 min read

How AI image pipelines fail quietly, and how to catch it

A Gemini try-on that took nearly two minutes to fail, product cutouts saved onto black, and the retry, cache and alpha fixes for each.

2 October 2026 · 11 min read

Grounding a study assistant in live web search and the course itself

A web mode that never searched, an SDK that turned 429s into AttributeErrors, and the numbers from answering with a whole course in the context.

1 October 2026 · 11 min read

How we pinned down four intermittent bugs in React 19 and Python

Four bugs in a React 19 and Python stack that failed only some of the time, the condition behind each, and how we made each one show up on demand.

30 September 2026 · 10 min read

What we learned building a voice tutor that draws while it talks

What broke in three versions of a voice tutor that draws as it talks, built on OpenAI’s Realtime API and GPT-Live, and the API details behind each problem.

29 September 2026 · 11 min read

How we cut an AI assistant’s time to first word to 3 seconds

An in-app AI assistant took 20 to 30 seconds to start answering. Putting its context in the prompt and forcing fewer tool calls got it to about 3 seconds.

29 September 2026 · 10 min read

How redux-persist’s PersistGate emptied our Next.js server HTML

Our public Next.js pages returned 200 with full head tags, but each body was a 1 KB loading screen. Why PersistGate did it, the fix, and how to check yours.

26 September 2026 · 7 min read

Making one MCP server work in Claude, ChatGPT, Cursor and VS Code

What broke when one remote MCP server met Claude, ChatGPT, Cursor, VS Code and command-line clients, and the OAuth and version fixes behind each.

26 September 2026 · 13 min read

Encoding transparent WebM with WebCodecs when alpha isn’t supported

Chrome’s VideoEncoder rejects alpha. Encode colour and alpha as two VP9 streams and join them in WebM BlockAdditions with a small hand-written muxer.

25 September 2026 · 12 min read

Order safety by default in code that can place trades

How 9io Alpha keeps order code safe with paper ports, dry runs, order caps and broker-side exits, and the cancel-then-sell race we still have to fix.

15 September 2026 · 14 min read

Guarding an LLM research pipeline with two reviews and a judge

How 9io Alpha checks every model answer with two differently prompted reviews, a judge, rule-based checks and a fallback for when the model fails.

15 September 2026 · 13 min read

How we built the 9io.ai blog on Markdown files and FastAPI

Markdown files and one Python module run the 9io.ai blog, with JSON-LD, canonical URLs, a sitemap, RSS and llms.txt built in. How it works and what we’d change.

10 September 2026 · 8 min read

Caching server-rendered Next.js HTML at the edge, by device type

We cached a Next.js storefront’s HTML on Cloudflare, split by device type. Cached pages come back in about 70 ms; mobile PageSpeed rose from 65 to 87.

8 September 2026 · 16 min read

Why cosine similarity couldn’t decide which textbook topics to merge

Distinct topics scored 0.67 to 0.91 and reworded duplicates 0.70 to 0.94, so no threshold worked. How we merge topics when turning textbooks into courses.

1 September 2026 · 12 min read

Why our LLM pipeline reported 0 dropped while most output was missing

A course build shipped 26 of 51 diagrams and reported 0 dropped. How a per-call limiter, 429s and deadlines hid the gap, where tokens went, and the fixes.

1 September 2026 · 11 min read