56,966 blogs · [ { "id": "01a0e4dd-de2b-701d-9fcb-d6b57706fcd9", "title": "Budgeting with Obsidian", "url": "https://blog.luketurner.org/posts/budgeting-with-obsidian/", "published_at": "2026-09-27T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d111399df", "title": "Devbox: a pattern for development in the cloud", "url": "https://blog.luketurner.org/posts/devbox-a-pattern-for-development-in-the-cloud/", "published_at": "2026-08-19T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d11dafcfd", "title": "Long-running agent workflows: Background and Tools", "url": "https://blog.luketurner.org/posts/long-running-agent-workflows/", "published_at": "2026-08-03T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d12cd8804", "title": "Accelerating software projects with AI-assisted prototyping", "url": "https://blog.luketurner.org/posts/ai-assisted-prototyping/", "published_at": "2026-06-24T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d12eefb49", "title": "Specks", "url": "https://blog.luketurner.org/posts/specks/", "published_at": "2026-02-10T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d137edf79", "title": "Experiments with spec-driven development", "url": "https://blog.luketurner.org/posts/experiments-with-spec-driven-development/", "published_at": "2025-10-25T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d13d90389", "title": "Are React hooks like inheritance?", "url": "https://blog.luketurner.org/posts/are-react-hooks-like-inheritance/", "published_at": "2025-10-05T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1486c255", "title": "Bakery: Building Bun single-file executables", "url": "https://blog.luketurner.org/posts/bakery-building-bun-single-file-executables/", "published_at": "2025-09-14T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d153f1591", "title": "Bring your own agent: an alternative AI strategy for SaaS", "url": "https://blog.luketurner.org/posts/bring-your-own-agent/", "published_at": "2025-09-13T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1620d8aa", "title": "Weave: a TUI for running multiple commands", "url": "https://blog.luketurner.org/posts/weave-a-tui-for-running-multiple-commands/", "published_at": "2025-08-21T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d16686466", "title": "Unfurling posts with Astro", "url": "https://blog.luketurner.org/posts/unfurling-posts-with-astro/", "published_at": "2025-07-31T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d16e04d30", "title": "Dopamine fasting", "url": "https://blog.luketurner.org/posts/dopamine-fasting/", "published_at": "2025-07-27T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d17b677d1", "title": "How I'm using Claude Code", "url": "https://blog.luketurner.org/posts/how-i-m-using-claude-code/", "published_at": "2025-07-09T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d18901191", "title": "Coupling and Modularization", "url": "https://blog.luketurner.org/posts/coupling-and-modularization/", "published_at": "2025-04-15T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d18d9736e", "title": "Why I started streaming programming", "url": "https://blog.luketurner.org/posts/why-i-started-streaming-programming/", "published_at": "2025-01-30T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d197f6037", "title": "Comparing Three CHOP extensions for VS Code", "url": "https://blog.luketurner.org/posts/comparing-chop-extensions-for-vs-code/", "published_at": "2025-01-15T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1a5d8f1b", "title": "Writing effective design documents", "url": "https://blog.luketurner.org/posts/writing-effective-design-documents/", "published_at": "2024-12-31T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1ad60b5b", "title": "Abstraction in software systems", "url": "https://blog.luketurner.org/posts/abstraction-in-software-systems/", "published_at": "2024-12-23T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1b62dec7", "title": "The first principle of software design", "url": "https://blog.luketurner.org/posts/the-first-principle-of-software-design/", "published_at": "2024-11-30T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1bd7072e", "title": "Hosting your own webhook testing service on Fly.io", "url": "https://blog.luketurner.org/posts/hosting-your-own-webhook-testing-service-on-fly/", "published_at": "2024-04-06T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1befda64", "title": "Using the pgvector extension with Fly Postgres", "url": "https://blog.luketurner.org/posts/using-pgvector-extension-on-fly/", "published_at": "2024-01-21T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1ca40168", "title": "Deploying Llamafiles on Fly", "url": "https://blog.luketurner.org/posts/deploying-llamafiles-on-fly/", "published_at": "2024-01-13T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1ca9b89a", "title": "Three weird reducers: State management in a Next.js app", "url": "https://blog.luketurner.org/posts/three-weird-reducers/", "published_at": "2023-10-30T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1cb979a2", "title": "Why I deployed my Next.js app on Fly instead of Vercel", "url": "https://blog.luketurner.org/posts/nextjs-fly-vercel/", "published_at": "2023-10-23T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1cf84bd0", "title": "Features in my ideal habit/task tracking app", "url": "https://blog.luketurner.org/posts/habit-task-app-features/", "published_at": "2023-09-04T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1d6cc65f", "title": "SSO Lab: Self-hosting Keycloak on Fly", "url": "https://blog.luketurner.org/posts/sso-lab-self-hosting-keycloak-on-fly/", "published_at": "2023-08-26T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1e551d95", "title": "Astro recipe: New post scaffold script", "url": "https://blog.luketurner.org/posts/astro-recipe-create-posts/", "published_at": "2023-08-20T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1ee42626", "title": "Astro recipe: D2 component", "url": "https://blog.luketurner.org/posts/astro-recipe-d2/", "published_at": "2023-08-13T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d1fd8d96d", "title": "Astro recipe: Creating aliases (redirects) for old content URLs", "url": "https://blog.luketurner.org/posts/astro-recipe-content-url-aliases/", "published_at": "2023-05-04T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d208114f9", "title": "Ad Astro", "url": "https://blog.luketurner.org/posts/ad-astro/", "published_at": "2023-03-31T00:00:00+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d21155d17", "title": "Web Clipping for Dendron", "url": "https://blog.luketurner.org/posts/dendron-markdownload-web-clipping/", "published_at": "2023-01-12T18:51:08+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d21569082", "title": "Compiling Mermaid, KaTeX, and D2 at build-time with aftermath", "url": "https://blog.luketurner.org/posts/aftermath/", "published_at": "2022-12-30T18:51:08+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d21a7f415", "title": "Triggering Fly deployments from Gitea webhooks", "url": "https://blog.luketurner.org/posts/gitea-fly-connector/", "published_at": "2022-11-27T18:51:08+00:00" }, { "id": "01a0874e-aa4e-701c-b843-668d22804ebf", "title": "Hosting Gitea on Fly", "url": "https://blog.luketurner.org/posts/gitea-on-fly/", "published_at": "2022-11-19T18:51:08+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2116b255", "title": "Breathing techniques", "url": "https://blog.luketurner.org/posts/breathing-techniques/", "published_at": "2022-07-21T15:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2179e305", "title": "Specter, a motivational tutorial", "url": "https://blog.luketurner.org/posts/specter-tutorial/", "published_at": "2021-12-28T04:32:12+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2188cc7f", "title": "Arch Linux RPi 4", "url": "https://blog.luketurner.org/posts/arch_linux_rpi4_cluster/", "published_at": "2021-07-25T07:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f21f2dd2f", "title": "Cool Tools for Desktop Linux", "url": "https://blog.luketurner.org/posts/linux_cool_tools/", "published_at": "2021-04-10T07:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f22ba811e", "title": "Doom Emacs config", "url": "https://blog.luketurner.org/posts/emacs_config/", "published_at": "2021-04-03T07:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f22d795bc", "title": "ClojureScript Project Quickstart", "url": "https://blog.luketurner.org/posts/cljs_quickstart/", "published_at": "2021-03-28T07:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2374634e", "title": "Useful GUIs for Developers", "url": "https://blog.luketurner.org/posts/useful_guis_for_developers/", "published_at": "2021-03-20T07:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f23a2596d", "title": "Recommended books", "url": "https://blog.luketurner.org/posts/booklist/", "published_at": "2021-03-14T08:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f24893cac", "title": "GergoPlex Keymap Images", "url": "https://blog.luketurner.org/posts/gergoplex_keymap_images/", "published_at": "2020-08-24T07:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f250b4748", "title": "Customizing the Faunchpad", "url": "https://blog.luketurner.org/posts/faunchpad_intro/", "published_at": "2020-08-10T07:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f256f74e1", "title": "Blogging workflow", "url": "https://blog.luketurner.org/posts/blogging-workflow/", "published_at": "2020-06-20T07:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2626e6f1", "title": "Pi Homelab", "url": "https://blog.luketurner.org/posts/pi-homelab/", "published_at": "2020-05-13T07:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2641ca56", "title": "The new blog theme", "url": "https://blog.luketurner.org/posts/blog-theme/", "published_at": "2020-04-12T07:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f26e36857", "title": "About this blog", "url": "https://blog.luketurner.org/posts/about/", "published_at": "2018-12-10T15:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2772ca9e", "title": "Sample Formatting", "url": "https://blog.luketurner.org/posts/sample-formatting/", "published_at": "2018-12-09T15:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f27c8cca6", "title": "Sharing human knowledge", "url": "https://blog.luketurner.org/posts/sharing-knowledge/", "published_at": "2018-12-07T15:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f28726e93", "title": "The Internet is down", "url": "https://blog.luketurner.org/posts/without-internet/", "published_at": "2018-12-03T23:04:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2958e5b1", "title": "G.O.L.EM.", "url": "https://blog.luketurner.org/posts/golem/", "published_at": "2018-09-11T17:32:12+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f29f3acef", "title": "Automating (even more) early and often", "url": "https://blog.luketurner.org/posts/automating-early-and-often/", "published_at": "2017-04-15T15:02:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2ab850dc", "title": "lpass-add and lpass-env", "url": "https://blog.luketurner.org/posts/lpass-add-env/", "published_at": "2016-12-29T22:26:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2b100aff", "title": "Unidirectional data flow architecture in JS", "url": "https://blog.luketurner.org/posts/unidirectional-data-flow-js/", "published_at": "2015-04-22T21:27:10+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2b2716c5", "title": "Gulp and Browserify recipe", "url": "https://blog.luketurner.org/posts/gulp-browserify/", "published_at": "2014-12-03T14:49:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2b3c7e4e", "title": "The value of a sentence", "url": "https://blog.luketurner.org/posts/value-of-a-sentence/", "published_at": "2014-09-09T17:23:02+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2b7f17b1", "title": "PersonalPVT Retrospective", "url": "https://blog.luketurner.org/posts/personalpvt/", "published_at": "2014-09-08T19:18:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2c42a49c", "title": "Maneuver warfare was agile before agile", "url": "https://blog.luketurner.org/posts/ooda-loop-agile/", "published_at": "2014-02-14T17:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2c4e6b02", "title": "Hack language parser in a single regex", "url": "https://blog.luketurner.org/posts/hack-parser-regex/", "published_at": "2013-12-30T17:00:00+00:00" }, { "id": "01a0874e-aa4f-7015-982d-db3f2ca78ee4", "title": "Skewomorphism: second-order mimesis", "url": "https://blog.luketurner.org/posts/skewomorphism/", "published_at": "2013-09-10T17:00:00+00:00" } ] posts Claim your blog
Back to blog.luketurner.org
Blog · corpus.blog/blogs/blog.luketurner.org/posts

blog.luketurner.org

blog.luketurner.org

2026

2025

2024

2023

2022

2021

2020

2018

2017

2016

2015

2014

2013