🔗 Mobivention announces its own iOS App Marketplace

As detailed by the company in a press release, mobivention’s App Marketplace will let developers distribute B2B and B2C apps to their customers outside the iOS App Store. “The mobivention App marketplace is primarily aimed at business customers who are looking for an alternative solution for distributing their apps,” mobivention explains.

Tired: there is an app for that. Wired: There is a marketplace for that. 🤓

How Do I Read and Process an Article

Let’s say I stumble on an article I wish to read and process. I’ll follow the following steps, covering the collection and archival stages.

  1. Save the article in Omnivore1,2.
  2. Set tags in Omnivore.
  3. Read the article, highlight text as needed and write comments if required.
  4. Summarize the article using Raycast AI. I have a Keyboard Maestro macro for that.
  5. Copy and paste the summary into the Omnivore notebook accompanying the article.
  6. Archive the article in Omnivore.
  7. Export the Readwise highlights (done automatically from Omnivore syncing).
  8. Import the created markdown files into Bear.
  9. Adjust tags if required.

I realize this workflow is essentially for the Mac. Nothing like this can be done on the iPad without a major tweak or two.

You can find this article on the “My Micro-Workflows Explained” website.


  1. The article can be saved from Inoreader, Reeder or the Arc Browser. ↩︎

  2. Some articles come in using my Omnivore’s email address that I use for subscribing to some newsletters. ↩︎

Each week, I use this template in Things 3 to help me out with my planning. Each Sunday, I duplicate the whole project and rename it accordingly. I love Things 3[^1]. [^1] I tried to do this in Apple Reminders but I prefer Things 3 experience.

Today I added a new global changelog1 page to my metablog. The changelog will cover all the changes applied to my digital publishing space.


  1. A changelog is a document or record that details the changes made in a software project. It typically includes information about new features, enhancements, bug fixes, and any modifications made to the software between different versions or updates. ↩︎

Some Hurdles to Fix Already

I encountered my first few hurdles in transposing my content from a Craft document to a Micro.blog. Craft enables rich document content and supports block types like JSON output or command line examples. Posts containing these need special Markdown attention. Thanks to some help1, I figured that out, so the output looks ok. Next up are documents with images like screenshots. When exporting from Craft to Ulysses, images are inserted in Ulysses as references to Craft’s backend storage. When posting on Micro.blog, the images are not uploaded on Micro.blog’s backend. I need to manually download each image and insert them in Ulysses so they get uploaded to Micro.blog and be self-contained there. If I ever drop Craft, I want the images in my post to stay valid and display correctly.


  1. I want to thank MacGPT here for the hint. 😅 ↩︎

Browsing Past Published Articles on Ghost

Circumventing Ghost’s limited posts management capabilities.

List of publications in Ghost admin panel.

I recently decided to spend some time editing past articles published on my Numeric Citizen Space website. I first thought that by going to my Ghost admin page, I could quickly browse past published articles by month. I couldn’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’s content APIs come into play.

The following API request doesn’t do the job (API key voluntarily removed!):

curl -H "Accept-Version: v5.0" "https://numeric-citizen-introspection.ghost.io/ghost/api/content/posts/?key={APIkeygoeshere}&fields=title,url,published_at,updated_at&filter=published_at:>2024-01-01%2Bpublished_at:<2024-02-01" | json_pp

Let me explain what is this API request.

First, I’m going to the request using the macOS command line, hence the curl 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 (&fields), 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:

jfm@CraftingMAChine ~ % curl -H "Accept-Version: v5.0" "https://numeric-citizen-introspection.ghost.io/ghost/api/content/posts/?key={API-key-goes-here}&fields=title,id,url,published_at,updated_at&filter=published_at:>2024-01-01%2Bpublished_at:<2024-02-01" | json_pp
	{
	   "meta" : {
	      "pagination" : {
	         "limit" : 15,
	         "next" : null,
	         "page" : 1,
	         "pages" : 1,
	         "prev" : null,
	         "total" : 9
	      }
	   },
	   "posts" : [
	      {
	         "id" : "65b6a09840566000015b0d37",
	         "published_at" : "2024-01-28T13:50:19.000-05:00",
	         "title" : "My Weekly Creative Summary for the Week of 2024/03",
	         "updated_at" : "2024-01-28T13:50:19.000-05:00",
	         "url" : "https://numericcitizen.me/my-weekly-creative-summary-for-the-week-of-2024-03/"
	      },
	      {
	         "id" : "65b6540640566000015b0cf7",
	         "published_at" : "2024-01-28T08:23:26.000-05:00",
	         "title" : "Special Message to Paying Subscribers",
	         "updated_at" : "2024-01-28T08:23:26.000-05:00",
	         "url" : "https://numericcitizen.me/special-message-to-paying-subscribers/"
	      },
	      {
	         "id" : "65b16e25bc7fde0001314ccb",
	         "published_at" : "2024-01-24T15:09:24.000-05:00",
	         "title" : "The Mac Turns 40",
	         "updated_at" : "2024-01-24T15:09:24.000-05:00",
	         "url" : "https://numericcitizen.me/the-mac-turns-40/"
	      },
	      {
	         "id" : "65ad35418532ae000169ddd2",
	         "published_at" : "2024-01-21T10:22:33.000-05:00",
	         "title" : "My Weekly Creative Summary for the Week 2024/02",
	         "updated_at" : "2024-01-21T10:22:33.000-05:00",
	         "url" : "https://numericcitizen.me/my-weekly-creative-summary-for-the-week-2024-02/"
	      },
	   ]
	}

Next, I copy the post ID of one article and paste it my browser for edition using this special URL:

https://numeric-citizen-introspection.ghost.io/ghost/#/editor/post/652e6eedb8a2650001ad9c5b

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.

You can find the Ghost API document right here.

Browsing Past Published Articles on Ghost

Image.png

I recently decided to spend some time editing past articles published on my Numeric Citizen Space website. I first thought that by going to my Ghost admin page, I could quickly browse past published articles by month. I couldn’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’s content APIs come into play.

The following API request doesn’t the job (API key voluntarly removed!):

curl -H "Accept-Version: v5.0" "https://numeric-citizen-introspection.ghost.io/ghost/api/content/posts/?key={APIkeygoeshere}&fields=title,url,published_at,updated_at&filter=published_at:>2024-01-01%2Bpublished_at:<2024-02-01" | json_pp

Let me explain what is this API request.

First, I’m going the request using macOS command line, hence the curl 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 (&fields), 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:

jfm@CraftingMAChine ~ % curl -H "Accept-Version: v5.0" "https://numeric-citizen-introspection.ghost.io/ghost/api/content/posts/?key={API-key-goes-here}&fields=title,id,url,published_at,updated_at&filter=published_at:>2024-01-01%2Bpublished_at:<2024-02-01" | json_pp
{
   "meta" : {
      "pagination" : {
         "limit" : 15,
         "next" : null,
         "page" : 1,
         "pages" : 1,
         "prev" : null,
         "total" : 9
      }
   },
   "posts" : [
      {
         "id" : "65b6a09840566000015b0d37",
         "published_at" : "2024-01-28T13:50:19.000-05:00",
         "title" : "My Weekly Creative Summary for the Week of 2024/03",
         "updated_at" : "2024-01-28T13:50:19.000-05:00",
         "url" : "https://numericcitizen.me/my-weekly-creative-summary-for-the-week-of-2024-03/"
      },
      {
         "id" : "65b6540640566000015b0cf7",
         "published_at" : "2024-01-28T08:23:26.000-05:00",
         "title" : "Special Message to Paying Subscribers",
         "updated_at" : "2024-01-28T08:23:26.000-05:00",
         "url" : "https://numericcitizen.me/special-message-to-paying-subscribers/"
      },
      {
         "id" : "65b16e25bc7fde0001314ccb",
         "published_at" : "2024-01-24T15:09:24.000-05:00",
         "title" : "The Mac Turns 40",
         "updated_at" : "2024-01-24T15:09:24.000-05:00",
         "url" : "https://numericcitizen.me/the-mac-turns-40/"
      },
      {
         "id" : "65ad35418532ae000169ddd2",
         "published_at" : "2024-01-21T10:22:33.000-05:00",
         "title" : "My Weekly Creative Summary for the Week 2024/02",
         "updated_at" : "2024-01-21T10:22:33.000-05:00",
         "url" : "https://numericcitizen.me/my-weekly-creative-summary-for-the-week-2024-02/"
      },
      {
         "id" : "65ac3aa68532ae000169ddb6",
         "published_at" : "2024-01-20T16:28:20.000-05:00",
         "title" : "New IT Rules at the Office Prompts Me to Revisit My Mac Usage at Home",
         "updated_at" : "2024-01-20T16:28:20.000-05:00",
         "url" : "https://numericcitizen.me/new-it-rules-at-the-office-prompts-me-to-revisit-my-mac-usage-at-home/"
      },
      {
         "id" : "65a3ed6e8532ae000169dbe0",
         "published_at" : "2024-01-14T09:24:25.000-05:00",
         "title" : "My Weekly Creative Summary for the Week of 2024/01",
         "updated_at" : "2024-01-14T09:24:25.000-05:00",
         "url" : "https://numericcitizen.me/my-weekly-creative-summary-for-the-week-of-2024-01/"
      },
      {
         "id" : "659e86018532ae000169dbbf",
         "published_at" : "2024-01-10T06:58:44.000-05:00",
         "title" : "Adobe Lightroom 2016-2024 RIP — How To Migrate From Adobe Lightroom to Photomator",
         "updated_at" : "2024-01-10T06:58:44.000-05:00",
         "url" : "https://numericcitizen.me/adobe-lightroom-2016-2024-rip-how-to-migrate-from-adobe-lightroom-to-photomator/"
      },
      {
         "id" : "659d32eb8532ae000169dba7",
         "published_at" : "2024-01-09T06:53:21.000-05:00",
         "title" : "Apple Vision Pro — The Missing Apple Keynote Case",
         "updated_at" : "2024-01-09T06:53:21.000-05:00",
         "url" : "https://numericcitizen.me/apple-vision-pro-the-missing-apple-keynote-case/"
      },
      {
         "id" : "659953468532ae000169db6d",
         "published_at" : "2024-01-06T08:27:04.000-05:00",
         "title" : "A Tough Year Ahead for Apple",
         "updated_at" : "2024-01-06T16:52:59.000-05:00",
         "url" : "https://numericcitizen.me/a-though-year-for-apple/"
      }
   ]
}

Next, I copy the post ID of one article and paste it my browser for edition using this special URL:

https://numeric-citizen-introspection.ghost.io/ghost/#/editor/post/652e6eedb8a2650001ad9c5b

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.

You can find the Ghost API document right here.

https://ghost.org/docs/content-api/

This article is also available here.

My Content Creator Workflow as of 2023-11

My-Creative-Workflow-2023-11.png

My creative workflow as of 2023-11. You can download an higher resolution here.

This 2023-11 version has a few changes and a cleaner and more focused workflow. Before going into specific details, I wanted to remind readers that I support the " POSSE " idea. You can read one post about it here. This workflow presented reflects this. As a reminder, here is one definition of the POSSE principle according to ChatGPT:

“POSSE” is an acronym that stands for “Publish (on your) Own Site, Syndicate Elsewhere.” It’s a content publishing model that first encourages publishing content on your own website, and then syndicating (or sharing) that content on other platforms or websites. This approach is often recommended in digital marketing and personal branding strategies, as it allows individuals to maintain control over their original content while still benefiting from the audience and engagement found on larger, established platforms. The POSSE model is particularly relevant in the context of blogging, social media, and online content creation.

Welcome AI, welcome ChatGPT, Dall-E, Midjourney

AI is making an official entry in my creative workflow. I wrote a long piece stating my guidelines for using AI in my creative work. You should read those and maybe get some inspiration out of them. The header image of this article was generated using Dall-E.

A new setup to share files easily

Dropshare coupled with Short.io enables me to share files like screenshots or other things. The setup was documented in detail in a previous article on this meta blog. Behind the scene, Dropshare is configured to use Backblaze to store files in a S3 bucket.

Bye bye to my Digital Garden

I came to the conclusion that a digital garden isn’t something for me. I decided to move some portions into my official about page. You can still access the remains of the garden, here.

A fun experience with Tinylytics

I’ve been using Plausible for my analytics needs but a cool guy (the same who’s also working with Manton Reece on Micro.blog hosting service, developed a lightweight version which I decided to support.

Safari-Personal (Default) — Sites tinylytics@2023-11-23@20.13.49@2x.png

The Tinylytics dashboard

Google Sheets is out too

I was using Google Sheets to save links to every post on Micro.blog via an IFTTT automation. I no longer feel the need to key this in place.

Brief

Brief is now part of my workflow because they also took over Mailbrew, both are forming a powerful content consumption enabler duo. Some of my Mailbrew newsletters contain Brief as a source for news, which is heavily using AI for summarization.

My Reading Workflow Explained

The many facets of my reading workflow needed to be examined and studied. When do I read, using which device and application? How is my reading affecting or contributing to my creative workflow? What happens when I find something interesting while I’m reading? How do I store important information pieces? How do I get back to them? How often and for what purpose? The answer to these numerous questions drive my choice of application for reading.

I’ve been thinking for a long time about ways to improve my reading workflow for a few reasons. First, I want to read more and more consistently. Two, I’m not sure which app is better to support this. I’ve been switching read-later service many times and until now, I wasn’t able to settle on one. Third, when reading, I want to get the most out of it and use the gathered knowledge more effectively. The following diagram depicts the flow of my reading workflow, inspired by the CODE methodology. Each box is explained in more detail below.

Freeform-My Reading Workflow as of 2023-09@2023-09-30@21.26.57@2x.png

First, let’s start with my possible reading sources.

  1. RSS feeds can be imported directly into Omnivore by using the RSS feed address. I follow a few dozen feeds via Inoreader and Reeder, but just a few are selected to go directly into Omnivore for the quality of their content. As I’m writing this, four feeds are configured for direct importation. This feature was only recently introduced into Omnivore, and it works great. Occasionally, I go into Omnivore, select the RSS tag and start reading from there.

Image.png

  1. Reeder is a very popular RSS reader. There are so many of them, but something hard to describe in Reeder sets it apart. Simplicity but not simplistic might be a good characterization. Reeder is also a great Inoreader client. Recently, I decided that for interesting articles in Reeder that I want to read, I save them into Things 3. One of the reasons is that when the article is read and analyzed, I can check it off from the to-do list, and Things will log this into the LogBook. I like the journaling capabilities of Things 3. I use it in my weekly creative summary.

Image.png

  1. Safari is my go-to browser. Surfing the web triggers reading opportunities. When I’m not ready to plunge into a 2500-word article, I use the Omnivore Safari extension to save it for a read later occasion. Another possibility is to save a bookmark directly into Craft from Safari (via Copy & Paste, thanks to Craft Safari extension limitations). When this happens, it’s because I was looking for something in Safari and needed to keep the bookmark for later use. The same process sometimes happens right in Reeder. In that case, a simple “copy & paste” of the bookmark is executed from Reeder to Craft. But, overall, I try to save a bookmark into Things 3 for the same reason I do it from Reeder. Things 3 helps me keep track in an effective way of all my future readings.

Image.png

  1. Things 3 helps me manage and be consistent with my creative activities. Unsurprisingly, it plays a role in the Collect portion of my CODE workflow. For each article I plan to read and possibly analyze, I create a new task in Things 3 with a link to the article in the task’s note. As I wrote previously, each time I check an item from the list, the item is logged in Things 3’s logbook. This way, I keep track of what I have read and when.

Image.png

  1. From Things 3, I’ll open the link in Safari for the article I decided to read. Sadly, I cannot save the link from Things 3 to Omnivore directly. It’s possible only through Omnivore’s Safari extension. From there, if I think the article is long enough and needs more thorough reading, I’ll send it to Omnivore. I might save the bookmark into Craft also, depending on my needs. I often visit an article only to copy and paste its URL into a Craft document as a reference. However, I could directly import the article’s content into a new Craft document using a “CraftClip” shortcut. In this scenario, I want to import knowledge into Craft to backlink to it and select the portion to include as a quote in another document.
  2. Omnivore is my go-to “read-later” service. I won’t write a review here (maybe for another article). Once the content is saved into Omnivore (via the Safari browser extension or automatically from the few selected RSS feeds, articles are stored in Omnivore’s Inbox and are available for reading, highlighting, annotation and tagging. The nice thing about Omnivore is that it is free, it is constantly evolving, and, more importantly, I can copy and paste all my highlights and annotations in one click and paste them into a Craft document, and they will be formatted exactly the way it should be.
  3. Omnivore highlights are synced to Readwise. I also copy and paste the link to the stored article back into Craft for easier and quicker access.

Image.png

  1. Central to my creative workflow, Craft is a repository of bookmarks from Safari, Reeder, and highlights stored in Readwise. I import those from time to time to consolidate knowledge. Anybox, a bookmarks manager, has a different role of holding bookmarks about specific subjects without contextual information. This is why I don’t consider Anybox part of my reading workflow.
  2. When working on a review or an article about a specific subject, I will create a unique document container in Craft based on a template I made (the template is available for sale here). Everything I read, potentially highlighted and annotated, might be stored in this container as a reference, a bookmark, or the full article. The idea is to bring related things closer together so I can build relations.

My reading workflow might look complex but it really isn’t. I’ve been testing it while reading articles about the iPhone 15 Pro Max. It’s not perfect but it is close to be just right for my needs. There are always possible improvements, but those will come in due time. Previously, my workflow was centered around Craft, you might take a look at the following video if you are curious.

My Reading Workflow Using Craft

Still to come: how do I read the newsletters I subscribe to? 🤔