41554 blogs · [ { "id": "01a07d5d-6106-7330-a368-9a756b8754c6", "title": "From error-handling to structured concurrency", "url": "https://blog.nelhage.com/post/concurrent-error-handling/", "published_at": "2026-03-23T15:30:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a756b9797fc", "title": "Solving regex crosswords with Z3", "url": "https://blog.nelhage.com/post/regex-crosswords-z3/", "published_at": "2025-10-21T14:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a756bff4b97", "title": "The ITTAGE indirect branch predictor", "url": "https://blog.nelhage.com/post/ittage-branch-predictor/", "published_at": "2025-07-04T21:30:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a756ce3694a", "title": "Performance of the Python 3.14 tail-call interpreter", "url": "https://blog.nelhage.com/post/cpython-tail-call/", "published_at": "2025-03-09T22:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a756d006218", "title": "Building personal software with Claude", "url": "https://blog.nelhage.com/post/personal-software-with-claude/", "published_at": "2025-01-27T20:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a756d31a57d", "title": "Finding near-duplicates with Jaccard similarity and MinHash", "url": "https://blog.nelhage.com/post/fuzzy-dedup/", "published_at": "2024-07-03T23:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a756df3e21e", "title": "Stripe's monorepo developer environment", "url": "https://blog.nelhage.com/post/stripe-dev-environment/", "published_at": "2024-05-21T17:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a756e16959f", "title": "Performance engineering, profilers, and seeing the invisible", "url": "https://blog.nelhage.com/post/profilers-seeing-the-invisible/", "published_at": "2023-12-18T16:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a756e181ff8", "title": "Advent of Code in C++ Template Metaprogramming", "url": "https://blog.nelhage.com/post/advent-of-templates/", "published_at": "2023-12-08T15:30:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a756ed789b7", "title": "What's with ML software and pickles?", "url": "https://blog.nelhage.com/post/pickles-and-ml/", "published_at": "2023-11-08T05:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a756f219579", "title": "Graceful behavior at capacity", "url": "https://blog.nelhage.com/post/systems-at-capacity/", "published_at": "2023-08-07T16:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a756f46d8be", "title": "Efficiency trades off against resiliency", "url": "https://blog.nelhage.com/post/efficiency-vs-resiliency/", "published_at": "2023-04-15T23:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a756fbaa394", "title": "Transformers for software engineers", "url": "https://blog.nelhage.com/post/transformers-for-software-engineers/", "published_at": "2022-04-01T20:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75708bdc11", "title": "A Cursed Bug", "url": "https://blog.nelhage.com/post/a-cursed-bug/", "published_at": "2022-02-23T03:03:48+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7570f2217c", "title": "Distributed cloud builds for everyone", "url": "https://blog.nelhage.com/post/distributed-builds-for-everyone/", "published_at": "2021-05-31T23:05:17+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7571867924", "title": "Building LLVM in 90 seconds using Amazon Lambda", "url": "https://blog.nelhage.com/post/building-llvm-in-90s/", "published_at": "2021-05-21T02:00:28+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757200ace6", "title": "Some opinionated thoughts on SQL databases", "url": "https://blog.nelhage.com/post/some-opinionated-sql-takes/", "published_at": "2021-03-30T17:32:31+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7572ef58f0", "title": "Towards solving Ultimate Tic Tac Toe", "url": "https://blog.nelhage.com/post/solving-ultimate-ttt/", "published_at": "2020-07-15T17:15:21+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75731c58e9", "title": "Write testable code by writing generic code", "url": "https://blog.nelhage.com/post/write-testable-code-by-writing-generic-code/", "published_at": "2020-03-12T01:30:17+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7573235ac6", "title": "Test suites as classifiers", "url": "https://blog.nelhage.com/post/test-suites-as-classifiers/", "published_at": "2020-03-01T20:34:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7573e858e4", "title": "Systems that defy detailed understanding", "url": "https://blog.nelhage.com/post/systems-that-defy-understanding/", "published_at": "2020-02-22T20:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757414807e", "title": "Computers can be understood", "url": "https://blog.nelhage.com/post/computers-can-be-understood/", "published_at": "2020-02-16T20:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7574e71ab0", "title": "Reflections on software performance", "url": "https://blog.nelhage.com/post/reflections-on-performance/", "published_at": "2020-02-03T01:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75756a1b9f", "title": "Why the Sorbet typechecker is fast", "url": "https://blog.nelhage.com/post/why-sorbet-is-fast/", "published_at": "2020-01-24T01:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757579e93c", "title": "Testing and feedback loops", "url": "https://blog.nelhage.com/post/testing-and-feedback-loops/", "published_at": "2020-01-19T20:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7575e34ffd", "title": "Record/Replay testing in Sorbet", "url": "https://blog.nelhage.com/post/record-replay-in-sorbet/", "published_at": "2020-01-13T18:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75767e1eb1", "title": "Two kinds of testing", "url": "https://blog.nelhage.com/post/two-kinds-of-testing/", "published_at": "2019-12-24T21:09:55+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75772f05ce", "title": "The architecture of declarative configuration management", "url": "https://blog.nelhage.com/post/declarative-configuration-management/", "published_at": "2019-11-12T22:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757773fffc", "title": "A Go/C Polyglot", "url": "https://blog.nelhage.com/post/a-go-c-polyglot/", "published_at": "2019-09-05T23:42:28+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7577e24d7a", "title": "Reader/reader blocking in reader/writer locks", "url": "https://blog.nelhage.com/post/rwlock-contention/", "published_at": "2019-05-07T15:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7577f966e5", "title": "My Apollo Bibliography", "url": "https://blog.nelhage.com/post/apollo-bibliography/", "published_at": "2019-04-09T03:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7578c3d131", "title": "Three kinds of memory leaks", "url": "https://blog.nelhage.com/post/three-kinds-of-leaks/", "published_at": "2018-04-29T15:30:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757907d3de", "title": "Property Testing Like AFL", "url": "https://blog.nelhage.com/post/property-testing-like-afl/", "published_at": "2017-10-24T16:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7579cc750a", "title": "Property-Based Testing Is Fuzzing", "url": "https://blog.nelhage.com/post/property-testing-is-fuzzing/", "published_at": "2017-10-03T16:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757a7e262a", "title": "Disable Transparent Hugepages", "url": "https://blog.nelhage.com/post/transparent-hugepages/", "published_at": "2017-07-10T21:15:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757b007ae1", "title": "Two Perspectives on the End-to-End Principle", "url": "https://blog.nelhage.com/post/end-to-end-principle/", "published_at": "2017-06-11T20:42:01+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757ba0e61c", "title": "Running Tensorflow on AWS GPUs", "url": "https://blog.nelhage.com/post/tensorflow-on-aws/", "published_at": "2017-02-26T23:41:27+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757c93e9f8", "title": "Thoughts On Kubernetes", "url": "https://blog.nelhage.com/post/kubernetes/", "published_at": "2017-02-19T20:48:34+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757d5c8b0b", "title": "Measuring Capacity Through Utilization", "url": "https://blog.nelhage.com/post/utilization/", "published_at": "2017-01-08T20:09:09+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757e4c2893", "title": "How I Write Tests", "url": "https://blog.nelhage.com/2016/12/how-i-test/", "published_at": "2016-12-29T19:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757ee52b17", "title": "Design for Testability", "url": "https://blog.nelhage.com/2016/03/design-for-testability/", "published_at": "2016-03-06T10:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757f11bad8", "title": "What MongoDB got Right", "url": "https://blog.nelhage.com/2015/11/what-mongodb-got-right/", "published_at": "2015-11-01T10:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757f775398", "title": "Indices point between elements", "url": "https://blog.nelhage.com/2015/08/indices-point-between-elements/", "published_at": "2015-07-17T09:00:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757fbac410", "title": "Regular Expression Search with Suffix Arrays", "url": "https://blog.nelhage.com/2015/02/regular-expression-search-with-suffix-arrays/", "published_at": "2015-02-01T15:52:43+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a757fc57bd6", "title": "New reptyr feature: TTY-stealing", "url": "https://blog.nelhage.com/2014/08/new-reptyr-feature-tty-stealing/", "published_at": "2014-08-20T08:41:34+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7580091040", "title": "Lightweight Linux Kernel Development with KVM", "url": "https://blog.nelhage.com/2013/12/lightweight-linux-kernel-development-with-kvm/", "published_at": "2013-12-30T02:11:45+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7580aca6aa", "title": "Tracking down a memory leak in Ruby's EventMachine", "url": "https://blog.nelhage.com/2013/03/tracking-an-eventmachine-leak/", "published_at": "2013-03-07T13:13:37+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758140102d", "title": "Why node.js is cool (it's not about performance)", "url": "https://blog.nelhage.com/2012/03/why-node-js-is-cool/", "published_at": "2012-03-12T11:36:35+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7581b9de31", "title": "BlackHat/DEFCON 2011 talk: Breaking out of KVM", "url": "https://blog.nelhage.com/2011/08/breaking-out-of-kvm/", "published_at": "2011-08-08T13:32:29+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7582703794", "title": "Exploiting misuse of Python's \"pickle\"", "url": "https://blog.nelhage.com/2011/03/exploiting-pickle/", "published_at": "2011-03-20T18:38:13+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75830dfff7", "title": "reptyr: Changing a process's controlling terminal", "url": "https://blog.nelhage.com/2011/02/changing-ctty/", "published_at": "2011-02-08T23:06:50+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75838acd54", "title": "reptyr: Attach a running process to a new terminal", "url": "https://blog.nelhage.com/2011/01/reptyr-attach-a-running-process-to-a-new-terminal/", "published_at": "2011-01-21T21:56:01+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7583c1199c", "title": "Some Android reverse-engineering tools", "url": "https://blog.nelhage.com/2010/12/some-android-reverse-engineering-tools/", "published_at": "2010-12-27T16:26:13+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75847749e0", "title": "CVE-2010-4258: Turning denial-of-service into privilege escalation", "url": "https://blog.nelhage.com/2010/12/cve-2010-4258-from-dos-to-privesc/", "published_at": "2010-12-10T12:02:11+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75851556f1", "title": "Some notes on CVE-2010-3081 exploitability", "url": "https://blog.nelhage.com/2010/11/exploiting-cve-2010-3081/", "published_at": "2010-11-30T12:58:01+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758609acc6", "title": "Why scons is cool", "url": "https://blog.nelhage.com/2010/11/why-scons-is-cool/", "published_at": "2010-11-07T18:00:38+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7586f92785", "title": "Configuring dnsmasq with VMware Workstation", "url": "https://blog.nelhage.com/2010/10/dnsmasq-and-vmware/", "published_at": "2010-10-24T23:15:23+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758711a0d4", "title": "Using Haskell's 'newtype' in C", "url": "https://blog.nelhage.com/2010/10/using-haskells-newtype-in-c/", "published_at": "2010-10-11T13:11:25+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7587df9e9d", "title": "amd64 and va_arg", "url": "https://blog.nelhage.com/2010/10/amd64-and-va_arg/", "published_at": "2010-10-04T00:14:28+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7588632498", "title": "A brief look at Linux's security record", "url": "https://blog.nelhage.com/2010/09/a-brief-look-at-linuxs-security-record/", "published_at": "2010-09-26T23:16:19+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7588e867d9", "title": "Dear Twitter: Stop screwing over your developers.", "url": "https://blog.nelhage.com/2010/09/dear-twitter/", "published_at": "2010-09-12T23:48:28+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758945f474", "title": "How is duct tape like the force?", "url": "https://blog.nelhage.com/2010/09/how-is-duct-tape-like-the-force/", "published_at": "2010-09-05T18:37:19+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75894d4b1a", "title": "Write yourself an strace in 70 lines of code", "url": "https://blog.nelhage.com/2010/08/write-yourself-an-strace-in-70-lines-of-code/", "published_at": "2010-08-29T12:33:26+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758a429329", "title": "Navigating the Linux Kernel", "url": "https://blog.nelhage.com/2010/08/navigating-the-linux-kernel/", "published_at": "2010-08-15T21:52:58+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758a6376d0", "title": "Suggestion time: What should I blog about?", "url": "https://blog.nelhage.com/2010/08/suggestion-time-what-should-i-blog-about/", "published_at": "2010-08-08T21:44:55+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758b1339d5", "title": "Some musings on ORMs", "url": "https://blog.nelhage.com/2010/07/some-musings-on-orms/", "published_at": "2010-07-18T18:38:23+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758b22bdc3", "title": "Implementing a declarative mini-language in the C preprocessor", "url": "https://blog.nelhage.com/2010/07/implementing-an-edsl-in-cpp/", "published_at": "2010-07-04T15:54:55+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758b901342", "title": "Check Plus: An EDSL for writing unit tests in C", "url": "https://blog.nelhage.com/2010/06/check-plus-an-edsl-for-writing-unit-tests-in-c/", "published_at": "2010-06-26T15:54:53+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758c6d71e2", "title": "Lab Notebooking for the Software Engineer", "url": "https://blog.nelhage.com/2010/06/lab-notebooking-for-the-software-engineer/", "published_at": "2010-06-20T22:53:07+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758c863063", "title": "Wordpress tricks: Disabling editing shortcuts", "url": "https://blog.nelhage.com/2010/06/disable-wordpress-edit-shortcuts/", "published_at": "2010-06-13T20:07:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758cadfa43", "title": "Confessions of a programmer: I hate code review", "url": "https://blog.nelhage.com/2010/06/i-hate-code-review/", "published_at": "2010-06-06T20:21:11+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758ccc0e7d", "title": "Using X forwarding with screen by proxying $DISPLAY", "url": "https://blog.nelhage.com/2010/05/using-x-forwarding-with-screen/", "published_at": "2010-05-30T20:25:52+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758cea9ffd", "title": "Getting carried away with hack value", "url": "https://blog.nelhage.com/2010/05/hack-value/", "published_at": "2010-05-23T19:53:30+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758dad6fae", "title": "The Window Manager I Want", "url": "https://blog.nelhage.com/2010/05/the-window-manager-i-want/", "published_at": "2010-05-09T17:08:47+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758e637a08", "title": "Software Engineers should keep lab notebooks", "url": "https://blog.nelhage.com/2010/05/software-and-lab-notebooks/", "published_at": "2010-05-02T23:14:14+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758ebcbaf2", "title": "Some thoughts on Quora", "url": "https://blog.nelhage.com/2010/04/some-thoughts-on-quora/", "published_at": "2010-04-04T23:33:51+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a758f4e8e5a", "title": "Fun with the preprocessor: CONFIG_IA32_EMULATION hacks in Linux", "url": "https://blog.nelhage.com/2010/03/config_ia32_emulation_hacks/", "published_at": "2010-03-28T20:07:43+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7590360ad4", "title": "Security doesn't respect abstraction boundaries", "url": "https://blog.nelhage.com/2010/03/security-doesnt-respect-abstraction/", "published_at": "2010-03-13T20:20:26+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7590b1ebd5", "title": "Followup to \"A Very Subtle Bug\"", "url": "https://blog.nelhage.com/2010/03/followup-to-a-very-subtle-bug/", "published_at": "2010-03-03T13:45:11+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7591580993", "title": "A Very Subtle Bug", "url": "https://blog.nelhage.com/2010/02/a-very-subtle-bug/", "published_at": "2010-02-27T23:48:47+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75915810ef", "title": "Iron Blogger: Blogging for Beer", "url": "https://blog.nelhage.com/2010/02/iron-blogger-blogging-for-beer/", "published_at": "2010-02-21T23:09:57+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7591d85940", "title": "Versioning dotfiles in git", "url": "https://blog.nelhage.com/2010/02/versioning-dotfiles-in-git/", "published_at": "2010-02-14T20:03:15+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75925f6e2c", "title": "CVE-2007-4573: The Anatomy of a Kernel Exploit", "url": "https://blog.nelhage.com/2010/02/cve-2007-4573-the-anatomy-of-a-kernel-exploit/", "published_at": "2010-02-05T23:32:31+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75933aeaa4", "title": "Git in pictures", "url": "https://blog.nelhage.com/2010/01/git-in-pictures/", "published_at": "2010-01-24T23:30:02+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75938251db", "title": "On git and usability", "url": "https://blog.nelhage.com/2010/01/on-git-and-usability/", "published_at": "2010-01-18T00:57:31+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7593e6e0b6", "title": "A Brief Introduction to termios: Signaling and Job Control", "url": "https://blog.nelhage.com/2010/01/a-brief-introduction-to-termios-signaling-and-job-control/", "published_at": "2010-01-11T01:42:52+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7594980b9b", "title": "A Brief Introduction to termios: termios(3) and stty", "url": "https://blog.nelhage.com/2009/12/a-brief-introduction-to-termios-termios3-and-stty/", "published_at": "2009-12-30T01:47:17+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7594afffeb", "title": "A Brief Introduction to termios", "url": "https://blog.nelhage.com/2009/12/a-brief-introduction-to-termios/", "published_at": "2009-12-22T19:11:22+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7594f90206", "title": "wpa_supplicant: GUI and wpa_action", "url": "https://blog.nelhage.com/2008/09/wpa_supplicant-gui-and-wpa_action/", "published_at": "2008-09-18T12:07:49+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75952cfd94", "title": "autocutsel", "url": "https://blog.nelhage.com/2008/09/autocutsel/", "published_at": "2008-09-16T12:08:12+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7595939aa2", "title": "New Blog Location", "url": "https://blog.nelhage.com/2008/09/new-blog/", "published_at": "2008-09-12T14:17:42+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7595c4bc7f", "title": "Using wpa_supplicant on Debian/Ubuntu", "url": "https://blog.nelhage.com/2008/08/using-wpa_supplicant-on-debianubuntu/", "published_at": "2008-08-22T14:06:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75967353f0", "title": "Automounting sshfs", "url": "https://blog.nelhage.com/2008/03/automounting-sshfs/", "published_at": "2008-03-23T18:54:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75969a0a5c", "title": "Conkeror", "url": "https://blog.nelhage.com/2008/03/conkeror/", "published_at": "2008-03-13T19:57:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75978b403c", "title": "todo.pl ratmenu", "url": "https://blog.nelhage.com/2008/02/todopl-ratmenu/", "published_at": "2008-02-19T23:46:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75983698b9", "title": "A week with the iPhone", "url": "https://blog.nelhage.com/2007/12/a-week-with-the-iphone/", "published_at": "2007-12-31T01:41:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a75987d9f0d", "title": "DEF CON", "url": "https://blog.nelhage.com/2007/08/def-con/", "published_at": "2007-08-05T22:53:00+00:00" }, { "id": "01a07d5d-6106-7330-a368-9a7599003c07", "title": "6.170, CVS, and SVN", "url": "https://blog.nelhage.com/2007/02/3/", "published_at": "2007-02-11T01:33:00+00:00" } ] posts Claim your blog
Back to Nelson Elhage
Blog · corpus.blog/blogs/blog.nelhage.com/posts

Nelson Elhage

blog.nelhage.com

2026

2025

2024

2023

2022

2021

2020

2019

2018

2017

2016

2015

2014

2013

2012

2011

2010

2009

2008

2007