{"id":257,"date":"2024-12-01T16:27:34","date_gmt":"2024-12-01T16:27:34","guid":{"rendered":"https:\/\/blog.zmh.org\/about\/"},"modified":"2024-12-01T16:27:34","modified_gmt":"2024-12-01T16:27:34","slug":"blog","status":"publish","type":"page","link":"https:\/\/zmh.org\/blog\/","title":{"rendered":"Blog"},"content":{"rendered":"\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9503679e wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:72%\">\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-query is-layout-flow wp-block-query-is-layout-flow\"><ul class=\"wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow\"><li class=\"wp-block-post post-2541 post type-post status-publish format-standard has-post-thumbnail hentry category-uncategorized tag-projects\">\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-89a94f6a wp-block-group-is-layout-flex\" style=\"line-height:1\"><div class=\"wp-block-post-date\"><time datetime=\"2026-04-13T02:47:20-04:00\"><a href=\"https:\/\/zmh.org\/personal-site-gallery\/\">Apr 13, 2026 \u00b7 2:47 AM<\/a><\/time><\/div>\n\n<div class=\"taxonomy-post_tag wp-block-post-terms\"><span class=\"wp-block-post-terms__prefix\">\u00b7 <\/span><a href=\"https:\/\/zmh.org\/tag\/projects\/\" rel=\"tag\">projects<\/a><\/div><\/div>\n\n\n<div class=\"entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow\">\n<p>I\u2019ve put together what I think is currently the most comprehensive directory of personal sites available on the internet today. 31,000+ personal web pages, screenshotted for easy browsing and tagged with visual characteristics so you can search through them very easily.<\/p>\n\n\n\n<p>Give it a try at <a href=\"https:\/\/zmh.github.io\/personal-site-gallery\/\">zmh.github.io\/personal-site-gallery\/<\/a><\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a7565b5a5844&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a7565b5a5844\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"732\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-13-at-14.44.20%402x.png?resize=1024%2C732&#038;quality=80&#038;ssl=1\" alt=\"\" class=\"wp-image-2542\" srcset=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-13-at-14.44.20%402x-scaled.png?resize=1024%2C732&amp;quality=80&amp;ssl=1 1024w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-13-at-14.44.20%402x-scaled.png?resize=300%2C215&amp;quality=80&amp;ssl=1 300w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-13-at-14.44.20%402x-scaled.png?resize=768%2C549&amp;quality=80&amp;ssl=1 768w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-13-at-14.44.20%402x-scaled.png?resize=1536%2C1098&amp;quality=80&amp;ssl=1 1536w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-13-at-14.44.20%402x-scaled.png?resize=2048%2C1465&amp;quality=80&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/div>\n\n\n<div style=\"height:var(--wp--preset--spacing--60);width:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div>\n\n<\/li><li class=\"wp-block-post post-2519 post type-post status-publish format-standard has-post-thumbnail hentry category-uncategorized tag-projects\">\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-89a94f6a wp-block-group-is-layout-flex\" style=\"line-height:1\"><div class=\"wp-block-post-date\"><time datetime=\"2026-04-08T12:49:29-04:00\"><a href=\"https:\/\/zmh.org\/dispatch\/\">Apr 8, 2026 \u00b7 12:49 PM<\/a><\/time><\/div>\n\n<div class=\"taxonomy-post_tag wp-block-post-terms\"><span class=\"wp-block-post-terms__prefix\">\u00b7 <\/span><a href=\"https:\/\/zmh.org\/tag\/projects\/\" rel=\"tag\">projects<\/a><\/div><\/div>\n\n\n<div class=\"entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow\">\n<h3 class=\"wp-block-heading\"><span style=\"font-family: var(--editor-font-family); font-size: var(--editor-font-size);\">A focused inbox for Slack.<\/span><\/h3>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-3 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a7565b5aca90&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a7565b5aca90\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"859\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"2529\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.14.00%402x.png?resize=1024%2C859&#038;quality=80&#038;ssl=1\" alt=\"\" class=\"wp-image-2529\" srcset=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.14.00%402x.png?resize=1024%2C859&amp;quality=80&amp;ssl=1 1024w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.14.00%402x.png?resize=300%2C252&amp;quality=80&amp;ssl=1 300w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.14.00%402x.png?resize=768%2C644&amp;quality=80&amp;ssl=1 768w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.14.00%402x.png?resize=1536%2C1288&amp;quality=80&amp;ssl=1 1536w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.14.00%402x.png?resize=2048%2C1717&amp;quality=80&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a7565b5adb5e&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a7565b5adb5e\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"825\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"2527\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.09.29%402x.png?resize=1024%2C825&#038;quality=80&#038;ssl=1\" alt=\"\" class=\"wp-image-2527\" srcset=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.09.29%402x.png?resize=1024%2C825&amp;quality=80&amp;ssl=1 1024w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.09.29%402x.png?resize=300%2C242&amp;quality=80&amp;ssl=1 300w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.09.29%402x.png?resize=768%2C619&amp;quality=80&amp;ssl=1 768w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.09.29%402x.png?resize=1536%2C1238&amp;quality=80&amp;ssl=1 1536w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.09.29%402x.png?w=1908&amp;quality=80&amp;ssl=1 1908w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a7565b5aea69&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a7565b5aea69\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"859\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"2528\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.10.50%402x.png?resize=1024%2C859&#038;quality=80&#038;ssl=1\" alt=\"\" class=\"wp-image-2528\" srcset=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.10.50%402x.png?resize=1024%2C859&amp;quality=80&amp;ssl=1 1024w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.10.50%402x.png?resize=300%2C252&amp;quality=80&amp;ssl=1 300w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.10.50%402x.png?resize=768%2C644&amp;quality=80&amp;ssl=1 768w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.10.50%402x.png?resize=1536%2C1288&amp;quality=80&amp;ssl=1 1536w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.10.50%402x.png?resize=2048%2C1717&amp;quality=80&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a7565b5afa47&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a7565b5afa47\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"825\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"2526\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.09.20%402x.png?resize=1024%2C825&#038;quality=80&#038;ssl=1\" alt=\"\" class=\"wp-image-2526\" srcset=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.09.20%402x.png?resize=1024%2C825&amp;quality=80&amp;ssl=1 1024w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.09.20%402x.png?resize=300%2C242&amp;quality=80&amp;ssl=1 300w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.09.20%402x.png?resize=768%2C619&amp;quality=80&amp;ssl=1 768w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.09.20%402x.png?resize=1536%2C1238&amp;quality=80&amp;ssl=1 1536w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/04\/CleanShot-2026-04-08-at-01.09.20%402x.png?w=1908&amp;quality=80&amp;ssl=1 1908w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/figure>\n\n\n\n<p>I hate how Slack&#8217;s Activity and Catch Up features work, so I built <a href=\"https:\/\/github.com\/zmh\/dispatch\">Dispatch<\/a>, an opinionated and focused inbox for Slack. Sort of like Superhuman for Slack \u2014 never miss an important message, and triage your inbox quickly.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add your Slack cookie so it can connect to your workspace. Everything happens locally.<\/li>\n\n\n\n<li>Choose what messages you want brought into Dispatch. Mentions are included by default. You can additionally specify people or channels. For example, I have people I work most closely with and senior execs listed, along with a few whole-company channels I know might be relevant.<\/li>\n\n\n\n<li>All the messages imported by the above will be categorized into split inboxes or categories, based either on simple keywords (e.g. <code>from:@Matt<\/code> should be filtered into the Important inbox) or, optionally, with Claude Haiku using a prompt you can configure. If you choose to enable Claude, you&#8217;ll effectively have a little assistant categorizing each message into a bucket based on your description.<\/li>\n\n\n\n<li>Go through each inbox. Star, snooze, or mark messages as done with keyboard shortcuts. Hit enter to read more or reply in Slack directly.<\/li>\n<\/ol>\n\n\n\n<p>This lets you treat Slack just like email. Messages come in, get filtered into inboxes, and then you can action them quickly. <\/p>\n\n\n\n<p>The design is inspired by Superhuman Mail, as well as a now-defunct alternative Slack client I used and loved called <a href=\"https:\/\/cancel.fm\/ripcord\/\">Ripcord<\/a>. Dispatch is typography-heavy and very dense, with inspiration and guidance from Matthew Butterick&#8217;s <em><a href=\"https:\/\/practicaltypography.com\/\">Practical Typography<\/a><\/em>, which argues that typography (font size, spacing, and density) are the primary interface of any text-heavy app. Dispatch uses SF Pro at 13px with tight row heights so you can scan dozens of messages without wasted space, and lets you switch to monospace or adjust sizes from 11\u201318px, because good typography respects the reader&#8217;s context. Just enough structure to let you read fast and act. <\/p>\n\n\n\n<p>There are <s>probably<\/s> definitely bugs, but I&#8217;ve been using it for the past few days and it&#8217;s helped cut through a lot of the noise on Slack. <a href=\"https:\/\/github.com\/zmh\/dispatch\">Give it a try<\/a> and let me know what you think!<\/p>\n\n\n\n<p>Why build a Slack client? For years, I&#8217;ve been fed up with how Slack treats channels, messages, and threads. Channels are too noisy, important context gets lost in threads, the Activity view captures a subset of actionable items, and notifications often don&#8217;t fire. And seemingly most of the internet agrees with me:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-twitter\"><blockquote class=\"twitter-tweet\" data-width=\"500\" data-dnt=\"true\"><p lang=\"en\" dir=\"ltr\">&quot;graveyard of unread messages&quot; is a very accurate description &#8211; the default state of every Slack workspace eventually becomes a pile of things nobody actually got back to<\/p>&mdash; Josh Jackson (@IamJoshJackson) <a href=\"https:\/\/twitter.com\/IamJoshJackson\/status\/2038797159047496129?ref_src=twsrc%5Etfw\">March 31, 2026<\/a><\/blockquote><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/div>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-twitter\"><blockquote class=\"twitter-tweet\" data-width=\"500\" data-dnt=\"true\"><p lang=\"en\" dir=\"ltr\">Is Slack performance degrading for anyone else?<br><br>Thread content sometimes loads, alerts usually happen, reactions appear and disappear, channels aren&#39;t marked as unread sometimes.<\/p>&mdash; Ryan Jones (@rjonesy) <a href=\"https:\/\/twitter.com\/rjonesy\/status\/1832099839586537770?ref_src=twsrc%5Etfw\">September 6, 2024<\/a><\/blockquote><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/div>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-twitter\"><blockquote class=\"twitter-tweet\" data-width=\"500\" data-dnt=\"true\"><p lang=\"en\" dir=\"ltr\">Slack is always broken. How is this error even happening?<br><br>* Activity: 1 notification<br>* Click on Activity<br>* No activity listed<br><br>\ud83d\ude35\u200d\ud83d\udcab <a href=\"https:\/\/t.co\/y0h5kpuWqH\">pic.twitter.com\/y0h5kpuWqH<\/a><\/p>&mdash; Anastasios Nikolas Angelopoulos (@ml_angelopoulos) <a href=\"https:\/\/twitter.com\/ml_angelopoulos\/status\/2028624751942668659?ref_src=twsrc%5Etfw\">March 3, 2026<\/a><\/blockquote><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/div>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-twitter\"><blockquote class=\"twitter-tweet\" data-width=\"500\" data-dnt=\"true\"><p lang=\"en\" dir=\"ltr\">Slack is where context goes to die. By thread 200 you can&#39;t find anything. Async tools that force structured thinking beat it every time for small teams doing real work.<\/p>&mdash; Teddy Gyabaah (@teddykabg) <a href=\"https:\/\/twitter.com\/teddykabg\/status\/2034584165799145768?ref_src=twsrc%5Etfw\">March 19, 2026<\/a><\/blockquote><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/div>\n<\/div><\/figure>\n\n\n\n<p>If someone doesn&#8217;t @-mention you or the channel, the only way you&#8217;ll see that message is to read every message, in every channel, every day. For orgs with hundreds of channels, it&#8217;s a mess.<\/p>\n<\/div>\n\n\n<div style=\"height:var(--wp--preset--spacing--60);width:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div>\n\n<\/li><li class=\"wp-block-post post-2515 post type-post status-publish format-standard hentry category-uncategorized\">\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-89a94f6a wp-block-group-is-layout-flex\" style=\"line-height:1\"><div class=\"wp-block-post-date\"><time datetime=\"2026-01-10T19:05:43-04:00\"><a href=\"https:\/\/zmh.org\/2026-01-10\/\">Jan 10, 2026 \u00b7 7:05 PM<\/a><\/time><\/div>\n\n<\/div>\n\n\n<div class=\"entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow\">\n<p>Today, on the 250th anniversary of Thomas Paine\u2019s <i>Common Sense<\/i>, from <a href=\"https:\/\/www.axios.com\/2026\/01\/10\/usa-250-years-promise-optimism\">Axios&#8217; Jim VandeHei &amp; Mike Allen<\/a>:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>So take three minutes this morning to simply savor what&#8217;s special about this country, 250 years into its revolution.<\/p>\n\n\n\n<p>There&#8217;s something special about democracy \u2014 American democracy \u2014 and its ability to evolve and meet the craziest of challenges. We free people, protect people, empower people and enrich people.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Our history points the way. It was ordinary people doing extraordinary things to flee kings and tyranny, birth a democracy, build a great nation, overcome division and adversity, and allow 50 states to form and prosper as one majestic union.<br><br>It was students, workers, farmers, teachers, doctors, truckers, businessmen and women, leaders of all stripes who restored sanity, valor, wisdom, hard work and common sense. They did, not duped; worked, not whined; built, not berated; restored, not ridiculed.<\/p>\n\n\n\n<p>They focused on U.S., not them.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Just for today, tune out the screams on screens and imagine\u2026<\/p>\n\n\n\n<p>Imagine working together, drawing on our shared patriotism and duty, to instantly and dramatically improve an already great nation to benefit you and your neighbors.<br><br>Imagine spending more time fixing stuff smartly than getting sucked into silly, small fights unwittingly.<br><br>Imagine an army of competent people storming politics and business and communities to retool things so workers, the middle class and the well-to-do all prosper. Imagine no longer condemning &#8220;the rich.&#8221; But giving everyone a fair shake at becoming it.<br><br>Imagine rural communities revitalized \u2026 suburbs soaring \u2026 cities sparkling and safe. Imagine the explosive growth to follow and the benefits finally flowing to you with better schools, better health care, affordable houses and high-paying jobs.<\/p>\n\n\n\n<p>This is the inspiring thing: This is all achievable now \u2014 not in some distant future or galaxy. America has all the ingredients: the talent, the ideas, the drive, the power. And it has you, the very people who prop up this nation, in good times and bad.<\/p>\n<\/blockquote>\n\n\n\n<p><\/p>\n<\/div>\n\n\n<div style=\"height:var(--wp--preset--spacing--60);width:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div>\n\n<\/li><li class=\"wp-block-post post-2464 post type-post status-publish format-standard hentry category-uncategorized tag-projects\">\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-89a94f6a wp-block-group-is-layout-flex\" style=\"line-height:1\"><div class=\"wp-block-post-date\"><time datetime=\"2026-01-01T11:32:21-04:00\"><a href=\"https:\/\/zmh.org\/2025-side-projects\/\">Jan 1, 2026 \u00b7 11:32 AM<\/a><\/time><\/div>\n\n<div class=\"taxonomy-post_tag wp-block-post-terms\"><span class=\"wp-block-post-terms__prefix\">\u00b7 <\/span><a href=\"https:\/\/zmh.org\/tag\/projects\/\" rel=\"tag\">projects<\/a><\/div><\/div>\n\n\n<div class=\"entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow\">\n<p>I\u2019m finally publishing my side projects for 2025 on Github \u2014 36,408 lines of code, almost entirely vibe coded.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/zmh.org\/quill\/\">Quill<\/a>, a beautiful, fast, native Mac WordPress blogging editor inspired by IA Writer but with full, bidirectional Gutenberg block support<\/li>\n\n\n\n<li><a href=\"https:\/\/zmh.org\/gymtxt\/\">Gymtxt<\/a>, a lightweight way to log workouts as plaintext<\/li>\n\n\n\n<li><a href=\"https:\/\/zmh.org\/day-one-publish\/\">Day One Publish<\/a>, a way to generate static sites from a Day One journal to share with friends and family<\/li>\n\n\n\n<li><a href=\"https:\/\/zmh.org\/shrinksearch\/\">Shrinksearch<\/a>, a fast way to search and browse Psychology Today profiles<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-2 is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a7565b5b5e2a&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a7565b5b5e2a\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"720\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"2477\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/quill-hero.png?resize=1024%2C720&#038;quality=80&#038;ssl=1\" alt=\"\" class=\"wp-image-2477\" srcset=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/quill-hero-scaled.png?resize=1024%2C720&amp;quality=80&amp;ssl=1 1024w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/quill-hero-scaled.png?resize=300%2C211&amp;quality=80&amp;ssl=1 300w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/quill-hero-scaled.png?resize=768%2C540&amp;quality=80&amp;ssl=1 768w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/quill-hero-scaled.png?resize=1536%2C1080&amp;quality=80&amp;ssl=1 1536w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/quill-hero-scaled.png?resize=2048%2C1440&amp;quality=80&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a7565b5b7176&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a7565b5b7176\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"613\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"2479\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/gymtxt-hero.png?resize=1024%2C613&#038;quality=80&#038;ssl=1\" alt=\"\" class=\"wp-image-2479\" srcset=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/gymtxt-hero-scaled.png?resize=1024%2C613&amp;quality=80&amp;ssl=1 1024w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/gymtxt-hero-scaled.png?resize=300%2C180&amp;quality=80&amp;ssl=1 300w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/gymtxt-hero-scaled.png?resize=768%2C460&amp;quality=80&amp;ssl=1 768w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/gymtxt-hero-scaled.png?resize=1536%2C920&amp;quality=80&amp;ssl=1 1536w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/gymtxt-hero-scaled.png?resize=2048%2C1227&amp;quality=80&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a7565b5b8346&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a7565b5b8346\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"737\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"2481\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/dayonepublish-hero.png?resize=1024%2C737&#038;quality=80&#038;ssl=1\" alt=\"\" class=\"wp-image-2481\" srcset=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/dayonepublish-hero-scaled.png?resize=1024%2C737&amp;quality=80&amp;ssl=1 1024w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/dayonepublish-hero-scaled.png?resize=300%2C216&amp;quality=80&amp;ssl=1 300w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/dayonepublish-hero-scaled.png?resize=768%2C553&amp;quality=80&amp;ssl=1 768w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/dayonepublish-hero-scaled.png?resize=1536%2C1106&amp;quality=80&amp;ssl=1 1536w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/dayonepublish-hero-scaled.png?resize=2048%2C1474&amp;quality=80&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a7565b5b9601&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a7565b5b9601\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"737\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"2483\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/shrinksearch-hero.png?resize=1024%2C737&#038;quality=80&#038;ssl=1\" alt=\"\" class=\"wp-image-2483\" srcset=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/shrinksearch-hero-scaled.png?resize=1024%2C737&amp;quality=80&amp;ssl=1 1024w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/shrinksearch-hero-scaled.png?resize=300%2C216&amp;quality=80&amp;ssl=1 300w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/shrinksearch-hero-scaled.png?resize=768%2C553&amp;quality=80&amp;ssl=1 768w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/shrinksearch-hero-scaled.png?resize=1536%2C1106&amp;quality=80&amp;ssl=1 1536w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/shrinksearch-hero-scaled.png?resize=2048%2C1474&amp;quality=80&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/figure>\n\n\n\n<p>Some notes from building this year:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>I\u2019ve been preferring one-page tools that read\/write from a local CSV, JSON file, or sqlite db \u2014 the data layer is easy for the models to use, version controlled, and super fast on the frontend for the user.<\/li>\n\n\n\n<li>I like UX where the app is a layer on top of plaintext. Gymtxt was my first attempt at this, and I love <a href=\"https:\/\/x.com\/zehf\/status\/2004571994126455003\">this travel app<\/a> with a similar vibe. Treating the text area as the database means the user, LLM, and developer can all easily interact with the same dataset.<\/li>\n\n\n\n<li>I highly recommend <a href=\"https:\/\/coolify.io\">Coolify<\/a> or <a href=\"https:\/\/dokploy.com\/\">Dokploy<\/a> for vibecoding projects with Claude Code. They\u2019re essentially a self-hosted Replit or V0 \u2014 you get a unique URL per project, and they auto-deploy when you push to Github. Set it up once on a cheap $5 VPS and you can go from a new folder on your computer to a link you can share in ~3 steps (create the repo in Github, push to it, and then tell Coolify about the new repo.)<\/li>\n\n\n\n<li>I\u2019m interested in what LLMs can \u201csee\u201d when processing images. Web projects were easier than native apps because Claude Code could snapshot the page and verify its results vs. native apps where I would largely do that (though I imagine giving screen access in the future will fix that.) But even when snapshotting, specific layout tweaks were sometimes hard for it to see in the generated image.<\/li>\n\n\n\n<li>Apple should have an App Store submission MCP and an improved notarization experience. The hardest part of Quill was getting it into executable form so people could download it and run directly. Until then, my default stack will skew towards web technologies unless there\u2019s a specific reason to build natively.<\/li>\n\n\n\n<li>I find it crazy that, when facing a bug the LLM can\u2019t solve, starting entirely from scratch and referencing the old project code will often result in 100% feature parity with the issue resolved. I wonder if coding agents will adopt this as a way to get around roadblocks.<\/li>\n<\/ul>\n<\/div>\n\n\n<div style=\"height:var(--wp--preset--spacing--60);width:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div>\n\n<\/li><li class=\"wp-block-post post-2462 post type-post status-publish format-standard has-post-thumbnail hentry category-uncategorized tag-projects\">\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-89a94f6a wp-block-group-is-layout-flex\" style=\"line-height:1\"><div class=\"wp-block-post-date\"><time datetime=\"2025-12-29T09:53:51-04:00\"><a href=\"https:\/\/zmh.org\/day-one-publish\/\">Dec 29, 2025 \u00b7 9:53 AM<\/a><\/time><\/div>\n\n<div class=\"taxonomy-post_tag wp-block-post-terms\"><span class=\"wp-block-post-terms__prefix\">\u00b7 <\/span><a href=\"https:\/\/zmh.org\/tag\/projects\/\" rel=\"tag\">projects<\/a><\/div><\/div>\n\n\n<div class=\"entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow\">\n<p><a href=\"https:\/\/github.com\/zmh\/dayone-publish\">Day One Publish<\/a> is a project I made to generate a static site from a Day One journal.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a7565b5bd39d&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a7565b5bd39d\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"737\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/dayonepublish-hero.png?resize=1024%2C737&#038;quality=80&#038;ssl=1\" alt=\"\" class=\"wp-image-2481\" srcset=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/dayonepublish-hero-scaled.png?resize=1024%2C737&amp;quality=80&amp;ssl=1 1024w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/dayonepublish-hero-scaled.png?resize=300%2C216&amp;quality=80&amp;ssl=1 300w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/dayonepublish-hero-scaled.png?resize=768%2C553&amp;quality=80&amp;ssl=1 768w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/dayonepublish-hero-scaled.png?resize=1536%2C1106&amp;quality=80&amp;ssl=1 1536w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/dayonepublish-hero-scaled.png?resize=2048%2C1474&amp;quality=80&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p><span style=\"font-family: var(--editor-font-family); font-size: var(--editor-font-size);\">For some recent travel, I wanted a way to add photos each day for a small group of family and friends to see. A blog would work, but I wanted a great native editing experience, with particular focus on places we were visiting. Luckily Day One has gorgeous native apps and now allows shared journals, but there was no way to take a journal and publish it as a site.&nbsp;<\/span><br><\/p>\n\n\n\n<p>The design is entirely inspired by the Day One app interface itself, so it feels native. View entries as a timeline, calendar, mosaic of photos, or on a map. I have it run nightly locally on my Mac, and it deploys via Coolify.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><br><\/p>\n<\/div>\n\n\n<div style=\"height:var(--wp--preset--spacing--60);width:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div>\n\n<\/li><li class=\"wp-block-post post-2449 post type-post status-publish format-standard has-post-thumbnail hentry category-uncategorized tag-projects\">\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-89a94f6a wp-block-group-is-layout-flex\" style=\"line-height:1\"><div class=\"wp-block-post-date\"><time datetime=\"2025-11-01T11:22:37-04:00\"><a href=\"https:\/\/zmh.org\/quill\/\">Nov 1, 2025 \u00b7 11:22 AM<\/a><\/time><\/div>\n\n<div class=\"taxonomy-post_tag wp-block-post-terms\"><span class=\"wp-block-post-terms__prefix\">\u00b7 <\/span><a href=\"https:\/\/zmh.org\/tag\/projects\/\" rel=\"tag\">projects<\/a><\/div><\/div>\n\n\n<div class=\"entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow\">\n<p><a href=\"https:\/\/github.com\/zmh\/Quill\">Quill<\/a> is a native macOS WordPress editor, built for those who like to edit their site posts directly.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a7565b5be3eb&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a7565b5be3eb\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"720\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/quill-hero.png?resize=1024%2C720&#038;quality=80&#038;ssl=1\" alt=\"\" class=\"wp-image-2477\" srcset=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/quill-hero-scaled.png?resize=1024%2C720&amp;quality=80&amp;ssl=1 1024w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/quill-hero-scaled.png?resize=300%2C211&amp;quality=80&amp;ssl=1 300w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/quill-hero-scaled.png?resize=768%2C540&amp;quality=80&amp;ssl=1 768w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/quill-hero-scaled.png?resize=1536%2C1080&amp;quality=80&amp;ssl=1 1536w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/quill-hero-scaled.png?resize=2048%2C1440&amp;quality=80&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>I\u2019ve used Ulysses, IA Writer, and MarsEdit, but none of them let me publish a post and then edit it later in the editor. Once a post was published, I\u2019d need to switch to WordPress to edit (or in MarsEdit\u2019s case, I\u2019d get a bunch of HTML comments around each block, which made editing hard.)<\/p>\n\n\n\n<p>So I made the Mac WordPress post editor I\u2019ve always wanted, mainly for blogging:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-family: var(--editor-font-family); font-size: var(--editor-font-size);\"><b>Native<\/b> &#8211; primarily I wanted this for the writing and editor experience, but it also means things like keyboard shortcuts, drag and drop, etc<\/span><\/li>\n\n\n\n<li><b>Well-designed<\/b> &#8211; nice fonts, fits into Mac OS, and feels like a place where I can get cozy and write<\/li>\n\n\n\n<li><b>Blogging-focused<\/b> &#8211; I really wanted to know how much I was writing and set goals<\/li>\n\n\n\n<li><b>Notes-like<\/b> &#8211; I wanted to treat posts as notes so they\u2019re living documents. Easy to open quickly, make a change, and save. Fast and available offline so you can edit on a plane<\/li>\n\n\n\n<li><b>Gutenberg support<\/b> &#8211; I wanted the editor to be bidirectionally compatible with the Gutenberg block editor. Edit on web or in the app, resume editing in the other. No weird save artifacts or unsupported blocks<\/li>\n<\/ul>\n\n\n\n<p>The app was almost entirely vibe-coded using Claude Code in a few sessions. Some observations:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Claude Code, and Opus, are substantially better at project management and context compacting since I started in June.&nbsp;<\/li>\n\n\n\n<li>Opus is very good at Mac development \u2014 the hardest part was notarization. If Apple fixed notarization and App Store submissions for Mac and iOS (perhaps using MCPs), I think you\u2019d see a renaissance of native app development.<\/li>\n\n\n\n<li>Building text editors continues to be one of the hardest problems in computer science.<\/li>\n<\/ul>\n\n\n\n<p>Check out the <a href=\"https:\/\/github.com\/zmh\/Quill\">project on Github<\/a>, and <a href=\"https:\/\/github.com\/zmh\/Quill\/releases\/latest\/download\/Quill.dmg\">download the Mac app here<\/a>.<\/p>\n\n\n\n<p><\/p>\n<\/div>\n\n\n<div style=\"height:var(--wp--preset--spacing--60);width:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div>\n\n<\/li><li class=\"wp-block-post post-2475 post type-post status-publish format-standard has-post-thumbnail hentry category-uncategorized tag-projects\">\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-89a94f6a wp-block-group-is-layout-flex\" style=\"line-height:1\"><div class=\"wp-block-post-date\"><time datetime=\"2025-09-30T11:18:13-04:00\"><a href=\"https:\/\/zmh.org\/gymtxt\/\">Sep 30, 2025 \u00b7 11:18 AM<\/a><\/time><\/div>\n\n<div class=\"taxonomy-post_tag wp-block-post-terms\"><span class=\"wp-block-post-terms__prefix\">\u00b7 <\/span><a href=\"https:\/\/zmh.org\/tag\/projects\/\" rel=\"tag\">projects<\/a><\/div><\/div>\n\n\n<div class=\"entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow\">\n<p><a href=\"https:\/\/gymtxt.com\">Gymtxt.com<\/a> is a lightweight way to jot down exercises at the gym, in plaintext. It\u2019s based on how I log workouts in Apple Notes \/ IA Writer, with a little scaffolding to make it easier to track workouts over time.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a7565b5c074a&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a7565b5c074a\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1215\" height=\"728\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/gymtxt-hero-edited.png?resize=1215%2C728&#038;quality=80&#038;ssl=1\" alt=\"\" class=\"wp-image-2490\" srcset=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/gymtxt-hero-edited.png?w=1215&amp;quality=80&amp;ssl=1 1215w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/gymtxt-hero-edited.png?resize=300%2C180&amp;quality=80&amp;ssl=1 300w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/gymtxt-hero-edited.png?resize=1024%2C614&amp;quality=80&amp;ssl=1 1024w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/gymtxt-hero-edited.png?resize=768%2C460&amp;quality=80&amp;ssl=1 768w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>It allows you to write something like<\/p>\n\n\n\n<pre class=\"wp-block-code wp-block-preformatted\"><code>10\/13\nsquats 100lbs 5x5 \nbench press 45 each side 5x8<\/code><\/pre>\n\n\n\n<p>The date, exercise, set count, rep count, and weight are parsed automatically and tracked over time with graphs. <\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a7565b5c1853&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a7565b5c1853\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"2277\" height=\"1318\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/CleanShot-2026-01-01-at-08.58.11%402x-edited.png?resize=2277%2C1318&#038;quality=80&#038;ssl=1\" alt=\"\" class=\"wp-image-2494\" srcset=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/CleanShot-2026-01-01-at-08.58.11%402x-edited.png?w=2277&amp;quality=80&amp;ssl=1 2277w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/CleanShot-2026-01-01-at-08.58.11%402x-edited.png?resize=300%2C174&amp;quality=80&amp;ssl=1 300w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/CleanShot-2026-01-01-at-08.58.11%402x-edited.png?resize=1024%2C593&amp;quality=80&amp;ssl=1 1024w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/CleanShot-2026-01-01-at-08.58.11%402x-edited.png?resize=768%2C445&amp;quality=80&amp;ssl=1 768w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/CleanShot-2026-01-01-at-08.58.11%402x-edited.png?resize=1536%2C889&amp;quality=80&amp;ssl=1 1536w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2026\/01\/CleanShot-2026-01-01-at-08.58.11%402x-edited.png?resize=2048%2C1185&amp;quality=80&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>Easily remember what you did last time and update your workout as you go.\u00a0<span style=\"font-family: var(--editor-font-family); font-size: var(--editor-font-size);\">It also includes a basic timer for breaks between sets.<\/span><\/p>\n\n\n\n<p>All data is stored in local storage and importable\/exportable as plain .txt files.<br><\/p>\n<\/div>\n\n\n<div style=\"height:var(--wp--preset--spacing--60);width:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div>\n\n<\/li><li class=\"wp-block-post post-2020 post type-post status-publish format-standard hentry category-uncategorized tag-most-read\">\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-89a94f6a wp-block-group-is-layout-flex\" style=\"line-height:1\"><div class=\"wp-block-post-date\"><time datetime=\"2025-06-12T08:00:00-04:00\"><a href=\"https:\/\/zmh.org\/clay-automattic\/\">Jun 12, 2025 \u00b7 8:00 AM<\/a><\/time><\/div>\n\n<div class=\"taxonomy-post_tag wp-block-post-terms\"><span class=\"wp-block-post-terms__prefix\">\u00b7 <\/span><a href=\"https:\/\/zmh.org\/tag\/most-read\/\" rel=\"tag\">most-read<\/a><\/div><\/div>\n\n\n<div class=\"entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow\">\n<p><span style=\"font-family: var(--editor-font-family); font-size: var(--editor-font-size);\">I&#8217;m very excited to announce that <a href=\"https:\/\/clay.earth\">Clay<\/a> has been <a href=\"https:\/\/automattic.com\/2025\/06\/12\/automattic-welcomes-clay\/\">acquired<\/a> by Automattic, the parent company of <a href=\"https:\/\/wordpress.com\">WordPress.com<\/a> and other fantastic products like <\/span><a style=\"font-family: var(--editor-font-family); font-size: var(--editor-font-size);\" href=\"https:\/\/beeper.com\">Beeper<\/a><span style=\"font-family: var(--editor-font-family); font-size: var(--editor-font-size);\">, <\/span><a style=\"font-family: var(--editor-font-family); font-size: var(--editor-font-size);\" href=\"https:\/\/tumblr.com\">Tumblr<\/a><span style=\"font-family: var(--editor-font-family); font-size: var(--editor-font-size);\">, <\/span><a style=\"font-family: var(--editor-font-family); font-size: var(--editor-font-size);\" href=\"https:\/\/dayoneapp.com\">Day One<\/a><span style=\"font-family: var(--editor-font-family); font-size: var(--editor-font-size);\">, <a href=\"https:\/\/pocketcasts.com\">Pocket Casts<\/a>, and more. Clay will not only live on, but continue to grow and improve\u2014with our entire team remaining at the helm. You can read more in <\/span><a style=\"font-family: var(--editor-font-family); font-size: var(--editor-font-size);\" href=\"https:\/\/clay.earth\/next\">our announcement<\/a><span style=\"font-family: var(--editor-font-family); font-size: var(--editor-font-size);\">, <a href=\"https:\/\/automattic.com\/2025\/06\/12\/automattic-welcomes-clay\/\">Automattic&#8217;s announcement<\/a>, and <a href=\"https:\/\/techcrunch.com\/2025\/06\/12\/automattic-acquires-relationship-manager-clay-to-add-an-identity-layer-to-online-tools\/\">TechCrunch<\/a>.<\/span><\/p>\n\n\n\n<p>Clay has 150 million relationships under management and growing, with everyone from Fortune 500 execs to students using it daily. We&#8217;re very thankful to our talented team, investors, and members for being the true champions of this tremendous milestone.<\/p>\n\n\n\n<p>I also need to pause here and specially thank my multi-talented co-founder <a href=\"https:\/\/achariam.com\">Matt Achariam<\/a>, whose product vision, design excellence, and dedication turned Clay from an idea into the product and business it is today. Building a company is hard. Building one with a co-founder and friend like Matt is a rare gift.<\/p>\n\n\n\n<p>That said, we&#8217;re not going anywhere! So I&#8217;d like to make a few things clear:<\/p>\n\n\n\n<p><b>1. Our product and team will be growing, unlike every previous app or product in this space.<\/b><\/p>\n\n\n\n<p>We started Clay because we had been burned by spending days adding people and notes into apps that eventually shut down:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Plaxo \u2014 acq. by Comcast and discontinued<\/li>\n\n\n\n<li>Contactually \u2014 acq. by Compass and discontinued <\/li>\n\n\n\n<li>Connected \u2014 acq. by LinkedIn and discontinued <\/li>\n\n\n\n<li>Refresh \u2014 acq. by LinkedIn and discontinued <\/li>\n\n\n\n<li>Rapportive \u2014 acq. by LinkedIn and discontinued <\/li>\n\n\n\n<li>Accompany \u2014 acq. by Cisco and discontinued<\/li>\n\n\n\n<li>Brewster \u2014 acq. by Burger King&#8217;s parent company (!), and then FullContact, and discontinued<\/li>\n\n\n\n<li>Humin \u2014 acq. by Match Group and discontinued <\/li>\n\n\n\n<li>Xobni \u2014 acq. by Yahoo and discontinued <\/li>\n\n\n\n<li>Gist \u2014 acq. by Research in Motion and discontinued <\/li>\n\n\n\n<li>Cobook \u2014 acq. by FullContact and discontinued <\/li>\n\n\n\n<li>Soocial \u2014 acq. by Viadeo and discontinued <\/li>\n\n\n\n<li>RelateIQ \u2014 acq. by Salesforce and discontinued <\/li>\n\n\n\n<li>Contacts+ \u2014 acq. by FullContact, then spun out, then acquired by Benchmark Email, and now stagnant<\/li>\n<\/ul>\n\n\n\n<p><span style=\"font-family: var(--editor-font-family); font-size: var(--editor-font-size);\">We count the founders or early employees of many of the above list as investors and advisors, because each of those products did many things right. But it&#8217;s actually quite a complex product to build, and even harder to grow and monetize sustainably.<\/span><\/p>\n\n\n\n<p>That&#8217;s why we built Clay as a paid product where you are the customer. And Automattic has a number of beautifully-designed, continually-maintained, privacy-conscious apps like Beeper, Day One, and Pocketcasts that have the same philosophy.<\/p>\n\n\n\n<p>Automattic is celebrating its 20th anniversary this month. It thinks in 100 year increments, and keeps apps running for decades. Which takes me to my next point:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><b>2. We are your best choice for anything contacts, network, or CRM related. If you believe in any part of our mission, join us.<\/b><\/p>\n\n\n\n<p>Our team is obsessed with building a great product for your people and relationships. Now we can think on years-long time horizons, but continue to ship daily. If you&#8217;ve ever wanted a better way to send gifts to friends, or remember birthdays, or share business cards with your team, or intro people to each other, or search your LinkedIn connections with AI, we either do it today or we will soon. Sign up to get updates about our journey.<\/p>\n\n\n\n<p>No other app out there will ship or innovate faster than Clay, promise. And we&#8217;ll be working with the best teams in the business to do that. Beeper&#8217;s mission is to build the best chat app on Earth. Day One protects your most treasured memories. We are joining the pantheon of beautifully-designed, privacy-respecting, tech-advancing apps.<\/p>\n\n\n\n<p>We don&#8217;t take that responsibility lightly, and we can&#8217;t do it alone. So if you&#8217;ve ever wanted to build something in this space, if you&#8217;re currently building something, let&#8217;s build it together \u2014 <a href=\"mailto:care@clay.earth\">email us<\/a>!<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><b>3. Digital identity and relationship graphs are more important than ever.<\/b><\/p>\n\n\n\n<p>So much of our digital identities today are locked in walled gardens and disjointed group chats. The utopic vision of an open web was replaced by closed protocols, shut-down APIs, and social network consolidation.<\/p>\n\n\n\n<p>The reason we haven&#8217;t seen a new breakout social network in more than a decade is the lack of identity and network portability. Facebook doesn&#8217;t want you to export your friends list, so they get rid of APIs that make it possible under the guise of privacy. Nefarious apps then took advantage of the address book, until Apple (rightly!) put protections in place to keep your entire address book from being shared.<\/p>\n\n\n\n<p>As AI continues to power our everyday software, your contacts, network, messages, people, and relationships are the last, most sensitive piece of the puzzle. That information shouldn&#8217;t be part of LLM training data, ever. But when done locally, just for you, with your permission, it can unlock magical product experiences that bring us closer together with one another. We&#8217;re not there yet, but the ingredients are all out there.<\/p>\n\n\n\n<p>Legislation like the ACCESS Act, consortia like Matrix and the Data Transfer Initiative, and protocols like ActivityPub and WebFinger are the only solution to building a more open and private ecosystem that encourages competition and innovation. Matt and I will be thinking holistically about those problems both at Automattic and beyond.<\/p>\n\n\n\n<p class=\"has-text-align-center\">***<\/p>\n\n\n\n<p>This acquisition is not just a milestone for Clay, but a step towards a future where your digital identity and relationships are truly yours. We&#8217;re excited to have you with us on this journey, and we look forward to building a brighter, more connected world together.<\/p>\n\n\n\n<p>So \u2014 thank you for being a part of the Clay community. Let&#8217;s build something extraordinary together.<\/p>\n<\/div>\n\n\n<div style=\"height:var(--wp--preset--spacing--60);width:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div>\n\n<\/li><li class=\"wp-block-post post-2463 post type-post status-publish format-standard has-post-thumbnail hentry category-uncategorized tag-projects\">\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-89a94f6a wp-block-group-is-layout-flex\" style=\"line-height:1\"><div class=\"wp-block-post-date\"><time datetime=\"2025-04-29T10:20:32-04:00\"><a href=\"https:\/\/zmh.org\/shrinksearch\/\">Apr 29, 2025 \u00b7 10:20 AM<\/a><\/time><\/div>\n\n<div class=\"taxonomy-post_tag wp-block-post-terms\"><span class=\"wp-block-post-terms__prefix\">\u00b7 <\/span><a href=\"https:\/\/zmh.org\/tag\/projects\/\" rel=\"tag\">projects<\/a><\/div><\/div>\n\n\n<div class=\"entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow\">\n<p><a href=\"https:\/\/zmh.github.io\/shrinksearch\/\">Shrinksearch<\/a> lets you quickly search and browse mental health providers from the NYC area, with data from Psychology Today as of April 2025.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a7565b5c420c&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a7565b5c420c\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"737\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/shrinksearch-hero.png?resize=1024%2C737&#038;quality=80&#038;ssl=1\" alt=\"\" class=\"wp-image-2483\" srcset=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/shrinksearch-hero-scaled.png?resize=1024%2C737&amp;quality=80&amp;ssl=1 1024w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/shrinksearch-hero-scaled.png?resize=300%2C216&amp;quality=80&amp;ssl=1 300w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/shrinksearch-hero-scaled.png?resize=768%2C553&amp;quality=80&amp;ssl=1 768w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/shrinksearch-hero-scaled.png?resize=1536%2C1106&amp;quality=80&amp;ssl=1 1536w, https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2025\/12\/shrinksearch-hero-scaled.png?resize=2048%2C1474&amp;quality=80&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>Psychology Today has the best data set for mental health providers, but it doesn\u2019t let you search the text of providers\u2019 descriptions and only shows a few providers per page.&nbsp;<\/p>\n\n\n\n<p><a href=\"https:\/\/zmh.github.io\/shrinksearch\/\">View live here<\/a>, or the <a href=\"https:\/\/github.com\/zmh\/shrinksearch\">code on Github here<\/a>.<\/p>\n<\/div>\n\n\n<div style=\"height:var(--wp--preset--spacing--60);width:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div>\n\n<\/li><li class=\"wp-block-post post-1293 post type-post status-publish format-standard hentry category-essays tag-ai\">\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-89a94f6a wp-block-group-is-layout-flex\" style=\"line-height:1\"><div class=\"wp-block-post-date\"><time datetime=\"2025-02-04T20:22:15-04:00\"><a href=\"https:\/\/zmh.org\/formats-and-frameworks\/\">Feb 4, 2025 \u00b7 8:22 PM<\/a><\/time><\/div>\n\n<div class=\"taxonomy-post_tag wp-block-post-terms\"><span class=\"wp-block-post-terms__prefix\">\u00b7 <\/span><a href=\"https:\/\/zmh.org\/tag\/ai\/\" rel=\"tag\">ai<\/a><\/div><\/div>\n\n\n<div class=\"entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow\"><p>Came across @eddiejiaoobj\u2019s launch of Common Knowledge today:<\/p>\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\nNow, Machine Intelligence gives us a new material \u2013 one whose inherent malleability allows us to invent entirely new categories of document. How will these new documents allow us to create, share, and collaborate in new ways?\n<\/p>\n<\/blockquote>\n<p>And then remembered a few tweets about AI-friendly frameworks:<\/p>\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>I think it will also impact the libraries and frameworks people choose for new productsTailwind with AI seems to work particularly well for me because the styling context is in the same file\u2014 Charles Williamson (@CFJWilliamson) September 12, 2024<\/p>\n<\/blockquote>\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>I was too skeptical about Tailwind. I thought it would be like Bootstrap, comes and goes. But when I saw almost all LLMs were trained on Tailwind, I switched to it. If you know Tailwind and use Cursor for example, you&#8217;ll be building web-apps couple of times faster.\u2014 Ozgur Ozer (@ozgrozer) January 29, 2025<\/p>\n<\/blockquote>\n<p>It\u2019s evident that AI favors frameworks like Tailwind and React, but I hadn\u2019t thought as much about the file format layer. I was recently trying to convert CSVs using various models and the results were surprisingly lackluster \u2014 reasoning models like ChatGPT O1 and DeepSeek r1 would forget to convert particular cells or get into logic loops trying to write and rewrite code that could interpret the input CSV. <\/p>\n<p>Non-reasoning models actually did better, particularly ones that I specified should not write code at all. But then the challenge was getting the model to output the correct number of commas in each row to put the right data in each column. <\/p>\n<p>AI prompts and responses are heavily reliant on Markdown formatting, and there\u2019s evidence that Markdown can help improve understanding of prompts. It understands XML well, and is getting better at JSON. <\/p>\n<p>I\u2019m sure understanding of CSVs will improve, though I wonder if they\u2019ll need to be considered more like images, given their 2D nature, than text. Is there even a large enough training set for CSVs?<\/p>\n<p>And then finally, I wonder if Microsoft will train models on a corpus of Office docs \u2014 .docx, .xlsx, and .pptx. As far as I can tell with Microsoft 365 Copilot, the AI is either generating standard text or markdown markup that is then opened in Microsoft Office (screenshot), or helping with text generation within the application itself. Behind the scenes those formats have a shared Office Open XML markup, but maybe the bigger issue is bundling files as a ZIP? <\/p>\n<p>If you ask o1 to generate a simple Word document, it thinks for a few minutes:<\/p>\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\nCrafting the document request<\/p>\n<p>I\u2019m figuring out how to generate a landscape-oriented Word document featuring \u201cHi there\u201d and considering methods for providing it since attachments or base64 encoding are not options.<\/p>\n<p>Assessing options<\/p>\n<p>I\u2019m thinking through creating a base64-encoded docx file or a minimal Open XML document, which the user can rename to .docx, as direct attachments aren\u2019t feasible.<\/p>\n<p>Crafting a Word doc<\/p>\n<p>I\u2019m set to create a minimal Word doc featuring \u201cHi there\u201d in landscape orientation, then encode it into a base64 string or provide raw text for users to save as a docx file.<\/p>\n<p>Preparing a solution<\/p>\n<p>I\u2019m thinking about crafting minimal Word doc instructions or a raw text file with \u201cHi there\u201d for users to convert to docx, simplifying the process with clear guidance or a base64-encoded string.<\/p>\n<p>Crafting the document<\/p>\n<p>I\u2019ll create a minimal Word doc, set the orientation to landscape, open it as a zip, and encode it into a base64 string, ensuring it aligns with the user\u2019s request.<\/p>\n<p>Forming the structure<\/p>\n<p>I\u2019m crafting an OOXML snippet for a minimal Word document, ensuring it includes necessary elements like  and references to styles. This requires precision to meet the standard structure.<\/p>\n<p>Organizing the essentials<\/p>\n<p>I\u2019m organizing the necessary XML files for a minimal Word document, including ContentTypes.xml, rels\/.rels, and word\/document.xml, ensuring a correct directory structure for packaging.<\/p>\n<p>Creating and encoding<\/p>\n<p>I\u2019ll compress the XML files into a .zip, rename it to .docx, and encode it into a base64 string. This method involves generating the document logically and encoding it for user access.<\/p>\n<p>Compressing and renaming<\/p>\n<p>I\u2019m piecing together the XML files into a .zip, renaming it to .docx, and base64 encoding the .docx, ensuring a compact and efficient format following the user\u2019s instructions.<\/p>\n<p>Renaming and encoding<\/p>\n<p>I\u2019m renaming the .zip to LandscapeHiThere.docx and preparing to encode it into a base64 string. This step ensures the document\u2019s format aligns with the user\u2019s request, focusing on maintaining accuracy and efficiency.<\/p>\n<p>Replicating the compression algorithm<\/p>\n<p>I\u2019m considering the feasibility of replicating the compression algorithm for generating a Word document. This involves constructing a minimal doc and encoding it into a base64 string for the user.<\/p>\n<p>Simplifying the process<\/p>\n<p>I\u2019m considering a minimal doc with only three files, encoding it into a base64 string, and providing instructions for decoding to streamline the process, avoiding unnecessary complexity.<\/p>\n<p>Nailing down the method<\/p>\n<p>I\u2019m thinking through providing instructions for generating a Word document in landscape orientation with \u2018Hi there\u2019 text, as this seems simpler than creating an entire .docx file.<\/p>\n<p>Generating the document structure<\/p>\n<p>I\u2019m crafting a minimal docx by creating essential files\u2014Document.xml, ContentTypes.xml, and rels\/.rels\u2014zipping them, and then encoding the zip into a base64 string.<\/p>\n<p>Weighing options<\/p>\n<p>I\u2019m considering providing a concise method for creating a Word document in landscape orientation with \u2018Hi there\u2019 text, or a base64 encoded snippet for decoding, to streamline the process.<\/p>\n<p>Moving forward<\/p>\n<p>I\u2019m weighing whether providing instructions or a base64-encoded zip file is more efficient. Despite the base64 approach being sizable, I\u2019ll proceed for thoroughness.<\/p>\n<p>Crafting helpful instructions<\/p>\n<p>I\u2019m pulling together detailed instructions for decoding a base64-encoded zip file, including copying the text, decoding securely, renaming, and opening in Microsoft Word for ease of use.<\/p>\n<p>Laying out the options<\/p>\n<p>I\u2019m organizing details on creating three essential XML files for a Word docx, focusing on the file structure and content, and assessing potential compression and base64 encoding sizes.<\/p>\n<p>Balancing options<\/p>\n<p>I\u2019m piecing together the base64 and instructions for creating a Word docx. The collaboration to merge them will ensure comprehensive guidance for the user.\n<\/p>\n<\/blockquote>\n<p>And finally gives you a few possible solutions:<\/p>\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\nBelow you\u2019ll find two ways to get a landscape-oriented Word document containing the text \u201cHi there.\u201d<\/p>\n<p>Option 1: Simple Step-by-Step Instructions<\/p>\n<p>Open Microsoft Word (or a compatible word processor).<\/p>\n<p>Switch the page orientation to Landscape:<\/p>\n<p>Type the text: Hi there<\/p>\n<p>That\u2019s it! You now have a Word document in landscape orientation that says \u201cHi there.\u201d<\/p>\n<p>Option 2: Downloadable (Base64-Encoded) Minimal DOCX<\/p>\n<p>Below is a minimal Word document (in .docx format) encoded in Base64. It has exactly one paragraph that says \u201cHi there,\u201d with its page set to landscape orientation.<\/p>\n<p>Instructions to use it:<\/p>\n<p>UEsDBBQABgAIAAAAIQDcZAUiYwEAAHsBAAAQAAAAW0NvbnRlbnRfVHlwZXMuXML7Wd1LFgUBf0q\/Sm2hh0M1fApTTZQKepItpOeIo5gSO7g0jhPyPR4awMl3ggjdSS9\/6HixzECAPQyB+x3D72bDY0+toYZpVCya3ke5EekQ4irjrJEKvK5ruxsj8L12cxhjTe9vJDv4R7N5vkcz9xaqGpTeABvEUfPFmyK+DmlrXujwSWVFFbeLRvZEzxBQSwMEFAAGAAgAAAAhANxkBSJjAQAAcwIAAAsAAABfcmVscy8ucmVsc7VQz07DIBDdBf8g7CeaNsHawKKA7sgDRylmOFGzo2tRSbPXr+RbN2aAwPGHInsJPe8P5HIC8qlIQDXRIS09ycymYsRsxzghm2lBKP8dc5UBsxm1jtKPYZ6rAa4uUHckkHvcznGgSSN7yhQU\/Ez1Z\/hEW72exOl\/yybv5Ys6TtFKR+Mpcblhx2acUl44K0xuYS\/rXdpwXLk+\/\/OfBUEsDBBQABgAIAAAAIQDcZAUiYwEAAeQGAABcAAAAd29yZC9kb2N1bWVudC54bWyVbU+bMBC951eIbAXeGh2UE4oB6CLBAK7UBbqDUaTZ9OWhgpcv1pZcN0DJF\/+9qymhktNcxlLb8\/XePyYiI+7Z9719+os8DQEjJ2PizLAeqKhCeQTdXKqgzk2QbEF72\/P6zpcB3+TOYXpxB34Frhxjpw4S4nyTxyoCxyI5IR9sL\/nKZfnct9ZU2M0Okai0RG29V2GJTuqAJakdW3gvxqAHw0xXrL47xdl1GOSFy7y9uuDAvOWhrfdHZ7t8SeT53nFlXiNo9ZJV4Q6gkHaoERNoBpJShHbkZb02lCU3PbNTeDbqhS4PbkAl6lv1CCqqnPJSh4+bCl556TizP4GCvI9b47+T1\/HZkPBcuvYJsOv2YVGzE6aZ\/gNedcJbPmzrqdncHz8+z8moPC\/YznE\/D8isGhPNM\/MvOv0zNv8855evD8r1QsDB5+tx70hyeDwEzSDEz2N6knV6SfJvO+DJ8AUEsBAhQDFAAGAAgAAAAhANxkBSJjAQAAewEAAAQAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzLnhtbFBLAQIUAxQABgAIAAAAIQDcZAUiYwEAAHMCAAALAAAAAAAAAAAAAAAAAC8AAABfcmVscy8ucmVsc1BLAQIUAxQABgAIAAAAIQDcZAUiYwEAAeQGAABcAAAAAAAAAAAAAAAAAHsAAAB3b3JkL2RvY3VtZW50LnhtbFBLBQYAAAAAAwADALcAAADnBgAAAAA=<\/p>\n<p>Verifying it works<\/p>\n<p>Enjoy your landscape Word document!\n<\/p>\n<\/blockquote>\n<p>4o does better, writing the following code:<\/p>\n<pre class=\"wp-block-code\"><code>from docx import Document\nfrom docx.shared import Inches\nfrom docx.enum.section import WD_ORIENT\n# Create a new Word document\ndoc = Document()\n# Change page orientation to landscape\nsection = doc.sections[0]\nsection.orientation = WD_ORIENT.LANDSCAPE\nnew_width, new_height = section.page_height, section.page_width\nsection.page_width = new_width\nsection.page_height = new_height\n# Add text to the document\ndoc.add_paragraph(\"Hi there\")\n# Save the document\nfile_path = \"\/mnt\/data\/Hi_there_landscape.docx\"\ndoc.save(file_path)\nfile_path\n<\/code><\/pre>\n<p>We\u2019ll get to AI-native file formats that are more accurate and have higher information density \/ bits per second transmission speed. But I can\u2019t help but wonder why, given the hundreds of billions of Office docs created each year, it can\u2019t output or manipulate them more easily. <\/p>\n<\/div>\n\n\n<div style=\"height:var(--wp--preset--spacing--60);width:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<\/div>\n\n<\/li><\/ul>\n\n<nav class=\"wp-block-query-pagination is-layout-flex wp-block-query-pagination-is-layout-flex\" aria-label=\"Pagination\">\n\n\n<div class=\"wp-block-query-pagination-numbers\"><span aria-current=\"page\" class=\"page-numbers current\">1<\/span>\n<a class=\"page-numbers\" href=\"?query-25-page=2\">2<\/a>\n<span class=\"page-numbers dots\">&hellip;<\/span>\n<a class=\"page-numbers\" href=\"?query-25-page=6\">6<\/a><\/div>\n\n<a href=\"\/blog\/wp-json\/wp\/v2\/pages\/257?query-25-page=2\" class=\"wp-block-query-pagination-next\">Next Page<\/a>\n<\/nav><\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column sidebar is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:28%\">\n<div class=\"wp-block-group sidebar has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Recent posts<\/h2>\n\n\n<ul class=\"wp-block-latest-posts__list wp-block-latest-posts\"><li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/zmh.org\/personal-site-gallery\/\">Personal Site Gallery<\/a><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/zmh.org\/dispatch\/\">Dispatch<\/a><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/zmh.org\/2026-01-10\/\">2026-01-10<\/a><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/zmh.org\/2025-side-projects\/\">2025 Side Projects<\/a><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/zmh.org\/day-one-publish\/\">Day One Publish<\/a><\/li>\n<\/ul>\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Stay in the loop<\/h2>\n\n\n<style>\n.connect-options {\n  display: flex;\n  flex-direction: column;\n  gap: 7px;\n  margin-bottom: 10px;\n}\n.connect-item {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  color: #737373;\n}\n.connect-item img {\n  width: 16px;\n  height: 16px;\n}\n.embeddable-buttondown-form {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n.embeddable-buttondown-form input[type=\"email\"] {\n  flex: 1;\n  min-width: 0;\n  border-radius: 12px;\n  margin: 0;\n}\n.embeddable-buttondown-form input[type=\"submit\"] {\n  width: 42px;\n  min-width: 42px;\n  height: 42px;\n  padding: 0;\n  margin: 0;\n  color: #7f7b74;\n  border: 1px solid #cbc5bc;\n  border-radius: 12px;\n  cursor: pointer;\n  background-color: transparent;\n  font-size: 18px;\n  font-weight: 300;\n  line-height: 1;\n  font-family: \"Lucida Grande\", \"Segoe UI\", \"Helvetica Neue\", Arial, sans-serif;\n  text-align: center;\n\n}\n.embeddable-buttondown-form input[type=\"submit\"]:hover {\n  background-color: rgba(0, 0, 0, 0.03);\n}\n<\/style>\n<div class=\"connect-options\">\n      <div class=\"connect-item\">\n        <img data-recalc-dims=\"1\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2024\/06\/email-open.png?quality=80&#038;ssl=1\" alt=\"Email Icon\">\n        <span>Reply or comment \n\n\n\n\n\n\n\n\n  \n\n\n\n  <a class=\"reply-by-email\" href=\"https:\/\/aemail.com\/3Jp\">by email<\/a>\n\n<\/span>\n      <\/div>\n\n      <div class=\"connect-item\">\n        <img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2024\/06\/user-add.png?quality=80&#038;ssl=1\" alt=\"Social Media Icon\">\n        <span>Follow me on <a href=\"https:\/\/twitter.com\/zmh\">Twitter<\/a> and <a href=\"https:\/\/linkedin.com\/in\/zacharyhamed\">Linkedin<\/a><\/span>\n      <\/div>\n      <div class=\"connect-item\">\n        <img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2024\/06\/feed.png?quality=80&#038;ssl=1\" alt=\"RSS Icon\">\n        <span>Get new posts <a href=\"https:\/\/zmh.org\/feed\">via RSS<\/a><\/span>\n      <\/div>\n      <div class=\"connect-item\">\n        <img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/zmh.org\/blog\/wp-content\/uploads\/2024\/06\/new-slide.png?quality=80&#038;ssl=1\" alt=\"Newsletter Icon\">\n        <span>Or get new posts by email:<\/span>\n      <\/div>\n    <\/div>\n<form action=\"https:\/\/buttondown.com\/api\/emails\/embed-subscribe\/zmh\" method=\"post\" target=\"popupwindow\" class=\"embeddable-buttondown-form\" style=\"pointer-events: auto;\">\n      <input type=\"email\" name=\"email\" placeholder=\"your@lovely.email\" autocomplete=\"email\" required>\n      <input type=\"hidden\" value=\"1\" name=\"embed\">\n      <input type=\"submit\" value=\"\u2192\" aria-label=\"Subscribe\">\n  <input type=\"hidden\" name=\"tag\" value=\"Website Newsletter\" \/>\n    <\/form>\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Browse by topic<\/h2>\n\n\n<ul style=\"font-size:0.75rem;\" class=\"wp-block-categories-list wp-block-categories\">\t<li class=\"cat-item cat-item-9\"><a href=\"https:\/\/zmh.org\/tag\/ai\/\">ai<\/a> (1)\n<\/li>\n\t<li class=\"cat-item cat-item-10\"><a href=\"https:\/\/zmh.org\/tag\/design\/\">design<\/a> (5)\n<\/li>\n\t<li class=\"cat-item cat-item-11\"><a href=\"https:\/\/zmh.org\/tag\/drafts\/\">drafts<\/a> (2)\n<\/li>\n\t<li class=\"cat-item cat-item-12\"><a href=\"https:\/\/zmh.org\/tag\/economics\/\">economics<\/a> (1)\n<\/li>\n\t<li class=\"cat-item cat-item-13\"><a href=\"https:\/\/zmh.org\/tag\/essays\/\">essays<\/a> (1)\n<\/li>\n\t<li class=\"cat-item cat-item-14\"><a href=\"https:\/\/zmh.org\/tag\/finance\/\">finance<\/a> (2)\n<\/li>\n\t<li class=\"cat-item cat-item-15\"><a href=\"https:\/\/zmh.org\/tag\/gear\/\">gear<\/a> (4)\n<\/li>\n\t<li class=\"cat-item cat-item-16\"><a href=\"https:\/\/zmh.org\/tag\/home\/\">home<\/a> (2)\n<\/li>\n\t<li class=\"cat-item cat-item-17\"><a href=\"https:\/\/zmh.org\/tag\/life\/\">life<\/a> (4)\n<\/li>\n\t<li class=\"cat-item cat-item-18\"><a href=\"https:\/\/zmh.org\/tag\/most-read\/\">most-read<\/a> (6)\n<\/li>\n\t<li class=\"cat-item cat-item-19\"><a href=\"https:\/\/zmh.org\/tag\/music\/\">music<\/a> (1)\n<\/li>\n\t<li class=\"cat-item cat-item-20\"><a href=\"https:\/\/zmh.org\/tag\/outdoors\/\">outdoors<\/a> (1)\n<\/li>\n\t<li class=\"cat-item cat-item-21\"><a href=\"https:\/\/zmh.org\/tag\/photos\/\">photos<\/a> (11)\n<\/li>\n\t<li class=\"cat-item cat-item-22\"><a href=\"https:\/\/zmh.org\/tag\/politics\/\">politics<\/a> (1)\n<\/li>\n\t<li class=\"cat-item cat-item-23\"><a href=\"https:\/\/zmh.org\/tag\/programming\/\">programming<\/a> (1)\n<\/li>\n\t<li class=\"cat-item cat-item-24\"><a href=\"https:\/\/zmh.org\/tag\/projects\/\">projects<\/a> (10)\n<\/li>\n\t<li class=\"cat-item cat-item-25\"><a href=\"https:\/\/zmh.org\/tag\/psychology\/\">psychology<\/a> (3)\n<\/li>\n\t<li class=\"cat-item cat-item-26\"><a href=\"https:\/\/zmh.org\/tag\/startups\/\">startups<\/a> (8)\n<\/li>\n\t<li class=\"cat-item cat-item-27\"><a href=\"https:\/\/zmh.org\/tag\/tech\/\">tech<\/a> (5)\n<\/li>\n\t<li class=\"cat-item cat-item-28\"><a href=\"https:\/\/zmh.org\/tag\/travel\/\">travel<\/a> (5)\n<\/li>\n\t<li class=\"cat-item cat-item-29\"><a href=\"https:\/\/zmh.org\/tag\/tv\/\">tv<\/a> (1)\n<\/li>\n<\/ul>\n\n\n<style>.sidebar h2 {font-size: 11px;\n  font-family: Lucida Grande;\n  text-transform: uppercase;\n  letter-spacing: 1px;\n  color: gray;\n  font-weight: 400;}<\/style>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-257","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/zmh.org\/blog\/wp-json\/wp\/v2\/pages\/257","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zmh.org\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/zmh.org\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/zmh.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zmh.org\/blog\/wp-json\/wp\/v2\/comments?post=257"}],"version-history":[{"count":0,"href":"https:\/\/zmh.org\/blog\/wp-json\/wp\/v2\/pages\/257\/revisions"}],"wp:attachment":[{"href":"https:\/\/zmh.org\/blog\/wp-json\/wp\/v2\/media?parent=257"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}