Archive
Everything, newest first.
84 posts
2026
- , 2026Putting a Three.js island inside a static site
- , 2026Morse code: one table, two ambiguities, three details
- , 2026An opponent that predicts the bounce, but not too well
- , 2026Volume without a modelling tool: triangulating an island by hand
- , 2026Twelve hundred instances: squeezing a garden into a few draw calls
- , 2026Lighting one scene: three lamps and a shadow map computed once
- , 2026Water from two shaders: a pool, a stream and a waterfall
- , 2026The loading budget for 3D: split the chunk, load on visibility, know when to stop
- 0, 2026Atomic file writes: write a temp file, then rename
- 0, 2026Base64: it is neither encryption nor compression
- 0, 2026Misusing big O: constants and preconditions decide more than the order
- 0, 2026Using @layer to make CSS precedence a declared order, not a specificity fight
- 0, 2026Debounce vs throttle: the difference is who decides when to run
- 0, 2026Estimating work: why "about three days" becomes three weeks
- 0, 2026Feature flags are debt, not configuration
- 0, 2026The game loop: why delta time is not optional
- 0, 2026git bisect: turn which commit broke it into one command
- 0, 2026Gomoku AI: splitting threat detection from search
- 0, 2026Graceful shutdown: the exit sequence decides between 502s and clean responses
- 0, 2026HTTP caching: Cache-Control and ETag each own half
- 0, 2026Idempotency keys: the one write that makes retries safe
- 0, 2026JSON canonicalization: why the same object hashes two ways
- 0, 2026Memory layout: the same algorithm, ten times slower, is usually cache
- 0, 2026Deadlock: break any one of four conditions
- 0, 2026The N+1 query: the most typical ORM performance trap
- 0, 2026Rate limiting: what token bucket and leaky bucket really differ on
- 0, 2026Catastrophic backtracking: why a regex can pin a CPU
- 0, 2026iframe sandbox: it narrows capability, it does not harden
- 0, 2026Semantic versioning: a major bump promises no silent behavior change
- 0, 2026SQLite indexes: the leftmost prefix is a consequence of sorting
- 0, 2026What technical debt interest actually looks like
- 0, 2026Time zones and DST: store UTC, or daylight saving will bite
- 0, 2026Turning an AI search into a tree you can page through
- 0, 2026Unicode normalization: why two identical-looking strings differ
- 0, 2026URL encoding: spaces, plus signs and double encoding
- 0, 2026Four places Chinese chess rules go wrong
- 9, 2026Writing a cron parser: five fields, the union rule, and February 30th
- 9, 2026CSV is not split on commas: quoting and newlines from RFC 4180
- 9, 2026Legal moves in Reversi: eight directions, one scan
- 9, 2026A sudoku generator: digging holes, unique solutions, and the bug that froze the page
- 8, 2026Consistent hashing: why adding a machine does not reshuffle every key
- 8, 2026Winning at Gomoku: checking the last stone is enough
- 8, 2026Sliding windows: decide what the window tracks before writing the loop
- 7, 2026Monotonic stacks: next greater element in O(n), not O(n squared)
- 7, 2026Counting the ones in a binary number: from loops to SWAR
- 7, 2026Union-find: two lines of optimisation make every operation near constant
- 6, 2026In Rust, context belongs on the line that actually fails
- 6, 2026When a crate should become a workspace
- 6, 2026Structured logging is not println replaced by tracing::info
- 5, 2026Islands are not Web Components: two different kinds of on-demand loading
- 5, 2026Cache headers for a static site: hashed files forever, HTML never
- 5, 2026When WebAssembly earns its place: less often than the pitch suggests
- 4, 2026Anchors hidden behind a sticky header: one scroll-padding-top for the whole site
- 4, 2026Use the native dialog element: you get more than you think
- 4, 2026Dark mode forms stay white: color-scheme is the switch
- 4, 2026Stop guessing the header height: measure it with ResizeObserver
- 3, 2026Design tokens: one file that runs the whole site
- 2, 2026Manual i18n: what hand-rolling three languages costs
- 1, 20262048: collapsing four directions into one operation
- 9, 2026Minesweeper: deferring mine placement until the first click
- 8, 2026Turning screen-printing limits into design tokens
- 7, 2026Base and unit conversion: temperature is the only non-linear one
- 5, 2026Color and contrast: relative luminance is not an average
- 4, 2026Full-text search on a static site: index at build time, no backend at runtime
- 3, 2026Hash and checksum: why CRC32 and MD5 have to be written by hand
- 1, 2026Regex Lab: hits, groups, replacement preview, and the zero-width trap
- , 2026JSON Studio: format, validate and diff in one page
- , 20261059 assertions, no test framework: why pure logic must import nothing
- , 2026SharePoint deserialisation RCE: CVE-2026-45659
- , 2026n8n unauthenticated RCE (Ni8mare): CVE-2026-21858
- , 2026Cisco FMC unauthenticated Java deserialisation RCE: CVE-2026-20131
- , 2026Pushing first-load JS to zero with Astro islands
- 0, 2026Next.js incremental cache path traversal to RCE: CVE-2026-75604
- 8, 2026React Router prototype pollution chained into RCE: CVE-2026-42211
- 7, 2026One source for head: SiteHead, JSON-LD escaping and hreflang
- 4, 2026Shipping a static site is not "upload the folder": caching, compression, honest 404s
- 2, 2026A theme-switch ripple with the View Transitions API
- 9, 2026Pagination at build time: why a static site should not page with a query string
- 6, 2026The @/ alias lives in three configs, and all three are required
- 3, 2026zod as a frontmatter contract: bad articles fail the build
- 1, 2026Why I built yet another personal site
- , 2026A zero-config registry: adding a game means adding a directory
- , 2026No client:only for app pages: a static shell plus an explicit mount
- , 2026Views hold no logic: all data assembly lives in src/server
