41554 blogs · [ { "id": "01a087a5-e58e-7386-9433-4946f0e19aac", "title": "Self-validating Terraform imports: detecting regressions at plan time", "url": "https://mikeball.info/blog/self-validating-terraform-imports-detecting-regressions-at-plan-time/", "published_at": "2026-05-09T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f19f79fb", "title": "Verifying and validating Terraform: techniques for testing infrastructure-as-code", "url": "https://mikeball.info/blog/verifying-and-validating-terraform-techniques-for-testing-infrastructure-as-code/", "published_at": "2026-04-13T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f2402144", "title": "Testing JavaScript with node:test", "url": "https://mikeball.info/blog/testing-javascript-with-nodetest/", "published_at": "2026-03-29T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f2a2f75e", "title": "Terraform: natively reading GitHub release assets", "url": "https://mikeball.info/blog/terraform-natively-reading-github-release-assets/", "published_at": "2026-01-31T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f30687ab", "title": "Infinity Cats", "url": "https://mikeball.info/blog/infinity-cats/", "published_at": "2025-12-30T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f3c2a163", "title": "Terraform: self-validating plan-time permissions checks", "url": "https://mikeball.info/blog/terraform-self-validating-plan-time-permissions-checks/", "published_at": "2025-03-21T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f4b30fea", "title": "Packer: conditionally omit HCL block configuration", "url": "https://mikeball.info/blog/packer-conditionally-omit-hcl-block-configuration/", "published_at": "2025-03-15T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f5a6abfe", "title": "Terraform Patterns: the wrapper module", "url": "https://mikeball.info/blog/terraform-patterns-the-wrapper-module/", "published_at": "2024-07-10T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f5afb160", "title": "Scalable Terraform Patterns: Reuse and Repeatability", "url": "https://mikeball.info/blog/scalable-terraform-patterns-reuse-and-repeatability/", "published_at": "2024-07-09T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f64455e3", "title": "Scalable Terraform patterns: compound workspace names", "url": "https://mikeball.info/blog/scalable-terraform-patterns-compound-workspace-names/", "published_at": "2024-07-01T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f67519d0", "title": "Automated Terraform Plan Analysis With Terratest", "url": "https://mikeball.info/blog/automated-terraform-plan-analysis-with-terratest/", "published_at": "2023-12-21T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f6da8a7c", "title": "Unit Testing AWS S3 Downloads in Go", "url": "https://mikeball.info/blog/unit-testing-aws-s3-downloads-in-go/", "published_at": "2023-08-25T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f7632466", "title": "Using tfmigrate to Codify and Automate Terraform State Operations", "url": "https://mikeball.info/blog/using-tfmigrate-to-codify-and-automate-terraform-state-operations/", "published_at": "2023-08-06T13:35:02+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f8275e49", "title": "Using the gh-dash gh CLI Extension to Manage GitHub Notifications", "url": "https://mikeball.info/blog/using-the-gh-dash-gh-cli-extension-to-manage-github-notifications/", "published_at": "2023-05-31T13:35:02+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f87c8cd8", "title": "Notes on Implementing Backstage", "url": "https://mikeball.info/blog/notes-on-implementing-backstage/", "published_at": "2023-03-03T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f8b49a8f", "title": "Extending the gh CLI with Go", "url": "https://mikeball.info/blog/extending-the-gh-cli-with-go/", "published_at": "2022-12-28T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f90b71ee", "title": "What is the Kubernetes controller pattern?", "url": "https://mikeball.info/blog/what-is-the-kubernetes-controller-pattern/", "published_at": "2022-12-12T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f9b1bed5", "title": "What is the Kubernetes Operator Pattern?", "url": "https://mikeball.info/blog/what-is-the-kubernetes-operator-pattern/", "published_at": "2022-11-28T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946f9bc2332", "title": "IP addressing, Networks, Subnets, and CIDR", "url": "https://mikeball.info/blog/ip-addressing-networks-subnets-and-cidr/", "published_at": "2022-11-11T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946fa4238d4", "title": "Advanced Terraform Logic", "url": "https://mikeball.info/blog/advanced-terraform-logic/", "published_at": "2022-11-08T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946fa4c8f5b", "title": "Collecting Paginated HTTP API Response Data Using JavaScript's async/await", "url": "https://mikeball.info/blog/collecting-paginated-http-api-response-data-using-javascripts-async/await/", "published_at": "2022-11-04T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946fb207afb", "title": "Querying GitHub Release Data With gh and jq", "url": "https://mikeball.info/blog/querying-github-release-data-with-gh-and-jq/", "published_at": "2022-10-02T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946fb8cd857", "title": "Terraform Provider Development Demystified", "url": "https://mikeball.info/blog/terraform-provider-development-demystified/", "published_at": "2022-07-14T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946fc6057b2", "title": "Mocking aws-sdk With Jest", "url": "https://mikeball.info/blog/mocking-aws-sdk-with-jest/", "published_at": "2021-11-16T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946fd16047d", "title": "Multi-stage Docker Builds", "url": "https://mikeball.info/blog/multi-stage-docker-builds/", "published_at": "2021-07-07T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946fdc90f5e", "title": "Transforming Terraform Output Values to Markdown with Terraputs", "url": "https://mikeball.info/blog/transforming-terraform-output-values-to-markdown-with-terraputs/", "published_at": "2021-07-02T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946fe07f038", "title": "Triggering GitHub Actions From Outside of GitHub", "url": "https://mikeball.info/blog/triggering-github-actions-from-outside-of-github/", "published_at": "2021-07-01T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946fed10e2d", "title": "Go Test Parallelization", "url": "https://mikeball.info/blog/go-test-parallelization/", "published_at": "2021-06-11T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4946ff6ce200", "title": "Terraform Plan Validation With Open Policy Agent", "url": "https://mikeball.info/blog/terraform-plan-validation-with-open-policy-agent/", "published_at": "2021-05-09T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4947003f804d", "title": "Using Terraform workspaces", "url": "https://mikeball.info/blog/using-terraform-workspaces/", "published_at": "2021-04-25T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494700eab238", "title": "An Intro to Unix File Permissions", "url": "https://mikeball.info/blog/an-intro-to-unix-file-permissions/", "published_at": "2021-03-21T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4947015286b9", "title": "Go Concurrency With Goroutines and Channels", "url": "https://mikeball.info/blog/go-concurrency-with-goroutines-and-channels/", "published_at": "2021-02-20T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494701dd9663", "title": "HTTP Middleware in Go with httptest.ResponseRecorder", "url": "https://mikeball.info/blog/http-middleware-in-go-with-httptest.responserecorder/", "published_at": "2021-02-13T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4947026eda7c", "title": "A systemd Cheat Sheet", "url": "https://mikeball.info/blog/a-systemd-cheat-sheet/", "published_at": "2020-12-18T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494702ca77d5", "title": "Testing Ansible Roles With Docker-in-Docker", "url": "https://mikeball.info/blog/testing-ansible-roles-with-docker-in-docker/", "published_at": "2020-11-29T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4947036d73f8", "title": "How to Make a Concourse Resource Type", "url": "https://mikeball.info/blog/how-to-make-a-concourse-resource-type/", "published_at": "2019-10-29T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49470448bd23", "title": "Channels in Go", "url": "https://mikeball.info/blog/channels-in-go/", "published_at": "2018-01-09T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494704c9ede7", "title": "Committing Via the Concourse Git Resource", "url": "https://mikeball.info/blog/committing-via-the-concourse-git-resource/", "published_at": "2017-06-05T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494704e94096", "title": "Serialize Empty Structs to JSON in Go", "url": "https://mikeball.info/blog/serialize-empty-structs-to-json-in-go/", "published_at": "2017-06-04T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4947056f30fa", "title": "31 West Philly Illustrations", "url": "https://mikeball.info/projects/31-west-philly-illustrations/", "published_at": "2017-02-01T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494705bcedee", "title": "Using the ConcourseCI pull request resource to verify Docker builds", "url": "https://mikeball.info/blog/using-the-concourseci-pull-request-resource-to-verify-docker-builds/", "published_at": "2016-08-19T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494706bb457f", "title": "Using OptionParser in Rake", "url": "https://mikeball.info/blog/using-optionparser-in-rake/", "published_at": "2016-04-15T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4947079ff656", "title": "Using wget over Ansible's get_url", "url": "https://mikeball.info/blog/using-wget-over-ansibles-get_url/", "published_at": "2015-12-23T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4947085466fe", "title": "Apache Persistent Connection Problems", "url": "https://mikeball.info/blog/apache-persistent-connection-problems/", "published_at": "2015-10-18T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494708b7fc23", "title": "Secure Session Cookie in Rails over HTTPS", "url": "https://mikeball.info/blog/secure-session-cookie-in-rails-over-https/", "published_at": "2015-09-24T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494708fbccd9", "title": "How to Test Google Polymer elements on Travis CI", "url": "https://mikeball.info/blog/how-to-test-google-polymer-elements-on-travis-ci/", "published_at": "2015-06-06T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494709795092", "title": "JSConf 2015: Headless Testing Against Real Web Browsers", "url": "https://mikeball.info/blog/jsconf-2015-headless-testing-against-real-web-browsers/", "published_at": "2015-05-27T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494709e171fe", "title": "NW.js Chromium data-path", "url": "https://mikeball.info/blog/nw.js-chromium-data-path/", "published_at": "2015-04-09T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494709f27f91", "title": "Creating a Windows Installer for a node-webkit App on Mac OS", "url": "https://mikeball.info/blog/creating-a-windows-installer-for-a-node-webkit-app-on-mac-os/", "published_at": "2014-09-25T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49470a11d7d5", "title": "Hopscotch Coffee Illustration", "url": "https://mikeball.info/projects/hopscotch-coffee-illustration/", "published_at": "2014-09-01T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49470a2dfbe0", "title": "All CSS Modal Dialogs", "url": "https://mikeball.info/blog/all-css-modal-dialogs/", "published_at": "2014-08-08T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49470a8638fc", "title": "JavaScript Modules", "url": "https://mikeball.info/blog/javascript-modules/", "published_at": "2014-07-07T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49470ab5e0ac", "title": "TimesGrapher", "url": "https://mikeball.info/projects/timesgrapher/", "published_at": "2014-05-22T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49470b5cf8f0", "title": "Rails API Integration Tests", "url": "https://mikeball.info/blog/rails-api-integration-tests/", "published_at": "2014-04-17T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49470b7c8b49", "title": "A Simple Ruby Class Example", "url": "https://mikeball.info/blog/a-simple-ruby-class-example/", "published_at": "2014-03-30T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49470c256194", "title": "Automating Product Availability Alerts", "url": "https://mikeball.info/blog/automating-product-availability-alerts/", "published_at": "2014-03-27T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49470d1099d1", "title": "Automated Tests: What, Why, How?", "url": "https://mikeball.info/blog/automated-tests-what-why-how/", "published_at": "2014-02-08T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49470dd56831", "title": "wp2middleman", "url": "https://mikeball.info/projects/wp2middleman/", "published_at": "2014-01-15T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49470e09650f", "title": "31 Dream Homes", "url": "https://mikeball.info/projects/31-dream-homes/", "published_at": "2013-10-02T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49470e85ddd4", "title": "Lobber", "url": "https://mikeball.info/projects/lobber/", "published_at": "2013-10-01T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49470f4f2d90", "title": "Philadelphia Police Advisory Commission Complaint Map", "url": "https://mikeball.info/projects/philadelphia-police-advisory-commission-complaint-map/", "published_at": "2013-04-27T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49470fe1bd9c", "title": "Nicar 2013 Conference", "url": "https://mikeball.info/blog/nicar-2013-conference/", "published_at": "2013-03-04T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4947100f4d4c", "title": "Using Google Spreadsheets and Tabletop.js as a Web Application Back-end", "url": "https://mikeball.info/blog/using-google-spreadsheets-and-tabletop.js-as-a-web-application-back-end/", "published_at": "2013-03-02T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494710faeb1e", "title": "Streamlined Rails Gem Updates on Gem in a Box", "url": "https://mikeball.info/blog/streamlined-rails-gem-updates-on-gem-in-a-box/", "published_at": "2013-02-11T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4947113bc29d", "title": "Using the phl_geocode Ruby Gem", "url": "https://mikeball.info/blog/using-the-phl_geocode-ruby-gem/", "published_at": "2012-12-17T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494712285b8b", "title": "Using the civic-info Node.js Module to Get Voter and Election Info", "url": "https://mikeball.info/blog/using-the-civic-info-node.js-module-to-get-voter-and-election-info/", "published_at": "2012-11-08T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494712632c1c", "title": "Deploying an Express App to Heroku", "url": "https://mikeball.info/blog/deploying-an-express-app-to-heroku/", "published_at": "2012-10-22T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4947133c0294", "title": "Testing Node.js with Mocha, Expect.js, and Nock", "url": "https://mikeball.info/blog/testing-node.js-with-mocha-expect.js-and-nock/", "published_at": "2012-10-12T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4947141309cd", "title": "Icon Sprites with Compass", "url": "https://mikeball.info/blog/icon-sprites-with-compass/", "published_at": "2012-10-10T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471428a2e4", "title": "Using Mocha to Test a Node.js Server", "url": "https://mikeball.info/blog/using-mocha-to-test-a-node.js-server/", "published_at": "2012-08-15T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471459230f", "title": "Collecting Basic Team and Sprint Metrics with Git", "url": "https://mikeball.info/blog/collecting-basic-team-and-sprint-metrics-with-git/", "published_at": "2012-08-11T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471537affa", "title": "Gull", "url": "https://mikeball.info/projects/gull/", "published_at": "2012-08-06T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471579aa60", "title": "Setting Up Postgres on Mac OSX with Homebrew", "url": "https://mikeball.info/blog/setting-up-postgres-on-mac-osx-with-homebrew/", "published_at": "2012-07-29T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494716782fa4", "title": "Fluent 2012 Notes: Nicholas Zakas on Maintainable JavaScript", "url": "https://mikeball.info/blog/fluent-2012-notes-nicholas-zakas-on-maintainable-javascript/", "published_at": "2012-05-31T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494716c5deab", "title": "Deploying Wordpress to Pagodabox", "url": "https://mikeball.info/blog/deploying-wordpress-to-pagodabox/", "published_at": "2012-03-24T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494716ec6940", "title": "Lobbying.ph", "url": "https://mikeball.info/blog/lobbying.ph/", "published_at": "2012-03-05T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494716eff30b", "title": "Using South on a Heroku-hosted Django Project", "url": "https://mikeball.info/blog/using-south-on-a-heroku-hosted-django-project/", "published_at": "2012-02-18T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471744495a", "title": "TEDxPhilly", "url": "https://mikeball.info/projects/tedxphilly/", "published_at": "2011-09-09T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4947182cc1a4", "title": "Basic Command Line Tools", "url": "https://mikeball.info/blog/basic-command-line-tools/", "published_at": "2011-08-30T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471912bd9a", "title": "How to Contribute to a Project on GitHub", "url": "https://mikeball.info/blog/how-to-contribute-to-a-project-on-github/", "published_at": "2011-08-23T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494719a5d872", "title": "CSS3: An All-CSS, Image-less Play Button", "url": "https://mikeball.info/blog/css3-an-all-css-image-less-play-button/", "published_at": "2011-07-16T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471a7b10ff", "title": "CSS3: Using Transform to Make a Cube", "url": "https://mikeball.info/blog/css3-using-transform-to-make-a-cube/", "published_at": "2011-07-15T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471b08d45d", "title": "How to Make Testable Private Methods in JavaScript", "url": "https://mikeball.info/blog/how-to-make-testable-private-methods-in-javascript/", "published_at": "2011-05-11T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471bf6c2d8", "title": "JavaScript Design Patterns", "url": "https://mikeball.info/blog/javascript-design-patterns/", "published_at": "2011-03-19T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471ca58cab", "title": "Simplified Find/Replace from the Command Line", "url": "https://mikeball.info/blog/simplified-find/replace-from-the-command-line/", "published_at": "2011-02-03T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471d7e5d9d", "title": "How to Exclude Files from SVN Commits", "url": "https://mikeball.info/blog/how-to-exclude-files-from-svn-commits/", "published_at": "2010-12-09T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471db80f48", "title": "Basic Overview of the Surround Plugin for Vim", "url": "https://mikeball.info/blog/basic-overview-of-the-surround-plugin-for-vim/", "published_at": "2010-11-01T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471e42098d", "title": "Our Philadelphia", "url": "https://mikeball.info/projects/our-philadelphia/", "published_at": "2010-04-23T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471ec7ce87", "title": "Quiet Logger: HTML5 WordPress Theme", "url": "https://mikeball.info/blog/quiet-logger-html5-wordpress-theme/", "published_at": "2010-03-26T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471eceb310", "title": "Hometown Typeface", "url": "https://mikeball.info/blog/hometown-typeface/", "published_at": "2010-03-19T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-49471f6a9dd1", "title": "OurPhiladelphia.org Launched", "url": "https://mikeball.info/blog/ourphiladelphia.org-launched/", "published_at": "2010-02-28T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494720051186", "title": "Battles", "url": "https://mikeball.info/projects/battles/", "published_at": "2010-02-23T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494720c4b7cf", "title": "Brainworms", "url": "https://mikeball.info/projects/brainworms/", "published_at": "2010-02-23T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494720cebd86", "title": "Clap Yr Hands", "url": "https://mikeball.info/projects/clap-yr-hands/", "published_at": "2010-02-23T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494721a146b9", "title": "free103point9", "url": "https://mikeball.info/projects/free103point9/", "published_at": "2010-02-23T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494721d3fe5f", "title": "Taylor & Juliette", "url": "https://mikeball.info/projects/taylor-juliette/", "published_at": "2010-02-23T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-4947224ccb0b", "title": "Anthroapology", "url": "https://mikeball.info/projects/anthroapology/", "published_at": "2010-02-22T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494722b83e47", "title": "Polaroid Celluloid", "url": "https://mikeball.info/projects/polaroid-celluloid/", "published_at": "2010-02-20T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494723b29975", "title": "31 Portraits", "url": "https://mikeball.info/projects/31-portraits/", "published_at": "2010-02-01T00:00:00+00:00" }, { "id": "01a087a5-e58e-7386-9433-494723bffbaa", "title": "31 Patterns", "url": "https://mikeball.info/projects/31-patterns/", "published_at": "2009-02-01T00:00:00+00:00" } ] posts Claim your blog
Back to mikeball.info
Blog · corpus.blog/blogs/mikeball.info/posts

mikeball.info

mikeball.info

2026

2025

2024

2023

2022

2021

2020

2019

2018

2017

2016

2015

2014

2013

2012

2011

2010

2009