Sebastian De Deyne
Designer & developer at Spatie

How to schedule posts on a static Hugo site with Netlify and GitHub Actions

If all went well, this post was published automatically. I added the ability to schedule posts on my static blog (built with Hugo). I wrote a short GitHub Action to trigger a build on Netlify every morning.

By default, Hugo doesn’t build pages that have a date in the future. During development, you can preview them with a flag.

hugo server --buildFuture

A post with this front matter would be scheduled to publish on February 2nd 2030 at 8:00 AM in my timezone:

title: Dive into Shimizu Corporation's underground city
date: 2030-02-01T08:00:00+02:00

Since Netlify builds Hugo sites without the --buildFuture flag, scheduled posts don’t appear online. Netlify only publishes this site when I push changes to the git repository.

That’s where GitHub Actions come in: you can schedule an Action with cron.

I’m no cron expert by any means, so I opened and smashed some numbers until I came up with a schedule that runs every morning at 8:00 AM. GitHub Actions are configured in UTC, so that’s 6:00 over there.

    - cron: "0 6 * * *"

Now to trigger a build. Netlify supports Build hooks, which are unique URLs you can POST to to trigger a build. After setting up a build hook in Netlify, I can curl it from the Action.

Build hook endpoints are protected by a secret token, which I added as a secret in my repository’s settings.

Here’s the final Action file:

name: Cron build

    - cron: "0 6 * * *"

    runs-on: ubuntu-latest
      - name: Trigger our build webhook on Netlify
        run: curl -s -X POST "${TOKEN}"
          TOKEN: ${{ secrets.NETLIFY_CRON_BUILD_HOOK }}

Now my site rebuilds every morning, and whenever I have a new post scheduled, it’ll go live.

If you enjoyed this post, you might be interested in my newsletter. I occasionally send a dispatch with personal stories, things I’ve been working on in the past month, and other interesting tidbits I come across online.