41554 blogs · [ { "id": "01a0d882-77f9-7345-9c77-0c346cf7931c", "title": "symgraph: Making a Code Graph Admit What It Doesn't Know", "url": "https://www.grahambrooks.com/post/symgraph-admitting-what-it-does-not-know/", "published_at": "2026-09-22T12:30:00+00:00" }, { "id": "01a0877e-78a8-739f-9386-ed0b350f3347", "title": "Building Your Own Tools", "url": "https://www.grahambrooks.com/post/building-your-own-tools/", "published_at": "2026-09-07T18:54:34+00:00" }, { "id": "01a0877e-78a8-739f-9386-ed0b3603832c", "title": "brake: Giving the Consumer a Representative in the Working Tree", "url": "https://www.grahambrooks.com/post/brake-exit-criteria-for-the-consumer/", "published_at": "2026-08-24T15:30:00+00:00" }, { "id": "01a0877e-78a8-739f-9386-ed0b365401dd", "title": "Tropism: Architecture the Agentic Loop Can Actually Check", "url": "https://www.grahambrooks.com/post/tropism-architecture-in-the-agentic-loop/", "published_at": "2026-08-08T16:12:00+00:00" }, { "id": "01a0877e-78a8-739f-9386-ed0b366d006c", "title": "A Control Plane for a Personal GitHub Account", "url": "https://www.grahambrooks.com/post/automating-github-account-management/", "published_at": "2026-07-25T00:00:00+00:00" }, { "id": "01a0877e-78a8-739f-9386-ed0b369bc0b3", "title": "facts: Porting Midje's Arrow to Rust", "url": "https://www.grahambrooks.com/post/facts-rust-testing-library/", "published_at": "2026-05-25T16:00:00+00:00" }, { "id": "01a0877e-78a8-739f-9386-ed0b37398229", "title": "bx: Running Local MCP Servers Without a Node or Python Runtime", "url": "https://www.grahambrooks.com/post/bx-lighter-mcp-servers/", "published_at": "2026-05-23T18:00:00+00:00" }, { "id": "01a0877e-78a8-739f-9386-ed0b379fc2ca", "title": "The Agentic Inner Loop: Sensors, Substrate, and Skills for Polyglot Development", "url": "https://www.grahambrooks.com/post/inner-loop-agentic-development/", "published_at": "2026-05-23T00:00:00+00:00" }, { "id": "01a0877e-78a8-739f-9386-ed0b3897e485", "title": "Casual-Review: A CLI for Team Code Review Without the Server", "url": "https://www.grahambrooks.com/post/casual-review-cli-team-code-review/", "published_at": "2026-04-30T20:00:00+00:00" }, { "id": "01a0877e-78a8-739f-9386-ed0b39745dc3", "title": "Code Review After the Pull Request", "url": "https://www.grahambrooks.com/post/code-review-after-the-pull-request/", "published_at": "2026-04-27T01:15:00+00:00" }, { "id": "01a0877e-78a8-739f-9386-ed0b39f0168d", "title": "A Code Knowledge Graph for Review, Not Generation", "url": "https://www.grahambrooks.com/post/code-knowledge-graph-for-review/", "published_at": "2026-04-27T00:30:00+00:00" }, { "id": "01a0877e-78a8-739f-9386-ed0b3a7b968a", "title": "A Rust-Native Architecture Toolchain: forge, puml, and adoc", "url": "https://www.grahambrooks.com/post/rust-native-architecture-toolchain/", "published_at": "2026-04-26T23:54:39+00:00" }, { "id": "01a0877e-78a8-739f-9386-ed0b3b6d2736", "title": "Sandboxing AI Coding Agents: Why Isolation Matters", "url": "https://www.grahambrooks.com/post/ai-coding-isolation/", "published_at": "2026-03-22T18:13:20+00:00" }, { "id": "01a0877e-78a8-739f-9386-ed0b3b9ec246", "title": "Exploring Your Backstage Catalog Without Backstage", "url": "https://www.grahambrooks.com/post/exploring-your-backstage-catalog-without-backstage/", "published_at": "2026-02-21T19:00:00+00:00" }, { "id": "01a0877e-78a8-739f-9386-ed0b3c38c7c1", "title": "Seeing Your Codebase as a City", "url": "https://www.grahambrooks.com/post/seeing-your-codebase-as-a-city/", "published_at": "2026-02-21T07:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2ddef6e83", "title": "Visualizing Project Structure with rv", "url": "https://www.grahambrooks.com/post/visualizing-project-structure-with-rv/", "published_at": "2026-02-21T07:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2de1b501c", "title": "Building a Code Knowledge Graph for Ai Agents", "url": "https://www.grahambrooks.com/post/building-a-code-knowledge-graph-for-ai-agents/", "published_at": "2026-02-15T15:35:20+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2de7486b3", "title": "Vibe Coding", "url": "https://www.grahambrooks.com/post/vibe-coding/", "published_at": "2026-01-25T22:18:33+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2deec27a5", "title": "Pair Programming, Mob Programming, and AI Co-Pilots: A Comparative Analysis", "url": "https://www.grahambrooks.com/post/2023-07-05-pair-mob-programming-ai-co-pilots/", "published_at": "2023-07-05T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2df143c43", "title": "Working in Interesting Times: Generative AI as Disruptive Tech in Software Development", "url": "https://www.grahambrooks.com/post/2023-07-03-interesting-times-gen-ai/", "published_at": "2023-07-03T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2df35a386", "title": "Iteration Zero - the first iteration", "url": "https://www.grahambrooks.com/post/2022-11-25-iteration-zero/", "published_at": "2022-11-25T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e0149191", "title": "Kilpse Blogging", "url": "https://www.grahambrooks.com/post/2021-09-11-kilpse-bloging/", "published_at": "2021-09-11T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e0c5f624", "title": "User-defined build settings for Bazel builds", "url": "https://www.grahambrooks.com/post/2021-08-30-user-defined-bazel-arguments/", "published_at": "2021-08-30T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e10b261a", "title": "Text fingerprints", "url": "https://www.grahambrooks.com/post/2021-06-06-text-fingerprinting/", "published_at": "2021-06-06T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e1f06e76", "title": "Installing built binaries locally with Bazel", "url": "https://www.grahambrooks.com/post/2021-05-31-bazel-local-install/", "published_at": "2021-05-31T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e28fbef9", "title": "Go and Bazel to build containers", "url": "https://www.grahambrooks.com/post/2020-04-05-go-bazel-container/", "published_at": "2020-04-05T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e2cda40c", "title": "Technical Health over Technical Debt", "url": "https://www.grahambrooks.com/post/2018-12-27-technical-health-over-technical-debt/", "published_at": "2018-12-27T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e2f2ffcb", "title": null, "url": "https://www.grahambrooks.com/post/2018-12-09-of-languages-and-containers/", "published_at": "2018-12-09T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e2f9af93", "title": null, "url": "https://www.grahambrooks.com/post/2018-04-29-orchestration-and-choreography/", "published_at": "2018-04-29T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e3d57a56", "title": null, "url": "https://www.grahambrooks.com/post/2018-02-17-quantifying-commit-risk/", "published_at": "2018-02-17T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e46460fd", "title": "The path to a million (loc)", "url": "https://www.grahambrooks.com/post/2017-07-07-path-to-a-million/", "published_at": "2017-07-07T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e49c8f55", "title": "Builder anti-patterns", "url": "https://www.grahambrooks.com/post/2017-06-19-builder-antipatterns/", "published_at": "2017-06-19T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e4a65690", "title": "Commit History Metrics", "url": "https://www.grahambrooks.com/post/2017-06-15-commit-history-metrics/", "published_at": "2017-06-15T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e5392c2f", "title": "Defending the Domain Model", "url": "https://www.grahambrooks.com/post/2017-06-06-defending-the-domain-model/", "published_at": "2017-06-06T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e5f13f0f", "title": "Testing Logging", "url": "https://www.grahambrooks.com/post/2017-05-26-testing-logging/", "published_at": "2017-05-26T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e67f155a", "title": "Templated styles", "url": "https://www.grahambrooks.com/post/2017-05-20-templated-styles/", "published_at": "2017-05-20T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e68144b9", "title": "Emacs es-mode - REPL experiences for ElasticSearch development", "url": "https://www.grahambrooks.com/post/2016-08-09-elasticsearch-emacs-mode/", "published_at": "2016-08-09T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e6b6e98c", "title": "Dependency Inversion - Applying the principle", "url": "https://www.grahambrooks.com/post/2016-07-11-dependency-inversion/", "published_at": "2016-07-11T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e78cd41b", "title": "The Value of Value Types", "url": "https://www.grahambrooks.com/post/2015-01-25-the-value-of-value-types/", "published_at": "2015-01-25T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e807c730", "title": "Build Analytics - better development understanding", "url": "https://www.grahambrooks.com/post/2015-01-19-build-analytics/", "published_at": "2015-01-19T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e86ea31e", "title": "Container-less web apps", "url": "https://www.grahambrooks.com/post/2014-04-07-container-less-web-applications/", "published_at": "2014-04-07T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e90854b2", "title": "Service IoC containers", "url": "https://www.grahambrooks.com/post/2014-04-07-service-ioc-containers/", "published_at": "2014-04-07T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2e9f68724", "title": "Team Distribution Models and Conways Law", "url": "https://www.grahambrooks.com/post/2014-03-31-team-distribution-models/", "published_at": "2014-03-31T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2ea29249f", "title": "lazybuilder v0.3", "url": "https://www.grahambrooks.com/post/2014-02-23-lazybuilder-v0-3/", "published_at": "2014-02-23T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2eb1dc333", "title": "CODE keyboard", "url": "https://www.grahambrooks.com/post/2014-01-28-code-keyboard/", "published_at": "2014-01-28T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2eb76651f", "title": "Cling A C++ REPL?!", "url": "https://www.grahambrooks.com/post/2013-12-19-cling-a-c-repl/", "published_at": "2013-12-19T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2ec277c69", "title": "Boost program_options", "url": "https://www.grahambrooks.com/post/2013-12-06-boost-program_options/", "published_at": "2013-12-06T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2eca7ce34", "title": "Java build tools 2013", "url": "https://www.grahambrooks.com/post/2013-11-15-java-build-tools-2013/", "published_at": "2013-11-15T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2ecb6be2e", "title": "ci console 0.0.2 released", "url": "https://www.grahambrooks.com/post/2013-10-12-ci-console-0-0-2-released/", "published_at": "2013-10-12T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2ed00a72f", "title": "Zero Down-time - relational databases", "url": "https://www.grahambrooks.com/post/2013-08-29-zero-down-time-relational-databases/", "published_at": "2013-08-29T00:00:00+00:00" }, { "id": "01a0877e-78a9-70fb-87cf-0ae2ed73f4df", "title": "word-finder", "url": "https://www.grahambrooks.com/post/2013-08-13-word-finder/", "published_at": "2013-08-13T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56b9f89eb3b6", "title": "What's in a name?", "url": "https://www.grahambrooks.com/post/2013-08-10-whats-in-a-name/", "published_at": "2013-08-10T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56b9f8d6654f", "title": "next_permutation", "url": "https://www.grahambrooks.com/post/2013-08-03-next_permutation/", "published_at": "2013-08-03T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56b9f9a33ce9", "title": "Emacs Sharing", "url": "https://www.grahambrooks.com/post/2013-07-25-emacs-sharing/", "published_at": "2013-07-25T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56b9f9b70821", "title": "Campaign for better IO", "url": "https://www.grahambrooks.com/post/2013-03-03-campaign-for-better-io/", "published_at": "2013-03-03T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56b9fa2de92b", "title": "All truth", "url": "https://www.grahambrooks.com/post/2013-02-14-all-truth/", "published_at": "2013-02-14T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56b9fa454307", "title": "If", "url": "https://www.grahambrooks.com/post/2013-02-14-if/", "published_at": "2013-02-14T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56b9fb22b156", "title": "I can't believe I missed this!", "url": "https://www.grahambrooks.com/post/2013-02-06-i-cant-believe-i-missed-this/", "published_at": "2013-02-06T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56b9fbbda147", "title": "DRYing out code", "url": "https://www.grahambrooks.com/post/2012-12-31-drying-out-code/", "published_at": "2012-12-31T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56b9fc880928", "title": "Integrating GPUs in Application Development - From Concept to Deployment", "url": "https://www.grahambrooks.com/post/2012-12-24-integrating-gpus-in-application-development-from-concept-to-deployment/", "published_at": "2012-12-24T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56b9fd09e09f", "title": "Automated refactoring for library updates", "url": "https://www.grahambrooks.com/post/2012-07-23-autmated-refactoring-for-library-updates/", "published_at": "2012-07-23T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56b9fd49c467", "title": "Metrics based Refactoring for cleaner code", "url": "https://www.grahambrooks.com/post/2012-01-02-metrics-based-refactoring-for-cleaner-code/", "published_at": "2012-01-02T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56b9fe3f9998", "title": "Oh My ZSH shell productivity", "url": "https://www.grahambrooks.com/post/2011-12-27-oh-my-zsh/", "published_at": "2011-12-27T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56b9fef6e032", "title": "AgileDC - Introduction to Continuous Delivery", "url": "https://www.grahambrooks.com/post/2011-10-27-agiledc-introduction-to-continuous-delivery/", "published_at": "2011-10-27T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56b9ff8f7177", "title": "Agile DC", "url": "https://www.grahambrooks.com/post/2011-10-25-agile-dc/", "published_at": "2011-10-25T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba006bbe8a", "title": "Encapsulating Databases", "url": "https://www.grahambrooks.com/post/2011-08-11-encapsulating-databases/", "published_at": "2011-08-11T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba015e9858", "title": "Insulating against failure using Caching Reverse Proxies", "url": "https://www.grahambrooks.com/post/2011-07-07-insulating-against-failure-using-caching-reverse-proxies/", "published_at": "2011-07-07T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba01c12900", "title": "asciidoc experiments", "url": "https://www.grahambrooks.com/post/2011-06-26-asciidoc-experiments/", "published_at": "2011-06-26T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba02161acc", "title": "Open Source project durations", "url": "https://www.grahambrooks.com/post/2011-04-28-open-source-project-durations/", "published_at": "2011-04-28T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0224a73e", "title": "Stabilizing Velocity", "url": "https://www.grahambrooks.com/post/2011-03-26-stabilizing-velocity/", "published_at": "2011-03-26T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba02883b62", "title": "Create MySQL database with Capistrano", "url": "https://www.grahambrooks.com/post/2011-01-24-create-mysql-database-with-capistrano/", "published_at": "2011-01-24T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0326109b", "title": "Rake db:migrate MySQL gem dependency", "url": "https://www.grahambrooks.com/post/2011-01-24-rake-dbmigrate-mysql-gem-dependency/", "published_at": "2011-01-24T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba03ff32cc", "title": "Five Ws sitting on a bench", "url": "https://www.grahambrooks.com/post/2011-01-22-five-ws-sitting-on-a-bench/", "published_at": "2011-01-22T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba04a47d38", "title": "Pulse Camp 1.0 and RHoK", "url": "https://www.grahambrooks.com/post/2011-01-07-pulse-camp-1-0-and-rhok/", "published_at": "2011-01-07T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba051ecb1f", "title": "The new Mac App Store", "url": "https://www.grahambrooks.com/post/2011-01-07-the-new-mac-app-store/", "published_at": "2011-01-07T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba059de382", "title": "Emacs Package manager", "url": "https://www.grahambrooks.com/post/2010-12-24-emacs-package-manager/", "published_at": "2010-12-24T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba05b8eb19", "title": "Progressive Enhancement", "url": "https://www.grahambrooks.com/post/2010-12-24-progressive-enhancement/", "published_at": "2010-12-24T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba06875d9b", "title": "Haml", "url": "https://www.grahambrooks.com/post/2010-12-19-haml/", "published_at": "2010-12-19T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0708519e", "title": "Watching the white horses on the Hudson ...", "url": "https://www.grahambrooks.com/post/2010-12-12-watching-the-white-horses-on-the-hudson/", "published_at": "2010-12-12T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba07653e9e", "title": "A good day of discussions in Chicago tod...", "url": "https://www.grahambrooks.com/post/2010-11-16-a-good-day-of-discussions-in-chicago-tod/", "published_at": "2010-11-16T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba07acd05c", "title": "Test Driven Talks", "url": "https://www.grahambrooks.com/post/2010-11-07-test-driven-talks/", "published_at": "2010-11-07T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba086920db", "title": "Technology Synergy", "url": "https://www.grahambrooks.com/post/2010-10-20-technology-synergy/", "published_at": "2010-10-20T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba08ea6da0", "title": "Testing - what to test when", "url": "https://www.grahambrooks.com/post/2010-10-20-testing-what-to-test-when/", "published_at": "2010-10-20T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba09bc7a99", "title": "Eben Bayer: Are mushrooms the new plastic?", "url": "https://www.grahambrooks.com/post/2010-10-06-eben-bayer-are-mushrooms-the-new-plastic/", "published_at": "2010-10-06T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba09dc40fe", "title": "Fighting layout bugs", "url": "https://www.grahambrooks.com/post/2010-10-06-fighting-layout-bugs/", "published_at": "2010-10-06T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0a8c8055", "title": "Dallas geek night", "url": "https://www.grahambrooks.com/post/2010-08-18-dallas-geek-night/", "published_at": "2010-08-18T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0aa9be71", "title": "Using a local Wiki for personal knowledge management", "url": "https://www.grahambrooks.com/post/2010-08-03-using-a-local-wiki-for-personal-knowledge-management/", "published_at": "2010-08-03T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0b49a6e0", "title": "Agile Software Development and Golf", "url": "https://www.grahambrooks.com/post/2010-06-30-agile-software-development-and-golf/", "published_at": "2010-06-30T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0c1a28de", "title": "Optimising build times", "url": "https://www.grahambrooks.com/post/2010-06-28-optimising-build-times/", "published_at": "2010-06-28T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0cd0032f", "title": "New BTree algorithms for virtual memory systems", "url": "https://www.grahambrooks.com/post/2010-06-20-new-btree-algorithms-for-virtual-memory-systems/", "published_at": "2010-06-20T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0d09abad", "title": "Blogging from emacs", "url": "https://www.grahambrooks.com/post/2010-05-05-blogging-from-emacs/", "published_at": "2010-05-05T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0d4df91f", "title": "Performance testing web applications", "url": "https://www.grahambrooks.com/post/2010-04-25-performance-testing-web-applications/", "published_at": "2010-04-25T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0dd47b52", "title": "7 days with the iPad", "url": "https://www.grahambrooks.com/post/2010-04-10-7-days-with-the-ipad/", "published_at": "2010-04-10T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0e6bb75f", "title": "ReleaseIt partial review", "url": "https://www.grahambrooks.com/post/2010-04-10-releaseit-partial-review/", "published_at": "2010-04-10T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0f4db196", "title": "Scraping Railscasts", "url": "https://www.grahambrooks.com/post/2010-04-07-scraping-railscasts/", "published_at": "2010-04-07T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0fa5e04f", "title": "iPad and keyboards", "url": "https://www.grahambrooks.com/post/2010-04-06-ipad-and-keyboards/", "published_at": "2010-04-06T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba0fdf2e2a", "title": "iPad first day on the road", "url": "https://www.grahambrooks.com/post/2010-04-05-ipad-first-day-on-the-road/", "published_at": "2010-04-05T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba1032a74c", "title": "iPad first impressions", "url": "https://www.grahambrooks.com/post/2010-04-04-ipad-first-impressions/", "published_at": "2010-04-04T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba1113c86e", "title": "Post Redirect Get web interaction pattern", "url": "https://www.grahambrooks.com/post/2010-03-27-post-redirect-get-web-interaction-pattern/", "published_at": "2010-03-27T00:00:00+00:00" }, { "id": "01a0877e-78aa-71ea-98dd-56ba114e31f1", "title": "Collaborating distributed teams", "url": "https://www.grahambrooks.com/post/2010-03-23-collaborating-distributed-teams/", "published_at": "2010-03-23T00:00:00+00:00" } ] posts Claim your blog
Back to grahambrooks.com
Blog · corpus.blog/blogs/grahambrooks.com/posts

grahambrooks.com

grahambrooks.com

2026

2023

2022

2021

2020

2018

2017

2016

2015

2014

2013

14 Feb 2013

2012

2011

2010

19 Dec 2010