AI made me replace another subscription: Ulysses

I finally cancelled my subscription to Ulysses. Why? I was using Ulysses because it supported Craft’s export document so that I could then publish either to Ghost or Micro.blog. Since the beginning of this year, I’ve created two n8n automation workflows to publish directly from Craft to Ghost or Micro.blog.

Publishing from Craft to Micro.blog with a Single n8n Workflow

This is a technical write-up of an n8n automation that takes a document written in Craft, converts it to clean HTML, rehosts its images, and publishes it to Micro.blog as a draft — all from a single webhook call. It’s a companion to an earlier Craft → Ghost publisher and reuses the same document-fetching approach, but targets Micro.blog’s Micropub API instead of a proprietary CMS.

The goal is to write in one place (Craft) and let automation handle the tedious, error-prone part: block conversion and image migration.

What it does

An AI assistant (via n8n’s MCP integration) or any HTTP client sends a webhook request naming a Craft document by title. The workflow then:

  1. Searches the Craft space for that title.
  2. Scores the search results to pick the actual matching document.
  3. Fetches the document’s full block tree.
  4. Converts Craft blocks into Micropub-ready HTML.
  5. Extracts every Craft-hosted image, downloads it, and re-uploads it to Micro.blog’s media endpoint.
  6. Swaps the original image URLs for their new Micro.blog-hosted equivalents.
  7. Publishes the result as a draft for manual review before it goes live.

The whole run typically completes in about 4–6 seconds, with image uploads accounting for most of the overhead.

Trigger and input

The workflow is triggered by an HTTP POST webhook that waits for the full run to complete before responding (a “response node” pattern), so the caller gets the final published URL back synchronously. It’s also exposed through n8n’s MCP server, which is what lets an assistant invoke it conversationally.

The input payload is minimal:

{ "targetTitle": "My Article Title" }

Flow overview

Webhook
  → Search Document in Craft
  → Find Best Matching Document
  → Fetch Document Content
  → Convert Craft Blocks to HTML
  → Set Micro.blog Token
  → Extract Craft Image URLs
  → Has Images?
       ├─ true  → Split by Image URL → Download from Craft → Fix Filename
       │          → Upload to Micro.blog Media → Merge Upload Result
       │          → Reassemble HTML → Merge Before Publish
       └─ false → Format No-Image Post → Merge Before Publish
  → Publish to Micro.blog
  → Respond to Webhook

The interesting problems

Most of the engineering effort went into three areas that aren’t obvious until you hit them.

Craft’s search API does full-text search, not title-only. That means a document that merely mentions the target title somewhere in its body can rank above the document actually named that. Publishing the wrong document is a nasty failure mode.

The fix is a small scoring node that runs after the search and ranks each candidate:

  • Exact title match: 100
  • Title starts with the query: 80
  • Title contains the query: under 50, penalized by how much longer the title is than the query

Before comparing, it strips Markdown noise — bold markers, italics, and heading prefixes — so formatting in a title doesn’t throw off the match. If nothing scores above zero, the node throws a descriptive error that lists every candidate it saw, which makes debugging a missed title trivial. The node emits the single best match in the same shape as the search results, so the downstream “fetch content” step doesn’t need to know any scoring happened.

2. Converting Craft blocks to HTML

Craft stores documents as a nested tree of typed blocks, not as HTML. A dedicated conversion node walks that tree and emits Micropub-ready markup. It covers:

  • Paragraphs and headings (h1–h4)
  • Blockquotes and horizontal rules
  • Unordered and ordered lists — consecutive list-item blocks are grouped into a single <ul> or <ol> rather than emitting one list per item
  • Task checkboxes (rendered as ✅ / ☐)
  • Images, wrapped in <figure>
  • Rich-link bookmarks, rendered as a styled bookmark block
  • Code blocks (<pre><code>)
  • Inline formatting: bold, italic, strikethrough, inline code, links, and proper HTML-entity escaping

It also handles two different document shapes — a notebook with sub-pages and a flat single document — with a fallback lookup, so it doesn’t matter how the source is organized.

3. Rehosting images across services

Craft images live on Craft’s own CDN. If you publish those URLs directly, your post depends on Craft continuing to serve them — not acceptable for a permanent blog post. So every Craft image has to be pulled down and re-uploaded to Micro.blog.

The image branch:

  1. Regex-scans the generated HTML for Craft image URLs.
  2. Splits into one item per image.
  3. Downloads each image’s binary from Craft.
  4. Fixes the filename extension based on the response’s MIME type (Craft URLs don’t always carry a usable extension).
  5. Uploads each image to Micro.blog’s media endpoint as multipart/form-data.

A subtle detail: Micro.blog’s media endpoint returns 202 Accepted and puts the new image URL in the HTTP Location response header, not in the body. To capture a header you have to ask the HTTP node for the full response rather than just the parsed body. A later node maps each uploaded image’s Location back to its original Craft URL by index, and the HTML is reassembled with every Craft URL replaced by its Micro.blog equivalent.

Image failures are handled gracefully: the upload node continues on error, so if one image fails (AVIF, for instance, tends to be rejected), the post still publishes — that image just keeps its original URL instead of breaking the whole run.

Why Micropub

The most reusable idea here is that Micro.blog speaks Micropub, a W3C standard, rather than a proprietary publishing API. The final payload is a standard h-entry:

{
  "type": ["h-entry"],
  "properties": {
    "name": ["My Article Title"],
    "content": ["<h2>...</h2><p>...</p>"],
    "post-status": ["draft"]
  }
}

Any Micropub-compatible endpoint would accept the same shape, so the publishing half of this workflow isn’t locked to one host. The post-status: draft field is deliberate — every post lands as a draft so it can be reviewed in the editor before going public. The endpoint responds with the new post’s URL, a preview link, and an edit link, which the workflow passes straight back to the webhook caller.

Error handling

  • A shared error-handler workflow catches failures across the automation.
  • The webhook always responds, even on failure, so a caller never hangs.
  • Image-upload failures are non-fatal (see above).
  • A missing title produces an explicit, descriptive error listing what was searched.
  • Full-text false positives are neutralized by the scoring node rather than by hoping the search ranks correctly.

Credentials and configuration (redacted)

For obvious reasons, the specifics below are not published:

  • Craft Connect REST link — a private access link used to search Craft and fetch block content.
  • Micro.blog app token — a Bearer token generated in Micro.blog account settings, stored in a dedicated “Set Token” node so it can be rotated in one place.
  • n8n instance URL, webhook path, and internal workflow IDs — infrastructure details specific to a self-hosted deployment.

If you rebuild something like this, you’d supply your own Craft access link and your own Micro.blog token, and point the workflow at your own n8n instance.

Takeaways

  • Treat a full-text search as untrusted input and score its results before acting on them.
  • When migrating content between hosts, migrate the assets too — don’t hotlink another service’s CDN.
  • Watch where an API returns the data you need; a Location header is easy to miss if you only read response bodies.
  • Prefer open standards (Micropub) over proprietary APIs where you can — it keeps the integration portable.
  • Publish to draft first. Automation should hand you a reviewable result, not a live surprise.

The Numeric Citizen Digital Ecosystem — Edition 2026-04

Today, I’m excited to share my latest digital ecosystem update, previously known as “The Numeric Citizen Content Creator Workflow”. The diagram sports a new title: “The Numeric Citizen Digital Ecosystem” to better reflect its scope: to enumerate services and apps at the center of my digital presence. It was entirely rebuilt in Apple Freeform, leaving Apple Keynote behind. Freeform is a joy to use; it’s much more flexible and powerful than Keynote, too. The content was also expanded to include a new set of tools I have built over the last few months since publishing the previous update. Let's dive in for all the details.

The entire ecosystem diagram was rebuilt from the ground up. Full resolution version available here.

At a high level, both Micro.blog and Ghost remain the two hosting and publishing pillars for most of my *.numericcitizen.me websites, while a few other websites, like my Ko-fi page and my new about website, Who Is Numeric Citizen, are hosted elsewhere. On the diagram, my websites are positioned on the left and in the top-left portion.

As you might notice, a lot has happened since my last update. Thanks to Claude AI and Claude Code, I made a major shift toward web app to meet two fundamental needs: a brand new bookmark manager (replacing AnyBox), and a lightweight RSS reader that integrates with my bookmark manager. Together, they support my reading workflow and help me produce the Ephemeral Scrapbook newsletter. See both web apps in this YouTube video.

My custom-built RSS reader web application

What’s in, what changed since last fall

AI is now playing a more prominent role in my digital ecosystem since the beginning of 2026. It’s mainly used for vibe coding, maintaining my web applications, and content summarization. You’ll see little light bulbs (💡) in the diagram; they indicate where AI summarization is involved. Anthropic’s Claude AI replaced OpenAI’s ChatGPT in all my workflows. Plus, Claude AI and Claude Code enabled many new possibilities for helping me build small digital services and web apps for my personal needs. It’s something I couldn’t have imagined a year ago.

Claude Code’s main window with some of my projects on the left sidebar and the DIFF view shown on the right

Another milestone was to replace IFTTT with n8n automation. It’s a major upgrade in functionality and usability. My n8n instance is running on the Digital Ocean hosting service, inside a pre-packaged “droplet” with 1 GB of RAM and 10 GB of disk space for $6 a month. Digital Ocean provides a one-click install of n8n which really made a difference in selecting Digital Ocean as a hosting service. I created more than a dozen automations, far more complex and useful than what I could build with IFTTT. Claude AI was also involved in optimizing many n8n workflows. It was possible because n8n supports the MCP endpoint that is exposed to Claude AI. In the following table, I present a summary of my n8n automation workflows. As you will see, Discord is a new entry, as it provides a custom server to receive n8n workflow outputs and some status reports from Tinylytics. Also good to know: all my n8n workflows are automatically documented in a Craft document, thanks to Claude Code, which connects to both the n8n and Craft backends. To get a well-structured documentation, I created a Claude Skill.

A portion of an automation workflow shown in the n8n canvas

My automated n8n workflows

Here’s a list of utilities running as n8n workflows on my self-hosted DigitalOcean instance.

  • API Credit Health Check — Pre-flight check on Anthropic credits; alerts Discord if depleted
  • Today's Forecast — Pulls weather data into the Craft daily note
  • Tinylytics Insights — Injects site analytics summary into the Craft daily note
  • Apple Daily News — Fetches MacSurfer headlines into the Craft daily note
  • Setup Craft Daily Note — Creates the day's 8-section journaling scaffold in Craft
  • Anthropic Daily Cost Report — Posts 7-day and 30-day AI spend breakdown to Discord

Example of automatically propulated Craft Daily note, thanks to n8n automation.

RSS & News Aggregation

A few workflows are used for content processing in the context of news consumption and Micro.blog timeline processing.

  • RSS Daily Summary — Aggregates RSS feeds and delivers an AI-summarized digest
  • Micro.blog Timeline Highlights — Summarizes Micro.blog activity via Claude
  • Apple News Flash Alerts — Real-time Apple news alerts from RSS
  • Apps & Services Release Highlights — Monitors release notes feeds for notable updates

Content & Publishing

Other workflows for supporting my content creation include:

  • Craft → Ghost — Two workflows (specific and generic) push Craft documents to Ghost as drafts
  • Ghost Publish Proxy — Triggers final publication on Ghost via webhook
  • Craft Fetch Proxy — Fetches Craft document content on demand for downstream processing
  • Poke to Craft / Peek at Ghost — Manual/chat-triggered utilities for quick content inspection

Newsletter & Email

A special workflow automation is processing email summarization on demand: simply forwarding an email to a dedicated Gmail account and after a few seconds I’ll receive a summary on my Discord server.

  • Email Summarizer — Polls Gmail every minute; summarizes newsletters and posts to Discord

Maintenance

Finally, backing up my workflows is a must, just in case something really bad happens on my n8n instance.

  • GitHub Backup — Backs up all n8n workflow definitions to a GitHub repo every Sunday

The Craft Agents main window

The updated diagram illustrates this: Craft consists of two parts—Craft content stored in the Craft cloud backend and various Craft clients, including the native general-purpose client and Craft Agents. Additionally, Craft now supports MCP and offers a comprehensive set of APIs, emphasizing the division between data storage and client applications. These latest additions to Craft are game changers and enable new use cases.

A few thoughts and observations about Craft Agents, a sort of spin-off of Craft, are worth sharing here. Think about Craft Agents as an orchestrator of AI agents. In many ways, Craft Agents can be compared to the Claude Desktop app. There is a high level of affinity between Craft Agents and Craft, connected via APIs or MCP. Consuming Craft content through Craft Agents is an obvious use case. Yet, I’m still not sure why the team behind Craft is spending so much effort on this, but it’s interesting to follow nonetheless. I’m still looking for clear use cases for it, hence the yellow dot (🟡) on its icon in the diagram. There are a few aspects of the app’s design and structure that I don’t like. I don’t like using the task manager to organize conversations. I don’t think task management belongs in this app. Plus, Craft Agents is a very hungry consumer of AI credits. It’s a major concern unless you subscribe to the highest tier of any AI provider (OpenAI, Anthropic, etc.). It’s worth noting that Craft also offers an assistant working inside Craft itself.

Also added to my digital ecosystem is CleanShot Cloud for hosting publicly shared screenshots or short screen recordings. I use that to share bugs or feedback. CleanShot X is sort of the client to CleanShot Cloud and is the best Mac utility you can get if you tae a lot of screenshots.

One last automation that prevented me from closing my IFTTT account was the process of automatically archiving my publications in DayOne. This process was briefly described in this blog post. Each time I share a blog post or an article, it is saved in DayOne. Micro.blog added a send-to-DayOne feature, which was the last needed nail in the coffin of IFTTT. It was such a relief.

Speaking of Micro.blog, I created a new website for sharing automated blog post digests on a monthly basis. Most of the process is supported by the use of AI summarization. It’s not fully automated but very effective. Each month I send my Micro.blog postss digest to Craft fo later processing using Craft Agents. The process takes less than 15 minutes to complete. I know there is a potential for a fully automated process. It’s on my todo list.

What’s out since the last update

Chillidog Web Hosting is out (the service hosting the Who Is Numeric Citizen website). It was replaced with Realmac Software Elements’ hosting solution. You can read the doc here. The transition was seamless. I prefer integrated solutions, which Realmac is now offering. Plus. Chillidog was purchased last year by Exact Hosting, and the purchase has been reported to degrade customer service.

Last fall, I added the ChatGPT Atlas browser to my ecosystem, but I removed it after switching to Claude AI. OpenAI Atlas was mainly used for summarizing articles, but now I do this within the Claude Desktop app. I still prefer using the ARC Browser, even though it might eventually be discontinued. The new browser, Dia, could take its place, but I’m interested to see how things unfold. Dia appears to require a Pro subscription to enable AI features in the browser. At $20 a month, I’ll pass.

Gone is Google News for cross-posting from Micro.blog. It never took off. Also gone is AnyBox, the very well-done bookmark manager available on all Apple platforms, but not available on the web, like Raindrop.io. I never liked Raindrop.io, so I built my own bookmark manager as a web-only app. It’s one of my new custom-built web apps.

Finally, the numericcitizen.io domain will be retired when it expires later this year, and the content hosted on a dedicated Craft subscription has already been moved to my main Craft subscription, helping me reduce costs. The meta.numericcitizen.me is taking over (my previous content was migrated there during 2025). Some of my content was also simply removed from public access.

My newly redesigned metablog as seen in dark mode

Still pondering about these

You’ll find yellow dots on the diagram which points to services or apps that I’m reconsidering. Let’s review a few of them.

Plausible vs Tinylytics: I use two web analytics. Plausible has been around in my ecosystem since I left Google Analytics. Then came long Tinylytics and I wanted to support its developer plus it provides a great design compared to Plausible. Yet, I have a lot of historic data in the latter. Plus, I started using Tinylytics APIs to feed one of my workflows who inject data inside Craft daily notes and dashboard web application. I could replace this with Plausible’s APIs but I don’t feel it’s worth the effort.

Things 3, a popular and highly regarded task manager, is currently being reconsidered. I like managing my to-dos, but I don’t have many. If I want to eliminate Things 3, I could switch to Craft’s basic task management, but it’s quite limited. For now, my most likely option is to create my own app, much like I did with my RSS reader or bookmark manager. However, I’m not in a hurry to switch away since it doesn’t require a subscription, giving me plenty of time to decide and develop a replacement.

Ulysses is another case where I’m pondering its long-term usefulness. If I can post to Micro.blog or Ghost directly from Craft (using my custom-made n8n workflows), why should I continue paying for this app? The next renewal is a year from now.

Finally, my Flipboard account hosts a magazine that pulls content from my main website via its RSS feed. I have 8 followers, apparently. I never get any reactions or comments from this place. The bigger question: is Flipboard still a thing these days?

Risk management

In this edition of the diagram, I included red dots (🔴) to indicate potential disruption risks. For example, Anthropic recently adjusted Claude's credit consumption, leading to a fivefold increase in the number of credits needed to perform the same task; something I've noticed too. Additionally, Anthropic conducted an experiment in which new subscribers could access Claude Code only if they chose the Max subscription tier at $200 per month. Although they quickly reversed this change, it raises the concern that they might eliminate the $20 plan altogether. If that happened, I could face serious difficulties and might stop maintaining my web applications built with Claude Code. Vercel is another risk potential: I’m using the free tier, which is rather generous. If they decided to remove this free tier, I would have to reconsider my position: either drop my web application or accept paying the monthly price they charge.

Concluding thoughts

This evolution reflects a fundamental shift in how I approach my digital life. By embracing AI assistants like Claude and building custom tools tailored to my specific needs, I've moved away from cobbling together disparate services toward a more cohesive, intentional ecosystem. The transition from automation platforms like IFTTT to n8n, coupled with the ability to code solutions with Claude Code, has given me both flexibility and control—rare commodities in the world of Software-as-a-Service.

The introduction of AI summarization across my workflows has transformed how I consume information, while the consolidation of my web presence under fewer, better-managed domains simplifies my digital footprint. Yet this ecosystem remains dynamic and somewhat fragile, dependent on the sustained availability of key services and the pricing decisions of AI providers. The risk management considerations I've outlined aren't just technical footnotes—they're essential guideposts for maintaining digital independence in an increasingly interconnected world.

As I continue to iterate and refine this ecosystem, the principles remain constant: intentionality, control, and the ability to evolve. The next edition will likely bring even more changes, but I'm optimistic that the foundations I've built will prove resilient enough to adapt to whatever comes next.

Previous update to my digital ecosystem can be found here.

My Content Creation Ecosystem - Fall 2025 Update

It has been a while since my last update in March 2025. Here’s a summary of the changes.

  • I removed Brief.news because I no longer think it will replace Mailbrew.
  • I removed Mailbrew because I no longer depend on it to consume Internet content. I tried to replace it with Inoreader email digests, but it didn’t work as I wrote here.
  • I decided to add ChatGPT Atlas because I now have a solid use case for it: articles summarization and analysis, as I explained in this YouTube video. This means Perplexity didn’t stay from my previous update. I’m focusing and want to settle on OpenAI for the foreseeable future.
  • My new personal landing page, which is mostly complete, has replaced the one previously hosted on Craft public documents.
  • I also made several visual tweaks to make it cleaner and more visually appealing.

The pace of updates slowed considerably in the last two years. It’s a good thing, and it means I can focus more on content and less on tooling.

Screenflow + Screen Studio

This week, I decided to add Screen Studio to my YouTube recording workflow. Screen Studio brings simplicity for recording more dynamic screen sequences. Everything Screen Studio does can be done in ScreenFlow, 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.

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.

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.

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?

An Update About My Journey with Realmac Software Elements

I’ve been quiet lately because I’ve been dedicating more time to learning Realmac Software Elements. I plan to create a few websites for fun. The first will be a new landing page to replace the current one shared with Craft Docs (look here). The second will be my professional website, which I’ll use when I transition to a freelance career. Ironically, the third will be a rework of my current employer’s corporate website, which I find quite unattractive.

So far, it’s a rather exciting journey. Elements is an excellent Mac app, and the team behind it offers a stellar presence on their support forums. This adds to the excitement of being part of a small club trying to build a new app. Elements is still in beta and should launch this year. You should see this video on YouTube showing the app’s user interface.

My experience with Elements reminds me of Apple’s iWeb website editor, which was part of the initial MobileMe rollout. However, Elements is much more powerful and geared toward a different crowd. The learning curve is much steeper, but it is reasonable for a guy like me. Elements is built around Tailwind CSS. I don’t know CSS or Tailwind CSS, but Elements hides its complexity.

Tailwind CSS is a utility-first CSS framework created by Adam Wathan and the team at Tailwind Labs in 2017. Designed to streamline web development, it provides a comprehensive set of low-level utility classes that allow developers to style elements directly in their HTML without writing custom CSS. This approach enables rapid prototyping and highly customizable designs, making Tailwind CSS a popular choice for developers seeking efficiency and flexibility in building modern web interfaces.

As soon as my first project matures enough, I’ll share more about it.

A Mandatory Update to my Content Creation Ecosystem

A visual look at my content creator ecosystem.

Some cleanup: Readwise is gone. Supporting services are now grouped at the bottom. Corrected a few typos. I made some visual adjustments to make things a little bit cleaner and easier to visualize, especially for website miniatures. I renamed the diagram to reflect the notion of an ecosystem instead of a workflow.

Many additions: each enhanced service with generative AI features is marked as such with a little brain icon. That’s the case for Inoreader, Craft and Grammarly. All my Micro.blog-hosted websites are now indicated. Since adhering to POSSE principles, I added the Fediverse and Bluesky icons and drew the cross-posting arrow lines to them.

A high-resolution version of this diagram is available here.

What is POSSE

The POSSE principle stands for “Publish (on your) Own Site, Syndicate Elsewhere.” It is a content distribution strategy often recommended for writers, bloggers, and publishers. The primary idea is to first publish your content on a platform you control, such as your personal website or blog, and then syndicate or share that content on other platforms like social media, Medium, or different online communities.

Here are some key points about the POSSE principle:

  1. Ownership and Control: By publishing on your own site first, you maintain control over your content and ensure it exists in a space you own. This helps protect your work from the risks of platform changes or shutdowns.
  2. Centralized Content: Your website becomes the central hub where all your content is stored and can be accessed by your audience.
  3. Traffic and SEO: By driving traffic to your own site, you can improve your website’s SEO, increase your audience, and potentially monetize traffic through ads, affiliate links, or direct sales.
  4. Syndication: After publishing on your own site, you can share your content with a wider audience by syndicating it to other platforms. This strategy helps reach readers who might not visit your site directly.
  5. Preservation: Content publishing on third-party platforms may be subject to their rules and policies. Publishing first on your own site ensures your content is preserved and remains unchanged regardless of policy changes elsewhere.

The POSSE principle is popular among creators who value long-term control over their work and want to build a sustainable and direct relationship with their audience.