The Curious Engineer

All blogs / Essays / personal

Applied Cartography

jmduke.com

Essays and media reviews by Justin Duke, CEO of Buttondown and partner at Third South Capital.

Essays / personalSoftware / engineering practiceGeneral

Posts
369 from 10 Jan 2013 to 29 Oct 2026
Posting
weekly (121 in the last year)
Kind
personal blog
Feed
https://www.jmduke.com/feed.xml

2026 107

  1. Slow Horses (Season 6)
  2. Three Elmos
  3. 1890
  4. Beset
  5. Befuddlement
  6. A Month in the Country
  7. The Sting
  8. The new look
  9. Vue
  10. State and Main
  11. To Live and Die in L.A.
  12. The Pale King
  13. Engineering produces wisdom
  14. Slack workflows as duct tape
  15. 10 04
  16. Flirting with Disaster
  17. Talk Easy
  18. It's just a model
  19. Hiring and firing a DBA
  20. /shuffle
  21. Coffee and Cigarettes
  22. Conjury
  23. Soulstone Survivors
  24. Fable 5.1
  25. Everybody Wants Some!!
  26. BB, Grok Bot
  27. EPUB is not that scary
  28. The Man Who Knew Too Much
  29. Wet Hot American Summer
  30. Notes on Cloudflare Access
  31. A Master Builder
  32. Tech debt is weird
  33. Secondhand Time
  34. MacGruber
  35. Patch notes
  36. Adaptation
  37. Near to the Wild Heart
  38. op, mprocs
  39. Best of Enemies
  40. Snacks are cheaper and tastier than ever
  41. Cursed knowledge
  42. Enough Said
  43. Nirvanna the Band the Show the Movie
  44. Check the status page
  45. How the media library works
  46. Wings of Desire
  47. Notorious
  48. Two hundred decisions
  49. June, 2026
  50. Jay Kelly
  51. Denormalization 101
  52. Peggy Sue Got Married
  53. Indeterminate / Squash
  54. Victory is a lossy compressor
  55. Back to Overcast
  56. Self-hosting our CI, three months later
  57. May, 2026
  58. ccusage
  59. What matters
  60. Be careful what you make easier
  61. Screen record more
  62. Buttondown no longer runs Redis
  63. Just aim the cannon correctly
  64. LLMs and Buttondown
  65. On self-updating screenshots
  66. April, 2026
  67. Four years in the maelstrom
  68. Write as you want to be heard
  69. Software never had a soul
  70. March, 2026
  71. A month of OpEx quick wins
  72. Why I'm a film blogger now
  73. What I would be doing
  74. Archiving the roadmap
  75. Self-hosting our GitHub Action runners
  76. The road to Pydantic V2
  77. Ascensions
  78. February, 2026
  79. Unshipping Keystatic
  80. Scattered thoughts on LLM tools
  81. Golinks
  82. Improper nouns
  83. More weird tests
  84. Changelog mornings
  85. Maybe use Plain
  86. Subpaths vs. subdomains
  87. Outgrowing Django admin
  88. Notes on "Harness Engineering"
  89. Better tests
  90. The death of software, the A24 of software
  91. Notes on "How I'd Grow Buttondown"
  92. One status field per model
  93. RIP XSLT
  94. Building a data greenhouse
  95. In praise of actions
  96. Maturing your support function past a single engineer
  97. January, 2026
  98. Brief notes on migrating to Postgres-backed jobs
  99. LLM as advance team
  100. Recent forays into developer productivity
  101. Pure strategy
  102. Every model should have a notes field
  103. Refactoring a product is tricky
  104. Uses (January 2026)
  105. Migrating to PlanetScale
  106. Obsidian for internal docs
  107. Terragon, Conductor, PyCharm

2025 65

  1. 10 questions
  2. Big Brother
  3. sitemaptorss
  4. Bauhaus, by science or magic
  5. Avoid single-use variables
  6. mise hooks
  7. Dotfiles
  8. How LLMs change my codebase
  9. 2025
  10. GitHub Actions' pricing changes
  11. Site 2026
  12. October, 2025
  13. Eucharist
  14. Picnic
  15. Cheetah II
  16. Vercel's abstractions
  17. Business as authorship
  18. Someone built it; someone has to build it
  19. Cheetah
  20. Adding imports to the Django shell
  21. Fixing CSS variables in Superhuman
  22. Hidden coupons
  23. September, 2025
  24. Weeknotes 2.0
  25. Pulumi
  26. Another reason our pytest suite is slow
  27. Why our pytest suite is slow
  28. 63 postcards
  29. Django forever
  30. Onboarding survey, one week in
  31. Goodwill
  32. August, 2025
  33. What follows GitHub?
  34. Ashland, 2025
  35. Three apps that will not change your life
  36. July, 2025
  37. Have you at least tried asking?
  38. Are calendars underrated?
  39. Post-Watch
  40. The year of mint chimichurri
  41. VC-subsidized tokens
  42. June, 2025
  43. Nine months in
  44. Justfiles are great
  45. Whisperglass
  46. Colocating your pytest fixtures
  47. Replacing screenshots and videos with iframes
  48. Spring, 2025
  49. Aqua Voice, text-to-speech, non-determinism
  50. Fatherhood
  51. Performance improvements can be obvious and silly in retrospect
  52. Smoke test your Django admin site
  53. Recursive filter schema
  54. Does that dependency spark joy?
  55. Hq1
  56. Naughty vs. nice
  57. YOLO-squashing our Django repository
  58. Humane Inc.
  59. What Gives
  60. February, 2025
  61. What's in a name
  62. Three Problems
  63. Vibe coding your way out of a SaaS contract
  64. Truncating timedeltas in Django
  65. January, 2025

2024 85

  1. 2024
  2. Order, Tailwind, DRY
  3. Linear
  4. buttondown.com/alternatives
  5. Hypermodern Django
  6. Bluesky is good
  7. November, 2024
  8. Letters to a Young Bartender
  9. Hidden settings are for cowards
  10. Fathom
  11. Klarna: nineteen years, twenty billion kroner
  12. A good H1
  13. Shipping is capturing value
  14. VC does not guarantee PMF
  15. October, 2024
  16. No bozos
  17. Meta's two assets
  18. Projects are things with steps
  19. Notebook as marketing primitive
  20. My approach to GTD and PKM
  21. Consider the data product
  22. You should build this:
  23. Migrating to Django 5
  24. Talking to customers
  25. Notes on Zed, revisited
  26. Two weeks of parenthood
  27. September, 2024
  28. Vendor outages
  29. Bluesky et al
  30. Always use an enum for your status field
  31. Why your marketing site should be separate
  32. RSS in Next 14
  33. MD5-based uniqueness constraints in Django
  34. Notes on 'Founder Mode' / Lieutenancy
  35. Keeping a technical edge
  36. How Buttondown uses HAProxy
  37. Notes on buttondown.com
  38. Using Cursor to port Django tests to pytest
  39. Improving Django's default pagination performance
  40. Peak Newsletter
  41. Incumbency
  42. Content debt
  43. Against Against Innovation Tokens
  44. Pytest: test for print statements
  45. Typesafe routes in Vue
  46. Notes from May
  47. The taste of beer
  48. Why can't you just...?
  49. Git one-liner: get the earliest commit from X hours ago
  50. Notes on ActivityPub
  51. Auth.js + Square
  52. Au revoir, Invoke
  53. Grace notes
  54. How shadcn/ui examples work
  55. Things take time
  56. Use Rails
  57. Notes from April
  58. Finding null JSON values in Postgres
  59. You need to be frictionlog-maxxing
  60. You gotta be able to taste the kool-aid
  61. Stripe Sessions 2024
  62. Weird test: internal link checking
  63. Two years as an independent technologist
  64. New words
  65. Why Buttondown isn't OSS
  66. defineModel is dope
  67. Tailwind black magic: swallowing all pointer events
  68. Tailwind black magic: styling paragraphs within tables
  69. Why should a company?
  70. Are monopolies bad, actually?
  71. Is cool enough?
  72. PSA: mess around with Keystatic
  73. On techno-optimism
  74. Globals in Histoire
  75. Notes on Zed
  76. Use weird tests to capture tacit knowledge
  77. PSA: mess around with Kolo
  78. Years are magic wands
  79. Vibes and years
  80. You should use Helpscout
  81. 11ty
  82. Great essays
  83. Buttondown Analytics 3.0
  84. Gosling’s Old Rum
  85. Migrating someone who's on Stripe Connect Express

2023 5

  1. Mass renaming files in fish on macOS
  2. Postgres batch enqueuing in ten lines of Django
  3. Befriending the Goon Squad
  4. Spoonbill (2016—2023)
  5. Bottles of Veuve

2022 1

  1. 2022

2021 1

  1. 2021

2019 1

  1. 2019

2018 3

  1. Customer Support for Side Projects
  2. Generators are dope
  3. Enthusiasm

2017 27

  1. A month with the AirPods
  2. How I cut my Webpack bundle size in half
  3. Not The Keynote You're Looking For
  4. Turning 25
  5. Creating a password validator component in Vue
  6. Side Projects: July 2017
  7. There are still dragons everywhere
  8. The best podcasts
  9. App sizes are under control, they just aren't under scrutiny
  10. A nice little list of valid and invalid email addresses
  11. So good it makes you angry
  12. Response Times
  13. Simply put
  14. Code Reviews
  15. What Vue needs next
  16. In praise of bloat
  17. namedtuple
  18. Forcing functions in everything
  19. Be a better employee, not a better programmer
  20. Developer experience is the ball game
  21. Shooting the Messenger
  22. A bigger pan
  23. Time is money, friend
  24. Waking up early
  25. Burnin
  26. Skyrim
  27. How liberal arts matters

2016 20

  1. My favorite things of 2016
  2. A month with the new MacBook
  3. Floradora
  4. My walk home
  5. Hidden elevators
  6. A long week
  7. liquid-trinkets
  8. Why we redesign our blogs
  9. cottage
  10. The Chipotle standard
  11. ambience
  12. A month with the iPad Pro
  13. Listening to Chance
  14. Rome
  15. Notes for a younger programmer
  16. Subscription pricing is for valuable products
  17. Voice interaction and muscle memory
  18. Only compare you to you
  19. Having written
  20. UX Slang

2015 20

  1. Books of 2015
  2. Packing as premature optimization
  3. Snippets from Virginia
  4. Your legacy code matters
  5. Why podcasts feel good
  6. What I miss about video games
  7. On a plane
  8. 22
  9. What lies under the bandaid
  10. In defense of keys
  11. Two weeks with the Amazon Echo
  12. porting-barback-to-swift
  13. Two weeks with the Apple Watch
  14. Moving
  15. Vine Street Market
  16. Tumblr
  17. Coalesce
  18. An average day
  19. Dieter Rams’ 15 questions
  20. barback-v23

2014 24

  1. 2014
  2. Crawling Tumblr with multiprocessing
  3. Coach marks and onboarding
  4. Simple empty states for UITableViews
  5. Using webassets with Pelican
  6. Ten lines of code
  7. Everything new is old again
  8. automating-app-store-screenshots
  9. 21
  10. Idk
  11. Three stages of consumption
  12. python-inline-shenanigans
  13. Swift is like Frasier
  14. My favorite robots
  15. barback-v22
  16. How to make $10 on the App Store
  17. visualizing-seattles-911-calls
  18. Trends in AV Club reviews
  19. 48 hours in Iceland
  20. better-beer-snobbery-through-data
  21. Old books in new places
  22. visualizing-nfl-point-differentials
  23. making-caves-with-cellular-automata
  24. analyzing-the-price-of-legos-with-python

2013 10

  1. 2013 in review
  2. How to send emails through Python and GMail
  3. Analysing Pitchfork using Pandas
  4. How to make $800/mo with three lines of code
  5. the-state-of-tech-recruiting-in-2013
  6. A gentle introduction to itertools
  7. 2003 and things
  8. Depth and whitespace
  9. A mindset of abundance
  10. The John Byrd EP