A Hundred & One Post Buttons

One of the reasons I love this setup so much is that publishing isn’t just simple – it’s fully automated with nothing more than stock Shortcuts actions on iOS and macOS. No scripts, no extra tools. Just Shortcuts and GitHub’s API.

Here’s how it works, step by step:


1. Take a Markdown file as input

The Shortcut starts by receiving a file – either from the Share Sheet or by prompting me to pick one. This file is the blog post I’ve written in plain text.

  • Action: Receive Files from Share Sheet
  • Why: Keeps things flexible – I can run the Shortcut from Finder on my Mac, Drafts on my iPhone, or anywhere else that can share a Markdown file.

2. Prepare the file name

Next, the Shortcut grabs the file’s name, URL-encodes it (so it’s safe for GitHub’s API), and saves it as Pretty File Name.

  • Action: Get Name from Blog Post → URL Encode → Set Variable

This ensures my post shows up as my-post.md inside the Hugo content/posts/ folder.


3. Encode the post content

The raw text of the file is pulled out and converted to Base64. GitHub’s API requires files to be sent this way.

  • Action: Get Text from Blog Post → Encode Text with Base64

Now I’ve got my post ready in a format GitHub understands.


4. Build the API request

The Shortcut constructs a URL to the right location in my repo:

https://api.github.com/repos/<username>/<repo>/contents/content/posts/<Pretty File Name>.md

This points GitHub’s API directly to where the Markdown file should live.


5. Check if the post exists

The Shortcut sends a GET request to that URL:

  • If a file exists, GitHub’s response includes a sha value (basically the file’s unique ID).
  • If it doesn’t exist, there’s no sha.

This lets the Shortcut decide whether to update an existing post or create a brand new one.


6. Update or create the post

Depending on the result, the Shortcut runs one of two PUT requests:

  • Update Blog Post → PUT with the sha included
  • Post New Blog Post → PUT without the sha

Both requests send JSON with:

{
  "message": "Posted via Shortcuts - <Name of BlogPost>",
  "content": "<Base64 Encoded Markdown>",
  "branch": "main",
  "sha": "<if updating>"
}

GitHub commits the file to my repo, and Hugo + GitHub Pages do the rest.


7. Done!

That’s it. Within seconds, the post appears on my live site – no browser, no dashboard, no manual uploads.


Why This Is So Good

  • Cross-platform: I use it on my Mac via Finder + Service Station, as an Alfred file action, in BBEdit via AppleScript, and on my iPhone via Drafts. If I had an iPad, it would work there too.
  • Minimal setup: The Shortcut is just a chain of built-in actions. No scripts, no third-party apps.
  • Future-proof: The only input it needs is a Markdown file – and that’s the one thing my blog will always be built on.
Post to Blog app icon Post to Blog

Apps Mentioned in this Post

Drafts app icon Drafts
Service Station app icon Service Station
BBEdit app icon BBEdit
Alfred 5 app icon Alfred 5