57,803 blogs · [
{
"id": "01a0d994-f735-717f-92f6-7eb54d69a6df",
"title": "BI is back in its era of ferment",
"url": "https://lindfors.no/blog/two-defensible-answers/",
"published_at": "2026-09-22T00:00:00+00:00"
},
{
"id": "01a0bb4d-9e6a-72f1-a18b-3fac55aa0f3a",
"title": "An early-access test of TypeSafe's Jev: calibrated judgments for half a cent",
"url": "https://lindfors.no/blog/a-first-look-at-typesafes-jev/",
"published_at": "2026-09-18T00:00:00+00:00"
},
{
"id": "01a0bb4d-9e6a-72f1-a18b-3fac55d2cfea",
"title": "Audio on a static site: build-time TTS and the script it reads from",
"url": "https://lindfors.no/blog/audio-on-a-static-site/",
"published_at": "2026-09-15T00:00:00+00:00"
},
{
"id": "01a0879a-fc57-72f5-ba25-13fbff905995",
"title": "A subscribe button does not need a Worker",
"url": "https://lindfors.no/blog/newsletter-on-my-own-server/",
"published_at": "2026-09-08T00:00:00+00:00"
},
{
"id": "01a0879a-fc57-72f5-ba25-13fbffa2dc03",
"title": "Why none of the 1,200 agents that hacked Hugging Face called a human",
"url": "https://lindfors.no/blog/swarm-with-no-gene-pool/",
"published_at": "2026-09-04T00:00:00+00:00"
},
{
"id": "01a0879a-fc58-719e-9191-8c64005f0859",
"title": "Reader analytics, kept to myself",
"url": "https://lindfors.no/blog/reader-analytics/",
"published_at": "2026-09-03T00:00:00+00:00"
},
{
"id": "01a0879a-fc58-719e-9191-8c6400e9587d",
"title": "Measuring what a coding agent actually costs",
"url": "https://lindfors.no/blog/what-my-coding-agent-costs/",
"published_at": "2026-08-13T00:00:00+00:00"
},
{
"id": "01a0879a-fc58-719e-9191-8c640169df45",
"title": "Forking Codex to talk to any endpoint",
"url": "https://lindfors.no/blog/forking-codex-for-any-endpoint/",
"published_at": "2026-07-14T00:00:00+00:00"
},
{
"id": "01a0879a-fc58-719e-9191-8c6401fe153b",
"title": "Exploring LLMs so our customers don't have to",
"url": "https://lindfors.no/blog/which-llm-are-we-allowed-to-use/",
"published_at": "2026-06-30T00:00:00+00:00"
},
{
"id": "01a0879a-fc58-719e-9191-8c64026bfd97",
"title": "One-click unsubscribe needs a URL per reader and a DKIM tag",
"url": "https://lindfors.no/blog/newsletter-one-click-unsubscribe/",
"published_at": "2026-05-26T00:00:00+00:00"
},
{
"id": "01a0879a-fc58-719e-9191-8c6402ad65da",
"title": "Images on a static site: tradeoffs, limits, and a 150-line Rust optimizer",
"url": "https://lindfors.no/blog/images-on-a-static-site/",
"published_at": "2026-04-14T00:00:00+00:00"
},
{
"id": "01a0879a-fc58-719e-9191-8c64032d425e",
"title": "Proper citations on a static site: Zotero, Rust, and Typst",
"url": "https://lindfors.no/blog/citations-on-a-static-site/",
"published_at": "2026-03-10T00:00:00+00:00"
},
{
"id": "01a0879a-fc58-719e-9191-8c6403f9e706",
"title": "Self-hosting email is not that hard anymore",
"url": "https://lindfors.no/blog/self-hosted-newsletter/",
"published_at": "2026-02-18T00:00:00+00:00"
},
{
"id": "01a0879a-fc58-719e-9191-8c6404751f97",
"title": "I use Typst to generate PDFs of my blog posts and my CV",
"url": "https://lindfors.no/blog/typst-for-blogging/",
"published_at": "2026-02-14T00:00:00+00:00"
},
{
"id": "01a0879a-fc58-719e-9191-8c640488a97e",
"title": "Zola has no plugins, so this blog grew a Rust CLI",
"url": "https://lindfors.no/blog/building-a-personal-blog-with-zola/",
"published_at": "2026-01-27T00:00:00+00:00"
}
] posts Claim your blog