41554 blogs · [ { "id": "01a0d4e5-9cda-71b9-9199-45b04024b00d", "title": "Reps: Wordle, but with JavaScript", "url": "https://zander.wtf/blog/reps/", "published_at": "2026-09-24T00:00:00+00:00" }, { "id": "01a0d4e5-9cda-71b9-9199-45b0404d0e98", "title": "Green Claws now available on the App Store", "url": "https://zander.wtf/blog/green-claws/", "published_at": "2026-09-23T00:00:00+00:00" }, { "id": "01a0d4e5-9cda-71b9-9199-45b0413135ea", "title": "Moons 2.2", "url": "https://zander.wtf/blog/moons-2-2/", "published_at": "2026-09-19T00:00:00+00:00" }, { "id": "01a0d4e5-9cda-71b9-9199-45b041a2baac", "title": "Time Tutor now available on the App Store", "url": "https://zander.wtf/blog/time-tutor/", "published_at": "2026-09-15T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2030c4f45b", "title": "Moons now available on the App Store", "url": "https://zander.wtf/blog/moons/", "published_at": "2026-09-10T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2030d2a266", "title": "Claude, meet my Obsidian vault", "url": "https://zander.wtf/blog/obsidian-mcp-pi/", "published_at": "2026-09-09T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2030ecee20", "title": "This site now comes in four flavours", "url": "https://zander.wtf/blog/four-flavours/", "published_at": "2026-09-08T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2031b93d96", "title": "shotframe", "url": "https://zander.wtf/blog/2026-09-08-shotframe/", "published_at": "2026-08-22T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203253de21", "title": "zed-ios-app-starter", "url": "https://zander.wtf/blog/2026-08-12-zed-ios-app-starter/", "published_at": "2026-08-12T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2032ba0d7f", "title": "What should actually go in your CLAUDE.md?", "url": "https://zander.wtf/blog/claude-md-agents-md/", "published_at": "2026-08-03T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2033037f43", "title": "astro-d1-search: site search for Astro in one integration", "url": "https://zander.wtf/blog/astro-d1-search-package/", "published_at": "2026-08-02T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2033b802aa", "title": "astro-d1-search released on npm", "url": "https://zander.wtf/blog/2026-08-02-astro-d1-search/", "published_at": "2026-08-02T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203432eef0", "title": "A native iOS app for Otter", "url": "https://zander.wtf/blog/2026-08-02-otter-native-ios-app/", "published_at": "2026-07-29T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20343d5d34", "title": "Building site search with Astro and Cloudflare D1", "url": "https://zander.wtf/blog/astro-cloudflare-d1-search/", "published_at": "2026-07-21T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2034a47484", "title": "Site-wide search + Raycast extension", "url": "https://zander.wtf/blog/2026-07-20-site-search/", "published_at": "2026-07-20T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2034c07bc1", "title": "text-wrap, overflow-wrap and word-break: which one do I actually want?", "url": "https://zander.wtf/blog/css-text-wrapping/", "published_at": "2026-07-19T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2035118d2e", "title": "Lab experiments + ZUI playground", "url": "https://zander.wtf/blog/2026-07-17-lab-and-zui-updates/", "published_at": "2026-07-17T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203582ffef", "title": "Letterboxd watchlist for Radarr", "url": "https://zander.wtf/blog/2026-07-13-letterboxd-radarr/", "published_at": "2026-07-13T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2036741f4a", "title": "The Otter ecosystem", "url": "https://zander.wtf/blog/otter-ecosystem/", "published_at": "2026-07-10T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2036a58fbb", "title": "The ZUI ecosystem", "url": "https://zander.wtf/blog/zui-ecosystem/", "published_at": "2026-07-10T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20373192cd", "title": "Zero: my project factory", "url": "https://zander.wtf/blog/zero-project-factory/", "published_at": "2026-07-08T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2037f6bd40", "title": "zed-astro-starter", "url": "https://zander.wtf/blog/2026-07-08-zed-astro-starter/", "published_at": "2026-07-08T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2038b7a448", "title": "The modern CSS hiding inside ZUI", "url": "https://zander.wtf/blog/zui-modern-css/", "published_at": "2026-07-07T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2039552d03", "title": "My zero-to-one stack", "url": "https://zander.wtf/blog/zero-to-one-stack/", "published_at": "2026-07-06T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2039a8850e", "title": "Launched fonts.zander.wtf", "url": "https://zander.wtf/blog/2026-07-04-fonts-zander-wtf/", "published_at": "2026-07-04T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203a0bbbb1", "title": "React Status Bar v1", "url": "https://zander.wtf/blog/2026-06-22-react-status-bar/", "published_at": "2026-06-22T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203abc4c79", "title": "Spotify Favourites", "url": "https://zander.wtf/blog/2026-06-19-spotify-fave-artists/", "published_at": "2026-06-16T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203b36dd54", "title": "Add a projects page", "url": "https://zander.wtf/blog/2026-06-08-projects-page/", "published_at": "2026-06-08T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203b779286", "title": "Using hunk as a diff viewer in lazygit", "url": "https://zander.wtf/blog/lazygit-with-hunk/", "published_at": "2026-06-05T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203c2b4a50", "title": "agent-skills", "url": "https://zander.wtf/blog/2026-06-19-agent-skills/", "published_at": "2026-06-04T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203d23e00f", "title": "Launched Reps", "url": "https://zander.wtf/blog/2026-06-03-reps/", "published_at": "2026-06-03T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203d67c729", "title": "Launched lab.zander.wtf", "url": "https://zander.wtf/blog/2026-05-19-lab-zander-wtf/", "published_at": "2026-05-19T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203d82991d", "title": "Otter web v1.1.0", "url": "https://zander.wtf/blog/2026-05-19-otter-web-v1.1.0/", "published_at": "2026-05-19T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203e168a68", "title": "zed-stack-starter", "url": "https://zander.wtf/blog/2026-05-07-zed-stack-starter/", "published_at": "2026-05-07T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203ef6a60a", "title": "Otter web v1.0.0", "url": "https://zander.wtf/blog/2026-05-06-otter-web-v1/", "published_at": "2026-05-06T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203f5ba717", "title": "UK Primary School Maths", "url": "https://zander.wtf/blog/2026-04-27-uk-primary-school-maths/", "published_at": "2026-04-27T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203fc58ae3", "title": "Launched ZUI (Zooey)", "url": "https://zander.wtf/blog/2026-03-18-zui/", "published_at": "2026-03-18T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203fc6b1a5", "title": "xtractr", "url": "https://zander.wtf/blog/2026-03-11-xtractr/", "published_at": "2026-03-11T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e203fda922e", "title": "strifx", "url": "https://zander.wtf/blog/2026-02-27-strifx/", "published_at": "2026-02-27T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20407353b8", "title": "zed-surround", "url": "https://zander.wtf/blog/2026-02-26-zed-surround/", "published_at": "2026-02-26T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20413f4bbd", "title": "vite-plugin-atlas", "url": "https://zander.wtf/blog/2026-02-25-vite-plugin-atlas/", "published_at": "2026-02-25T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20417eae08", "title": "Things I've been building recently while evaluating AI agents", "url": "https://zander.wtf/blog/ai-side-projects/", "published_at": "2026-02-23T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20420d9011", "title": "url-merge", "url": "https://zander.wtf/blog/2026-02-04-url-merge/", "published_at": "2026-02-04T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20422a09ce", "title": "Code notes come to the site", "url": "https://zander.wtf/blog/2026-01-26-code-notes-on-site/", "published_at": "2026-01-26T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2042bd9d60", "title": "my-api-tools", "url": "https://zander.wtf/blog/2025-03-30-my-api-tools/", "published_at": "2025-03-30T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2042f7a8b6", "title": "Add Now page", "url": "https://zander.wtf/blog/2024-05-31-now-page/", "published_at": "2024-05-31T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2043c7f1dc", "title": "Homepage updates", "url": "https://zander.wtf/blog/2024-05-29-home-page-updates/", "published_at": "2024-05-29T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20443420e5", "title": "Otter Raycast Extension", "url": "https://zander.wtf/blog/2024-03-03-otter-raycast-extension/", "published_at": "2024-03-03T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2044e940a0", "title": "Moving to Cloudflare", "url": "https://zander.wtf/blog/2024-03-01-moving-to-cloudflare/", "published_at": "2024-03-01T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2045cd9465", "title": "Add matching collections to Otter feed items", "url": "https://zander.wtf/blog/2024-02-18-otter-feed-items-collections/", "published_at": "2024-02-18T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204683a4e9", "title": "Otter Bookmark entry improvements", "url": "https://zander.wtf/blog/2024-02-14-otter-bookmark-entry-improvements/", "published_at": "2024-02-14T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20472aca22", "title": "Otter database upgrade", "url": "https://zander.wtf/blog/2024-01-08-otter-db-upgrade/", "published_at": "2024-01-08T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2047d0a5a9", "title": "Otter Collections", "url": "https://zander.wtf/blog/2023-12-14-otter-collections/", "published_at": "2023-12-14T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20483fe329", "title": "Opengraph images", "url": "https://zander.wtf/blog/2023-12-06-opengraph-images/", "published_at": "2023-12-06T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20489a8edf", "title": "Otter AI titles", "url": "https://zander.wtf/blog/2023-12-01-otter-ai-titles/", "published_at": "2023-12-01T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204910ba7e", "title": "Worklog", "url": "https://zander.wtf/blog/2023-11-28-worklog/", "published_at": "2023-11-28T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2049e229e5", "title": "Otter Raycast OAuth", "url": "https://zander.wtf/blog/2023-11-23-otter-raycast-oauth/", "published_at": "2023-11-23T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204a7006a2", "title": "Otter v2.1.0 release", "url": "https://zander.wtf/blog/2023-11-11-otter-v2.1.0-release/", "published_at": "2023-11-11T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204aa4a4cb", "title": "Otter v2.0.0", "url": "https://zander.wtf/blog/otter-v2/", "published_at": "2023-11-04T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204aa55b5f", "title": "Otter v2.0.0 release", "url": "https://zander.wtf/blog/2023-11-04-otter-v2-release/", "published_at": "2023-11-04T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204aed344e", "title": "Styling React 2023 edition", "url": "https://zander.wtf/blog/styling-react/", "published_at": "2023-11-01T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204b2aa707", "title": "React blogpost", "url": "https://zander.wtf/blog/2023-11-01-react-styling/", "published_at": "2023-11-01T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204bf415b3", "title": "Mastodon to Supabase integration", "url": "https://zander.wtf/blog/2023-10-06-otter-mastodon-integration/", "published_at": "2023-10-06T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204cabd446", "title": "Cloudflare scraper", "url": "https://zander.wtf/blog/2023-10-03-cloudflare-scraper/", "published_at": "2023-10-03T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204d4a8a4b", "title": "Reviving old music gadgets for my son", "url": "https://zander.wtf/blog/old-tech/", "published_at": "2023-09-07T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204d66028e", "title": "Otter", "url": "https://zander.wtf/blog/otter-intro/", "published_at": "2022-09-21T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204d8c4d10", "title": "2020 In Review", "url": "https://zander.wtf/blog/2020-review/", "published_at": "2021-01-03T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204dea4c77", "title": "Building a table of contents component", "url": "https://zander.wtf/blog/gatsby-table-of-contents/", "published_at": "2020-06-17T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204e783a30", "title": "Announcing Code Notes", "url": "https://zander.wtf/blog/code-notes-release/", "published_at": "2020-06-11T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204f656ace", "title": "Redesigning my site... 2020 edition", "url": "https://zander.wtf/blog/site-redesign-2020/", "published_at": "2020-05-30T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e204ffd729c", "title": "Command line tools", "url": "https://zander.wtf/blog/terminal-commands/", "published_at": "2019-09-07T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205077360c", "title": "Avoid being tracked on the web", "url": "https://zander.wtf/blog/not-tracked-online/", "published_at": "2019-09-07T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20515a7dc5", "title": "Lessons learned building design systems", "url": "https://zander.wtf/blog/lessons-learned-building-design-systems/", "published_at": "2019-03-14T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20523ad17e", "title": "Design systems at FairFX", "url": "https://zander.wtf/blog/design-systems-at-fairfx/", "published_at": "2018-10-25T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20529f2369", "title": "Jargon busting", "url": "https://zander.wtf/blog/jargon-busting/", "published_at": "2018-08-11T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205314bb03", "title": "Rebel with a CORS", "url": "https://zander.wtf/blog/rebel-with-a-cors/", "published_at": "2018-02-14T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2053bf7bd7", "title": "Introducing Design System Utils", "url": "https://zander.wtf/blog/introducing-design-system-utils/", "published_at": "2018-02-11T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2053c19399", "title": "Creating dynamic layouts with Jekyll", "url": "https://zander.wtf/blog/creating-dynamic-layouts-with-jekyll/", "published_at": "2017-02-02T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205475ba44", "title": "Creative Technology Monthly: Disappearing interface", "url": "https://zander.wtf/blog/creative-technology-monthly-disappearing-interface/", "published_at": "2017-01-27T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20555d1900", "title": "Creative Technology Monthly: Motion and Animation", "url": "https://zander.wtf/blog/creative-technology-monthly-motion-and-animation/", "published_at": "2016-12-23T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2055a7807d", "title": "Creative Technology Monthly: Chatbots", "url": "https://zander.wtf/blog/creative-technology-monthly-chatbots/", "published_at": "2016-11-24T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205605cca1", "title": "Updating npm packages", "url": "https://zander.wtf/blog/update-npm-modules/", "published_at": "2016-05-21T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205635c9cf", "title": "Redesigning my site... 2016 edition", "url": "https://zander.wtf/blog/site-redesign-2016/", "published_at": "2016-04-15T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205709ac23", "title": "How to create custom grids with Kickoff", "url": "https://zander.wtf/blog/how-to-create-custom-grids-with-kickoff/", "published_at": "2016-02-12T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205785c6cd", "title": "Kickoff 6 and the future", "url": "https://zander.wtf/blog/kickoff-6-and-the-future/", "published_at": "2016-02-10T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20578a2684", "title": "Add responsive helper classes to your project", "url": "https://zander.wtf/blog/responsive-helper-classes/", "published_at": "2016-01-18T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2057b9260c", "title": "How to painlessly move Kickoff’s assets directory", "url": "https://zander.wtf/blog/how-to-painlessly-move-kickoffs-assets-directory/", "published_at": "2016-01-09T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2057f08813", "title": "My process for using SVG on the web", "url": "https://zander.wtf/blog/svg-on-the-web/", "published_at": "2015-09-09T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205848bf6a", "title": "Improving the UX of a front-end framework", "url": "https://zander.wtf/blog/ux-of-a-front-end-framework/", "published_at": "2015-09-07T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e20590b34c3", "title": "My development stack", "url": "https://zander.wtf/blog/dev-stack-2015/", "published_at": "2015-01-20T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e2059f638ed", "title": "Improve website event tracking with trak.js", "url": "https://zander.wtf/blog/trakjs-universal-analytics-api/", "published_at": "2014-11-17T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205a66f50c", "title": "The road to Kickoff version 4", "url": "https://zander.wtf/blog/the-road-to-kickoff-v4/", "published_at": "2014-08-27T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205b25933d", "title": "Pinboard.in Chrome Extension", "url": "https://zander.wtf/blog/pinboard-chrome-extension/", "published_at": "2014-08-01T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205bd42a2c", "title": "Sublime Text packages for Front-end web development", "url": "https://zander.wtf/blog/sublime-text-for-front-end-development/", "published_at": "2014-07-30T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205c3c21e3", "title": "Yeoman Generator Development Tips", "url": "https://zander.wtf/blog/yeoman-generator-development-tips/", "published_at": "2014-05-01T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205c714165", "title": "Tooling around", "url": "https://zander.wtf/blog/tooling-around/", "published_at": "2014-04-16T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205cea5f7f", "title": "Speedtesting gulp.js and Grunt", "url": "https://zander.wtf/blog/speedtesting-gulp-and-grunt/", "published_at": "2014-01-15T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205d164e42", "title": "Introducing Kickoff", "url": "https://zander.wtf/blog/introducing-kickoff/", "published_at": "2013-12-10T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205d637a0b", "title": "More efficient Grunt workflows", "url": "https://zander.wtf/blog/more-efficient-grunt-workflows/", "published_at": "2013-12-01T00:00:00+00:00" }, { "id": "01a08c66-68a7-7168-af07-2e205de126a3", "title": "Two versions of jQuery?", "url": "https://zander.wtf/blog/two-versions-of-jquery/", "published_at": "2013-06-10T00:00:00+00:00" } ] posts Claim your blog
Back to zander.wtf
Blog · corpus.blog/blogs/zander.wtf/posts

zander.wtf

zander.wtf

2026

2025

2024

2023

2022

21 Sept 2022

2021

2020

2019

2018

2017

2016

2015

2014

2013