# Nino Kroesen > Personal site and blog of Nino Kroesen: writing about AI, tooling, and building software, plus a lab of small tools built to answer one question each. Dutch on ninokroesen.nl, English on ninokroesen.com. This file is a machine index. Every page above is also served as markdown: append `.md` to the path (the home page is `/index.md`), or send `Accept: text/markdown`. The `.md` URLs are the cacheable ones. Labels here are English; post titles are in the host's locale (en). ## Pages - [Home](https://ninokroesen.com/): markdown at https://ninokroesen.com/index.md - [Blog index (all posts)](https://ninokroesen.com/blog): markdown at https://ninokroesen.com/blog.md - [Library — longer SEO guides](https://ninokroesen.com/library): markdown at https://ninokroesen.com/library.md - [Takes — short news commentary](https://ninokroesen.com/takes): markdown at https://ninokroesen.com/takes.md - [Projects](https://ninokroesen.com/projects): markdown at https://ninokroesen.com/projects.md - [About](https://ninokroesen.com/about): markdown at https://ninokroesen.com/about.md - [Lab — index of the experiments](https://ninokroesen.com/lab): markdown at https://ninokroesen.com/lab.md - [Hourly — a project](https://ninokroesen.com/hourly): markdown at https://ninokroesen.com/hourly.md - [Bitvested — a project](https://ninokroesen.com/bitvested): markdown at https://ninokroesen.com/bitvested.md - [ta.js — a project](https://ninokroesen.com/ta): markdown at https://ninokroesen.com/ta.md ## Laboratory - [Text as PNG](https://ninokroesen.com/render-text-as-png): Renders markdown or plain text into one dense PNG using a bundled 5x8 bitmap font. Built for vision models: the same text usually costs fewer input tokens as an image than as text, and the response reports both estimates. POST /api/render-text-as-png, GET /api/render-text-as-png. MCP tool `render_text_as_png`. Full machine description: https://ninokroesen.com/lab/api.json - [unslopf](https://ninokroesen.com/unslopf): Mechanical n-gram analysis (no LLM) over markdown you pass in, page URLs, or a sitemap. Returns the phrases that recur in that corpus but are not distinctive to it — a negative-keyword list to push a classifier away from filler — with document-frequency counts and a ready-to-paste prompt block. It compares documents against each other, so the corpus needs at least two: a single text has nothing to recur against and comes back empty. POST /api/unslopf, GET /api/unslopf. MCP tool `unslopf_negative_keywords`. Full machine description: https://ninokroesen.com/lab/api.json - [Appel & Ei Index](https://ninokroesen.com/appel-en-ei): What one apple and one egg cost per Dutch supermarket chain, and the weighted national index built from them. Read-only: there is nothing to call, only data to read. GET /appel-en-ei.json. Full machine description: https://ninokroesen.com/lab/api.json ## Writing - [Spec-driven development is getting slow](https://ninokroesen.com/blog/spec-driven-development-is-getting-slow): 2026-08-22 — Full spec-and-review ceremony on every task slowed the build to a crawl, so I forked superpowers into two speed lanes. The audit put a number on it: 27 subagent runs for 11 tasks, one fix loop eating 22 percent of them. Upstream shipped its own router a day after my routing change, so the problem was real. - [Building an autoresearch lab I can actually watch](https://ninokroesen.com/blog/building-an-autoresearch-lab-i-can-actually-watch): 2026-08-15 — For the past six weeks a machine I built has been doing part of my quant research for me. It proposes a hypothesis, writes the strategy itself, backtests it across twelve out-of-sample windows, and tells me which ideas are dead. It has run around 700 experiments and nothing has survived holdout. That reads like a verdict on autoresearch and it is not one, it is a verdict on my harness. - [ta v2.0.0: three libraries on one audited spec](https://ninokroesen.com/blog/ta-v200-three-libraries-on-one-audited-spec): 2026-05-14 — ta.js, ta.py, and ta.go now agree on what an RSI is supposed to return. v2.0.0 ships them at the same version with a comparative bench in each language. - [Two weeks of agentic coding into a paywalled SaaS category](https://ninokroesen.com/blog/two-weeks-of-agentic-coding-into-a-paywalled-saas-category): 2026-05-06 — I built Hourly in two weeks with agentic coding to test whether a paywalled SaaS category — WorkingHours, Toggl, Timery — is still defensible. - [Magento's _cl tables had 902 million rows](https://ninokroesen.com/blog/magentos-_cl-tables-had-902-million-rows): 2026-04-26 — Magento 2's indexer cannot drain its changelog tables fast enough at 800K products. Here is the cron I run nightly, and why no Magento expert found it. - [A hundred technical indicator functions in JavaScript](https://ninokroesen.com/blog/a-hundred-technical-indicator-functions-in-javascript): 2026-04-26 — My first opensource project is a technicalanalysis library called — around a hundred indicator functions in JavaScript, first commit on 20200824, v1.17.0 shipped earlier this week. I started it… - [A diamond painting shop the code could not save](https://ninokroesen.com/blog/a-diamond-painting-shop-the-code-could-not-save): 2026-04-26 — I built a custom Node webshop for personalized diamond paintings, sold one canvas, and shut it down inside a month. The supplier was the bottleneck. - [The adoption gap](https://ninokroesen.com/blog/the-adoption-gap): 2026-04-25 — I changed my mind about agentic coding loops. Most of my work this year was built next to one — and the honest read on what it lifts and what it leaves behind. - [A research pipeline for the internet-shaped part of the decision](https://ninokroesen.com/blog/a-research-pipeline-for-the-internet-shaped-part-of-the-decision): 2026-04-20 — I built a 5-stage pipeline over 177K Dutch e-commerce domains to pick a niche. V1 picked one. The shop died in operations the pipeline couldn't see. - [An agent built around not calling the LLM](https://ninokroesen.com/blog/an-agent-built-around-not-calling-the-llm): 2026-04-19 — A personal agent built so the default question every tick is whether the model needs to be called, and an architecture where the answer is usually no. - [Introduction](https://ninokroesen.com/blog/introduction): 2026-04-17 — I'm Nino Kroesen, operator-developer in the Achterhoek. The site covers production systems, slow-feedback research, and shipped independent experiments. ## Machine endpoints - [MCP server](https://ninokroesen.com/mcp): Streamable HTTP, JSON-RPC 2.0, POST only. Tools: `render_text_as_png`, `unslopf_negative_keywords`. - [Lab API description](https://ninokroesen.com/lab/api.json): every machine-callable lab endpoint with its parameters, limits, and error codes. - [Full text](https://ninokroesen.com/llms-full.txt): this index plus the body of every post listed above, in markdown. - [Sitemap](https://ninokroesen.com/sitemap.xml), [RSS](https://ninokroesen.com/rss.xml). ## Notes - Quotes should link to the canonical URL of the page they came from. - Machine access is rate-limited per caller and can be switched off server-side: expect `429` with `Retry-After` when throttled, `503` when a lab service is off. - Admin, preview, and analytics paths are excluded here on purpose; nothing behind them is public.