Applied Cartography
Essays and media reviews by Justin Duke, CEO of Buttondown and partner at Third South Capital.
- 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
- Slow Horses (Season 6)
- Three Elmos
- 1890
- Beset
- Befuddlement
- A Month in the Country
- The Sting
- The new look
- Vue
- State and Main
- To Live and Die in L.A.
- The Pale King
- Engineering produces wisdom
- Slack workflows as duct tape
- 10 04
- Flirting with Disaster
- Talk Easy
- It's just a model
- Hiring and firing a DBA
- /shuffle
- Coffee and Cigarettes
- Conjury
- Soulstone Survivors
- Fable 5.1
- Everybody Wants Some!!
- BB, Grok Bot
- EPUB is not that scary
- The Man Who Knew Too Much
- Wet Hot American Summer
- Notes on Cloudflare Access
- A Master Builder
- Tech debt is weird
- Secondhand Time
- MacGruber
- Patch notes
- Adaptation
- Near to the Wild Heart
- op, mprocs
- Best of Enemies
- Snacks are cheaper and tastier than ever
- Cursed knowledge
- Enough Said
- Nirvanna the Band the Show the Movie
- Check the status page
- How the media library works
- Wings of Desire
- Notorious
- Two hundred decisions
- June, 2026
- Jay Kelly
- Denormalization 101
- Peggy Sue Got Married
- Indeterminate / Squash
- Victory is a lossy compressor
- Back to Overcast
- Self-hosting our CI, three months later
- May, 2026
- ccusage
- What matters
- Be careful what you make easier
- Screen record more
- Buttondown no longer runs Redis
- Just aim the cannon correctly
- LLMs and Buttondown
- On self-updating screenshots
- April, 2026
- Four years in the maelstrom
- Write as you want to be heard
- Software never had a soul
- March, 2026
- A month of OpEx quick wins
- Why I'm a film blogger now
- What I would be doing
- Archiving the roadmap
- Self-hosting our GitHub Action runners
- The road to Pydantic V2
- Ascensions
- February, 2026
- Unshipping Keystatic
- Scattered thoughts on LLM tools
- Golinks
- Improper nouns
- More weird tests
- Changelog mornings
- Maybe use Plain
- Subpaths vs. subdomains
- Outgrowing Django admin
- Notes on "Harness Engineering"
- Better tests
- The death of software, the A24 of software
- Notes on "How I'd Grow Buttondown"
- One status field per model
- RIP XSLT
- Building a data greenhouse
- In praise of actions
- Maturing your support function past a single engineer
- January, 2026
- Brief notes on migrating to Postgres-backed jobs
- LLM as advance team
- Recent forays into developer productivity
- Pure strategy
- Every model should have a notes field
- Refactoring a product is tricky
- Uses (January 2026)
- Migrating to PlanetScale
- Obsidian for internal docs
- Terragon, Conductor, PyCharm
2025 65
- 10 questions
- Big Brother
- sitemaptorss
- Bauhaus, by science or magic
- Avoid single-use variables
- mise hooks
- Dotfiles
- How LLMs change my codebase
- 2025
- GitHub Actions' pricing changes
- Site 2026
- October, 2025
- Eucharist
- Picnic
- Cheetah II
- Vercel's abstractions
- Business as authorship
- Someone built it; someone has to build it
- Cheetah
- Adding imports to the Django shell
- Fixing CSS variables in Superhuman
- Hidden coupons
- September, 2025
- Weeknotes 2.0
- Pulumi
- Another reason our pytest suite is slow
- Why our pytest suite is slow
- 63 postcards
- Django forever
- Onboarding survey, one week in
- Goodwill
- August, 2025
- What follows GitHub?
- Ashland, 2025
- Three apps that will not change your life
- July, 2025
- Have you at least tried asking?
- Are calendars underrated?
- Post-Watch
- The year of mint chimichurri
- VC-subsidized tokens
- June, 2025
- Nine months in
- Justfiles are great
- Whisperglass
- Colocating your pytest fixtures
- Replacing screenshots and videos with iframes
- Spring, 2025
- Aqua Voice, text-to-speech, non-determinism
- Fatherhood
- Performance improvements can be obvious and silly in retrospect
- Smoke test your Django admin site
- Recursive filter schema
- Does that dependency spark joy?
- Hq1
- Naughty vs. nice
- YOLO-squashing our Django repository
- Humane Inc.
- What Gives
- February, 2025
- What's in a name
- Three Problems
- Vibe coding your way out of a SaaS contract
- Truncating timedeltas in Django
- January, 2025
2024 85
- 2024
- Order, Tailwind, DRY
- Linear
- buttondown.com/alternatives
- Hypermodern Django
- Bluesky is good
- November, 2024
- Letters to a Young Bartender
- Hidden settings are for cowards
- Fathom
- Klarna: nineteen years, twenty billion kroner
- A good H1
- Shipping is capturing value
- VC does not guarantee PMF
- October, 2024
- No bozos
- Meta's two assets
- Projects are things with steps
- Notebook as marketing primitive
- My approach to GTD and PKM
- Consider the data product
- You should build this:
- Migrating to Django 5
- Talking to customers
- Notes on Zed, revisited
- Two weeks of parenthood
- September, 2024
- Vendor outages
- Bluesky et al
- Always use an enum for your status field
- Why your marketing site should be separate
- RSS in Next 14
- MD5-based uniqueness constraints in Django
- Notes on 'Founder Mode' / Lieutenancy
- Keeping a technical edge
- How Buttondown uses HAProxy
- Notes on buttondown.com
- Using Cursor to port Django tests to pytest
- Improving Django's default pagination performance
- Peak Newsletter
- Incumbency
- Content debt
- Against Against Innovation Tokens
- Pytest: test for print statements
- Typesafe routes in Vue
- Notes from May
- The taste of beer
- Why can't you just...?
- Git one-liner: get the earliest commit from X hours ago
- Notes on ActivityPub
- Auth.js + Square
- Au revoir, Invoke
- Grace notes
- How shadcn/ui examples work
- Things take time
- Use Rails
- Notes from April
- Finding null JSON values in Postgres
- You need to be frictionlog-maxxing
- You gotta be able to taste the kool-aid
- Stripe Sessions 2024
- Weird test: internal link checking
- Two years as an independent technologist
- New words
- Why Buttondown isn't OSS
- defineModel is dope
- Tailwind black magic: swallowing all pointer events
- Tailwind black magic: styling paragraphs within tables
- Why should a company?
- Are monopolies bad, actually?
- Is cool enough?
- PSA: mess around with Keystatic
- On techno-optimism
- Globals in Histoire
- Notes on Zed
- Use weird tests to capture tacit knowledge
- PSA: mess around with Kolo
- Years are magic wands
- Vibes and years
- You should use Helpscout
- 11ty
- Great essays
- Buttondown Analytics 3.0
- Gosling’s Old Rum
- Migrating someone who's on Stripe Connect Express
2023 5
2022 1
2021 1
2019 1
2018 3
2017 27
- A month with the AirPods
- How I cut my Webpack bundle size in half
- Not The Keynote You're Looking For
- Turning 25
- Creating a password validator component in Vue
- Side Projects: July 2017
- There are still dragons everywhere
- The best podcasts
- App sizes are under control, they just aren't under scrutiny
- A nice little list of valid and invalid email addresses
- So good it makes you angry
- Response Times
- Simply put
- Code Reviews
- What Vue needs next
- In praise of bloat
- namedtuple
- Forcing functions in everything
- Be a better employee, not a better programmer
- Developer experience is the ball game
- Shooting the Messenger
- A bigger pan
- Time is money, friend
- Waking up early
- Burnin
- Skyrim
- How liberal arts matters
2016 20
- My favorite things of 2016
- A month with the new MacBook
- Floradora
- My walk home
- Hidden elevators
- A long week
- liquid-trinkets
- Why we redesign our blogs
- cottage
- The Chipotle standard
- ambience
- A month with the iPad Pro
- Listening to Chance
- Rome
- Notes for a younger programmer
- Subscription pricing is for valuable products
- Voice interaction and muscle memory
- Only compare you to you
- Having written
- UX Slang
2015 20
- Books of 2015
- Packing as premature optimization
- Snippets from Virginia
- Your legacy code matters
- Why podcasts feel good
- What I miss about video games
- On a plane
- 22
- What lies under the bandaid
- In defense of keys
- Two weeks with the Amazon Echo
- porting-barback-to-swift
- Two weeks with the Apple Watch
- Moving
- Vine Street Market
- Tumblr
- Coalesce
- An average day
- Dieter Rams’ 15 questions
- barback-v23
2014 24
- 2014
- Crawling Tumblr with multiprocessing
- Coach marks and onboarding
- Simple empty states for UITableViews
- Using webassets with Pelican
- Ten lines of code
- Everything new is old again
- automating-app-store-screenshots
- 21
- Idk
- Three stages of consumption
- python-inline-shenanigans
- Swift is like Frasier
- My favorite robots
- barback-v22
- How to make $10 on the App Store
- visualizing-seattles-911-calls
- Trends in AV Club reviews
- 48 hours in Iceland
- better-beer-snobbery-through-data
- Old books in new places
- visualizing-nfl-point-differentials
- making-caves-with-cellular-automata
- analyzing-the-price-of-legos-with-python