<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Zachary Hamed</title>
	<atom:link href="https://zmh.org/feed/" rel="self" type="application/rss+xml" />
	<link>https://zmh.org/</link>
	<description></description>
	<lastBuildDate>Tue, 14 Apr 2026 12:23:16 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://i0.wp.com/zmh.org/blog/wp-content/uploads/2024/12/cropped-favicon-zmh.gif?fit=32%2C32&#038;ssl=1</url>
	<title>Zachary Hamed</title>
	<link>https://zmh.org/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">239930377</site>	<item>
		<title>Personal Site Gallery</title>
		<link>https://zmh.org/personal-site-gallery/</link>
					<comments>https://zmh.org/personal-site-gallery/#respond</comments>
		
		<dc:creator><![CDATA[zacharyhamed]]></dc:creator>
		<pubDate>Mon, 13 Apr 2026 06:47:20 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[projects]]></category>
		<guid isPermaLink="false">https://zmh.org/?p=2541</guid>

					<description><![CDATA[I’ve put together what I think is currently the most comprehensive directory of personal sites available on the internet today. 31,000+ personal web p]]></description>
										<content:encoded><![CDATA[
<p>I’ve 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>



<p>Give it a try at <a href="https://zmh.github.io/personal-site-gallery/">zmh.github.io/personal-site-gallery/</a></p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e4f83487005&quot;}" data-wp-interactive="core/image" data-wp-key="69e4f83487005" class="wp-block-image size-large wp-lightbox-container"><img data-recalc-dims="1" fetchpriority="high" 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="(max-width: 1000px) 100vw, 1000px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<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" />
			</svg>
		</button></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://zmh.org/personal-site-gallery/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2541</post-id>	</item>
		<item>
		<title>Dispatch</title>
		<link>https://zmh.org/dispatch/</link>
					<comments>https://zmh.org/dispatch/#respond</comments>
		
		<dc:creator><![CDATA[zacharyhamed]]></dc:creator>
		<pubDate>Wed, 08 Apr 2026 16:49:29 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[projects]]></category>
		<guid isPermaLink="false">https://zmh.org/?p=2519</guid>

					<description><![CDATA[An opinionated, focused inbox for Slack.

https://x.com/youyuxi/status/2036298146704400793]]></description>
										<content:encoded><![CDATA[
<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>



<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">
<figure data-wp-context="{&quot;imageId&quot;:&quot;69e4f83492519&quot;}" data-wp-interactive="core/image" data-wp-key="69e4f83492519" class="wp-block-image size-large wp-lightbox-container"><img data-recalc-dims="1" 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="(max-width: 1000px) 100vw, 1000px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<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" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e4f83493d7b&quot;}" data-wp-interactive="core/image" data-wp-key="69e4f83493d7b" class="wp-block-image size-large wp-lightbox-container"><img data-recalc-dims="1" 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="(max-width: 1000px) 100vw, 1000px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<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" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e4f834955fc&quot;}" data-wp-interactive="core/image" data-wp-key="69e4f834955fc" 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
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<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" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e4f834972fb&quot;}" data-wp-interactive="core/image" data-wp-key="69e4f834972fb" 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
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<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" />
			</svg>
		</button></figure>
</figure>



<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 — never miss an important message, and triage your inbox quickly.</p>



<ol class="wp-block-list">
<li>Add your Slack cookie so it can connect to your workspace. Everything happens locally.</li>



<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>



<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>



<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>
</ol>



<p>This lets you treat Slack just like email. Messages come in, get filtered into inboxes, and then you can action them quickly. </p>



<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–18px, because good typography respects the reader&#8217;s context. Just enough structure to let you read fast and act. </p>



<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>



<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>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<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>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<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>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<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><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f635-200d-1f4ab.png" alt="😵‍💫" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <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>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<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>
</div></figure>



<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>
]]></content:encoded>
					
					<wfw:commentRss>https://zmh.org/dispatch/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2519</post-id>	</item>
		<item>
		<title>2026-01-10</title>
		<link>https://zmh.org/2026-01-10/</link>
					<comments>https://zmh.org/2026-01-10/#respond</comments>
		
		<dc:creator><![CDATA[zacharyhamed]]></dc:creator>
		<pubDate>Sat, 10 Jan 2026 23:05:43 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://zmh.org/?p=2515</guid>

					<description><![CDATA[Today, on the 250th anniversary of Thomas Paine’s Common Sense, Axios' Jim VandeHei &#038; Mike Allen:

Just for today, tune out the screams on screens and]]></description>
										<content:encoded><![CDATA[
<p>Today, on the 250th anniversary of Thomas Paine’s <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>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>So take three minutes this morning to simply savor what&#8217;s special about this country, 250 years into its revolution.</p>



<p>There&#8217;s something special about democracy — American democracy — and its ability to evolve and meet the craziest of challenges. We free people, protect people, empower people and enrich people.</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<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>



<p>They focused on U.S., not them.</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Just for today, tune out the screams on screens and imagine…</p>



<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 … suburbs soaring … 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>



<p>This is the inspiring thing: This is all achievable now — 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>
</blockquote>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://zmh.org/2026-01-10/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2515</post-id>	</item>
		<item>
		<title>2025 Side Projects</title>
		<link>https://zmh.org/2025-side-projects/</link>
					<comments>https://zmh.org/2025-side-projects/#respond</comments>
		
		<dc:creator><![CDATA[zacharyhamed]]></dc:creator>
		<pubDate>Thu, 01 Jan 2026 15:32:21 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[projects]]></category>
		<guid isPermaLink="false">https://zmh.org/?p=2464</guid>

					<description><![CDATA[I’m finally publishing my side projects for 2025 on Github —  36,408 lines of code, almost entirely vibe coded.

• Quill, a native Mac WordPress blogg]]></description>
										<content:encoded><![CDATA[
<p>I’m finally publishing my side projects for 2025 on Github — 36,408 lines of code, almost entirely vibe coded.</p>



<ul class="wp-block-list">
<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>



<li><a href="https://zmh.org/gymtxt/">Gymtxt</a>, a lightweight way to log workouts as plaintext</li>



<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>



<li><a href="https://zmh.org/shrinksearch/">Shrinksearch</a>, a fast way to search and browse Psychology Today profiles</li>
</ul>



<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">
<figure data-wp-context="{&quot;imageId&quot;:&quot;69e4f834a3166&quot;}" data-wp-interactive="core/image" data-wp-key="69e4f834a3166" 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
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<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" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e4f834a73b5&quot;}" data-wp-interactive="core/image" data-wp-key="69e4f834a73b5" 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
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<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" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e4f834a9099&quot;}" data-wp-interactive="core/image" data-wp-key="69e4f834a9099" 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
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<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" />
			</svg>
		</button></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e4f834aa87c&quot;}" data-wp-interactive="core/image" data-wp-key="69e4f834aa87c" 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
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<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" />
			</svg>
		</button></figure>
</figure>



<p>Some notes from building this year:</p>



<ul class="wp-block-list">
<li>I’ve been preferring one-page tools that read/write from a local CSV, JSON file, or sqlite db — the data layer is easy for the models to use, version controlled, and super fast on the frontend for the user.</li>



<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>



<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’re essentially a self-hosted Replit or V0 — 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>



<li>I’m interested in what LLMs can “see” 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>



<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’s a specific reason to build natively.</li>



<li>I find it crazy that, when facing a bug the LLM can’t 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>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://zmh.org/2025-side-projects/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2464</post-id>	</item>
		<item>
		<title>Day One Publish</title>
		<link>https://zmh.org/day-one-publish/</link>
					<comments>https://zmh.org/day-one-publish/#respond</comments>
		
		<dc:creator><![CDATA[zacharyhamed]]></dc:creator>
		<pubDate>Mon, 29 Dec 2025 13:53:51 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[projects]]></category>
		<guid isPermaLink="false">https://zmh.org/?p=2462</guid>

					<description><![CDATA[Day One Publish is a project I made to generate a static site from a Day One journal.

For some recent travel, I wanted a way to add photos each day f]]></description>
										<content:encoded><![CDATA[
<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>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e4f834ae8d8&quot;}" data-wp-interactive="core/image" data-wp-key="69e4f834ae8d8" 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
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<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" />
			</svg>
		</button></figure>



<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>



<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>



<p></p>



<p></p>



<p><br></p>
]]></content:encoded>
					
					<wfw:commentRss>https://zmh.org/day-one-publish/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2462</post-id>	</item>
		<item>
		<title>Quill</title>
		<link>https://zmh.org/quill/</link>
					<comments>https://zmh.org/quill/#comments</comments>
		
		<dc:creator><![CDATA[zacharyhamed]]></dc:creator>
		<pubDate>Sat, 01 Nov 2025 15:22:37 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[projects]]></category>
		<guid isPermaLink="false">https://zmh.org/?p=2449</guid>

					<description><![CDATA[Quill is a native macOS WordPress editor, built for those who like to edit their site posts directly.

I’ve used Ulysses, IA Writer, and MarsEdit, but]]></description>
										<content:encoded><![CDATA[
<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>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e4f834af9a7&quot;}" data-wp-interactive="core/image" data-wp-key="69e4f834af9a7" 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
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<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" />
			</svg>
		</button></figure>



<p>I’ve 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’d need to switch to WordPress to edit (or in MarsEdit’s case, I’d get a bunch of HTML comments around each block, which made editing hard.)</p>



<p>So I made the Mac WordPress post editor I’ve always wanted, mainly for blogging:</p>



<ul class="wp-block-list">
<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>



<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>



<li><b>Blogging-focused</b> &#8211; I really wanted to know how much I was writing and set goals</li>



<li><b>Notes-like</b> &#8211; I wanted to treat posts as notes so they’re living documents. Easy to open quickly, make a change, and save. Fast and available offline so you can edit on a plane</li>



<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>
</ul>



<p>The app was almost entirely vibe-coded using Claude Code in a few sessions. Some observations:</p>



<ul class="wp-block-list">
<li>Claude Code, and Opus, are substantially better at project management and context compacting since I started in June.&nbsp;</li>



<li>Opus is very good at Mac development — the hardest part was notarization. If Apple fixed notarization and App Store submissions for Mac and iOS (perhaps using MCPs), I think you’d see a renaissance of native app development.</li>



<li>Building text editors continues to be one of the hardest problems in computer science.</li>
</ul>



<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>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://zmh.org/quill/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2449</post-id>	</item>
		<item>
		<title>Gymtxt</title>
		<link>https://zmh.org/gymtxt/</link>
					<comments>https://zmh.org/gymtxt/#respond</comments>
		
		<dc:creator><![CDATA[zacharyhamed]]></dc:creator>
		<pubDate>Tue, 30 Sep 2025 15:18:13 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[projects]]></category>
		<guid isPermaLink="false">https://zmh.org/?p=2475</guid>

					<description><![CDATA[Gymtxt.com is a lightweight way to jot down exercises at the gym, in plaintext. It’s based on how I log workouts in Apple Notes / IA Writer, with a li]]></description>
										<content:encoded><![CDATA[
<p><a href="https://gymtxt.com">Gymtxt.com</a> is a lightweight way to jot down exercises at the gym, in plaintext. It’s 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>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e4f834b2372&quot;}" data-wp-interactive="core/image" data-wp-key="69e4f834b2372" 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
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<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" />
			</svg>
		</button></figure>



<p>It allows you to write something like</p>



<pre class="wp-block-code wp-block-preformatted"><code>10/13
squats 100lbs 5x5 
bench press 45 each side 5x8</code></pre>



<p>The date, exercise, set count, rep count, and weight are parsed automatically and tracked over time with graphs. </p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e4f834b34eb&quot;}" data-wp-interactive="core/image" data-wp-key="69e4f834b34eb" 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
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<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" />
			</svg>
		</button></figure>



<p>Easily remember what you did last time and update your workout as you go. <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>



<p>All data is stored in local storage and importable/exportable as plain .txt files.<br></p>
]]></content:encoded>
					
					<wfw:commentRss>https://zmh.org/gymtxt/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2475</post-id>	</item>
		<item>
		<title>Clay + Automattic</title>
		<link>https://zmh.org/clay-automattic/</link>
					<comments>https://zmh.org/clay-automattic/#respond</comments>
		
		<dc:creator><![CDATA[zacharyhamed]]></dc:creator>
		<pubDate>Thu, 12 Jun 2025 12:00:00 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[most-read]]></category>
		<guid isPermaLink="false">https://zmh.org/?p=2020</guid>

					<description><![CDATA[I'm very excited to announce that Clay has been acquired by Automattic, the parent company of WordPress.com and other fantastic products like Beeper, ]]></description>
										<content:encoded><![CDATA[
<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—with 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>



<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>



<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>



<p>That said, we&#8217;re not going anywhere! So I&#8217;d like to make a few things clear:</p>



<p><b>1. Our product and team will be growing, unlike every previous app or product in this space.</b></p>



<p>We started Clay because we had been burned by spending days adding people and notes into apps that eventually shut down:</p>



<ul class="wp-block-list">
<li>Plaxo — acq. by Comcast and discontinued</li>



<li>Contactually — acq. by Compass and discontinued </li>



<li>Connected — acq. by LinkedIn and discontinued </li>



<li>Refresh — acq. by LinkedIn and discontinued </li>



<li>Rapportive — acq. by LinkedIn and discontinued </li>



<li>Accompany — acq. by Cisco and discontinued</li>



<li>Brewster — acq. by Burger King&#8217;s parent company (!), and then FullContact, and discontinued</li>



<li>Humin — acq. by Match Group and discontinued </li>



<li>Xobni — acq. by Yahoo and discontinued </li>



<li>Gist — acq. by Research in Motion and discontinued </li>



<li>Cobook — acq. by FullContact and discontinued </li>



<li>Soocial — acq. by Viadeo and discontinued </li>



<li>RelateIQ — acq. by Salesforce and discontinued </li>



<li>Contacts+ — acq. by FullContact, then spun out, then acquired by Benchmark Email, and now stagnant</li>
</ul>



<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>



<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>



<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>



<p></p>



<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>



<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>



<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>



<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 — <a href="mailto:care@clay.earth">email us</a>!</p>



<p></p>



<p><b>3. Digital identity and relationship graphs are more important than ever.</b></p>



<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>



<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>



<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>



<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>



<p class="has-text-align-center">***</p>



<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>



<p>So — thank you for being a part of the Clay community. Let&#8217;s build something extraordinary together.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://zmh.org/clay-automattic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2020</post-id>	</item>
		<item>
		<title>Shrinksearch</title>
		<link>https://zmh.org/shrinksearch/</link>
					<comments>https://zmh.org/shrinksearch/#respond</comments>
		
		<dc:creator><![CDATA[zacharyhamed]]></dc:creator>
		<pubDate>Tue, 29 Apr 2025 14:20:32 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[projects]]></category>
		<guid isPermaLink="false">https://zmh.org/?p=2463</guid>

					<description><![CDATA[Shrinksearch lets you quickly search and browse mental health providers from the NYC area, with data from Psychology Today as of April 2025.

Psycholo]]></description>
										<content:encoded><![CDATA[
<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>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e4f834b5a15&quot;}" data-wp-interactive="core/image" data-wp-key="69e4f834b5a15" 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
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<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" />
			</svg>
		</button></figure>



<p>Psychology Today has the best data set for mental health providers, but it doesn’t let you search the text of providers’ descriptions and only shows a few providers per page.&nbsp;</p>



<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>
]]></content:encoded>
					
					<wfw:commentRss>https://zmh.org/shrinksearch/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2463</post-id>	</item>
		<item>
		<title>Formats and Frameworks</title>
		<link>https://zmh.org/formats-and-frameworks/</link>
					<comments>https://zmh.org/formats-and-frameworks/#respond</comments>
		
		<dc:creator><![CDATA[zacharyhamed]]></dc:creator>
		<pubDate>Wed, 05 Feb 2025 01:22:15 +0000</pubDate>
				<category><![CDATA[Essays]]></category>
		<category><![CDATA[ai]]></category>
		<guid isPermaLink="false">https://zmh.org/?p=1293</guid>

					<description><![CDATA[Came across @eddiejiaoobj’s launch of Common Knowledge today:

Now, Machine Intelligence gives us a new material – one whose inherent malleability all]]></description>
										<content:encoded><![CDATA[<p>Came across @eddiejiaoobj’s launch of Common Knowledge today:</p>
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>
Now, Machine Intelligence gives us a new material – 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?
</p>
</blockquote>
<p>And then remembered a few tweets about AI-friendly frameworks:</p>
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<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— Charles Williamson (@CFJWilliamson) September 12, 2024</p>
</blockquote>
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<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.— Ozgur Ozer (@ozgrozer) January 29, 2025</p>
</blockquote>
<p>It’s evident that AI favors frameworks like Tailwind and React, but I hadn’t thought as much about the file format layer. I was recently trying to convert CSVs using various models and the results were surprisingly lackluster — 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>
<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>
<p>AI prompts and responses are heavily reliant on Markdown formatting, and there’s evidence that Markdown can help improve understanding of prompts. It understands XML well, and is getting better at JSON. </p>
<p>I’m sure understanding of CSVs will improve, though I wonder if they’ll need to be considered more like images, given their 2D nature, than text. Is there even a large enough training set for CSVs?</p>
<p>And then finally, I wonder if Microsoft will train models on a corpus of Office docs — .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>
<p>If you ask o1 to generate a simple Word document, it thinks for a few minutes:</p>
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>
Crafting the document request</p>
<p>I’m figuring out how to generate a landscape-oriented Word document featuring “Hi there” and considering methods for providing it since attachments or base64 encoding are not options.</p>
<p>Assessing options</p>
<p>I’m 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’t feasible.</p>
<p>Crafting a Word doc</p>
<p>I’m set to create a minimal Word doc featuring “Hi there” in landscape orientation, then encode it into a base64 string or provide raw text for users to save as a docx file.</p>
<p>Preparing a solution</p>
<p>I’m thinking about crafting minimal Word doc instructions or a raw text file with “Hi there” for users to convert to docx, simplifying the process with clear guidance or a base64-encoded string.</p>
<p>Crafting the document</p>
<p>I’ll 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’s request.</p>
<p>Forming the structure</p>
<p>I’m 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>
<p>Organizing the essentials</p>
<p>I’m 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>
<p>Creating and encoding</p>
<p>I’ll 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>
<p>Compressing and renaming</p>
<p>I’m 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’s instructions.</p>
<p>Renaming and encoding</p>
<p>I’m renaming the .zip to LandscapeHiThere.docx and preparing to encode it into a base64 string. This step ensures the document’s format aligns with the user’s request, focusing on maintaining accuracy and efficiency.</p>
<p>Replicating the compression algorithm</p>
<p>I’m 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>
<p>Simplifying the process</p>
<p>I’m 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>
<p>Nailing down the method</p>
<p>I’m thinking through providing instructions for generating a Word document in landscape orientation with ‘Hi there’ text, as this seems simpler than creating an entire .docx file.</p>
<p>Generating the document structure</p>
<p>I’m crafting a minimal docx by creating essential files—Document.xml, ContentTypes.xml, and rels/.rels—zipping them, and then encoding the zip into a base64 string.</p>
<p>Weighing options</p>
<p>I’m considering providing a concise method for creating a Word document in landscape orientation with ‘Hi there’ text, or a base64 encoded snippet for decoding, to streamline the process.</p>
<p>Moving forward</p>
<p>I’m weighing whether providing instructions or a base64-encoded zip file is more efficient. Despite the base64 approach being sizable, I’ll proceed for thoroughness.</p>
<p>Crafting helpful instructions</p>
<p>I’m 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>
<p>Laying out the options</p>
<p>I’m 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>
<p>Balancing options</p>
<p>I’m piecing together the base64 and instructions for creating a Word docx. The collaboration to merge them will ensure comprehensive guidance for the user.
</p>
</blockquote>
<p>And finally gives you a few possible solutions:</p>
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>
Below you’ll find two ways to get a landscape-oriented Word document containing the text “Hi there.”</p>
<p>Option 1: Simple Step-by-Step Instructions</p>
<p>Open Microsoft Word (or a compatible word processor).</p>
<p>Switch the page orientation to Landscape:</p>
<p>Type the text: Hi there</p>
<p>That’s it! You now have a Word document in landscape orientation that says “Hi there.”</p>
<p>Option 2: Downloadable (Base64-Encoded) Minimal DOCX</p>
<p>Below is a minimal Word document (in .docx format) encoded in Base64. It has exactly one paragraph that says “Hi there,” with its page set to landscape orientation.</p>
<p>Instructions to use it:</p>
<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>
<p>Verifying it works</p>
<p>Enjoy your landscape Word document!
</p>
</blockquote>
<p>4o does better, writing the following code:</p>
<pre class="wp-block-code"><code>from docx import Document
from docx.shared import Inches
from docx.enum.section import WD_ORIENT
# Create a new Word document
doc = Document()
# Change page orientation to landscape
section = doc.sections[0]
section.orientation = WD_ORIENT.LANDSCAPE
new_width, new_height = section.page_height, section.page_width
section.page_width = new_width
section.page_height = new_height
# Add text to the document
doc.add_paragraph("Hi there")
# Save the document
file_path = "/mnt/data/Hi_there_landscape.docx"
doc.save(file_path)
file_path
</code></pre>
<p>We’ll get to AI-native file formats that are more accurate and have higher information density / bits per second transmission speed. But I can’t help but wonder why, given the hundreds of billions of Office docs created each year, it can’t output or manipulate them more easily. </p>
]]></content:encoded>
					
					<wfw:commentRss>https://zmh.org/formats-and-frameworks/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1293</post-id>	</item>
	</channel>
</rss>
