<rss version="2.0">
  <channel>
    <title>How To on Numeric Citizen I/O — A Blog About Blogging</title>
    <link>https://meta.numericcitizen.me/categories/how-to/</link>
    <description></description>
    
    <language>en-us</language>
    
    <lastBuildDate>Sun, 06 Sep 2026 10:20:14 -0400</lastBuildDate>
    
    <item>
      <title>Making Eight Years of Blogging Searchable</title>
      <link>https://meta.numericcitizen.me/2026/09/06/making-eight-years-of-blogging.html</link>
      <pubDate>Sun, 06 Sep 2026 10:20:14 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2026/09/06/making-eight-years-of-blogging.html</guid>
      <description>&lt;p&gt;I have been publishing on Ghost since October 2018. That is 677 posts, and until this week I had no good way to ask questions about any of it. I could search my own site, which matches titles. I could remember roughly what I wrote and when, which works for the last few months and fails completely for 2019.&lt;/p&gt;
&lt;p&gt;What I wanted was to ask &amp;ldquo;what have I written about X&amp;rdquo; and get a real answer drawn from the full text of every post. Ghost offers an API but no MCP endpoint, so the obvious path was not available. Here is what it actually took, including the parts I got wrong.&lt;/p&gt;
&lt;h2 id=&#34;starting-with-what-already-exists&#34;&gt;Starting with what already exists&lt;/h2&gt;
&lt;p&gt;There are several community-built Ghost MCP servers. I tried one that supports the read-only Content API, and it worked immediately. Posts, pages, tags, authors, all queryable in conversation.&lt;/p&gt;
&lt;p&gt;For about an hour I thought I was done.&lt;/p&gt;
&lt;h2 id=&#34;the-thing-that-quietly-breaks-everything&#34;&gt;The thing that quietly breaks everything&lt;/h2&gt;
&lt;p&gt;Ghost 6.0 removed support for &lt;code&gt;?limit=all&lt;/code&gt; and imposed a maximum page size of 100 on every API endpoint. That change is documented and reasonable, since unbounded queries hurt large sites.&lt;/p&gt;
&lt;p&gt;The problem is how it fails. Requesting &lt;code&gt;?limit=all&lt;/code&gt; does not error. It returns 100 items and says nothing about the other 577.&lt;/p&gt;
&lt;p&gt;I found this by running a &lt;code&gt;curl&lt;/code&gt; command to measure my archive size and getting back exactly 100 posts. A suspiciously round number for a blog running since 2018. The same cap applies to any MCP server built on the Content API, which means every answer I had been getting was drawn from my most recent fourteen months of writing while presenting itself as complete.&lt;/p&gt;
&lt;p&gt;That is worse than an error. An error tells you to fix something. This just quietly narrows your world.&lt;/p&gt;
&lt;p&gt;There is a second limitation underneath it. Ghost&amp;rsquo;s NQL filter language has no &lt;code&gt;like&lt;/code&gt; operator and no partial matching, and content fields are not filterable at all. You can retrieve &lt;code&gt;plaintext&lt;/code&gt; in a response, but you cannot query against it. So even with correct pagination, there is no way to search article bodies through the API.&lt;/p&gt;
&lt;p&gt;Ghost&amp;rsquo;s own site search works around this the same way I ended up doing: download the corpus and search it locally.&lt;/p&gt;
&lt;h2 id=&#34;the-local-copy&#34;&gt;The local copy&lt;/h2&gt;
&lt;p&gt;The design that followed is unglamorous and took an afternoon.&lt;/p&gt;
&lt;p&gt;A Postgres table holding one row per post, with the full body in a &lt;code&gt;plaintext&lt;/code&gt; column and a generated &lt;code&gt;tsvector&lt;/code&gt; column indexed with GIN. An n8n workflow pulls the archive weekly with explicit pagination, seven pages at 100 posts each with a one second delay between them, and upserts everything in a single round trip.&lt;/p&gt;
&lt;p&gt;The schema is boring on purpose:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;create&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;table&lt;/span&gt; ghost.posts (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  id            text &lt;span style=&#34;color:#66d9ef&#34;&gt;primary&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;key&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  slug          text &lt;span style=&#34;color:#66d9ef&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;unique&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  title         text,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  plaintext     text,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  url           text,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  tags          text[],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  published_at  timestamptz,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  updated_at    timestamptz,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  synced_at     timestamptz &lt;span style=&#34;color:#66d9ef&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  fts tsvector &lt;span style=&#34;color:#66d9ef&#34;&gt;generated&lt;/span&gt; always &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    setweight(to_tsvector(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;english&amp;#39;&lt;/span&gt;::regconfig, coalesce(title, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)),     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;A&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    setweight(to_tsvector(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;english&amp;#39;&lt;/span&gt;::regconfig, coalesce(plaintext, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)), &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;B&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ) stored
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;setweight&lt;/code&gt; calls mean a title match outranks a body match. Without them, a post that mentions a term once in passing can outrank the post named after it.&lt;/p&gt;
&lt;p&gt;Two details in the sync are worth stealing if you build something similar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Full reconcile, not incremental.&lt;/strong&gt; My first instinct was a watermark on &lt;code&gt;updated_at&lt;/code&gt;, which is what I use for feed-based syncs. It is the wrong tool here. It would save six HTTP calls a week and would never detect a deleted or unpublished post. Pulling everything self-heals.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A guard on the delete step.&lt;/strong&gt; Every row gets stamped with the run&amp;rsquo;s timestamp, and anything older gets pruned, which is how deletions propagate. But the prune only runs if this pass fetched at least 80% of the rows already in the table. Without that check, one bad fetch silently wipes eight years of archive. This is the kind of thing you want in place before you need it.&lt;/p&gt;
&lt;h2 id=&#34;i-was-wrong-about-the-size&#34;&gt;I was wrong about the size&lt;/h2&gt;
&lt;p&gt;I nearly did not build this because I assumed the archive would blow past my database provider&amp;rsquo;s free tier. That assumption was off by roughly two orders of magnitude.&lt;/p&gt;
&lt;p&gt;677 posts come to 3.2 million characters of body text. The table with its full-text index totals 11 MB against a 512 MB limit. I would need something like 32,000 posts to be in trouble.&lt;/p&gt;
&lt;p&gt;A related surprise: my recent posts average about 8,400 characters while the archive average is 4,700. My writing has roughly doubled in length over eight years. I did not know that about myself before running the query.&lt;/p&gt;
&lt;p&gt;The more useful lesson is that on serverless Postgres, storage is almost never the binding constraint for text. Compute hours are. Every query wakes the database for a minimum billing interval regardless of how fast it runs, so a scattered handful of ad-hoc searches costs more than the weekly bulk write does. Worth knowing before you optimise the wrong thing, which I did for a while.&lt;/p&gt;
&lt;h2 id=&#34;the-part-i-did-not-anticipate&#34;&gt;The part I did not anticipate&lt;/h2&gt;
&lt;p&gt;With the table populated, I assumed I was finished. I was not, and the gap here is the least obvious thing in this whole project.&lt;/p&gt;
&lt;p&gt;Nothing routes the question.&lt;/p&gt;
&lt;p&gt;Each time you ask something, the assistant picks tools based on their names and descriptions. It sees a Ghost MCP whose tools are explicitly labelled as browsing and reading blog posts. It also sees a generic SQL tool pointed at a database it knows nothing about. Ask &amp;ldquo;what have I written about X&amp;rdquo; and the match is overwhelmingly toward the Ghost tools, which return the 100 most recent posts and no warning.&lt;/p&gt;
&lt;p&gt;Building the better data source does not cause it to be used. You have to say so, explicitly, somewhere persistent.&lt;/p&gt;
&lt;p&gt;I solved this with a Skill: a set of instructions that triggers on phrasings like &amp;ldquo;what did I write about X&amp;rdquo; and states the routing rule as a prohibition rather than a preference. Do not use the Ghost browse tools for search, here is why they fail, here is the table and the query shape to use instead.&lt;/p&gt;
&lt;p&gt;The skill also pins the retrieval pattern, which matters more than I expected. Search first with ranked snippets, then fetch full bodies for only the three to five posts that are actually relevant. And read whole posts, never fragments. A paragraph mentioning a product without the surrounding argument is exactly how you end up having your own past position mischaracterised back to you.&lt;/p&gt;
&lt;h2 id=&#34;full-text-is-not-semantic-search&#34;&gt;Full-text is not semantic search&lt;/h2&gt;
&lt;p&gt;I conflated these two for a while, and the distinction is worth being precise about.&lt;/p&gt;
&lt;p&gt;What I built matches words and their grammatical variants. Ask about &amp;ldquo;Apple Intelligence&amp;rdquo; and it finds posts containing those words. Ask &amp;ldquo;how has my thinking about AI subscriptions evolved&amp;rdquo; and it will find something, because the words appear somewhere, but it has no way to surface a post that discusses the same idea in entirely different vocabulary.&lt;/p&gt;
&lt;p&gt;Semantic search needs embeddings, a vector column, and a model called at both index and query time. That is a real layer of work.&lt;/p&gt;
&lt;p&gt;I deliberately did not build it. Full-text over 677 posts with English stemming handles the lookup questions well, and lookup is most of what I actually ask. If the thematic questions come back consistently thin, the embeddings layer drops into the same table without rearchitecting anything. Building it up front would have been solving a problem I had not yet confirmed I have.&lt;/p&gt;
&lt;h2 id=&#34;what-it-does-not-do&#34;&gt;What it does not do&lt;/h2&gt;
&lt;p&gt;Four posts have empty bodies. The unauthenticated Content API cannot see members-only content, so gated posts arrive with a title and nothing else. They are findable by name but their text is not indexed. Fixing that means switching to the Admin API with JWT signing, which is not worth it for four posts.&lt;/p&gt;
&lt;p&gt;The copy is up to seven days stale. Irrelevant for archive questions, relevant if I ask about something published yesterday.&lt;/p&gt;
&lt;p&gt;And the whole thing is lexical. When a thematic question comes back thin, the honest answer is that the tool is not built for it, not that the archive is silent.&lt;/p&gt;
&lt;h2 id=&#34;was-it-worth-it&#34;&gt;Was it worth it&lt;/h2&gt;
&lt;p&gt;An afternoon, one database table, one scheduled workflow, and one skill file.&lt;/p&gt;
&lt;p&gt;The first real test was asking what I had written about GuruShots, a photography game I covered in late 2018. Two posts came back with dates and links. Through the Ghost API alone, that question has no answer at all.&lt;/p&gt;
&lt;p&gt;That is the whole point. Eight years of writing is only an archive if you can reach into it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Solving Broken Images When Exporting Craft Documents</title>
      <link>https://meta.numericcitizen.me/2026/04/25/solving-broken-images-when-exporting.html</link>
      <pubDate>Sat, 25 Apr 2026 13:27:03 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2026/04/25/solving-broken-images-when-exporting.html</guid>
      <description>&lt;h2&gt;The Problem &lt;/h2&gt;
&lt;p&gt;When exporting articles from Craft to Ulysses and Micro.blog, images referenced by temporary URLs quickly become broken links. Craft hosts images with public URLs that expire within days, leaving your published posts with missing images. This automation workflow solves that problem by re-hosting all images on Micro.blog before publishing.&lt;/p&gt;
&lt;h2&gt;How It Works &lt;/h2&gt;
&lt;p&gt;The workflow is triggered when you request to publish a Craft document to Micro.blog. Here&#39;s what happens behind the scenes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A request is send in Claude with the article title to publish&lt;/li&gt;
&lt;li&gt;The n8n automation searches my Craft space and uses a scoring algorithm to find the exact document (preventing false matches from body text mentions)&lt;/li&gt;
&lt;li&gt;The document&#39;s content is converted from Craft&#39;s block format into clean HTML, preserving headings, lists, formatting, quotes, code blocks, and more&lt;/li&gt;
&lt;li&gt;The workflow scans for all image URLs pointing to Craft&#39;s backend hosting&lt;/li&gt;
&lt;li&gt;Each image is downloaded from Craft and immediately re-uploaded to Micro.blog&#39;s permanent media storage&lt;/li&gt;
&lt;li&gt;All image references in the post are updated to point to the new, stable Micro.blog URLs&lt;/li&gt;
&lt;li&gt;The article is published as a draft to Micro.blog for review before going live, which is a manual process&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/143495/2026/craft-image-0-1777137965533.png&#34; alt=&#34;&#34;&gt;&lt;/figure&gt;
&lt;h2&gt;Key Technical Features &lt;/h2&gt;
&lt;h3&gt;Smart Document Matching &lt;/h3&gt;
&lt;p&gt;The search algorithm scores results by how closely the document title matches the request. Exact matches score 100, partial matches score lower, and body-text mentions are heavily penalized. This ensures I get the right document even if multiple articles discuss similar topics. The search is done via Craft API endpoint.&lt;/p&gt;
&lt;h3&gt;Rich Content Support &lt;/h3&gt;
&lt;p&gt;The conversion preserves all the formatting: paragraph styles, heading levels (h1–h4), bullet and numbered lists, blockquotes, task checkboxes, strikethrough text, code blocks, horizontal rules, and rich link bookmarks. Consecutive list items are automatically grouped into single lists.&lt;/p&gt;
&lt;h3&gt;Graceful Image Handling &lt;/h3&gt;
&lt;p&gt;If an image fails to upload (for example, unsupported formats like AVIF), the system keeps the original Craft URL in your post rather than failing entirely. This ensures the article publishes even if one image has issues.&lt;/p&gt;
&lt;h3&gt;Manual Review &lt;/h3&gt;
&lt;p&gt;All posts are created as drafts in Micro.blog. I can review the final result, check that images loaded correctly, and make edits before publishing it live.&lt;/p&gt;
&lt;h2&gt;Workflow Specifications &lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trigger:&lt;/strong&gt; Webhook at craft-to-microblog (available in my n8n instance wirh MCP endpoint enabled)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Input:&lt;/strong&gt; Simple JSON with the article title to publish&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APIs used:&lt;/strong&gt; Craft&#39;s document search and block retrieval, Micro.blog&#39;s Micropub standard API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typical execution:&lt;/strong&gt; 4–6 seconds (image uploads add ~1.5 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output:&lt;/strong&gt; Draft post URL, preview link, and edit URL from Micro.blog&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why This Matters &lt;/h2&gt;
&lt;p&gt;This automation fills a gap in the content publishing process. I can craft and organize my articles in Craft, a versatile and attractive writing environment, and then publish them to Micro.blog without losing images or manually fixing broken links. I use a similar method to publish new editions of the Ephemeral Scrapbook newsletter, which relies on a separate n8n workflow to handle Ghost CMS-specific requirements. &lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/143495/2026/craft-image-1-1777137965533.png&#34; alt=&#34;&#34;&gt;&lt;/figure&gt;
</description>
    </item>
    
    <item>
      <title>My Micro.blog Timeline Summarization Workflow</title>
      <link>https://meta.numericcitizen.me/2026/01/14/my-microblog-timeline-summarization-workflow.html</link>
      <pubDate>Wed, 14 Jan 2026 07:43:12 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2026/01/14/my-microblog-timeline-summarization-workflow.html</guid>
      <description>&lt;p&gt;By popular request, here&amp;rsquo;s &lt;a href=&#34;https://crafted.numericcitizen.me/FtKlZVn3GnMjbs&#34;&gt;the documentation&lt;/a&gt; for my n8n workflow. This documentation was created with Claude AI using Claude Skills and was slightly tweaked to remove any sensitive data. The diagram was manually added.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/143495/2026/rssfeedtrigger.png&#34; width=&#34;600&#34; height=&#34;256&#34; alt=&#34;&#34;&gt;
</description>
    </item>
    
    <item>
      <title>Building an Automated Publishing Pipeline: From Craft to Ghost</title>
      <link>https://meta.numericcitizen.me/2026/01/02/building-an-automated-publishing-pipeline.html</link>
      <pubDate>Fri, 02 Jan 2026 17:57:27 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2026/01/02/building-an-automated-publishing-pipeline.html</guid>
      <description>&lt;p&gt;For months, I&amp;rsquo;ve been publishing my weekly newsletter, &lt;em&gt;The Ephemeral Scrapbook&lt;/em&gt;, using a manual process: write in Craft, export to Ulysses, copy to Ghost, reformat everything, add images, fix formatting issues, and finally publish. It worked, but it was tedious and time-consuming.&lt;/p&gt;
&lt;p&gt;Today, that process is fully automated. Here&amp;rsquo;s how Claude and I built it together.&lt;/p&gt;
&lt;h2 id=&#34;the-challenge&#34;&gt;The Challenge&lt;/h2&gt;
&lt;p&gt;My workflow had become a bottleneck:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Writing newsletters in Craft Docs (my preferred writing environment)&lt;/li&gt;
&lt;li&gt;Exporting to Ulysses as an intermediary step&lt;/li&gt;
&lt;li&gt;Manual copy/paste to Ghost (my publishing platform)&lt;/li&gt;
&lt;li&gt;Reformatting all the markdown and HTML&lt;/li&gt;
&lt;li&gt;Dealing with Craft-specific formatting that Ghost didn&amp;rsquo;t understand&lt;/li&gt;
&lt;li&gt;Adding metadata like excerpts and tags manually&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I wanted automation, but I also wanted to understand the infrastructure I was building. That&amp;rsquo;s where working with Claude became invaluable—not just executing commands, but learning and iterating together.&lt;/p&gt;
&lt;h2 id=&#34;the-solution-n8n-workflow-automation&#34;&gt;The Solution: n8n Workflow Automation&lt;/h2&gt;
&lt;p&gt;We decided to build an n8n workflow that would:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Search for a document in Craft by title&lt;/li&gt;
&lt;li&gt;Fetch all the content blocks&lt;/li&gt;
&lt;li&gt;Transform Craft&amp;rsquo;s markdown/blocks into clean HTML&lt;/li&gt;
&lt;li&gt;Publish to Ghost as a draft&lt;/li&gt;
&lt;li&gt;Return confirmation with the post URL&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Simple in concept, complex in execution.&lt;/p&gt;
&lt;h2 id=&#34;the-journey-key-milestones&#34;&gt;The Journey: Key Milestones&lt;/h2&gt;
&lt;h3 id=&#34;milestone-1-understanding-the-architecture&#34;&gt;Milestone 1: Understanding the Architecture&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Challenge&lt;/strong&gt;: Should we use multiple workflows or one unified workflow?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Decision&lt;/strong&gt;: One end-to-end workflow that handles everything from search to publish.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Learning&lt;/strong&gt;: Simplicity wins. Rather than orchestrating multiple workflows, we built one cohesive pipeline that&amp;rsquo;s easier to debug and maintain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workflow nodes&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Webhook (trigger)&lt;/li&gt;
&lt;li&gt;HTTP Request (search Craft)&lt;/li&gt;
&lt;li&gt;HTTP Request (fetch document)&lt;/li&gt;
&lt;li&gt;Code (transform to HTML)&lt;/li&gt;
&lt;li&gt;HTTP Request (publish to Ghost)&lt;/li&gt;
&lt;li&gt;Respond to Webhook&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;the-iterative-building-process&#34;&gt;The Iterative Building Process&lt;/h3&gt;
&lt;p&gt;One of the most important decisions we made was to &lt;strong&gt;build and test incrementally&lt;/strong&gt;. Rather than assembling the entire workflow at once and hoping it would work, we added one node at a time, testing after each addition.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Testing Cadence&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Add Webhook → Test&lt;/strong&gt;: Confirmed the webhook received the query parameter correctly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add Search Node → Test&lt;/strong&gt;: Verified we could find the document and get the correct document ID&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add Fetch Node → Test&lt;/strong&gt;: Checked that we retrieved all 54 blocks of content with the proper nested structure&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add Code Node → Test&lt;/strong&gt;: Validated the HTML transformation, checking for clean output without Craft tags&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add Ghost Publish Node → Test&lt;/strong&gt;: Ensured the post was created as a draft with all content intact&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add Response Node → Test&lt;/strong&gt;: Confirmed the workflow returned post details back to Claude&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Why This Mattered&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Each test revealed issues that would have been much harder to debug in a complete workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The search node helped us understand Craft returns multiple matches (we needed the first result)&lt;/li&gt;
&lt;li&gt;The fetch node showed us the nested structure (parent document → edition page → content blocks)&lt;/li&gt;
&lt;li&gt;The code node iterations caught formatting issues (&lt;code&gt;&amp;lt;callout&amp;gt;&lt;/code&gt; tags, &lt;code&gt;##&lt;/code&gt; symbols, &lt;code&gt;&amp;lt;highlight&amp;gt;&lt;/code&gt; tags)&lt;/li&gt;
&lt;li&gt;The Ghost publish node revealed we needed the &lt;code&gt;?source=html&lt;/code&gt; query parameter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By testing at each step, we could pinpoint exactly where problems occurred. When something didn&amp;rsquo;t work, we knew it was the node we just added, not some mysterious interaction between distant parts of the workflow.&lt;/p&gt;
&lt;p&gt;This incremental approach turned what could have been hours of debugging into a smooth building process. Each successful test gave us confidence to move forward, and each failure was easy to isolate and fix.&lt;/p&gt;
&lt;h3 id=&#34;milestone-2-building-the-html-transformer&#34;&gt;Milestone 2: Building the HTML Transformer&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Challenge&lt;/strong&gt;: Craft uses its own markdown dialect with special tags like &lt;code&gt;&amp;lt;callout&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;highlight color=&amp;quot;blue&amp;quot;&amp;gt;&lt;/code&gt;, and markdown headers in text blocks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What we built&lt;/strong&gt;: A comprehensive JavaScript transformation engine that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Removes Craft-specific tags (&lt;code&gt;&amp;lt;callout&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;highlight&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Converts markdown formatting (bold, italic, links, code)&lt;/li&gt;
&lt;li&gt;Processes different block types (text, headers, quotes, code, images, videos)&lt;/li&gt;
&lt;li&gt;Handles rich URL blocks (YouTube embeds)&lt;/li&gt;
&lt;li&gt;Preserves anchor links for internal navigation&lt;/li&gt;
&lt;li&gt;Generates proper HTML for Ghost&amp;rsquo;s Lexical editor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Key functions&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;markdownToHtml()&lt;/code&gt; - Converts inline markdown to HTML&lt;/li&gt;
&lt;li&gt;&lt;code&gt;processBlock()&lt;/code&gt; - Handles each block type (text, image, richUrl, code, line, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;milestone-3-testing-and-validation&#34;&gt;Milestone 3: Testing and Validation&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The Process&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Test with real content (Edition 2025-52 with 54 blocks)&lt;/li&gt;
&lt;li&gt;Verify HTML output in Ghost&amp;rsquo;s editor&lt;/li&gt;
&lt;li&gt;Check for Craft formatting artifacts&lt;/li&gt;
&lt;li&gt;Confirm all sections, videos, quotes, and images are preserved&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Quality Checks&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ No &lt;code&gt;&amp;lt;callout&amp;gt;&lt;/code&gt; tags&lt;/li&gt;
&lt;li&gt;✅ No &lt;code&gt;&amp;lt;highlight&amp;gt;&lt;/code&gt; tags&lt;/li&gt;
&lt;li&gt;✅ No &lt;code&gt;##&lt;/code&gt; symbols in headers&lt;/li&gt;
&lt;li&gt;✅ All YouTube videos embedded correctly&lt;/li&gt;
&lt;li&gt;✅ Blockquotes formatted properly&lt;/li&gt;
&lt;li&gt;✅ Images included&lt;/li&gt;
&lt;li&gt;✅ 9-minute reading time (17,000+ characters)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-final-workflow&#34;&gt;The Final Workflow&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Input&lt;/strong&gt;: &lt;code&gt;{&amp;quot;query&amp;quot;: &amp;quot;The Ephemeral Scrapbook — Edition 2025-52&amp;quot;}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;: Draft post in Ghost with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complete HTML content&lt;/li&gt;
&lt;li&gt;All formatting preserved&lt;/li&gt;
&lt;li&gt;Clean structure&lt;/li&gt;
&lt;li&gt;Ready for manual review (add images, tags, excerpt)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Execution time&lt;/strong&gt;: ~3-4 seconds total&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Search: 1-2 seconds&lt;/li&gt;
&lt;li&gt;Fetch: 1-2 seconds&lt;/li&gt;
&lt;li&gt;Transform: 36-84ms&lt;/li&gt;
&lt;li&gt;Publish: 600-900ms&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-tools&#34;&gt;The Tools&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Craft&lt;/strong&gt;: My writing environment with a powerful API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ghost&lt;/strong&gt;: My publishing platform with a robust Admin API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;n8n&lt;/strong&gt;: Workflow automation platform (self-hosted on DigitalOcean)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claude AI&lt;/strong&gt;: My pair-programming partner via MCP (Model Context Protocol)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-result&#34;&gt;The Result&lt;/h2&gt;
&lt;p&gt;The workflow is production-ready. My publishing workflow went from 20+ minutes of manual work through Craft, Ulysses, and Ghost to a single command:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Claude, publish Edition 2026-01 to Ghost&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And it just works. 🎉&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why I Built a Micro.blog Front End?</title>
      <link>https://meta.numericcitizen.me/2025/12/28/why-i-built-a-microblog.html</link>
      <pubDate>Sun, 28 Dec 2025 22:36:28 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2025/12/28/why-i-built-a-microblog.html</guid>
      <description>&lt;p&gt;As &lt;a href=&#34;https://blog.numericcitizen.me/2025/12/28/and-now-microblog-poster-web.html&#34;&gt;recently shared on my blog&lt;/a&gt;, I have finished (or mostly finished&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;) building a simple front end for Micro.blog. This front end, as depicted in the following screenshot, presents the user with a straightforward UI: a title field, a body field, blog post categories, and a Publish button—very focused, with no distractions. It works on desktops and mobile devices. I even added PWA support. But why did I build this?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.numericcitizen.me/uploads/2025/cleanshot-microblog-poster2025-12-2820.08.362x.png&#34;
  alt=&#34;&#34;
  loading=&#34;lazy&#34;
  decoding=&#34;async&#34;&gt;
&lt;/p&gt;
&lt;p&gt;First, I wanted to dip my toes into &lt;a href=&#34;https://vercel.com&#34;&gt;Vercel&lt;/a&gt;. I’ve recently stumbled upon many posts about web apps built and deployed on Vercel by people claiming no programming experience. Most people were using Claude AI or Claude Code to describe their app and deploy it to Vercel. Some apps were impressively designed and functional. Yet, I thought it wasn’t that easy and required a lot of technical knowledge. I was intrigued. I was “mostly” wrong.&lt;/p&gt;
&lt;p&gt;I’ve been using Claude AI since mid-December, in conversational mode, for different tasks, including getting explanations on building apps on Vercel and other platforms. I’ve been looking for small project ideas since then. Building a simple front-end to Micro.blog quickly became the perfect test. Micro.blog offers a simple API for many things. Using Claude and the API documentation, I asked Claude AI whether it was possible to build a simple UI for posting on Micro.blog. Sure enough, it was. My initial prompt describing the envisioned app follows:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Let’s build a web app hosted on Vercel that lets me to write blog posts for Micro.blog. The form will include only two text fields: a blog post title and the blog post text itself. Include a character count that will update as I type. Maximum of 5000 characters. The web page should include a title “Microblog Poster&amp;quot;, centered.&lt;/p&gt;
&lt;p&gt;Micro.blog supports Markdown, so the blog post text field should support it too.&lt;/p&gt;
&lt;p&gt;The authorization token should be stored in an environment variable named “microblog_token” which I will provide once the project is created on Vercel.&lt;/p&gt;
&lt;p&gt;I will use a GitHub repo, which should be named after the application name: “(redacted)” where the app will use the full URL: https://(redacted)&lt;/p&gt;
&lt;p&gt;Provided that Micro.blog supports draft posts as exposed in the Micro.blog APIs, a toggle named “Draft” should be on the web form and be off by default. When enabled, this means I can send the blog post to Micro.blog but with a draft status. Otherwise, the blog post is published.&lt;/p&gt;
&lt;p&gt;The initial state of the web app is to list all available blog post categories as a series of checkboxes, all off by default. You will need to retrieve possible blog post categories during the initialization phase. A blog post can have more than one category selected or none. This list of checkboxes should be left-aligned. The category list should be saved in the browser’s local storage and initialized on the first invocation of the web app.&lt;/p&gt;
&lt;p&gt;The form will contain a button “Publish” centered horizontally (like all the other UI elements, except the toggle underneath the Publish button which should be left aligned. Once clicked, if the post operation is successful, add a small banner (centered) telling me the operation was successful with an appropriate message.&lt;/p&gt;
&lt;p&gt;For a non-draft post, after hitting Publish, the form should display a clickable link to the blog post’s final URL. For the draft post, you should display the clickable link to the draft post instead.&lt;/p&gt;
&lt;p&gt;Images or any other attachments are not needed.&lt;/p&gt;
&lt;p&gt;You can look at micro.blog API documentation in the following URLs:&lt;/p&gt;
&lt;p&gt;For reading data from Micro.blog service: &lt;a href=&#34;https://help.micro.blog/t/json-api/97&#34;&gt;https://help.micro.blog/t/json-api/97&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For posting to Micro.blog service: &lt;a href=&#34;https://help.micro.blog/2017/api-posting/&#34;&gt;https://help.micro.blog/2017/api-posting/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After a few hiccups and errors, it eventually worked. I had to install GitHub Desktop on My Mac as well as Visual Source Code, but I eventually realized Claude AI wasn’t optimal. I ultimately switched to Claude Code to iterate on the initial release. My experience was so much smoother. I do experience so weird issues with GitHub, but it seems without impacts on the deployment.&lt;/p&gt;
&lt;p&gt;So, building the app requires a GitHub repository for holding the source code. Vercel connects to my GitHub repo, and as soon as a new commit is made, a new app deployment happens; It’s all automatic. One important thing to know: a project environment variable&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; to hold the Micro.blog app token is needed before trying the app for the first time.&lt;/p&gt;
&lt;p&gt;My first try mainly worked as expected. I made sure to have a draft mode available in the UI so that I don’t mess up my timeline with test posts. Once the app is deployed and available for use, any modifications are made through prompting Claude Code on my local machine. Code changes are pushed to GitHub on demand. It takes a few minutes for a new iteration to be available for testing.&lt;/p&gt;
&lt;p&gt;If you have any questions or comments, feel free to post them, and I’ll do my best to answer them to the best of my knowledge.&lt;/p&gt;
&lt;p&gt;One more thing: Vercel is free to use in my case because my app is relatively lightweight. Lastly, one benefit of building my app is that it will circumvent a design issue with Micro.blog’s post editor on the web: the title field and categories aren’t listed by default. I find this to be annoying. My app shows them. I’m happy with that.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Software is never finished!&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;It’s the most secure way to keep that token away from unauthorized eyes.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://meta.numericcitizen.me/2025/10/16/as-a-craft-power-user.html</link>
      <pubDate>Thu, 16 Oct 2025 19:23:38 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2025/10/16/as-a-craft-power-user.html</guid>
      <description>&lt;p&gt;As a Craft power user, I still need Ulysses to complete my writing and publishing workflow. I made &lt;a href=&#34;https://youtu.be/cKYwzRXfdVU&#34;&gt;a video&lt;/a&gt; about this.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/cKYwzRXfdVU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Screenflow &#43; Screen Studio</title>
      <link>https://meta.numericcitizen.me/2025/09/28/screenflow-screen-studio.html</link>
      <pubDate>Sun, 28 Sep 2025 21:27:14 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2025/09/28/screenflow-screen-studio.html</guid>
      <description>&lt;p&gt;This week, I decided to add &lt;strong&gt;Screen Studio&lt;/strong&gt; to my YouTube recording workflow. Screen Studio brings simplicity for recording more dynamic screen sequences. Everything Screen Studio does can be done in &lt;strong&gt;ScreenFlow&lt;/strong&gt;, but it requires significantly more manual work. But Screen Studio has a severe limitation: we cannot merge recorded sequences. That’s why I’m keeping ScreenFlow.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/143495/2025/cleanshot-project-02.-tags-and-the-need-for-rules2025-09-2820.54.382x.png&#34;
  alt=&#34;&#34;
  loading=&#34;lazy&#34;
  decoding=&#34;async&#34;&gt;
&lt;/p&gt;
&lt;p&gt;In summary, my workflow proceeds as follows: individual sequences are recorded in Screen Studio, exported as .mp4 files, and then imported into ScreenFlow to be assembled into a complete video sequence, which includes the intro and outro sequences with background music. Chapter markers are also added in ScreenFlow before final export. Finally, video subtitles are created using Whisper Transcription and exported as an .srt file, which is compatible with YouTube Studio.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/143495/2025/cleanshot-91.-using-tags-effectively-in-craft2025-09-2820.48.512x.png&#34;
  alt=&#34;&#34;
  loading=&#34;lazy&#34;
  decoding=&#34;async&#34;&gt;
&lt;/p&gt;
&lt;p&gt;Overall, I do spend more time on video rendering, but I think it’s worth it. Lastly, disk space consumption is way higher than before, with 2x-3x more space consumed than with ScreenFlow alone. Ouch.&lt;/p&gt;
&lt;p&gt;One more thing: Screen Studio is the only app that makes the M4 Mac mini fan run at full speed. I wonder if Screen Studio uses Apple Metal technology?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Behind the Scenes of the “On Apple Failures&#34; Writing Project</title>
      <link>https://meta.numericcitizen.me/2025/09/21/behind-the-scenes-of-the.html</link>
      <pubDate>Sun, 21 Sep 2025 20:22:50 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2025/09/21/behind-the-scenes-of-the.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve long wanted to write an article like &lt;a href=&#34;https://numericcitizen.me/on-apple-failures/&#34;&gt;this one&lt;/a&gt;. However, as Apple continued to add to its list of failures, poor Apple, I kept pushing back the deadline. This summer, however, the timing was right. Here’s what I did differently this time.&lt;/p&gt;
&lt;p&gt;A few months ago, I started gathering a list of Apple’s failures in a Craft document. I wanted to cover the period from when Tim Cook took over as Apple’s leader, following Steve Jobs’ passing, up until now. For each failure, I wrote a summary that included a description, some context, and a list of potential collateral damage to Apple’s reputation and brand. Then, I turned to ChatGPT for help.&lt;/p&gt;
&lt;p&gt;I set up a space to upload files, one for each failure, and began a separate &amp;ldquo;conversation&amp;rdquo; to explore areas I hadn&amp;rsquo;t already covered. This process took a few weeks. I&amp;rsquo;d revisit one of the failures every other day and continue the conversation until I was satisfied.&lt;/p&gt;
&lt;p&gt;Next, I started creating a first draft based on all the conversations in this ChatGPT writing project. It took many prompts to refine the base content before exporting it as a Markdown file. Then, I set up a new conversation, uploaded the file, and asked ChatGPT to continue working on the article, this time in canvas mode. It took many more iterations and manual edits to finish around 85% of the writing process.&lt;/p&gt;
&lt;p&gt;After that, I imported the text back into Craft and kept adding relevant facts and comments. As I went along, I started searching for photos that could illustrate each section. I used Kagi Search for all my image searches. For each photo, I wrote a brief caption that gave a unique perspective on the failure it was highlighting.&lt;/p&gt;
&lt;p&gt;It’s also worth noting the role of Grammarly. As I finished writing in Craft, I used Grammarly to rephrase parts I didn’t quite like. I ended up keeping around half of Grammarly&amp;rsquo;s suggested rephrases.&lt;/p&gt;
&lt;p&gt;In summary, generative AI was a significant contributor to my writing, either through the use of ChatGPT or with Grammarly’s constant supervision. I’m not sure how I should feel about this, nor how you should think about it, now that you know. Make no mistake, the original writing project idea is mine. The selection of Apple’s failures is mine. The starting point of research is mine. The selection of images is mine. Supervision of ChatGPT’s contribution is mine. But is the final product mine? Anyway, complete transparency, now you know.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Future of Writing? Testing ChatGPT Canvas for a Specific Use Case</title>
      <link>https://meta.numericcitizen.me/2025/03/28/the-future-of-writing-testing.html</link>
      <pubDate>Fri, 28 Mar 2025 15:45:24 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2025/03/28/the-future-of-writing-testing.html</guid>
      <description>&lt;p&gt;In October 2024, OpenAI launched &lt;strong&gt;ChatGPT Canvas&lt;/strong&gt;, designed to enhance the writing experience. Before ChatGPT Canvas, one writing approach using ChatGPT involved compiling these references into a ChatGPT project, then starting the writing process by using a first prompt, followed by another, and so forth. With ChatGPT Canvas, the approach promised to be more user-friendly, more interactive, more natural.&lt;/p&gt;
&lt;p&gt;I wondered which writing project I could use to test this new conversational experience. For a long time, I’ve wanted to write about the data protection and privacy features offered by Apple’s ecosystem for iPhone and Mac users. I had already started gathering references from Apple’s support website and elsewhere on the internet. It was the perfect use case for this experiment.&lt;/p&gt;
&lt;p&gt;ChatGPT Canvas starts off with a prompt, as usual, but now you include the term “canvas” in the request. The rest of the experience unfolds in an interface split into two sections: on the left side is the writing conversation, and on the right is the evolving draft. ChatGPT Canvas lets you interactively edit sections of text by selecting them first before requesting modifications. It’s highly interactive; somewhat like working with an editor in real-time. It’s very stimulating.&lt;/p&gt;
&lt;p&gt;With &amp;ldquo;&lt;a href=&#34;https://numericcitizen.me/protecting-your-digital-life-privacy-and-security-measures-for-apple-users/&#34;&gt;Protecting Your Digital Life: Privacy and Security Measures for Apple Users&lt;/a&gt;&amp;rdquo;, I had the opportunity to fully test this experience with my previously mentioned article project. ChatGPT was central to this writing project, but I also revised certain parts by removing or adding some content and by adding details that ChatGPT didn’t consider important enough to include. The result isn’t perfect, but it’s definitely better than what I would have written from scratch. I hope you enjoy reading it, and that you find the article informative. PS, the diagram is mine, not ChatGPT’s.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Combining Craft And Things 3 For My Writing Projects</title>
      <link>https://meta.numericcitizen.me/2024/05/07/combining-craft-and-things-for.html</link>
      <pubDate>Tue, 07 May 2024 20:00:00 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2024/05/07/combining-craft-and-things-for.html</guid>
      <description>&lt;p&gt;This article is about how I’m using Craft and Things 3, which is behind any short or long article I share online. Here is what happens when I get a new post idea.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In Things 3, Create an entry and set priority and desired or expected date of publication if known.&lt;/li&gt;
&lt;li&gt;In Craft, I create a new document, set the title and then copy the document’s deeplink to the clipboard.&lt;/li&gt;
&lt;li&gt;Still within Craft, I move the newly created document in the appropriate folder.&lt;/li&gt;
&lt;li&gt;Still within Craft, I optionally update my private creator dashboard document.&lt;/li&gt;
&lt;li&gt;Back to Things 3 and I paste the deeplink in the note field. It&amp;rsquo;s handy to jump from Things 3 to Craft with a single tap.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At this point, I can start my research, writing and editing of my article or blog post in Craft. Now, here is what happens after publishing my article:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Mark the to-do item as done in Things 3.&lt;/li&gt;
&lt;li&gt;I update my private creator dashboard document by converting my deeplink to a new a permalink that I put in the Recently Published section.&lt;/li&gt;
&lt;li&gt;I monitor the appropriate RSS feed for quality control. See &lt;a href=&#34;https://numericcitizen.me/three-reasons-why-i-subscribe-to-my-own-rss-feeds/&#34;&gt;this article&lt;/a&gt; about subscribing to my own RSS feeds.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There you have it. Craft plays a central role in My Blogger Workflow. This blog post exposes what happens at the beginning and at the end of a new post idea. I hope you enjoyed it and maybe learned something.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Browsing Past Published Articles on Ghost</title>
      <link>https://meta.numericcitizen.me/2024/02/26/browsing-past-published.html</link>
      <pubDate>Mon, 26 Feb 2024 18:30:30 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2024/02/26/browsing-past-published.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;Circumventing Ghost&amp;rsquo;s limited posts management capabilities.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://cdn.uploads.micro.blog/143495/2024/ghost-published-content.png&#34;
    alt=&#34;List of publications in Ghost admin panel.&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;List of publications in Ghost admin panel.&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;I recently decided to spend some time editing past articles published on my Numeric Citizen Space &lt;a href=&#34;https://numericcitizen.me&#34;&gt;website&lt;/a&gt;. I first thought that by going to my Ghost admin page, I could quickly browse past published articles by month. I couldn&amp;rsquo;t be more wrong. In fact, Ghost offers limited post management capabilities, thanks to its limited content browsing capabilities. I cannot go back, say, list articles published early in 2023. I can sort by ascending or descending order, but from there, I have to scroll through a long, dynamically created list of posts. It’s not very effective for a website with 600-plus posts. I had to find a different option to locate a post for an update. This is where Ghost&amp;rsquo;s content APIs come into play.&lt;/p&gt;
&lt;p&gt;The following API request doesn’t do the job (API key voluntarily removed!):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;curl&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;-H&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Accept-Version: v5.0&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://numeric-citizen-introspection.ghost.io/ghost/api/content/posts/?key={APIkeygoeshere}&amp;amp;fields=title,url,published_at,updated_at&amp;amp;filter=published_at:&amp;gt;2024-01-01%2Bpublished_at:&amp;lt;2024-02-01&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;json_pp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let me explain what is this API request.&lt;/p&gt;
&lt;p&gt;First, I’m going to the request using the macOS command line, hence the &lt;code&gt;curl&lt;/code&gt; command. Next, the whole query follows in quotes. I query the content/posts API endpoint. Next, I pass my API key, followed by a field selection (&lt;code&gt;&amp;amp;fields&lt;/code&gt;), and next with the filter using the published date between two dates. Finally, I pipe the results in the pretty JSON print macro (is this a macro?) so the output looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;jfm@CraftingMAChine&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;~&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;curl&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;-H&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Accept-Version: v5.0&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://numeric-citizen-introspection.ghost.io/ghost/api/content/posts/?key={API-key-goes-here}&amp;amp;fields=title,id,url,published_at,updated_at&amp;amp;filter=published_at:&amp;gt;2024-01-01%2Bpublished_at:&amp;lt;2024-02-01&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;json_pp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	   &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;meta&amp;#34;&lt;/span&gt; : {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;pagination&amp;#34;&lt;/span&gt; : {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;limit&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;15&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;next&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;page&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;pages&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;prev&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;total&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	   },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	   &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;posts&amp;#34;&lt;/span&gt; : [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	      {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;65b6a09840566000015b0d37&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;published_at&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2024-01-28T13:50:19.000-05:00&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;My Weekly Creative Summary for the Week of 2024/03&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;updated_at&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2024-01-28T13:50:19.000-05:00&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://numericcitizen.me/my-weekly-creative-summary-for-the-week-of-2024-03/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	      },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	      {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;65b6540640566000015b0cf7&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;published_at&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2024-01-28T08:23:26.000-05:00&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Special Message to Paying Subscribers&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;updated_at&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2024-01-28T08:23:26.000-05:00&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://numericcitizen.me/special-message-to-paying-subscribers/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	      },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	      {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;65b16e25bc7fde0001314ccb&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;published_at&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2024-01-24T15:09:24.000-05:00&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;The Mac Turns 40&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;updated_at&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2024-01-24T15:09:24.000-05:00&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://numericcitizen.me/the-mac-turns-40/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	      },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	      {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;65ad35418532ae000169ddd2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;published_at&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2024-01-21T10:22:33.000-05:00&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;My Weekly Creative Summary for the Week 2024/02&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;updated_at&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2024-01-21T10:22:33.000-05:00&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	         &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://numericcitizen.me/my-weekly-creative-summary-for-the-week-2024-02/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	      },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	   ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, I copy the post ID of one article and paste it my browser for edition using this special URL:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://numeric-citizen-introspection.ghost.io/ghost/#/editor/post/652e6eedb8a2650001ad9c5b&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This URL brings me directly into the Ghost editor, provided that i was already authenticated with my account. That’s pretty much it. It could be much simpler. For this, I miss WordPress.&lt;/p&gt;
&lt;p&gt;You can find the Ghost API document right &lt;a href=&#34;https://ghost.org/docs/content-api/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Browsing Past Published Articles on Ghost</title>
      <link>https://meta.numericcitizen.me/2024/02/17/browsing-past-published-articles-on.html</link>
      <pubDate>Sat, 17 Feb 2024 15:00:00 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2024/02/17/browsing-past-published-articles-on.html</guid>
      <description>&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/4B0A4B79-C27F-40AF-B4EF-9E12289BEED7/E0AA0901-400E-4EDC-8601-165929D9C16F_2/gUfqDUYleZSiiYqSWiru22yMmxyyrYHhJHYZy2vDvekz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;I recently decided to spend some time editing past articles published on my Numeric Citizen Space &lt;a href=&#34;https://numericcitizen.me&#34;&gt;website&lt;/a&gt;. I first thought that by going to my Ghost admin page, I could quickly browse past published articles by month. I couldn&amp;rsquo;t be more wrong. In fact, Ghost offers limited post management capabilities, thanks to its limited content browsing capabilities. I cannot go back, say, list articles published early in 2023. I can sort by ascending or descending order, but from there, I have to scroll through a long, dynamically created list of posts. Not very effective for a 600-plus posts website. I had to find a different option to locate a post up for an update. This is where Ghost&amp;rsquo;s content APIs come into play.&lt;/p&gt;
&lt;p&gt;The following API request doesn’t the job (API key voluntarly removed!):&lt;/p&gt;
&lt;p&gt;&lt;code&gt;curl -H &amp;quot;Accept-Version: v5.0&amp;quot; &amp;quot;https://numeric-citizen-introspection.ghost.io/ghost/api/content/posts/?key={APIkeygoeshere}&amp;amp;fields=title,url,published_at,updated_at&amp;amp;filter=published_at:&amp;gt;2024-01-01%2Bpublished_at:&amp;lt;2024-02-01&amp;quot; | json_pp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Let me explain what is this API request.&lt;/p&gt;
&lt;p&gt;First, I’m going the request using macOS command line, hence the &lt;code&gt;curl&lt;/code&gt; command. Next, the whole query follows in quotes. I query the content / posts API endpoint. Next, I pass my API key, followed by a fields selection (&lt;code&gt;&amp;amp;fields&lt;/code&gt;), next with the filter using the published date between two dates. Finally, I pipe the results in the pretty JSON print macro (is this a macro?) so the output looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;jfm@CraftingMAChine ~ % curl -H &amp;quot;Accept-Version: v5.0&amp;quot; &amp;quot;https://numeric-citizen-introspection.ghost.io/ghost/api/content/posts/?key={API-key-goes-here}&amp;amp;fields=title,id,url,published_at,updated_at&amp;amp;filter=published_at:&amp;gt;2024-01-01%2Bpublished_at:&amp;lt;2024-02-01&amp;quot; | json_pp
{
   &amp;quot;meta&amp;quot; : {
      &amp;quot;pagination&amp;quot; : {
         &amp;quot;limit&amp;quot; : 15,
         &amp;quot;next&amp;quot; : null,
         &amp;quot;page&amp;quot; : 1,
         &amp;quot;pages&amp;quot; : 1,
         &amp;quot;prev&amp;quot; : null,
         &amp;quot;total&amp;quot; : 9
      }
   },
   &amp;quot;posts&amp;quot; : [
      {
         &amp;quot;id&amp;quot; : &amp;quot;65b6a09840566000015b0d37&amp;quot;,
         &amp;quot;published_at&amp;quot; : &amp;quot;2024-01-28T13:50:19.000-05:00&amp;quot;,
         &amp;quot;title&amp;quot; : &amp;quot;My Weekly Creative Summary for the Week of 2024/03&amp;quot;,
         &amp;quot;updated_at&amp;quot; : &amp;quot;2024-01-28T13:50:19.000-05:00&amp;quot;,
         &amp;quot;url&amp;quot; : &amp;quot;https://numericcitizen.me/my-weekly-creative-summary-for-the-week-of-2024-03/&amp;quot;
      },
      {
         &amp;quot;id&amp;quot; : &amp;quot;65b6540640566000015b0cf7&amp;quot;,
         &amp;quot;published_at&amp;quot; : &amp;quot;2024-01-28T08:23:26.000-05:00&amp;quot;,
         &amp;quot;title&amp;quot; : &amp;quot;Special Message to Paying Subscribers&amp;quot;,
         &amp;quot;updated_at&amp;quot; : &amp;quot;2024-01-28T08:23:26.000-05:00&amp;quot;,
         &amp;quot;url&amp;quot; : &amp;quot;https://numericcitizen.me/special-message-to-paying-subscribers/&amp;quot;
      },
      {
         &amp;quot;id&amp;quot; : &amp;quot;65b16e25bc7fde0001314ccb&amp;quot;,
         &amp;quot;published_at&amp;quot; : &amp;quot;2024-01-24T15:09:24.000-05:00&amp;quot;,
         &amp;quot;title&amp;quot; : &amp;quot;The Mac Turns 40&amp;quot;,
         &amp;quot;updated_at&amp;quot; : &amp;quot;2024-01-24T15:09:24.000-05:00&amp;quot;,
         &amp;quot;url&amp;quot; : &amp;quot;https://numericcitizen.me/the-mac-turns-40/&amp;quot;
      },
      {
         &amp;quot;id&amp;quot; : &amp;quot;65ad35418532ae000169ddd2&amp;quot;,
         &amp;quot;published_at&amp;quot; : &amp;quot;2024-01-21T10:22:33.000-05:00&amp;quot;,
         &amp;quot;title&amp;quot; : &amp;quot;My Weekly Creative Summary for the Week 2024/02&amp;quot;,
         &amp;quot;updated_at&amp;quot; : &amp;quot;2024-01-21T10:22:33.000-05:00&amp;quot;,
         &amp;quot;url&amp;quot; : &amp;quot;https://numericcitizen.me/my-weekly-creative-summary-for-the-week-2024-02/&amp;quot;
      },
      {
         &amp;quot;id&amp;quot; : &amp;quot;65ac3aa68532ae000169ddb6&amp;quot;,
         &amp;quot;published_at&amp;quot; : &amp;quot;2024-01-20T16:28:20.000-05:00&amp;quot;,
         &amp;quot;title&amp;quot; : &amp;quot;New IT Rules at the Office Prompts Me to Revisit My Mac Usage at Home&amp;quot;,
         &amp;quot;updated_at&amp;quot; : &amp;quot;2024-01-20T16:28:20.000-05:00&amp;quot;,
         &amp;quot;url&amp;quot; : &amp;quot;https://numericcitizen.me/new-it-rules-at-the-office-prompts-me-to-revisit-my-mac-usage-at-home/&amp;quot;
      },
      {
         &amp;quot;id&amp;quot; : &amp;quot;65a3ed6e8532ae000169dbe0&amp;quot;,
         &amp;quot;published_at&amp;quot; : &amp;quot;2024-01-14T09:24:25.000-05:00&amp;quot;,
         &amp;quot;title&amp;quot; : &amp;quot;My Weekly Creative Summary for the Week of 2024/01&amp;quot;,
         &amp;quot;updated_at&amp;quot; : &amp;quot;2024-01-14T09:24:25.000-05:00&amp;quot;,
         &amp;quot;url&amp;quot; : &amp;quot;https://numericcitizen.me/my-weekly-creative-summary-for-the-week-of-2024-01/&amp;quot;
      },
      {
         &amp;quot;id&amp;quot; : &amp;quot;659e86018532ae000169dbbf&amp;quot;,
         &amp;quot;published_at&amp;quot; : &amp;quot;2024-01-10T06:58:44.000-05:00&amp;quot;,
         &amp;quot;title&amp;quot; : &amp;quot;Adobe Lightroom 2016-2024 RIP â How To Migrate From Adobe Lightroom to Photomator&amp;quot;,
         &amp;quot;updated_at&amp;quot; : &amp;quot;2024-01-10T06:58:44.000-05:00&amp;quot;,
         &amp;quot;url&amp;quot; : &amp;quot;https://numericcitizen.me/adobe-lightroom-2016-2024-rip-how-to-migrate-from-adobe-lightroom-to-photomator/&amp;quot;
      },
      {
         &amp;quot;id&amp;quot; : &amp;quot;659d32eb8532ae000169dba7&amp;quot;,
         &amp;quot;published_at&amp;quot; : &amp;quot;2024-01-09T06:53:21.000-05:00&amp;quot;,
         &amp;quot;title&amp;quot; : &amp;quot;Apple Vision Pro â The Missing Apple Keynote Case&amp;quot;,
         &amp;quot;updated_at&amp;quot; : &amp;quot;2024-01-09T06:53:21.000-05:00&amp;quot;,
         &amp;quot;url&amp;quot; : &amp;quot;https://numericcitizen.me/apple-vision-pro-the-missing-apple-keynote-case/&amp;quot;
      },
      {
         &amp;quot;id&amp;quot; : &amp;quot;659953468532ae000169db6d&amp;quot;,
         &amp;quot;published_at&amp;quot; : &amp;quot;2024-01-06T08:27:04.000-05:00&amp;quot;,
         &amp;quot;title&amp;quot; : &amp;quot;A Tough Year Ahead for Apple&amp;quot;,
         &amp;quot;updated_at&amp;quot; : &amp;quot;2024-01-06T16:52:59.000-05:00&amp;quot;,
         &amp;quot;url&amp;quot; : &amp;quot;https://numericcitizen.me/a-though-year-for-apple/&amp;quot;
      }
   ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, I copy the post ID of one article and paste it my browser for edition using this special URL:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://numeric-citizen-introspection.ghost.io/ghost/#/editor/post/652e6eedb8a2650001ad9c5b&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This URL brings me directly into the Ghost editor, provided that i was already authenticated with my account. That’s pretty much it. It could be much simpler. For this, I miss WordPress.&lt;/p&gt;
&lt;p&gt;You can find the Ghost API document right here.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ghost.org/docs/content-api/&#34;&gt;https://ghost.org/docs/content-api/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This article is also available &lt;a href=&#34;https://meta.numericcitizen.me/2024/02/26/browsing-past-published.html&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Moving Out of WordPress — The DNS Side of the Story</title>
      <link>https://meta.numericcitizen.me/2023/05/16/moving-out-of-wordpress-the.html</link>
      <pubDate>Tue, 16 May 2023 07:00:00 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2023/05/16/moving-out-of-wordpress-the.html</guid>
      <description>&lt;p&gt;The migration from GoDaddy to CloudFlare was mandatory to support the ability to use a custom domain with Ghost at the root level (numericcitizen.me), using CNAME. This is something that is not possible using GoDaddy. The process is relatively simple once you’ve done your homework of reading ALL the documentation from both GoDaddy and CloudFlare.&lt;/p&gt;
&lt;h2 id=&#34;wordpress-numericcitizenme-current-config&#34;&gt;WordPress: numericcitizen.me current config&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Hosted on GoDaddy, the host file:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/34364799-0c1b-6d62-97ea-207f079b3af3/aL8eCDxyNZktyiN69z1wlx2vqm6GR15LLlJOf4uyPMYz/numericcitizen.me.txt&#34;&gt;numericcitizen.me.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/48f1399c-ffe3-f507-c01f-ccc8a392a3f8/fxH8SZVbRczpby539ovuaCGlRLQZCyrrQjkm8t1UKqYz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;WordPress configuration to use numericcitizen.me&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/ab17c2df-4037-fbee-938b-175c9c0467dc/Y31S364ChyxvyibKVKrWQBJ7ODe6gUIf9WjXkoOm3kQz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/3c0bd41e-d5f8-f6c7-b307-f810604ebb23/NQCGqRylNgo4EWh8mR5Wsm3U4uyuYtygyfrJF7mA0mAz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;website will only be available through: &lt;a href=&#34;https://numericcitizen.wordpress.com&#34;&gt;https://numericcitizen.wordpress.com&lt;/a&gt; once domain disconnected&lt;/p&gt;
&lt;h2 id=&#34;ghost-numericcitizen-introspectionblog-current-configuration&#34;&gt;Ghost: numericcitizen-introspection.blog current configuration&lt;/h2&gt;
&lt;p&gt;Hosted on CloudFlare&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/2e804126-5719-879d-a4cc-f78b03da046f/7J2URcTCJ5tK1VyTzgV9Ey9x3bNDvbhbZHOXTxCNIToz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;CloudFlare host file:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/8ce63acf-675d-b968-a7a9-08162d050af3/aox9FQvsfdoB1KoFDzvbD7w5yoUfxOHExP9MqYZfrhQz/numericcitizen-introspection.blog.txt&#34;&gt;numericcitizen-introspection.blog.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/347947e9-50dc-e081-4f64-eaa8cf5b32f9/R6nVFr1kfIMOuzuePytxbkYzSTfr0YyqicUZ2tdR7aIz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id=&#34;start-of-dns-changes&#34;&gt;Start of DNS changes&lt;/h2&gt;
&lt;p&gt;Because I’m planning to use a root domain for Ghost, as per &lt;a href=&#34;https://ghost.org/help/godaddy-domain-setup-guide/&#34;&gt;this Ghost article&lt;/a&gt;, GoDaddy doesn’t support root domain:&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/be783fc4-bb45-c1b6-2a62-b37070832049/VyBs19ZR3xhN7Mrqc3ItI89N5hOW9KYhHHsppgteyIwz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;numericcitizen.me&lt;/strong&gt; domain will need to be transferred from GoDaddy to CloudFlare first.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On GoDaddy: Update contact information on the source domain on GoDaddy to be exactly the same for both domains.&lt;/li&gt;
&lt;li&gt;On GoDaddy: Unlock the domain to allow for registrar change.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/af65a3b4-f9a1-2bcd-922b-84d0d70bf0dd/5kxCDO1ycczflM4atDwOphZYfgymVkxrBn9FpFyQuT0z/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On CloudFlare: Add the domain name to my CloudFlare account.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/2763d5d9-7875-8275-1c52-83dc3f0f4084/iNpoa3qB1l08nItG7x5Fi5HImk8T7xFSABkeRvvSW1Yz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/7c1ecc73-6772-385f-eab1-f82e2ac7e90e/FPR1XwRpW0LHiRAfyzd3AtpGmJTK0mXkSjx4LtNvRPkz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;CloudFlare name servers:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://hans.ns.cloudflare.com&#34;&gt;hans.ns.cloudflare.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;noor.ns.cloudflare.com&#34;&gt;noor.ns.cloudflare.com&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On GoDaddy, edit nameservers on the domain:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/7328aad6-c1b8-2c0c-4b23-bbed5da6d05b/LRS9q9okofOSIMyNKRBlN72HhL9FOYLTEpxcgLCa09Qz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Proceed to the CloudFlare &lt;a href=&#34;https://developers.cloudflare.com/registrar/get-started/transfer-domain-to-cloudflare/&#34;&gt;procedure&lt;/a&gt;, but first, add the &lt;strong&gt;numericcitizen.me&lt;/strong&gt; domain to the CloudFlare account using &lt;a href=&#34;https://ghost.org/help/cloudflare-domain-setup/&#34;&gt;this article&lt;/a&gt;. Then, continue using GoDaddy&amp;rsquo;s &lt;a href=&#34;https://ca.godaddy.com/help/transfer-my-domain-away-from-godaddy-3560&#34;&gt;procedure&lt;/a&gt;. Once done, proceed with the following steps.&lt;/p&gt;
&lt;p&gt;Steps to follow once the domain has been successfully transferred to CloudFlare.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Disconnect &lt;strong&gt;numericcitizen.me&lt;/strong&gt; from WordPress (website should stop resolving under &lt;strong&gt;numericcitizen.me&lt;/strong&gt; except &lt;a href=&#34;https://numericcitizen.wordpress.com&#34;&gt;https://numericcitizen.wordpress.com&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;In the GoDaddy domain manager, remove two &lt;code&gt;A records&lt;/code&gt; pointing to WordPress servers (&lt;code&gt;192.0.78.*&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;CNAME @ numeric-citizen-introspection.ghost.io&lt;/code&gt; so that &lt;a href=&#34;https://numericcitizen.me&#34;&gt;https://numericcitizen.me&lt;/a&gt; (root domain) resolves to &lt;strong&gt;numeric-citizen-introspection.ghost.io&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The use of a CNAME for a root domain is explained in super and great details &lt;a href=&#34;https://developers.cloudflare.com/dns/cname-flattening/cname-flattening-diagram/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Wait for propagation using &lt;a href=&#34;https://www.whatsmydns.net&#34;&gt;https://www.whatsmydns.net&lt;/a&gt; (like a few hours).&lt;/li&gt;
&lt;li&gt;In Ghost(Pro) &amp;gt; Domain, &lt;strong&gt;Update&lt;/strong&gt; current domain:
&lt;ol&gt;
&lt;li&gt;change the following according to the actual process.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/0941b797-f1a1-3e80-816b-9202756d8f6d/vDwpyb8NTgJW3AXFjIFwwHHDyJckxGAGdoOyu1Un7tEz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/5399d392-e6af-f6d3-3328-e68aeaa83c22/N4xzvQRi0xA8TTK8ky0Xa0l3vB0qJZz3g24TjSAv7ioz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/d39ae0f0-d484-6f9d-e418-22ecf2975159/g6nhxe8lXfVlylkpnjDta56gt3WdwhrZg9Hy77qyJ2wz/Safari-GhostPro%20-%20Numeric%20Citizen%20Blog2023-03-2415.55.402x.png&#34;
    alt=&#34;Safari-Ghost(Pro) - Numeric Citizen Blog@2023-03-24@15.55.40@2x.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Safari-Ghost(Pro) - Numeric Citizen Blog@2023-03-24@15.55.40@2x.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/9B98963F-0D1A-4BDB-966A-908B5760967D/02d3fb72-757b-2612-e20e-690fe21f049e/ImSlQZuLWRr2jkOeB7hA7TeFUE5L6VO1OVNhoiKQ6M8z/Safari-GhostPro%20-%20Numeric%20Citizen%20Blog2023-03-2415.55.482x.png&#34;
    alt=&#34;Safari-Ghost(Pro) - Numeric Citizen Blog@2023-03-24@15.55.48@2x.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Safari-Ghost(Pro) - Numeric Citizen Blog@2023-03-24@15.55.48@2x.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Still using Ghost(Pro) &amp;gt; Domain, set new ghost subdomain to &lt;strong&gt;numericitizen-me.ghost.io&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Wait for the process to complete&lt;/li&gt;
&lt;li&gt;Test &lt;a href=&#34;https://numericcitizen.me&#34;&gt;https://numericcitizen.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Test intra-links.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Done.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Moving Out of WordPress — My Detailed Experience</title>
      <link>https://meta.numericcitizen.me/2023/03/25/moving-out-of-wordpress-my.html</link>
      <pubDate>Sat, 25 Mar 2023 11:00:00 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2023/03/25/moving-out-of-wordpress-my.html</guid>
      <description>&lt;p&gt;So it began. Then it concluded. After thinking about it for a while doing some detailed planning, I’m officially done with moving out of WordPress.com for my blog hosting service. I’m leaving after so many years of joy and pain (I’ve been on WordPress since 2015).&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://numericcitizen.me/bye-bye-wordpress-hello-again-ghost/&#34;&gt;https://numericcitizen.me/bye-bye-wordpress-hello-again-ghost/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://numericcitizen.me/special-announcement-some-important-changes-coming-soon/&#34;&gt;https://numericcitizen.me/special-announcement-some-important-changes-coming-soon/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://numericcitizen.me/2023/01/20/a-message-to-my-readers-followers-on-wordpress-com/&#34;&gt;https://numericcitizen.me/2023/01/20/a-message-to-my-readers-followers-on-wordpress-com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://numericcitizen.me/important-change-coming-to-this-website/&#34;&gt;https://numericcitizen.me/important-change-coming-to-this-website/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://numericcitizen.me/a-message-to-my-readers-followers-on-wordpress-com/&#34;&gt;https://numericcitizen.me/a-message-to-my-readers-followers-on-wordpress-com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I recently spent quite some time working on my WordPress.com exit. First, I prepared a project plan and make it one of my main focuses for the year. Second, I started to clean up my content. I reviewed in more or less detail all of my 766 posts. Many posts were deleted for different reasons: too much time-sensitive, irrelevant content, posts with many embedded tweets, etc.&lt;/p&gt;
&lt;p&gt;All in all, I’m now down to 325 posts. These are the ones that I want to migrate out of WordPress. Here is why.&lt;/p&gt;
&lt;h2 id=&#34;why&#34;&gt;Why&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;WordPress is needy. It requires a configuration to run correctly when using many plugins.&lt;/li&gt;
&lt;li&gt;Posting on WordPress requires too much work before a post becomes online.&lt;/li&gt;
&lt;li&gt;I want to focus more on content less on management. I value frictionless experiences.&lt;/li&gt;
&lt;li&gt;WordPress.com is very expensive. I was subscribing to the business plan because of my plugin usage, and I wanted to suppress ads for my readers.&lt;/li&gt;
&lt;li&gt;By quitting Twitter, there were many plugins that I was longer using.&lt;/li&gt;
&lt;li&gt;Many plugins are not free, and I was tired of paying for something with questionable value.&lt;/li&gt;
&lt;li&gt;Some plugins didn’t have the expected effects on SEO.&lt;/li&gt;
&lt;li&gt;I’m also on Ghost.org, and I feel it was redundant to keep both. Ghost is more polished, lighter to manage, cleaner to experience, and easier to use when posting content.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;expected-gains&#34;&gt;Expected gains&lt;/h2&gt;
&lt;p&gt;By moving out of WordPress, and merging content to Ghost, I’ll be gaining these features.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Newsletter functionality which could allow me to send mail on an as-needed basis.&lt;/li&gt;
&lt;li&gt;A refreshed and more straightforward design is needed for a more responsive website.&lt;/li&gt;
&lt;li&gt;The possibility to post directly from Craft to Ghost. I’m not expecting to use this, but if I want, it’s there.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/2C6DF123-45F7-4673-B328-593ACB15BC37/1c1d5526-fcb9-fe55-dde9-15b34af80500/II4R2m60fQyl7b4yyjx3rLlV8czqOhnryXx5o5YEnXgz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id=&#34;the-process&#34;&gt;The process&lt;/h2&gt;
&lt;p&gt;The next step was to dig a little bit into the migration process itself which is based on the use of a plugin: &lt;a href=&#34;https://wordpress.org/plugins/ghost/&#34;&gt;Export to Ghost&lt;/a&gt;, which is free and is currently at version 1.2.1. The process is well &lt;a href=&#34;https://ghost.org/docs/migration/wordpress/#troubleshooting?utm_source=wp-ghost-plugin&#34;&gt;documented&lt;/a&gt; on Ghost&amp;rsquo;s website and on the web in different articles. Issues arise when you start to look deeper into the process. Upon the first try to export my content, the process timed out and I got a message from WordPress.com&amp;rsquo;s gateway (nginx). Ouch. A second try produced the same results. I couldn&amp;rsquo;t image either losing my content or having to move manually. I thought it was an issue with my WordPress instance so I asked for some help from WordPress.com&amp;rsquo;s support for an investigation. These guys are always willing to help but they couldn&amp;rsquo;t really fix it. After a bit more of reading, I tried connecting to my WordPress website with FTP and saw what was in there. I was surprised to see the following:&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/2C6DF123-45F7-4673-B328-593ACB15BC37/082fc69e-c0dd-b0d6-1278-9f05d8289678/aALkpGdB2HzaIaFgwexoXuw1Or2Yye3rpwqjVoQd8ZEz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;wp-content&lt;/code&gt; folder contained another folder called “&lt;code&gt;uploads&lt;/code&gt;” and another named “&lt;code&gt;ghost-exports&lt;/code&gt;”. The files I was expecting to start downloading to my Mac were sitting right there. The JSON file is the file to import into the Ghost service, while the other zip file was the images referenced by my posts. Exploring the JSON file revealed a typical structure Ghost expects while importing content.&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/2C6DF123-45F7-4673-B328-593ACB15BC37/1470aa2d-9b3b-e5fa-1782-a227e7daaacb/cmcyci4qC9JEs8JwsuWcO7aL7sk4nJJKtWyXTybvtToz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Oh, one thing that I learned: Firefox is a great tool for reading and parsing JSON files. Did you know that?&lt;/p&gt;
&lt;p&gt;The “&lt;code&gt;mobiledoc&lt;/code&gt;” node is where the actual post content is. Digging a bit deeper, I could find &lt;code&gt;HTTPS&lt;/code&gt; requests for each image like the following example:&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/2C6DF123-45F7-4673-B328-593ACB15BC37/ae4e6562-17e0-ffed-3fa4-7aaaf2a72086/elYeAI32GXeIqxBgdl887jAwwMrmJrGtKM04e5sNh9Ez/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;I was curious how this would work at the import stage. The &lt;code&gt;?w=124&amp;amp;&lt;/code&gt;… was added by one of my WordPress plugin for some image optimization purposes. I wasn’t quite sure it would work when trying to import that file into Ghost. I started to search for tool to remove those &lt;code&gt;HTTPS&lt;/code&gt; parameters. Eventually, I gave up this path.&lt;/p&gt;
&lt;p&gt;Then I started questioning my strategy. Maybe it was easier to just translate everything from WordPress to a more portable format, like Markdown. I did some manual testing by downloading a single post, then tried to edit the resulting file in Ulysses and then upload it to Ghost. It required too much manual work. On top of that, I couldn’t back-date the article I was trying to push on Ghost. I gave up that route too.&lt;/p&gt;
&lt;p&gt;While searching for other solutions, I came across &lt;a href=&#34;https://ghost.org/docs/migration/pro/&#34;&gt;a web page on Ghost.org&lt;/a&gt; about a concierge service for Ghost(Pro) subscribers. I decided to write and ask If I was eligible. In less than 12 hours, I got an affirmative response. I was relieved.&lt;/p&gt;
&lt;p&gt;Over the course of three days, we exchanged emails detailing the migration process and for answering my numerous questions about the expected results. I cannot overstate enough how great the support was. Just before the weekend, everything was moved and my domain name setup updated. The latter part was on my responsibility. I’ll post a more detailed article just for the DNS portion of the migration.&lt;/p&gt;
&lt;h2 id=&#34;plugins&#34;&gt;Plugins&lt;/h2&gt;
&lt;p&gt;A few words about WordPress plugins and Ghost Integration. WordPress plugin economy is large and deep. It’s a rich ecosystem. On Ghost, plugins are called Integration. I’m not seeing the equivalent ecosystem, but that’s ok. I’m using the follow integration.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unsplash for easy insertion of images into posts.&lt;/li&gt;
&lt;li&gt;Ulysses for easy posting from this wonderful writing app.&lt;/li&gt;
&lt;li&gt;Plausible for analytics.&lt;/li&gt;
&lt;li&gt;Stripe to receive subscription fees from subscribers.&lt;/li&gt;
&lt;li&gt;Custom integration for Craft support of posting from within the app.&lt;/li&gt;
&lt;li&gt;Custom integration for cross posting of content from my Write.as account.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;some-important-migration-details&#34;&gt;Some important migration details&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The first thing was to change the DNS from WordPress to GoDaddy where my domain name is registered. I later discovered that I the domain needed to move to CloudFlare to support CNAME for the root domain, something GoDaddy don’t support.&lt;/li&gt;
&lt;li&gt;Domain name &lt;a href=&#34;https://numericcitizen-introspection.blog&#34;&gt;https://numericcitizen-introspection.blog&lt;/a&gt; will eventually lead to &lt;a href=&#34;https://numericcitizen.me&#34;&gt;https://numericcitizen.me&lt;/a&gt; via the help of a forwarder. I still have this to fix.&lt;/li&gt;
&lt;li&gt;Links should with slug &lt;code&gt;/year/month/date&lt;/code&gt; in them should continue to work, thanks to redirections that were created the Ghost&amp;rsquo;s support personnel.&lt;/li&gt;
&lt;li&gt;I created a backup file with WordPress.com backup plugin for archives purposes. I extracted all my images and uploaded them on my DS720+ Synology NAS for easy access.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/2C6DF123-45F7-4673-B328-593ACB15BC37/8a5938e6-18b3-2daa-2843-74608f9b0be7/xl6yN1J7bAtTkGnG9LIFCB8qVIINWl1y4VChmQU5xZYz/Image.png&#34;
    alt=&#34;Image.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Image.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id=&#34;a-few-things-were-lost-along-the-way&#34;&gt;A few things were lost along the way&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The possibility of getting “likes” on WordPress posts. I don’t care.&lt;/li&gt;
&lt;li&gt;Past comments on each post couldn’t be migrated. That was expected. I’m a bit sad for this, but my content is worth more.&lt;/li&gt;
&lt;li&gt;My 154 WordPress.com followers. I don’t have a mean of moving them to Ghost. The only thing is to write a blogpost asking them to subscribe to my new blog, with Ghost’s newsletter feature. After publishing such article, I didn’t see any increase in subscribers. I expect most of my WordPress followers just don’t care or are simply inactive.&lt;/li&gt;
&lt;li&gt;Jetpack app and WordPress app on the iPad and iPhone, these are no longer needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-im-going-to-miss&#34;&gt;What I’m going to miss&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Native application support on the iPad; Ghost doesn’t offer an iPad or iPhone app. The solution is to use Ulysses for my posting needs. I’m fine with this, I’m already using it for my Micro.blog posts.&lt;/li&gt;
&lt;li&gt;Custom themes are seemingly more limited on Ghost compared to WordPress. I’ll probably explore alternatives in the future.&lt;/li&gt;
&lt;li&gt;Posts path no longer uses the YYYY/MM/JJ/ document-title. I like it when the date if part of the path.&lt;/li&gt;
&lt;li&gt;RSS feed users on WordPress will need to update their subscription so their feed keep working.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;core-web-vitals-change&#34;&gt;Core web vitals change&lt;/h2&gt;
&lt;p&gt;The following are snapshots of my PageSpeed Core Web Vitals stats.&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/4B0A4B79-C27F-40AF-B4EF-9E12289BEED7/329919A0-8ED4-480A-9BDA-CA977580CDDC_2/xc1mMPnzxQmVBeo85wwSsW2BKGmoDUdHn8aOLWIfGhwz/Safari-PageSpeed%20Insights2023-03-2417.46.492x.png&#34;
    alt=&#34;Safari-PageSpeed Insights@2023-03-24@17.46.49@2x.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Safari-PageSpeed Insights@2023-03-24@17.46.49@2x.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/4B0A4B79-C27F-40AF-B4EF-9E12289BEED7/67F3AA90-C830-423E-A88B-4D9E57C6AB7A_2/QGAgwExygWZbDzT1nQGvV7MUB4o8yuF14Ql9rVYpCQgz/Safari-PageSpeed%20Insights2023-03-2417.46.392x.png&#34;
    alt=&#34;Safari-PageSpeed Insights@2023-03-24@17.46.39@2x.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Safari-PageSpeed Insights@2023-03-24@17.46.39@2x.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Before the migration&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/doc/4B0A4B79-C27F-40AF-B4EF-9E12289BEED7/CFB2FCEE-EBB1-459C-B452-607CC3DB5678_2/tVxe7uIie8KZSKv2DMxBNARiDSgWcpt6DnQ7NdjmmxMz/Safari-PageSpeed%20Insights2023-03-2417.46.052x.png&#34;
    alt=&#34;Safari-PageSpeed Insights@2023-03-24@17.46.05@2x.png&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Safari-PageSpeed Insights@2023-03-24@17.46.05@2x.png&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;After the migration&lt;/p&gt;
&lt;p&gt;Overall, migrating to Ghost is an improvement. I’ll be monitoring this over the course of upcoming weeks and months so see how this will affect my visitors statistics.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;It took me many long hours to make this move, but it was well worth it. I’m using a more modern and easier platform for my publication needs. I had to refresh my knowledge of a DNS service too. Since 2015, I learn a bit of WordPress and I consider to be an intermediate user. I prefer Ghost now.&lt;/p&gt;
&lt;p&gt;I hope you learn a few things with this article Feel free to post comments using the commenting feature of this Craft-made site.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Documenting My Numeric Life With Dayone</title>
      <link>https://meta.numericcitizen.me/2023/03/06/documenting-my-numeric-life-with.html</link>
      <pubDate>Mon, 06 Mar 2023 20:00:00 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2023/03/06/documenting-my-numeric-life-with.html</guid>
      <description>&lt;p&gt;Do you have a Flickr or &lt;a href=&#34;https://glass.photo/&#34;&gt;Glass&lt;/a&gt; account where you posted your best shots, describing your mood when the pictures were taken? Do you have a Twitter or Mastodon account where you describe what’s on your mind? Maybe you are a blogger posting on WordPress or Micro.blog about a trip you are currently doing? If you answered yes to a few or all of these questions, you must read this article explaining how you could be documenting your life automatically. Why? How do you ensure the content you create on the Internet will stay forever accessible to you? How can you make sure you won’t lose anything when a service like Flickr changes the rules and removes pictures from its platform? I have set up a process to automatically document my numeric life with content I post online. Here is how.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/143495/2026/intro-devices402x.jpg&#34; width=&#34;600&#34; height=&#34;346&#34; alt=&#34;&#34;&gt;
&lt;p&gt;I’ve been using the excellent, powerful journaling app &lt;a href=&#34;http://dayoneapp.com/&#34;&gt;Dayone&lt;/a&gt; to help me save copies of my digital work. Dayone allows you to create journal entries containing text, photos, audio recordings, drawings, videos, etc. In addition, each entry contains metadata such as the current weather, GPS coordinates, the currently playing music, etc. The key to my setup is integrating Dayone with the automation service &lt;a href=&#34;https://ifttt.com/&#34;&gt;IFTTT&lt;/a&gt;, which lets you automate tasks across other web services. One such example of automation is automatically posting a photo you just uploaded to Flickr on Mastodon. Glass alone doesn’t do that, so to circumvent this, I use IFTTT to do it for me.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/143495/2026/ifttt-automation.png&#34; width=&#34;600&#34; height=&#34;385&#34; alt=&#34;Auto-generated description: An applet editing interface shows a trigger action for a New feed item and a resulting action to Create Journal Entry.&#34;&gt;
&lt;p&gt;&lt;strong&gt;The cool thing is that you can also use IFTTT to push content to your Dayone journal&lt;/strong&gt;. To integrate both, you need to subscribe to the premium tier of Dayone. This will enable many cool features like syncing your journals on Dayone web servers. Second, this will make it possible for IFTTT web services to push content into your Dayone journals over the web. Don’t worry about security here; all data movement is encrypted.&lt;/p&gt;
&lt;p&gt;As an example, I have created an “applet” on IFTTT that does this: if I publish a picture on Glass, I’d like to keep this post in my personal journal on Dayone and give it the tag “Glass”. The journal entry will include the picture itself, the description, the date and time and the source of information. Pretty cool, huh?! I have many applets that I have created to save, for example, a copy of all my posts on Micro.blog, or create an entry each time I publish a new blog post here on &lt;a href=&#34;https://numericcitizen.me/&#34;&gt;numericcitizen.me&lt;/a&gt;. Using RSS feeds with IFTTT is super simple.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/143495/2026/dayonejournalcontent.png&#34; width=&#34;600&#34; height=&#34;358&#34; alt=&#34;Auto-generated description: A digital journal page displays entries about a travel update to Sibenik, Croatia, with dates, times, and accompanying images.&#34;&gt;
&lt;p&gt;With all these applets running in the background, it is documenting and saving what I post on the internet via the web services I use. The following diagram shows the flow of information between the sources and the destination, Dayone.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/143495/2026/document-numeric-life.png&#34; width=&#34;600&#34; height=&#34;242&#34; alt=&#34;Auto-generated description: A diagram illustrates how data from YouTube Likes, Glass photos, Pixelfed photos, Micro.blog posts, and Blog posts flow into IFTTT and then are saved into DayOne.&#34;&gt;
&lt;p&gt;On the left, are the web services that I use for publishing content, and on the right, Dayone who gets all the information confined thanks to applets running at IFTTT.&lt;/p&gt;
&lt;p&gt;As you can see, my internet presence is not only here on WordPress. I publish YouTube videos, I have a Micro.blog account, I’m posting photos on Glass, and I’m a YouTube consumer too. Nearly all of my interactions with these services are saved within my personal journal on Dayone. I find it cool and relieving to know that my personal archives are readily available. After reading this article, maybe you’ll consider doing something similar for your content, too?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Documenting Blog Changes</title>
      <link>https://meta.numericcitizen.me/2021/03/02/documenting-blog-changes.html</link>
      <pubDate>Tue, 02 Mar 2021 15:00:00 -0400</pubDate>
      
      <guid>http://numericcitizen-meta.micro.blog/2021/03/02/documenting-blog-changes.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;Using Git instead of Dropbox for Blot content syncing provides an unexpected benefit.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As I &lt;a href=&#34;https://numericcitizen.io/2021/02/28/selecting-a-git-client&#34;&gt;recently wrote&lt;/a&gt;, Blot supports two mechanisms for synchronizing content from my Mac to the web: Dropbox or Git. I chose Git. As I write this, I’m still testing Nova as the Git front-end (I’m a GUI type of guy). One of the great benefits of using Git is the built-in history of commits that is at the core of any Git repo. As shown below, as I push updates to my Blot-based website, I make sure to write a short comment in the commit action to document the commit action. I think this is an important asset in managing a blog and owning its content.&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://blog.numericcitizen.me/uploads/2024/-git-repo-commit-history.png&#34;
    alt=&#34;Commit history to the blog report using Nova&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Commit history to the blog report using Nova&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;A better view at the GIT panel in Nova:&lt;/p&gt;
&lt;p&gt;&lt;div class=&#34;nc-image-wrap&#34;&gt;
  &lt;img src=&#34;https://res.craft.do/user/full/2af24264-e3c1-fb23-4d31-e2491112f9ab/1524BBEE-239E-4283-950D-DE8122729DB1_2/GQAhclIful6uywpYyOH0Efriq5EpNtE37gduH8k9QHcz/_Nova-Commit-message.png&#34;
    alt=&#34;Nova GIT panel with commit message area&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
  &lt;span class=&#34;nc-image-caption&#34; aria-hidden=&#34;true&#34;&gt;Nova GIT panel with commit message area&lt;/span&gt;
&lt;/div&gt;
&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>