<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Julie</title>
    <description>The latest articles on DEV Community by Julie (@julies1).</description>
    <link>https://dev.to/julies1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4094877%2Fa953dd8e-e822-4db4-b29a-f7a2c8998f06.png</url>
      <title>DEV Community: Julie</title>
      <link>https://dev.to/julies1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/julies1"/>
    <language>en</language>
    <item>
      <title>The minimum you need to know about GitHub Actions</title>
      <dc:creator>Julie</dc:creator>
      <pubDate>Wed, 14 Oct 2026 05:16:00 +0000</pubDate>
      <link>https://dev.to/julies1/the-minimum-you-need-to-know-about-github-actions-6p7</link>
      <guid>https://dev.to/julies1/the-minimum-you-need-to-know-about-github-actions-6p7</guid>
      <description>&lt;h2&gt;
  
  
  What is GitHub Actions?
&lt;/h2&gt;

&lt;p&gt;Have you heard of GitHub Actions but assumed it was too complicated to learn? I had the same thought — until I used it on a real project (&lt;a href="https://dev.to/julies1/i-tried-to-learn-github-actions-twice-i-failed-the-first-time-but-ai-helped-me-succeed-the-second-4ph"&gt;Build and deploy Hugo site with GitHub Actions&lt;/a&gt;, &lt;a href="https://dev.to/julies1/how-to-schedule-posts-for-future-publication-1bem"&gt;Schedule future-dated posts with Github Actions&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Think of GitHub Actions as a robot living on GitHub: you call it, and it does exactly what you've told it to do. More precisely, it's GitHub's built-in automation. You write a workflow, and GitHub runs it for you whenever one of the events you specify happens. &lt;/p&gt;

&lt;p&gt;With GitHub Actions, I no longer build my Hugo site by hand: I push a new post, and the robot builds and deploys it.&lt;/p&gt;

&lt;p&gt;In this post I'll show you the two sections every workflow file needs, then walk you through a six-line workflow that you can paste into your own repository today. &lt;/p&gt;

&lt;h2&gt;
  
  
  A real example: my Hugo site
&lt;/h2&gt;

&lt;p&gt;Let me make this concrete with my own case of static site generation. With Hugo, the classic approach was to build the site locally and manually, then push the generated &lt;code&gt;public/&lt;/code&gt; folder to GitHub for deployment. With GitHub Actions, GitHub's servers take over the build. Now I just need to push a new post, and GitHub will build and deploy the site for me.&lt;/p&gt;

&lt;p&gt;Even better, GitHub Actions can run on a schedule, so it runs at the time and frequency you choose.&lt;/p&gt;

&lt;h2&gt;
  
  
  The magic is in the workflow file
&lt;/h2&gt;

&lt;p&gt;So how does it actually work? &lt;/p&gt;

&lt;p&gt;The key is to define the workflow file: a &lt;code&gt;.yml&lt;/code&gt; or &lt;code&gt;.yaml&lt;/code&gt; file under &lt;code&gt;.github/workflows/&lt;/code&gt;. It's the set of instructions we hand the "robot" in advance, so it knows what to do when it's triggered.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: a &lt;code&gt;workflows/&lt;/code&gt; folder can hold several workflow files.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Two sections are required: &lt;code&gt;on&lt;/code&gt; and &lt;code&gt;jobs&lt;/code&gt;.&lt;/strong&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  The &lt;code&gt;on&lt;/code&gt; section: when it runs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The &lt;code&gt;on&lt;/code&gt; section specifies which events trigger the workflow.&lt;/strong&gt; For example, a &lt;code&gt;push&lt;/code&gt; to a branch, or a &lt;code&gt;pull_request&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let's use the Hugo site as our example. Its workflow lists three triggers: &lt;code&gt;push&lt;/code&gt;, &lt;code&gt;schedule&lt;/code&gt;, and &lt;code&gt;workflow_dispatch&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;26&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*'&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;push&lt;/code&gt; trigger means the workflow runs whenever someone pushes to the &lt;code&gt;main&lt;/code&gt; branch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;schedule&lt;/code&gt; trigger runs the workflow on a cron schedule — here, at 01:26 UTC every day. GitHub's cron uses UTC, so convert your local time. I walk through every cron field in &lt;a href="https://dev.to/julies1/how-to-schedule-posts-for-future-publication-1bem"&gt;this post&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;workflow_dispatch&lt;/code&gt; trigger lets you run the workflow manually. Normally a workflow only starts in response to an event, so testing it means making a throwaway commit. &lt;code&gt;workflow_dispatch&lt;/code&gt; exists precisely so you don't have to.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adding &lt;code&gt;workflow_dispatch&lt;/code&gt; puts a &lt;strong&gt;Run workflow&lt;/strong&gt; button at the top of the Actions tab. Here's how to use it:&lt;/p&gt;

&lt;p&gt;(1) In your repository, click the &lt;strong&gt;Actions&lt;/strong&gt; tab;&lt;/p&gt;

&lt;p&gt;(2) In the left sidebar, click the workflow name;&lt;/p&gt;

&lt;p&gt;(3) On the right side, click the &lt;strong&gt;Run workflow&lt;/strong&gt; button. The button only exists when the file contains &lt;code&gt;workflow_dispatch&lt;/code&gt;. You can pick the branch here.&lt;/p&gt;

&lt;p&gt;(4) The new run appears at the top of the list.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: pay attention to the indentation before each trigger. I once made the mistake of putting &lt;code&gt;schedule&lt;/code&gt; on the same indentation level as the &lt;code&gt;branches&lt;/code&gt; under &lt;code&gt;push&lt;/code&gt;, that cost me a lot of time debugging.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The &lt;code&gt;jobs&lt;/code&gt; section: what it does
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The &lt;code&gt;jobs&lt;/code&gt; section specifies what the workflow does when it runs.&lt;/strong&gt; In the Hugo example, the jobs build and deploy the site.&lt;/p&gt;

&lt;p&gt;Each job needs two keys:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;runs-on&lt;/code&gt;&lt;/strong&gt;: the machine the job runs on (&lt;code&gt;ubuntu-latest&lt;/code&gt;, &lt;code&gt;windows-latest&lt;/code&gt;, &lt;code&gt;macos-latest&lt;/code&gt;, …);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;steps&lt;/code&gt;&lt;/strong&gt;: the list of individual tasks to run, &lt;strong&gt;in order&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The code below shows the &lt;code&gt;build&lt;/code&gt; job. The &lt;code&gt;deploy&lt;/code&gt; job that follows it is omitted. You can read the full workflow &lt;a href="https://github.com/Juliecodestack/Juliecodestack.github.io/blob/main/.github/workflows/hugo.yml" rel="noopener noreferrer"&gt;here&lt;/a&gt; .&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;HUGO_VERSION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.166.0&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Hugo CLI&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb &amp;amp;&amp;amp; sudo dpkg -i ${{ runner.temp }}/hugo.deb&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Dart Sass&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sudo snap install dart-sass&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;submodules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;recursive&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Pages&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pages&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/configure-pages@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Node.js dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[[&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-f&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;package-lock.json&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;||&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-f&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;npm-shrinkwrap.json&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;]]&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;npm&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ci&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;||&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build with Hugo&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;HUGO_CACHEDIR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ runner.temp }}/hugo_cache&lt;/span&gt;
          &lt;span class="na"&gt;HUGO_ENV&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hugo --gc --minify&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload artifact&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-pages-artifact@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./public&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the job top to bottom and you can follow the flow: install Hugo and Dart Sass; check out the repository onto the runner; build the site with Hugo; and pack the &lt;code&gt;public/&lt;/code&gt; folder as a Pages artifact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;In fact, you've been using this kind of thing for years — an auto-reply rule in your email app runs the moment a message arrives. GitHub Actions is the same idea applied to your code.&lt;/p&gt;

&lt;p&gt;GitHub is full of examples, too. Open your first pull request on a project, for instance, and you may receive a welcome message — that's GitHub Actions at work.&lt;/p&gt;

&lt;p&gt;How do you write your first GitHub Action? &lt;/p&gt;

&lt;p&gt;You don't need a site on GitHub Pages yet. Start small: set up a push-triggered workflow in any repository. Here's a complete, minimal one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;push&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;hello&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo "hello"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save it as &lt;code&gt;.github/workflows/hello.yml&lt;/code&gt; in your repository. Push, and it runs.  &lt;/p&gt;

&lt;p&gt;Keep in mind that GitHub Actions runs on a GitHub-hosted runner, so &lt;code&gt;echo "hello"&lt;/code&gt; won't display on your local terminal. Where does it go?&lt;/p&gt;

&lt;p&gt;The output is captured in the run's log. To view it, open your repository on GitHub and click the &lt;strong&gt;Actions&lt;/strong&gt; tab. Then click the run and then the job (&lt;code&gt;hello&lt;/code&gt; in this example).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqu0dydr7rtz0nka183y2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqu0dydr7rtz0nka183y2.png" alt=" raw `hello` endraw  job" width="799" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Expand the step, and you will see &lt;code&gt;hello&lt;/code&gt; in the log.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkb5l2a7hhnts3uhavd00.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkb5l2a7hhnts3uhavd00.png" alt="run's log" width="799" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it. Now you have a workflow that runs on every push. And that's the whole trick: you write a workflow file, GitHub does the work.&lt;/p&gt;

&lt;p&gt;If you want to go further:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a schedule: reuse the &lt;code&gt;schedule&lt;/code&gt; trigger from the &lt;code&gt;on&lt;/code&gt; section so your site rebuilds itself every night, and please remember the cron runs in UTC.&lt;/li&gt;
&lt;li&gt;Add a manual trigger: add &lt;code&gt;workflow_dispatch&lt;/code&gt; and you get a &lt;strong&gt;Run workflow&lt;/strong&gt; button, so you can test a workflow change without pushing a throwaway commit.&lt;/li&gt;
&lt;li&gt;Read a real one: here's &lt;a href="https://github.com/Juliecodestack/Juliecodestack.github.io/blob/main/.github/workflows/hugo.yml" rel="noopener noreferrer"&gt;the full workflow file&lt;/a&gt; for my Hugo site. Now you should be able to follow it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Have you set up GitHub Actions in your own repository yet? I'd love to hear what you're automating with it.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>beginners</category>
      <category>automation</category>
      <category>hugo</category>
    </item>
    <item>
      <title>How to schedule future-dated posts with Github Actions?</title>
      <dc:creator>Julie</dc:creator>
      <pubDate>Tue, 06 Oct 2026 12:30:00 +0000</pubDate>
      <link>https://dev.to/julies1/how-to-schedule-posts-for-future-publication-1bem</link>
      <guid>https://dev.to/julies1/how-to-schedule-posts-for-future-publication-1bem</guid>
      <description>&lt;p&gt;Sometimes you may write several posts in one sitting when you have ideas, but you may not want to publish them all at once. Instead, you’d like to publish them one at a time on future dates.&lt;/p&gt;

&lt;p&gt;You can automate this with GitHub Actions. Here’s how.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Add a scheduled trigger to the GitHub Actions workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  First, set the schedule in &lt;code&gt;hugo.yml&lt;/code&gt;.
&lt;/h3&gt;

&lt;p&gt;Open your Hugo workflow file, usually at &lt;code&gt;.github/workflows/hugo.yml&lt;/code&gt; or &lt;code&gt;.github/workflows/hugo.yaml&lt;/code&gt;. In the &lt;code&gt;on:&lt;/code&gt; section, add a &lt;code&gt;schedule&lt;/code&gt; trigger as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
   &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;

   &lt;span class="c1"&gt;#add the following two lines&lt;/span&gt;
   &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What do the cron fields mean?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first two fields specify the minute (0-59) and the hour (0-23) of the scheduled time (&lt;strong&gt;in UTC&lt;/strong&gt;), respectively. In the example above, &lt;code&gt;0 1&lt;/code&gt; specifies 01:00 UTC.&lt;/p&gt;

&lt;p&gt;The last three fields specify the day of the month (1-31), the month (1-12), and the day of the week (0-6, where Sunday is 0). An asterisk (&lt;code&gt;*&lt;/code&gt;) matches all values in that field. So when the last three fields are &lt;code&gt;* * *&lt;/code&gt; , there is no restriction on the day, month, or day of the week, and the workflow runs daily. Together with &lt;code&gt;0 1&lt;/code&gt;, &lt;code&gt;0 1 * * *&lt;/code&gt; means the workflow runs daily at 01:00 UTC.&lt;/p&gt;

&lt;h3&gt;
  
  
  Then, push the workflow file to GitHub.
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add .github/workflows/hugo.yml
git commit &lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="s2"&gt;"add daily schedule build for future posts"&lt;/span&gt;
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: Scheduled workflows run from the default branch, and GitHub may delay scheduled runs during periods of high load.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 2: Set a future date in the post front matter
&lt;/h2&gt;

&lt;p&gt;In the front matter of a new post, set the &lt;code&gt;date&lt;/code&gt; field to the time when you want it to be published. &lt;/p&gt;

&lt;p&gt;Set the time in the &lt;code&gt;date&lt;/code&gt; field slightly earlier than the schedule build time. For example, if the workflow runs at 01:00 UTC, use 00:00 UTC or earlier. This ensures that the post is no longer in the future when Hugo builds the site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Previewing future posts locally
&lt;/h2&gt;

&lt;p&gt;You can run &lt;code&gt;hugo server&lt;/code&gt; to preview your site locally, but future-dated posts will not appear. To include them, run &lt;code&gt;hugo server --buildFuture&lt;/code&gt; or &lt;code&gt;hugo server -F&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Do not add &lt;code&gt;--buildFuture&lt;/code&gt; to the GitHub Actions build command (&lt;code&gt;hugo&lt;/code&gt;); otherwise, future-dated posts will be published immediately.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Can I use the classic deployment approach?
&lt;/h2&gt;

&lt;p&gt;The key to scheduling future posts is that the build must happen after the post's scheduled publication time. With GitHub Actions, the build runs on GitHub's servers, so it can be scheduled. In the classic approach, you build the site locally and then push the &lt;code&gt;public/&lt;/code&gt; folder to GitHub. The build is performed manually.&lt;/p&gt;

&lt;p&gt;Therefore, the classic approach cannot schedule builds by itself. You would need to set up a scheduled task on your own machine or another server to run &lt;code&gt;hugo&lt;/code&gt; and push the generated files.&lt;/p&gt;

</description>
      <category>hugo</category>
      <category>github</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I tried to learn GitHub Actions twice: I failed the first time, but AI helped me succeed the second time</title>
      <dc:creator>Julie</dc:creator>
      <pubDate>Wed, 30 Sep 2026 01:17:03 +0000</pubDate>
      <link>https://dev.to/julies1/i-tried-to-learn-github-actions-twice-i-failed-the-first-time-but-ai-helped-me-succeed-the-second-4ph</link>
      <guid>https://dev.to/julies1/i-tried-to-learn-github-actions-twice-i-failed-the-first-time-but-ai-helped-me-succeed-the-second-4ph</guid>
      <description>&lt;p&gt;The first time I tried to deploy a static site using GitHub Actions, I gave up halfway through the tutorials. The second time, with the help of an AI agent, I had the site deployed in several hours — and I finally understood how it all worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first time, I gave up
&lt;/h2&gt;

&lt;p&gt;I first encountered GitHub Actions while reading Hugo static site deployment tutorials. Most showed the classic approach: run &lt;code&gt;hugo&lt;/code&gt; locally, push the &lt;code&gt;public&lt;/code&gt; folder to GitHub, done. A few mentioned GitHub Actions. This approach uses a workflow and saves time. The automatic workflow sounded efficient and I wanted to give it a try.&lt;/p&gt;

&lt;p&gt;But the tutorials were too brief; they only included a few commands and the workflow file (&lt;code&gt;hugo.yml&lt;/code&gt;). It was hard to follow because some settings were not written clearly enough. I didn't even know where to put these files. Perhaps the authors assumed that readers were already familiar with GitHub Actions and were simply applying it to static site generation. In fact, I had never used GitHub Actions explicitly before. I spent some time trying to figure out what GitHub Actions actually was. This opened up a much broader topic: there are many different kinds of Actions on GitHub. Eventually, I gave up.&lt;/p&gt;

&lt;p&gt;I went back to the classic way. It was simpler — build locally, push &lt;code&gt;public&lt;/code&gt; , and deploy. It worked, but every time I published a post I had to build and then push the whole &lt;code&gt;public&lt;/code&gt; folder. I told myself I would learn GitHub Actions "someday". &lt;/p&gt;

&lt;h2&gt;
  
  
  The second time, I succeeded
&lt;/h2&gt;

&lt;p&gt;That "someday" came three years later. This time, when I updated my website, I thought, "Why not let an AI agent help me do this and try GitHub Actions again?" &lt;/p&gt;

&lt;p&gt;I opened an AI agent. First, I chatted with it to get a general idea of the differences between the two deployment approaches. It explained that the classic approach builds locally (on your machine) and pushes the output, while GitHub Actions builds on GitHub's servers, so you only need to push your new posts. That was enough context to start.&lt;/p&gt;

&lt;p&gt;Then I asked it to set everything up for me. Here is the prompt I used:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In this folder, Mysite is the original folder used to generate the static website using Hugo, and then it was connected to GitHub to deploy GitHub Pages. I used &lt;code&gt;hugo&lt;/code&gt; to generate the files and push the public folder to GitHub. &lt;/p&gt;

&lt;p&gt;Now I want to: 1. Switch the theme. The new theme has been configured in the Mysite_paper folder, so please use this folder. 2. Switch from pushing the public folder to using GitHub Actions.&lt;/p&gt;

&lt;p&gt;Don't do it now. First tell me your plan.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The AI came back with two decisions I needed to make:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Where should the Hugo source code live? In the same repository on new branch, or in a separate repository?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How should the theme be tracked in Git? As a submodule or vendored?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of just picking whatever it recommended, I asked it to explain the trade-offs first. Then I chose the "same repository and new branch" option, so that I wouldn't have to switch between repositories later. I chose to track the theme as a Git submodule. With a submodule, the theme is referenced from its own repository, so you can update it easily later. The vendored approach removes the theme's &lt;code&gt;.git&lt;/code&gt; directory and commits the files directly. It looks simpler, but you have to update manually.&lt;/p&gt;

&lt;p&gt;Once those decisions were made, the AI agent laid out a clear, step-by-step plan and started implementing it. It added the Git submodule, a &lt;code&gt;.gitignore&lt;/code&gt; file, and the workflow file to my local project. After that, the AI agent tried to push to GitHub but failed with the error:  &lt;code&gt;GitHub is unreachable from the current network&lt;/code&gt; .   &lt;/p&gt;

&lt;p&gt;So I asked the AI to list what I needed to do manually. Four clear steps. I followed them.&lt;/p&gt;

&lt;p&gt;Two things went wrong, and both turned out to be instructive.&lt;/p&gt;

&lt;p&gt;First, Git Credential Manager kept asking for authentication. I checked my SSH connection — it was fine. I asked the AI why it thought the connection failed. It realized it had tried HTTPS, whereas I usually used SSH. It then gave me the correct SSH-based command, and the push worked.&lt;/p&gt;

&lt;p&gt;Second, the first deployment failed with the error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;building succeeded, deploying failed. Branch &lt;span class="s1"&gt;'main'&lt;/span&gt; is not allowed to deploy to github-pages due to environment protection rules.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I pasted the error message to the AI. It explained that GitHub Pages was still configured to deploy from the &lt;code&gt;master&lt;/code&gt; branch, while my repository now uses the &lt;code&gt;main&lt;/code&gt; branch. I followed its instructions to change the branch settings, and the next build succeeded.&lt;/p&gt;

&lt;h2&gt;
  
  
  What made the difference?
&lt;/h2&gt;

&lt;p&gt;So what changed between the first attempt and the second one? It wasn't that GitHub Actions got easier. It was that AI removed the barriers holding me back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, the AI handled the setup work.&lt;/strong&gt; It wrote the workflow file (&lt;code&gt;hugo.yml&lt;/code&gt;), configured the Git submodule, generated the &lt;code&gt;.gitignore&lt;/code&gt; file. These are the small, tedious tasks that make a beginner feel lost. With them handled, I could focus on understanding what GitHub Actions actually does instead of fighting with config files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, it lowered the mental barrier.&lt;/strong&gt; In the past, I thought "this is too complex, I need to learn all of this first." With AI by my side, I knew I could start and ask when I got stuck. Although I still didn't know enough, I had the confidence to work on it and get it done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This flipped my learning order.&lt;/strong&gt; I used to think that the right sequence was: learn the theory thoroughly, then practice. Now I think it is: &lt;strong&gt;do first, learn along the way&lt;/strong&gt;. AI can be a great one-on-one tutor, explaining things to you and guiding you through the process. &lt;/p&gt;

&lt;p&gt;This time, I didn't look for any tutorials to read. Instead, I asked the AI to tell me what to do at each step. When I didn't understand why to do it, I would pause and asked the AI to explain it. In the end, I got GitHub Actions configured and I learned more through practice than by just reading tutorials.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do I understand it now?
&lt;/h2&gt;

&lt;p&gt;To be honest, I can't write a workflow file from scratch yet. But I understand the big picture: GitHub builds the site on its own servers, so I only push my Markdown posts. I know where the workflow file lives, what each major step does, and where to look when something breaks. That's more than I knew a week ago, and it's enough to maintain this setup and debug simple issues.&lt;/p&gt;

&lt;p&gt;The key shift is this: I didn't wait until I "fully understood" to start. I started with a working scaffold or starter template, and I understood it piece by piece as I built on it. &lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts: start first, learn along the way
&lt;/h2&gt;

&lt;p&gt;This experience changed how I think about learning. For practical skills such as deploying a site, configuring a tool, or building an app, the hardest part isn't understanding. It's starting. Every small roadblock (a confusing config line, an authentication error, a branch setting) is a reason to quit. As a beginner, you don't know where to find the solution. AI can now act as a one-on-one tutor, helping you fix these problems and remove the roadblocks.&lt;/p&gt;

&lt;p&gt;If there's a tool or skill you've been putting off because "it's too complex to learn," try this: instead of turning to tutorials, open an AI agent, describe what you want to build or learn. Let the AI give you a general idea first, and then help you get a working version. Ask it to explain what you don't understand as you go. In my experience, once you start working on it, you will run into problems, fix them, and learn a lot along the way.&lt;/p&gt;

&lt;p&gt;At least, that was my experience with GitHub Actions. I had put it off for three years. This time, I started with a working setup, asked the AI when I got stuck, and filled in the gaps as I went.&lt;/p&gt;

&lt;p&gt;You'll learn more in an afternoon of doing than in a week of reading. And you may find that the thing you've been putting off isn't as hard as you expected.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>github</category>
      <category>beginners</category>
    </item>
    <item>
      <title>AI Writes Code Now — So What Should We Actually Learn?</title>
      <dc:creator>Julie</dc:creator>
      <pubDate>Sat, 12 Sep 2026 02:51:05 +0000</pubDate>
      <link>https://dev.to/julies1/ai-writes-the-code-now-so-what-should-we-actually-learn-3c6l</link>
      <guid>https://dev.to/julies1/ai-writes-the-code-now-so-what-should-we-actually-learn-3c6l</guid>
      <description>&lt;p&gt;&lt;strong&gt;With AI coding, I can build things faster than ever. Yet I've never felt less in control.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Last November, with the launch of GPT 5.1 and Claude Opus 4.5, something changed: AI started producing production-ready code in minutes. &lt;/p&gt;

&lt;p&gt;Since then, I've found myself thinking about building more things. In the past, a lot held me back: where should I start? Should I learn more frontend and backend before diving in? Now AI can put together a project in minutes, and I can study the code afterwards. &lt;/p&gt;

&lt;p&gt;But at the same time, I feel like I'm losing control over the projects. I'm not writing the code myself,  and I have no idea what exactly each line of code does. &lt;/p&gt;

&lt;p&gt;If AI writes most of the code, what should we actually learn — and how?&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Learn
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Regaining Control
&lt;/h3&gt;

&lt;p&gt;I used to think I could only truly understand a project if I understood, or even wrote every line of code myself. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now that AI writes most of the code, we need to change our perspective and see AI coding as a higher level of abstraction.&lt;/strong&gt; It produces modules and functions. As long as these parts pass tests and behave as expected, we can use them without knowing every implementation detail.&lt;/p&gt;

&lt;p&gt;When scripting languages such as JavaScript and Python came out, some programmers argued that these were not "real" programming languages like C or assembly, because they used a higher level of abstraction and did not compile directly to native machine code in the same way. Today, these scripting languages are widely used. We may see AI coding as an even higher level of abstraction. &lt;/p&gt;

&lt;p&gt;But abstraction does not mean blind trust. We regain control by managing module boundaries and risks: what each module is responsible for, what goes in and out, how it fails, and what breaks if we change it. Tests and clear interfaces make this practical. We do not need every detail; we need to know where the risks are and how to check them.&lt;/p&gt;

&lt;p&gt;This is control at a higher level. The skills behind it are what we turn to next.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Core of Coding Skills
&lt;/h3&gt;

&lt;p&gt;I used to think that if AI did the coding, my coding skills would be hard to improve without deliberate practice. However, as &lt;a href="https://dev.to/pascal_cescato_692b7a8a20"&gt;Pascal CESCATO&lt;/a&gt; pointed out in &lt;a href="https://dev.to/pascal_cescato_692b7a8a20/comment/3e7ha"&gt;our conversations about AI coding&lt;/a&gt;, "(With AI coding,) I feel that I can spend more time thinking about the system instead of spending hours translating my thoughts into syntax." &lt;/p&gt;

&lt;p&gt;This leads me to ask what really matters—the core of coding skills. Syntax still matters, but translating ideas into code is no longer the bottleneck. &lt;strong&gt;What matters more is the ability to decompose a problem, choose the right abstractions, design clear interfaces, model data, trace control flow, evaluate trade-offs, and verify behavior.&lt;/strong&gt; These are the skills that let you supervise AI output rather than merely accept it.&lt;/p&gt;

&lt;p&gt;When we read AI-generated code, we should treat it as a design to be examined, not just a result to be accepted. Identify the key decisions: where the module boundaries are, why the interfaces look the way they do, how data is modeled, and which dependencies point in which direction. Then ask whether we would have made the same choices—and what trade-offs those choices imply.&lt;/p&gt;

&lt;p&gt;We do not need to study every line, but need to understand the structure well enough to test it and improve it.  That kind of understanding is best built in real projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Practice: Through Projects
&lt;/h2&gt;

&lt;p&gt;Some might argue that basics like syntax are the foundation of coding. If you don't even practice and master them until they become muscle memory, how can you master higher-level skills like architecture? &lt;/p&gt;

&lt;p&gt;Don't get me wrong—syntax and other basics are very important; we need to master them. But instead of typing the same lines of code over and over to memorize them, we can now learn them by using them in a project. This approach is more effective.&lt;/p&gt;

&lt;p&gt;Start with a project you are interested in. Let AI build the first version. &lt;/p&gt;

&lt;p&gt;Then read it as a design: map the modules, trace the data, check the interfaces, and ask what trade-offs it makes. &lt;/p&gt;

&lt;p&gt;Finally, rewrite the core part yourself—the part where the real design decisions live—so you use the fundamentals without writing boilerplate again and again. &lt;/p&gt;

&lt;p&gt;I had a similar experience before the AI era. When I was learning list comprehensions in Python, I typed out the examples, but I didn't use them in my own code. Some time later, I forgot how to use them. &lt;/p&gt;

&lt;p&gt;Then, in a Kaggle competition, the dataset had a huge number of columns. How should I select a few to analyze? In a highly upvoted notebook, the author used list comprehensions to select columns and extract the data. Its elegance impressed me. I had learned the syntax, but I did not know I could apply it to the dataset. Following the notebook's example, I tried selecting different columns as I wanted. After that, I finally knew how to use list comprehensions. Learning them in context was far more effective than studying examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;So what should we learn in the age of AI? The same things that have always mattered—just in a different way. &lt;/p&gt;

&lt;p&gt;We still need to learn the fundamentals, but we learn them best by using them in real projects. &lt;/p&gt;

&lt;p&gt;We still need to understand code, but not every line. &lt;/p&gt;

&lt;p&gt;We regain control not by writing every line of code ourselves, but by understanding how the system fits together and why some parts matter more than others.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are your thoughts on AI coding? I'd love to hear them — feel free to leave a comment below.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Special thanks to &lt;a class="mentioned-user" href="https://dev.to/pascal_cescato_692b7a8a20"&gt;@pascal_cescato_692b7a8a20&lt;/a&gt;. Our conversations inspired this post.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
