AI

Playwright’s PDF export is 96 dpi, not 72

Environment: Playwright 1.62, bundled headless Chromium, Linux. The cover this came out of went to print in 2026.Last ti...
AI

Typesetting a print-ready paperback with HTML and WeasyPrint

Environment: WeasyPrint (system Python 3, not the venv), CSS Paged Media, B5 trim. The interiors described here went to ...
AI

Check the reading before you synthesise: a local Japanese TTS on WSL

Environment: AivisSpeech Engine 1.2.0, Linux x64 build, running inside WSL2 on Windows. Node.js 20, Python 3, ffmpeg. In...
AI

OpenAI’s TTS silently drops the tail of long inputs

Environment: gpt-4o-mini-tts and whisper-1 via the OpenAI HTTP API, Node.js 20, ffmpeg. Measured July–August 2026.We pro...
AI

The writer never grades its own work

Environment: Claude Code (Opus), Node.js 20. Two subagents defined as Markdown files with YAML front matter.Ask a model ...
AI

Split the word list before you generate, not after

Environment: Node.js 20, Claude Code (Opus). The allocation script is 184 lines with no dependencies.A drill book has te...
AI

Don’t let the model judge difficulty: a vocabulary allow-list, checked by machine

Environment: Node.js 20, Claude Code (Opus). The checks are plain ES modules in the same repository as the manuscripts —...
AI

Four Claude Code subagents that write our exam-prep books

Environment: Claude Code (Opus), Node.js 20, macOS/WSL. Everything below runs from a single git repository.We publish En...
django

Customize Django Admin: record name, order, search box and editable field

A central feature of Django is the Admin Panel.In this article, I will describe how to customize the Admin Panel and mak...
django

Django: How to Route Multiple Apps in 1 project

Folder structureWhen routing Django's website, always needs to be aware of the location of the templates you have placed...