41554 blogs · [ { "id": "01a0b68b-4cdb-72ba-9366-66763dc3afc9", "title": "Keith J. Grant", "url": "https://keithjgrant.com", "published_at": "2026-09-07T05:20:44+00:00" }, { "id": "01a08794-82e2-734e-aed9-b5628c66343f", "title": "An AI Skeptic Uses AI for a Week", "url": "https://keithjgrant.com/posts/2025/07/an-ai-skeptic-uses-ai-for-a-week/", "published_at": "2025-07-15T19:46:14+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad0460578", "title": "Simplify Nested Code", "url": "https://keithjgrant.com/posts/2025/02/simplify-nested-code/", "published_at": "2025-02-11T16:02:37+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad082a1a3", "title": "Theme Machine 2.0", "url": "https://keithjgrant.com/posts/2024/12/theme-machine-20/", "published_at": "2024-12-30T19:15:24+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad13cacd3", "title": "CSS in Depth Addendum", "url": "https://keithjgrant.com/posts/2024/10/css-in-depth-addendum/", "published_at": "2024-10-17T19:37:07+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad1404ae2", "title": "A Structured Approach to Custom Properties", "url": "https://keithjgrant.com/posts/2024/06/a-structured-approach-to-custom-properties/", "published_at": "2024-06-28T19:40:06+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad15a7b64", "title": "Theme Machine: A CSS Color Palette Tool", "url": "https://keithjgrant.com/posts/2024/06/theme-machine-a-css-color-palette-tool/", "published_at": "2024-06-27T17:27:49+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad20a3776", "title": "Assessing Web Component Libraries", "url": "https://keithjgrant.com/posts/2024/06/assessing-web-component-libraries/", "published_at": "2024-06-11T15:30:22+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad2d2a263", "title": "CSS in Depth, Second Edition", "url": "https://keithjgrant.com/posts/2024/05/css-in-depth-second-edition/", "published_at": "2024-05-30T21:18:50+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad2d6847d", "title": "I Do Not Like These LLMs", "url": "https://keithjgrant.com/posts/2024/05/i-do-not-like-these-llms/", "published_at": "2024-05-28T15:40:20+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad3860486", "title": "Weighing in on CSS Masonry", "url": "https://keithjgrant.com/posts/2024/05/weighing-in-on-css-masonry/", "published_at": "2024-05-17T18:45:48+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad39a6119", "title": "My CSS resets", "url": "https://keithjgrant.com/posts/2024/01/my-css-resets/", "published_at": "2024-01-04T17:49:36+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad3b2f48a", "title": "Be Excited for New Features", "url": "https://keithjgrant.com/posts/2023/11/be-excited-for-new-features/", "published_at": "2023-11-16T17:49:26+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad3edeb29", "title": "Workarounds for Buggy Gradients", "url": "https://keithjgrant.com/posts/2023/11/problematic-color-gradients-and-workarounds/", "published_at": "2023-11-03T16:17:02+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad4df1485", "title": "Scope vs Shadow DOM", "url": "https://keithjgrant.com/posts/2023/08/scope-vs-shadow-dom/", "published_at": "2023-08-25T16:43:03+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad547f6f2", "title": "Web Components Aren’t Components", "url": "https://keithjgrant.com/posts/2023/07/web-components-arent-components/", "published_at": "2023-07-26T23:08:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad5c62ca7", "title": "Re-evaluating px vs em in Media Queries", "url": "https://keithjgrant.com/posts/2023/05/px-vs-em-in-media-queries/", "published_at": "2023-05-31T18:37:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad6a81321", "title": "The Webdev Social Schism", "url": "https://keithjgrant.com/posts/2023/05/the-webdev-social-schism/", "published_at": "2023-05-02T18:16:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad72c5a85", "title": "Scoped CSS is Back", "url": "https://keithjgrant.com/posts/2023/04/scoped-css-is-back/", "published_at": "2023-04-24T15:54:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad74e0d83", "title": "Transitioning to Height Auto (Two Ways)", "url": "https://keithjgrant.com/posts/2023/04/transitioning-to-height-auto/", "published_at": "2023-04-21T17:17:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad8130463", "title": "It's Time to Learn oklch Color", "url": "https://keithjgrant.com/posts/2023/04/its-time-to-learn-oklch-color/", "published_at": "2023-04-07T18:27:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad8a4e463", "title": "Redesign 2023", "url": "https://keithjgrant.com/posts/2023/03/redesign-2023/", "published_at": "2023-03-29T17:54:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad953d0c3", "title": "React Pays the Bills", "url": "https://keithjgrant.com/posts/2023/02/react-pays-the-bills/", "published_at": "2023-02-08T18:02:14+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad9c55943", "title": "You Should Start a Mastodon Instance", "url": "https://keithjgrant.com/posts/2022/you-should-start-a-mastodon-instance/", "published_at": "2022-11-07T16:15:46+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad9da0bcf", "title": "What Happened to Unit Tests?", "url": "https://keithjgrant.com/posts/2021/06/what-happened-to-unit-tests/", "published_at": "2021-06-29T16:25:49+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ad9e214ca", "title": "Client Side NPM", "url": "https://keithjgrant.com/posts/2020/04/client-side-npm/", "published_at": "2020-04-21T17:00:47+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ada156e0c", "title": "Adding Webmention Support to a Static Site", "url": "https://keithjgrant.com/posts/2019/02/adding-webmention-support-to-a-static-site/", "published_at": "2019-02-01T17:47:33+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ada3e2b3d", "title": "Preparing Your Site for Posting Notes", "url": "https://keithjgrant.com/posts/2019/01/preparing-your-site-for-posting-notes/", "published_at": "2019-01-17T19:23:33+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ada6476c1", "title": "A Low-Friction Workflow for Short-form Posting on a Statically Generated Site", "url": "https://keithjgrant.com/posts/2019/01/low-friction-workflow-for-notes/", "published_at": "2019-01-17T15:11:33+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9adafbadcf", "title": "Teaching a Correct CSS Mental Model", "url": "https://keithjgrant.com/posts/2019/01/css-mental-model/", "published_at": "2019-01-08T17:38:52+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9adb05a0f0", "title": "Won’t You Be My Neighbor", "url": "https://keithjgrant.com/posts/2018/09/wont-you-be-my-neighbor/", "published_at": "2018-09-10T12:29:22+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9adbe65e89", "title": "Getting Started with Micropub", "url": "https://keithjgrant.com/posts/2018/09/getting-started-with-micropub/", "published_at": "2018-09-04T16:39:16+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9adc87ec1a", "title": "Resilient, Declarative, Contextual", "url": "https://keithjgrant.com/posts/2018/06/resilient-declarative-contextual/", "published_at": "2018-06-08T13:39:05+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9adcd634f9", "title": "HTML5 Sectioning and Landmark Elements", "url": "https://keithjgrant.com/posts/2018/03/html5-sectioning-and-landmark-elements/", "published_at": "2018-03-05T17:09:47+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9add8a0fda", "title": "Introducing Sidecar", "url": "https://keithjgrant.com/posts/2018/01/introducing-sidecar/", "published_at": "2018-01-19T13:46:41+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ade455c27", "title": "Meet the New Dialog Element", "url": "https://keithjgrant.com/posts/2018/01/meet-the-new-dialog-element/", "published_at": "2018-01-11T14:22:12+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9adf294384", "title": "Shindig", "url": "https://keithjgrant.com/posts/2018/01/shindig/", "published_at": "2018-01-02T19:38:37+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9adfa5735d", "title": "OOCSS and Grid", "url": "https://keithjgrant.com/posts/2017/12/oocss-and-grid/", "published_at": "2017-12-13T18:03:47+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae015e799", "title": "Code, Not Clojure", "url": "https://keithjgrant.com/posts/2017/09/code-not-clojure/", "published_at": "2017-09-08T15:25:10+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae05ce808", "title": "Transitioning Gradients", "url": "https://keithjgrant.com/posts/2017/07/transitioning-gradients/", "published_at": "2017-07-05T17:33:51+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae0d5dc24", "title": "Thoughts on Self-Documenting CSS", "url": "https://keithjgrant.com/posts/2017/06/self-documenting-css/", "published_at": "2017-06-09T17:34:24+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae1cc3778", "title": "Memorizing Alignment Properties", "url": "https://keithjgrant.com/posts/2017/05/memorizing-alignment-properties/", "published_at": "2017-05-05T13:44:55+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae1dddb7c", "title": "What Grid Can Do That Tables Can’t", "url": "https://keithjgrant.com/posts/2017/04/grid-v-tables/", "published_at": "2017-04-12T15:52:15+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae2bddf96", "title": "Don’t QWOP Your Way Through CSS", "url": "https://keithjgrant.com/posts/2017/04/dont-qwop-your-css/", "published_at": "2017-04-07T19:45:07+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae3b331f9", "title": "CSS is Not Broken", "url": "https://keithjgrant.com/posts/2017/03/css-is-not-broken/", "published_at": "2017-03-24T18:15:34+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae3fc244e", "title": "More thoughts on CSS in JS", "url": "https://keithjgrant.com/posts/2017/03/more-thoughts-on-css-in-js/", "published_at": "2017-03-20T19:07:49+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae4a475b2", "title": "A better approach to CSS aspect ratios", "url": "https://keithjgrant.com/posts/2017/03/aspect-ratios/", "published_at": "2017-03-14T14:12:43+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae55705ed", "title": "It’s Both", "url": "https://keithjgrant.com/posts/2017/01/its-both/", "published_at": "2017-01-27T13:54:57+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae59000bb", "title": "Hello, World Wide IndieWeb!", "url": "https://keithjgrant.com/posts/2017/01/hello-indieweb/", "published_at": "2017-01-23T20:34:37+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae5f43aa7", "title": "Let’s Talk About Separation of Concerns", "url": "https://keithjgrant.com/posts/2016/12/separation-of-concerns/", "published_at": "2016-12-23T05:00:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae62e08d7", "title": "Your Team Needs a UX Engineer", "url": "https://keithjgrant.com/posts/2016/10/your-team-needs-a-ux-engineer/", "published_at": "2016-10-02T05:00:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae6e6b481", "title": "CSS in Depth", "url": "https://keithjgrant.com/posts/2016/08/css-in-depth/", "published_at": "2016-08-24T05:00:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae78581d1", "title": "Save Scoped CSS", "url": "https://keithjgrant.com/posts/2016/06/save-scoped-css/", "published_at": "2016-06-09T05:00:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae7c651d8", "title": "A Quest for Interchangeable Parts", "url": "https://keithjgrant.com/posts/2016/02/a-quest-for-interchangeable-parts/", "published_at": "2016-02-06T05:00:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae8315cab", "title": "Width and Absolute Positioning", "url": "https://keithjgrant.com/posts/2016/01/width-and-absolute-positioning/", "published_at": "2016-01-30T05:00:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae8d5ddc5", "title": "Simply White", "url": "https://keithjgrant.com/posts/2016/01/simply-white/", "published_at": "2016-01-27T05:00:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae8e41758", "title": "CSS First", "url": "https://keithjgrant.com/posts/2015/08/css-first/", "published_at": "2015-08-01T15:00:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae9334326", "title": "Into the future of CSS", "url": "https://keithjgrant.com/posts/2015/05/into-the-future-of-css/", "published_at": "2015-05-30T05:00:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9ae98c604f", "title": "Against CSS in JS", "url": "https://keithjgrant.com/posts/2015/05/against-css-in-js/", "published_at": "2015-05-29T05:00:00+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9aea384d94", "title": "Hosting on Github", "url": "https://keithjgrant.com/posts/2015/05/hosting-on-github/", "published_at": "2015-05-16T21:26:32+00:00" }, { "id": "01a08794-82e3-7278-8525-fc9aeacf0ab5", "title": "Taming CSS", "url": "https://keithjgrant.com/posts/2015/04/taming-css/", "published_at": "2015-04-29T21:26:32+00:00" } ] posts Claim your blog
Back to Keith J. Grant
Blog · corpus.blog/blogs/keithjgrant.com/posts

Keith J. Grant

keithjgrant.com

2026

2025

2024

2023

2022

2021

2020

2019

2018

2017

2016

2015