41554 blogs · [ { "id": "01a09534-a1b4-70b3-80f2-90ef871a57ad", "title": "Very niche software, part 2", "url": "https://philbooth.me/blog/very-niche-software-part-2/", "published_at": "2026-09-11T14:00:00+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb058b4d6", "title": "Very niche software, part 1", "url": "https://philbooth.me/blog/very-niche-software-part-1/", "published_at": "2026-08-30T09:57:00+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb0a58330", "title": "Agentic coding and mental models", "url": "https://philbooth.me/blog/agentic-coding-and-mental-models/", "published_at": "2026-06-11T08:00:00+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb1521789", "title": "Pawno: terminal pleasure", "url": "https://philbooth.me/blog/pawno-terminal-pleasure/", "published_at": "2026-02-03T05:10:00+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb1ed59c0", "title": "Three ways to shoot yourself in the foot with Google Cloud Run", "url": "https://philbooth.me/blog/three-ways-to-shoot-yourself-in-the-foot-with-cloud-run/", "published_at": "2024-12-08T10:00:00+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb292af85", "title": "Concurrency diagrams", "url": "https://philbooth.me/blog/concurrency-diagrams/", "published_at": "2024-11-30T13:40:52+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb35ba2b3", "title": "Node.js async the right way", "url": "https://philbooth.me/blog/nodejs-async-the-right-way/", "published_at": "2024-06-09T09:00:00+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb3a224cb", "title": "Status games", "url": "https://philbooth.me/blog/status-games/", "published_at": "2024-05-27T10:33:23+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb487d0bd", "title": "The art of good code review", "url": "https://philbooth.me/blog/the-art-of-good-code-review/", "published_at": "2024-01-29T08:42:48+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb55a4cd4", "title": "Vector search for dummies", "url": "https://philbooth.me/blog/vector-search-for-dummies/", "published_at": "2023-09-03T19:15:00+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb5a8a1db", "title": "Lessons learned from integrating with GPT in production", "url": "https://philbooth.me/blog/lessons-learned-from-integrating-with-gpt-in-production/", "published_at": "2023-08-05T12:57:23+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb64d7693", "title": "Four ways to shoot yourself in the foot with Redis", "url": "https://philbooth.me/blog/four-ways-to-shoot-yourself-in-the-foot-with-redis/", "published_at": "2023-07-29T11:49:11+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb688f9dc", "title": "Nine ways to shoot yourself in the foot with PostgreSQL", "url": "https://philbooth.me/blog/nine-ways-to-shoot-yourself-in-the-foot-with-postgresql/", "published_at": "2023-04-23T08:38:17+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb7867705", "title": "Six ways to shoot yourself in the foot with healthchecks", "url": "https://philbooth.me/blog/six-ways-to-shoot-yourself-in-the-foot-with-healthchecks/", "published_at": "2023-03-26T13:13:33+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb84f0234", "title": "How to evaluate dependencies", "url": "https://philbooth.me/blog/how-to-evaluate-dependencies/", "published_at": "2023-02-25T15:20:51+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb8550c76", "title": "How to debug", "url": "https://philbooth.me/blog/how-to-debug/", "published_at": "2023-01-22T23:11:31+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb8af6d0d", "title": "Some useful, non-obvious Postgres patterns", "url": "https://philbooth.me/blog/some-useful-non-obvious-postgres-patterns/", "published_at": "2022-10-16T13:07:44+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb90bbe19", "title": "Things my dog taught me about software development", "url": "https://philbooth.me/blog/things-my-dog-taught-me-about-software-development/", "published_at": "2021-10-16T10:54:54+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb961562a", "title": "Passing the WSET Level 3 Award in Wines", "url": "https://philbooth.me/blog/passing-the-wset-level-3-award-in-wines/", "published_at": "2019-09-08T09:59:35+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bb9dd9cc8", "title": "Build a better release script", "url": "https://philbooth.me/blog/build-a-better-release-script/", "published_at": "2019-06-05T12:17:40+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bba56f57b", "title": "FxA monorepo migration", "url": "https://philbooth.me/blog/fxa-monorepo-migration/", "published_at": "2019-05-04T12:16:20+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bba99875f", "title": "Interactive bulk editing with vim macros", "url": "https://philbooth.me/blog/interactive-bulk-editing-with-vim-macros/", "published_at": "2019-03-03T08:30:59+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bbb5ce851", "title": "Back-off and retry using JavaScript arrays and promises", "url": "https://philbooth.me/blog/back-off-and-retry-using-javascript-arrays-and-promises/", "published_at": "2019-02-02T14:04:27+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bbc573d51", "title": "2018 retrospective", "url": "https://philbooth.me/blog/2018-retrospective/", "published_at": "2019-01-20T19:10:45+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bbd24d572", "title": "Gadget review: Polar Flow M430 vs Garmin Forerunner 645", "url": "https://philbooth.me/blog/gadget-review-polar-flow-m430-vs-garmin-forerunner-645/", "published_at": "2019-01-13T13:05:21+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bbde04c17", "title": "Passing the WSET Level 2 Award in Wines and Spirits", "url": "https://philbooth.me/blog/passing-the-wset-level-2-award-in-wines-and-spirits/", "published_at": "2019-01-05T12:17:39+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bbe201f97", "title": "Custom assertions using Rust macros", "url": "https://philbooth.me/blog/custom-assertions-using-rust-macros/", "published_at": "2018-10-21T17:35:40+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bbe72f1eb", "title": "Automating MySQL EXPLAIN checks", "url": "https://philbooth.me/blog/automating-mysql-explain-checks/", "published_at": "2018-09-17T15:52:30+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bbede9d0f", "title": "Refactoring with Rust macros", "url": "https://philbooth.me/blog/refactoring-with-rust-macros/", "published_at": "2018-08-12T12:54:12+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bbfbf10da", "title": "Bye Dad", "url": "https://philbooth.me/blog/bye-dad/", "published_at": "2018-06-17T11:21:34+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bc03ec8e7", "title": "The elegance of Rust", "url": "https://philbooth.me/blog/the-elegance-of-rust/", "published_at": "2018-05-16T10:04:26+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bc09e0975", "title": "Parsing individual data items from huge JSON streams in Node.js", "url": "https://philbooth.me/blog/parsing-individual-data-items-from-huge-json-streams-in-nodejs/", "published_at": "2018-03-30T20:44:08+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bc14dab84", "title": "Showing how poor performance affects user behaviour", "url": "https://philbooth.me/blog/showing-how-poor-performance-affects-user-behaviour/", "published_at": "2017-11-08T07:18:22+00:00" }, { "id": "01a087c1-3a96-7080-9280-8f5bc24c5f13", "title": "wset", "url": "https://philbooth.me/blog/tags/wset/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc2b4b54a", "title": "wine", "url": "https://philbooth.me/blog/tags/wine/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc2c0d3d4", "title": "web-performance", "url": "https://philbooth.me/blog/tags/web-performance/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc34d9ef5", "title": "vim", "url": "https://philbooth.me/blog/tags/vim/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc36c04cd", "title": "vectors", "url": "https://philbooth.me/blog/tags/vectors/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc4183447", "title": "traits", "url": "https://philbooth.me/blog/tags/traits/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc4937123", "title": "tools", "url": "https://philbooth.me/blog/tags/tools/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc4b8124d", "title": "text-editors", "url": "https://philbooth.me/blog/tags/text-editors/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc4dc2624", "title": "testing", "url": "https://philbooth.me/blog/tags/testing/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc541c820", "title": "teams", "url": "https://philbooth.me/blog/tags/teams/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc5a0a736", "title": "system-design", "url": "https://philbooth.me/blog/tags/system-design/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc68df890", "title": "streams", "url": "https://philbooth.me/blog/tags/streams/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc6fe7519", "title": "status", "url": "https://philbooth.me/blog/tags/status/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc7b817a1", "title": "startups", "url": "https://philbooth.me/blog/tags/startups/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc7bd3c42", "title": "sql", "url": "https://philbooth.me/blog/tags/sql/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc84fc673", "title": "shell", "url": "https://philbooth.me/blog/tags/shell/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc8952708", "title": "search", "url": "https://philbooth.me/blog/tags/search/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc8d16796", "title": "rust", "url": "https://philbooth.me/blog/tags/rust/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bc9c0537a", "title": "running", "url": "https://philbooth.me/blog/tags/running/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bca04599a", "title": "reviews", "url": "https://philbooth.me/blog/tags/reviews/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bca1d0c0c", "title": "refactoring", "url": "https://philbooth.me/blog/tags/refactoring/", "published_at": null }, { "id": "01a087c1-3a96-7080-9280-8f5bcad610f2", "title": "redis", "url": "https://philbooth.me/blog/tags/redis/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6edafb93c6", "title": "recursion", "url": "https://philbooth.me/blog/tags/recursion/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6edb242203", "title": "promises", "url": "https://philbooth.me/blog/tags/promises/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6edb86113b", "title": "postgres", "url": "https://philbooth.me/blog/tags/postgres/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6edbcbab48", "title": "personal", "url": "https://philbooth.me/blog/tags/personal/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6edbda3d38", "title": "nodejs", "url": "https://philbooth.me/blog/tags/nodejs/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6edbf112d2", "title": "mysql", "url": "https://philbooth.me/blog/tags/mysql/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6edc743e59", "title": "mozilla", "url": "https://philbooth.me/blog/tags/mozilla/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6edc828e0d", "title": "monorepo", "url": "https://philbooth.me/blog/tags/monorepo/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6edd38e89a", "title": "mentoring", "url": "https://philbooth.me/blog/tags/mentoring/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6eddd11779", "title": "macros", "url": "https://philbooth.me/blog/tags/macros/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6eddfa9f11", "title": "linting", "url": "https://philbooth.me/blog/tags/linting/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ede71e083", "title": "json", "url": "https://philbooth.me/blog/tags/json/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6edf27f4d1", "title": "javascript", "url": "https://philbooth.me/blog/tags/javascript/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee01fa352", "title": "how-to", "url": "https://philbooth.me/blog/tags/how-to/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee07513c8", "title": "healthchecks", "url": "https://philbooth.me/blog/tags/healthchecks/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee08ee24a", "title": "gpt", "url": "https://philbooth.me/blog/tags/gpt/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee15f7a76", "title": "go", "url": "https://philbooth.me/blog/tags/go/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee216983f", "title": "gcp", "url": "https://philbooth.me/blog/tags/gcp/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee289d509", "title": "games", "url": "https://philbooth.me/blog/tags/games/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee2d17308", "title": "gadgets", "url": "https://philbooth.me/blog/tags/gadgets/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee3a38f92", "title": "fxa", "url": "https://philbooth.me/blog/tags/fxa/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee430627a", "title": "extreme-learning", "url": "https://philbooth.me/blog/tags/extreme-learning/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee51d74ca", "title": "events", "url": "https://philbooth.me/blog/tags/events/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee59af577", "title": "embeddings", "url": "https://philbooth.me/blog/tags/embeddings/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee5ee3281", "title": "dogs", "url": "https://philbooth.me/blog/tags/dogs/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee68346cd", "title": "diagrams", "url": "https://philbooth.me/blog/tags/diagrams/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee6ae5cdc", "title": "devops", "url": "https://philbooth.me/blog/tags/devops/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee76b7364", "title": "dependencies", "url": "https://philbooth.me/blog/tags/dependencies/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee83de1a1", "title": "debugging", "url": "https://philbooth.me/blog/tags/debugging/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee8fb5024", "title": "databases", "url": "https://philbooth.me/blog/tags/databases/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee9061bc0", "title": "data-visualization", "url": "https://philbooth.me/blog/tags/data-visualization/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6ee9f0dad4", "title": "code-review", "url": "https://philbooth.me/blog/tags/code-review/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6eea997f19", "title": "cloudflare", "url": "https://philbooth.me/blog/tags/cloudflare/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6eeb513763", "title": "cloud-run", "url": "https://philbooth.me/blog/tags/cloud-run/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6eeb66d368", "title": "chess", "url": "https://philbooth.me/blog/tags/chess/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6eebb88a19", "title": "bluesky", "url": "https://philbooth.me/blog/tags/bluesky/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6eebcc5041", "title": "bfj", "url": "https://philbooth.me/blog/tags/bfj/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6eec04511d", "title": "automation", "url": "https://philbooth.me/blog/tags/automation/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6eeca84478", "title": "async", "url": "https://philbooth.me/blog/tags/async/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6eed982ae9", "title": "arrays", "url": "https://philbooth.me/blog/tags/arrays/", "published_at": null }, { "id": "01a087c1-3a97-738c-8259-4c6eee5b5dbd", "title": "ai", "url": "https://philbooth.me/blog/tags/ai/", "published_at": null } ] posts Claim your blog
Back to philbo
Blog · corpus.blog/blogs/philbooth.me/posts

philbo

philbooth.me

2026

2024

2023

2022

2021

2019

2018

2017

Undated