<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>cosmic on jwogrady</title>
		<link>https://www.jwogrady.com/tags/cosmic/</link>
		<description>Recent content in cosmic on jwogrady</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Mon, 19 Oct 2026 16:39:52 -0500</lastBuildDate>
		
			<atom:link href="https://www.jwogrady.com/tags/cosmic/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Presence, platform, product</title>
				<link>https://www.jwogrady.com/posts/presence-platform-product/</link>
				<pubDate>Mon, 19 Oct 2026 16:39:52 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/presence-platform-product/</guid>
				<description>&lt;p&gt;I believe every local business needs to build three things, in this order.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Presence. Platform. Product.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;figure&gt;&#xA;  &lt;img src=&#34;https://www.jwogrady.com/posts/presence-platform-product/three-ps.png&#34; width=&#34;1220&#34; height=&#34;448&#34;&#xA;       alt=&#34;Three cards joined by arrows. Presence asks &amp;#39;Should I call these people?&amp;#39;: the brand and the 4 Ps behind it, said on the website, social media and every directory; mine is status26.com. Platform asks &amp;#39;Did the lead become a job?&amp;#39;: capture the lead, dispatch the service or order, record what happened; mine is CosmOS with a Cosmic for each business. Product asks &amp;#39;What do they get back?&amp;#39;: what customers told you, turned into something useful for them, kept and still theirs; mine is Cosmic WTP and its VIP back office. Underneath all three, a bar labelled Intake: someone tells you something and it has to be captured correctly; mine is Daniel.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&#xA;  &lt;figcaption&gt;Three things to build, in order, on one foundation.&lt;span class=&#34;credit&#34;&gt;Drawn&lt;/span&gt;&#xA;  &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;That sounds like a slide. It started as a voice note, and I want to explain&#xA;it properly, because for most of my career I would have told you the list had&#xA;one item on it.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Your agency isn&#39;t slow, it&#39;s locked out</title>
				<link>https://www.jwogrady.com/posts/not-slow-locked-out/</link>
				<pubDate>Wed, 23 Sep 2026 12:41:21 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/not-slow-locked-out/</guid>
				<description>&lt;p&gt;Here is the thing nobody tells you before you sign.&lt;/p&gt;&#xA;&lt;p&gt;The best predictor of whether a local marketing engagement produces anything&#xA;is not the agency&amp;rsquo;s talent. It isn&amp;rsquo;t your budget, your industry, or how good&#xA;the pitch deck was. It is something much more boring:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;How many things can they do without stopping to ask you?&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;That number is the whole relationship. And almost nobody negotiates it on&#xA;purpose, which is why so many of these arrangements feel like wading.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Call them at nine on a Sunday</title>
				<link>https://www.jwogrady.com/posts/call-them-at-nine-on-a-sunday/</link>
				<pubDate>Wed, 23 Sep 2026 12:06:10 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/call-them-at-nine-on-a-sunday/</guid>
				<description>&lt;p&gt;The most useful number I know of in a local competitive analysis is not in&#xA;any tool, costs nothing, and you collect it with a telephone.&lt;/p&gt;&#xA;&lt;p&gt;Call your competitors at nine o&amp;rsquo;clock on a Sunday night. Count how many of&#xA;them answer.&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s it. That is the measurement. If you sell anything with an emergency&#xA;in it — water where water should not be, no heat in February, a door that&#xA;won&amp;rsquo;t lock — then some meaningful share of the money in your market is&#xA;moving at hours when a tool&amp;rsquo;s dashboard is a flat line and a human being is&#xA;standing in a hallway deciding who to try next. &lt;strong&gt;Competitor after-hours&#xA;answer rate.&lt;/strong&gt; Nobody sells it to you because nobody can; it isn&amp;rsquo;t in a&#xA;database anywhere. It is, however, entirely knowable by anyone willing to&#xA;spend forty minutes and look slightly odd.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The database that held no data</title>
				<link>https://www.jwogrady.com/posts/the-database-that-held-no-data/</link>
				<pubDate>Tue, 22 Sep 2026 15:35:31 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/the-database-that-held-no-data/</guid>
				<description>&lt;p&gt;Before you move a business&amp;rsquo;s data anywhere, you take an inventory. It is dull&#xA;work and it is the only part that is genuinely load-bearing, because everything&#xA;after it is built on believing you know what you have.&lt;/p&gt;&#xA;&lt;p&gt;I had a file called &lt;code&gt;wtp.duckdb&lt;/code&gt;. Two hundred and seventy-four kilobytes, sat&#xA;in the archive directory next to everything else, named after the company. If&#xA;you had asked me what it was I would have said: that&amp;rsquo;s the database, that&amp;rsquo;s the&#xA;historical record, that&amp;rsquo;s the thing we must not lose.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The number nobody counted</title>
				<link>https://www.jwogrady.com/posts/the-number-nobody-counted/</link>
				<pubDate>Tue, 22 Sep 2026 15:29:13 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/the-number-nobody-counted/</guid>
				<description>&lt;p&gt;No screenshot on this one. The finding is seven.&lt;/p&gt;&#xA;&lt;p&gt;I was doing the least glamorous job in software, which is taking an inventory&#xA;before a move. Two piles of data for the same business — one old, one newer —&#xA;and the only question that matters before you touch either is: what is actually&#xA;in each, and where do they already agree?&lt;/p&gt;&#xA;&lt;p&gt;So I asked the database what it had. The tooling has a perfectly good listing&#xA;that gives you every table with a row count beside it, which is exactly the&#xA;shape of answer the question wants. One table came back at &lt;strong&gt;141 rows&lt;/strong&gt;. The&#xA;old pile had 134 of the same records.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Set is not the same as works</title>
				<link>https://www.jwogrady.com/posts/set-is-not-the-same-as-works/</link>
				<pubDate>Tue, 22 Sep 2026 15:19:14 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/set-is-not-the-same-as-works/</guid>
				<description>&lt;p&gt;I shipped a version that promises nothing today, on purpose, and what stayed&#xA;with me afterwards was how much of it I had to take on faith right up until the&#xA;moment it ran.&lt;/p&gt;&#xA;&lt;p&gt;The job was release automation. A bot watches the commits landing on the main&#xA;branch, and when it sees enough to be worth naming it opens a pull request that&#xA;writes the changelog, bumps the version, and cuts the tag. It is a good deal.&#xA;Setting it up, though, is almost entirely configuration — and configuration is&#xA;just a pile of claims about what will happen later, sitting in a file, looking&#xA;exactly as confident when it is wrong.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The one that threw an error was the safe one</title>
				<link>https://www.jwogrady.com/posts/the-one-that-errored-was-safe/</link>
				<pubDate>Tue, 22 Sep 2026 14:40:26 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/the-one-that-errored-was-safe/</guid>
				<description>&lt;p&gt;Here is the thing I had backwards this afternoon. I spent an hour planning&#xA;around a failure that announces itself, and very nearly walked straight past&#xA;the one that doesn&amp;rsquo;t.&lt;/p&gt;&#xA;&lt;p&gt;The setup is ordinary enough. A static site — pages assembled once, ahead of&#xA;time, then served as plain files — that pulls its content out of a database&#xA;while it builds. The database is Postgres, and every table on it has Row Level&#xA;Security switched on: RLS, a rule attached to the table that runs on every&#xA;query and decides which rows &lt;em&gt;this particular caller&lt;/em&gt; is allowed to see. The&#xA;build connects as &lt;code&gt;anon&lt;/code&gt;, the unauthenticated role, because a build has no user&#xA;to be. It is nobody, asking politely.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
