56,966 blogs · [ { "id": "01a0bb93-e760-72ea-b7ef-393ef1da19d4", "title": "What is a type system for?", "url": "https://michaeluloth.com/alexis-king-constructive-data-modeling/", "published_at": "2026-09-14T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf24b33e7d2", "title": "Ignoring files you've already committed", "url": "https://michaeluloth.com/git-ignore-tracked-files/", "published_at": "2025-09-08T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf24bc4b763", "title": "Converting a list of JS objects into a parent-child tree", "url": "https://michaeluloth.com/javascript-objects-nested/", "published_at": "2024-12-27T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf24c3e20fc", "title": "A \"!\" prefix makes any Tailwind CSS class important", "url": "https://michaeluloth.com/tailwindcss-important-modifier/", "published_at": "2024-12-26T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf24cdc45ce", "title": "Tmux's version command is -V", "url": "https://michaeluloth.com/tmux-version/", "published_at": "2024-12-18T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf24d56d708", "title": "SELECT DISTINCT outputs a column's unique values", "url": "https://michaeluloth.com/sql-select-distinct/", "published_at": "2024-12-12T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf24de6e0fb", "title": "It's tricky to statically type a \"pipe\" function in Python", "url": "https://michaeluloth.com/python-fp-pipe/", "published_at": "2024-11-28T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf24ea2f392", "title": "An iOS Shortcut can add data to a Google Sheet", "url": "https://michaeluloth.com/ios-shortcut-save-form-responses-to-google-sheet/", "published_at": "2024-11-20T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf24ebd7c5b", "title": "How to query a BigQuery table from Python", "url": "https://michaeluloth.com/bigquery-query-from-python/", "published_at": "2024-11-19T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf24efe3a5b", "title": "CloudFlare sells domain names at cost", "url": "https://michaeluloth.com/cloudflare-domain-registration-at-cost/", "published_at": "2024-11-16T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf24f104cb2", "title": "Homebrew packages might install dependencies", "url": "https://michaeluloth.com/homebrew-package-dependencies/", "published_at": "2024-11-13T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf24fc84ffa", "title": "Shell functions don’t need parentheses", "url": "https://michaeluloth.com/bash-functions-parentheses-optional/", "published_at": "2024-11-11T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf250a46080", "title": "You can run shell scripts in tmux.conf", "url": "https://michaeluloth.com/tmux-conf-run-shell-script/", "published_at": "2024-11-05T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf250bf7bae", "title": "Why unknown types are useful", "url": "https://michaeluloth.com/programming-types-unknown-why-useful/", "published_at": "2024-07-29T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf251562457", "title": "Using \"object\" as an unknown type in Python", "url": "https://michaeluloth.com/python-types-object-as-unknown/", "published_at": "2024-07-25T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf25243bc50", "title": "Defining a custom unknown type in Python", "url": "https://michaeluloth.com/python-types-unknown/", "published_at": "2024-07-21T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf25321fadb", "title": "Undoing a merge to your main git branch", "url": "https://michaeluloth.com/git-undo-merge-to-main/", "published_at": "2023-12-20T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf253650f97", "title": "Switching configs in Neovim", "url": "https://michaeluloth.com/neovim-switch-configs/", "published_at": "2023-09-07T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf253e92397", "title": "Adding a pull request template to your GitHub repo", "url": "https://michaeluloth.com/github-repo-pr-template", "published_at": "2022-12-15T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf2548543dc", "title": "Dramatically reducing video file size using FFmpeg", "url": "https://michaeluloth.com/how-to-shrink-video-file-size-using-ffmpeg", "published_at": "2022-11-10T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf254d36482", "title": "The translateZ trick", "url": "https://michaeluloth.com/translate-z", "published_at": "2022-09-01T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf25521ee2c", "title": "What is a Factory Function?", "url": "https://michaeluloth.com/what-is-a-factory-function", "published_at": "2022-02-27T05:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf2555bb13c", "title": "Writing Great Alt Text", "url": "https://michaeluloth.com/writing-great-alt-text", "published_at": "2022-02-17T05:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf255ac8693", "title": "Levels of Abstraction in Testing", "url": "https://michaeluloth.com/levels-of-abstraction-in-testing", "published_at": "2022-02-15T05:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf255e0a45b", "title": "Using Slack to report data entry errors to content editors", "url": "https://michaeluloth.com/slack-alerts-for-cms-errors", "published_at": "2021-05-31T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf256bcd0f4", "title": "The filter(Boolean) trick", "url": "https://michaeluloth.com/filter-boolean", "published_at": "2020-06-01T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf257231943", "title": "Using GraphQL with Gatsby", "url": "https://michaeluloth.com/using-graphql-with-gatsby", "published_at": "2019-06-03T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf2573b78c7", "title": "Adding content to a Gatsby project", "url": "https://michaeluloth.com/adding-content-to-a-gatsby-project", "published_at": "2019-05-27T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf257c71589", "title": "Writing CSS-in-JS in a Gatsby project", "url": "https://michaeluloth.com/writing-css-in-js-in-a-gatsby-project", "published_at": "2019-03-18T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf258b3e766", "title": "Writing CSS in a Gatsby project", "url": "https://michaeluloth.com/writing-css-in-a-gatsby-project", "published_at": "2019-03-11T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf258f52264", "title": "Wrapping pages in a layout component", "url": "https://michaeluloth.com/wrapping-pages-in-a-layout-component", "published_at": "2019-03-04T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf25982ef9b", "title": "Adding pages to a Gatsby project", "url": "https://michaeluloth.com/adding-pages-to-a-gatsby-project", "published_at": "2019-02-21T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf259a35dea", "title": "Writing HTML in a Gatsby project", "url": "https://michaeluloth.com/writing-html-in-a-gatsby-project", "published_at": "2019-02-15T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf259b6da50", "title": "Gatsby's default files and folders", "url": "https://michaeluloth.com/gatsbys-default-files-and-folders", "published_at": "2019-01-31T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf25aaa0c84", "title": "Starting a new Gatsby project", "url": "https://michaeluloth.com/starting-a-new-gatsby-project", "published_at": "2019-01-24T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf25b51888e", "title": "What is Gatsby?", "url": "https://michaeluloth.com/what-is-gatsby", "published_at": "2019-01-17T00:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf25bc5bb6b", "title": "Introducing Gatsby Tutorials", "url": "https://michaeluloth.com/introducing-gatsby-tutorials", "published_at": "2018-11-30T05:00:00+00:00" }, { "id": "01a087a5-6175-71ae-9f14-4bf25c6113ac", "title": "How to set up a Mac for web development", "url": "https://michaeluloth.com/how-to-set-up-a-mac-for-web-development", "published_at": "2018-10-20T04:00:00+00:00" } ] posts Claim your blog
Back to michaeluloth.com
Blog · corpus.blog/blogs/michaeluloth.com/posts

michaeluloth.com

michaeluloth.com

2026

2025

2024

2023

2022

2021

2020

2019

2018