<?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: Oxypteros</title>
    <description>The latest articles on DEV Community by Oxypteros (@oxypteros).</description>
    <link>https://dev.to/oxypteros</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3354545%2F08f3a843-05c4-4507-9cca-81522701af21.png</url>
      <title>DEV Community: Oxypteros</title>
      <link>https://dev.to/oxypteros</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oxypteros"/>
    <language>en</language>
    <item>
      <title>We're All Temporarily Abled</title>
      <dc:creator>Oxypteros</dc:creator>
      <pubDate>Fri, 24 Oct 2025 17:11:39 +0000</pubDate>
      <link>https://dev.to/oxypteros/were-all-temporarily-abled-1m5p</link>
      <guid>https://dev.to/oxypteros/were-all-temporarily-abled-1m5p</guid>
      <description>&lt;p&gt;We like to separate things into neat boxes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accessibility for disabilities,&lt;/li&gt;
&lt;li&gt;Usability for convenience,&lt;/li&gt;
&lt;li&gt;Performance for speed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the ultimate question for a project should be: Can a human reach, read, and use what we built?&lt;/p&gt;

&lt;p&gt;The box-model, while it is the foundation of the web, as a thought model is faulty.&lt;/p&gt;

&lt;p&gt;A dark-only theme that becomes unreadable in daylight is just a &lt;em&gt;“usability issue”&lt;/em&gt;?&lt;br&gt;
A bloated page that never loads on a weak connection is just a &lt;em&gt;“performance issue”&lt;/em&gt;?&lt;br&gt;
A flashing animation that distracts people is just a &lt;em&gt;“usability issue”&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;All of them disable access and therefore, all of them are accessibility issues?&lt;br&gt;
It doesn't matter what box you pick because the box doesn't exist.&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.amazonaws.com%2Fuploads%2Farticles%2Frds20f8nc88qsaghlcf7.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.amazonaws.com%2Fuploads%2Farticles%2Frds20f8nc88qsaghlcf7.png" alt="A venn diagram of three circles: Accessibility, Performance and Usaability. The single point where all three circles overlap is marked as Inclusivity" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  We’re All Temporarily Abled
&lt;/h2&gt;

&lt;p&gt;Most people think of web accessibility under the prism of "helping people with disabilities". This creates a soft boundary of them/us. But "true accessibility" is about everyone!&lt;/p&gt;

&lt;p&gt;It's &lt;strong&gt;Inclusivity!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because, in reality, we are all abled only for a timeframe.&lt;/p&gt;

&lt;p&gt;Can a user with tired eyes, a dim phone screen or just under direct sunlight can access a well-build site better than one with a screen reader?&lt;/p&gt;

&lt;p&gt;You have 20/20 eyesight and can read the stylish tiny text but tomorrow?&lt;/p&gt;

&lt;p&gt;You have a fast laptop now, but next month you’ll be stuck with poor signal on a slow device trying to open a 10MB web page.&lt;/p&gt;

&lt;p&gt;In all those moments, you are temporarily disabled, not by your body, but by design choices that didn’t consider your situation.&lt;/p&gt;

&lt;p&gt;Inclusivity isn’t only about a fixed group of users with disabilities. It’s about developing and designing for variability. For human conditions that shift with age, environment, attention, or technology.&lt;/p&gt;

&lt;p&gt;The modern developer should have a unique mantra:&lt;br&gt;
&lt;strong&gt;&lt;em&gt;“No matter who you are, where you are, or how you access it, you can use it.”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Broader Responsibility
&lt;/h2&gt;

&lt;p&gt;If a website is not screen reader friendly, too heavy for slow networks, too dark for daylight, too flashy for concentration, or too rigid for older devices, it’s not inclusive.&lt;/p&gt;

&lt;p&gt;It’s tunnel-vision design. Assuming the world will always meet the developer’s setup.&lt;/p&gt;

&lt;p&gt;Inclusivity is humble. It recognizes that everyone becomes disabled, even if only for a moment.&lt;/p&gt;

&lt;p&gt;So when we design for inclusivity we’re not checking a box.&lt;br&gt;
We’re simply future-proofing our humanity—making sure that when it’s our turn to be the one “disabled to access,” we’ll still be able to see, read, and connect.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;“Develop like everyone’s ability expires tomorrow, because in some way, it does.”&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>a11y</category>
      <category>ux</category>
    </item>
    <item>
      <title>Installing Hugo on Linux: The Reliable Way</title>
      <dc:creator>Oxypteros</dc:creator>
      <pubDate>Fri, 18 Jul 2025 12:19:15 +0000</pubDate>
      <link>https://dev.to/oxypteros/installing-hugo-on-linux-the-reliable-way-411h</link>
      <guid>https://dev.to/oxypteros/installing-hugo-on-linux-the-reliable-way-411h</guid>
      <description>&lt;p&gt;Recently, a user trying to get started with my theme, got stuck. They had tried to install Hugo on Ubuntu, followed a few different guides, and ended up with multiple, conflicting Hugo versions on their system. Their frustration was palpable, and it's a story I've come across more than once.&lt;/p&gt;

&lt;p&gt;The official Hugo docs are great, but the Linux ecosystem has a few quirks. This guide is my attempt to provide a crystal-clear, &lt;strong&gt;"do this and it will work"&lt;/strong&gt; method for Linux users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Rules
&lt;/h2&gt;

&lt;p&gt;Before we touch the terminal, let's establish three rules. Following these will save you from &lt;strong&gt;99%&lt;/strong&gt; of future problems.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Avoid Your Distro's Package Manager.&lt;/strong&gt; This is the most important rule (&lt;code&gt;apt&lt;/code&gt;, &lt;code&gt;dnf&lt;/code&gt;, etc) almost always contain outdated versions of Hugo. In some cases &lt;strong&gt;two years old&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check Your Theme's Requirements.&lt;/strong&gt; Themes require a &lt;strong&gt;minimum&lt;/strong&gt; Hugo version to work. Always check the theme's &lt;code&gt;theme.toml&lt;/code&gt; file first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update How You Installed.&lt;/strong&gt; If you install manually, you must update manually. If you used a &lt;code&gt;snap&lt;/code&gt; package, stick with that. Mixing installation methods is the fastest way to break your setup.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With that said, let's install Hugo.&lt;/p&gt;

&lt;h3&gt;
  
  
  My recommendation: Manual Installation
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;safest&lt;/strong&gt;, most &lt;strong&gt;reliable&lt;/strong&gt;, problem-free method is to install the pre-compiled binary from Hugo's official GitHub releases. It has never failed me.&lt;br&gt;
This is my preferred method for all my Linux machines. It's clean, simple, and gives you full control.&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Step 1: Download the Correct Archive&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Go to the &lt;a href="https://github.com/gohugoio/hugo/releases" rel="noopener noreferrer"&gt;Hugo Releases page&lt;/a&gt;. Expand the &lt;strong&gt;Assets&lt;/strong&gt; list, for the version you need and find the extended version for your system. &lt;br&gt;
For most users this will be: &lt;code&gt;hugo_extended_[VERSION]_linux-amd64.tar.gz&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Step 2: Download it&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Make sure is saved to your &lt;code&gt;~/Downloads&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debian/Ubuntu&lt;/strong&gt; and derivatives:&lt;br&gt;
 You can download the &lt;code&gt;.deb&lt;/code&gt; file from the &lt;strong&gt;Assets&lt;/strong&gt; list and install it with: &lt;code&gt;sudo dpkg -i hugo_extended_*_linux-*.deb&lt;/code&gt;&lt;br&gt;&lt;br&gt;
This works well, but the manual method below works on &lt;strong&gt;any Linux distribution.&lt;/strong&gt;  &lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Step 3: Install Hugo with a single Copy/Paste&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;This command block will create the necessary directory, extract the &lt;code&gt;hugo&lt;/code&gt; binary into it, and make it executable. &lt;br&gt;
It's the simplest way to perform a local install.&lt;/p&gt;

&lt;p&gt;Open a terminal and run this command block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;
  &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.local/bin
  &lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xvzf&lt;/span&gt; ~/Downloads/hugo_extended_&lt;span class="k"&gt;*&lt;/span&gt;.tar.gz &lt;span class="nt"&gt;-C&lt;/span&gt; ~/.local/bin/ hugo
  hugo version
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This command assumes you only have one Hugo &lt;code&gt;tar.gz&lt;/code&gt; file in your &lt;code&gt;Downloads/&lt;/code&gt; folder. If it fails, make sure that's the case.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Step 4: Add Hugo to your PATH&lt;/strong&gt; (&lt;em&gt;One-Time Setup&lt;/em&gt;)
&lt;/h4&gt;

&lt;p&gt;The final step is to make sure your system knows where to find the &lt;code&gt;hugo&lt;/code&gt; command. You may need to add &lt;code&gt;~/.local/bin&lt;/code&gt; to your system's &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Restart your terminal and run &lt;code&gt;hugo version&lt;/code&gt;.&lt;br&gt;
If it works: &lt;strong&gt;You're done!&lt;/strong&gt; Your &lt;code&gt;PATH&lt;/code&gt; is already configured correctly.&lt;/p&gt;

&lt;p&gt;If it says &lt;strong&gt;"command not found"&lt;/strong&gt;: You need to edit your shell's startup file. &lt;/p&gt;

&lt;p&gt;Run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PATH="$HOME/.local/bin:$PATH"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, restart your terminal or run &lt;code&gt;source ~/.bashrc&lt;/code&gt;. (If you use Zsh, change &lt;code&gt;.bashrc&lt;/code&gt; to &lt;code&gt;.zshrc&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Update Hugo Manually
&lt;/h3&gt;

&lt;p&gt;Updating is now simple. Just repeat the process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the new version from GitHub.&lt;/li&gt;
&lt;li&gt;Run the same single command block from &lt;strong&gt;Step 3&lt;/strong&gt;. It will overwrite the old &lt;code&gt;hugo&lt;/code&gt; binary with the new one.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The hugo-install Script
&lt;/h3&gt;

&lt;p&gt;For my own use, I wrapped this entire process into a small Bash script. &lt;/p&gt;

&lt;p&gt;It does the same thing as the commands above, but it's a bit smarter. It checks for errors and also gives you the option to install Hugo globally for all users.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Fast One-Liner
&lt;/h4&gt;

&lt;p&gt;This is the fastest way. This command downloads the script, names it &lt;code&gt;hugo-install&lt;/code&gt;, and makes it executable, all in one go.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; hugo-install https://alpha.oxypteros.com/downloads/hugo-install &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;chmod&lt;/span&gt; +x hugo-install &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Script 'hugo-install' downloaded to: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/hugo-install"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After downloading, you can inspect the script with &lt;code&gt;cat hugo-install&lt;/code&gt; or open it in a text editor to see exactly what it does before running it with &lt;code&gt;./hugo-install&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Manual Way
&lt;/h4&gt;

&lt;p&gt;If you prefer, you can create the file yourself. Save the code below as &lt;code&gt;hugo-install&lt;/code&gt;, make it executable with &lt;code&gt;chmod +x hugo-install&lt;/code&gt;, and run it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash
# A script to safely install the latest version of Hugo on Linux.
# It's designed to be run after downloading the .tar.gz file from GitHub.

# Exit immediately if a command exits with a non-zero status.
set -e

# Configuration &amp;amp; Colors
GREEN='\e[32m'
RED='\e[31m'
YELLOW='\e[33m'
BOLD_GREEN='\e[1;32m'
RESET='\e[0m'

# Path Variables
DOWNLOADS_DIR="$HOME/Downloads"
LOCAL_INSTALL_DIR="$HOME/.local/bin"
GLOBAL_INSTALL_DIR="/opt/hugo"
GLOBAL_SYMLINK_PATH="/usr/local/bin/hugo"

# Main Script
echo -e "${BOLD_GREEN}Starting Hugo Installer...${RESET}"

# Find the Hugo archive.
echo "Searching for 'hugo_*_linux-*.tar.gz' in '$DOWNLOADS_DIR'..."
HUGO_ARCHIVES=$(find "$DOWNLOADS_DIR" -maxdepth 1 -name "hugo_*_linux-*.tar.gz")
ARCHIVE_COUNT=$(echo "$HUGO_ARCHIVES" | grep -c .)

# Handle cases with zero or multiple archives found.
if [ "$ARCHIVE_COUNT" -eq 0 ]; then
  echo -e "${RED}Error: No Hugo archive found.${RESET}"
  echo "Please download the 'hugo_*_linux-*.tar.gz' file from GitHub Releases and place it in your '$DOWNLOADS_DIR' folder."
  echo "URL: https://github.com/gohugoio/hugo/releases"
  exit 1
elif [ "$ARCHIVE_COUNT" -gt 1 ]; then
  echo -e "${RED}Error: Multiple Hugo archives found.${RESET}"
  echo "Ensure there is only ONE 'hugo_*_linux-*.tar.gz' file in your '$DOWNLOADS_DIR' folder and run this script again."
  echo -e "Found files:\n$HUGO_ARCHIVES"
  exit 1
fi

echo -e "${GREEN}Found Hugo archive: $(basename "$HUGO_ARCHIVES")${RESET}"

# Ask the user for installation type.
read -p "Install Hugo for the current user only (local)? [Y/n] " -n 1 -r
echo 

if [[ $REPLY =~ ^[Nn]$ ]]; then
  # Global Installation
  echo -e "\n${BOLD_GREEN}Starting global installation...${RESET}"
  echo "Hugo will be installed in '$GLOBAL_INSTALL_DIR' and symlinked to '$GLOBAL_SYMLINK_PATH'."

  # Create destination directory if it doesn't exist.
  if [ ! -d "$GLOBAL_INSTALL_DIR" ]; then
    echo "Creating destination directory (requires sudo)..."
    sudo mkdir -p "$GLOBAL_INSTALL_DIR"
  fi

  # Extract directly into the destination directory.
  echo "Extracting 'hugo' binary to '$GLOBAL_INSTALL_DIR' (requires sudo)..."
  sudo tar --no-same-owner -xvzf "$HUGO_ARCHIVES" -C "$GLOBAL_INSTALL_DIR" hugo
  sudo chmod +x "$GLOBAL_INSTALL_DIR/hugo" 

  # Check and create symlink.
  if [ -L "$GLOBAL_SYMLINK_PATH" ]; then
    if [ "$(readlink "$GLOBAL_SYMLINK_PATH")" != "$GLOBAL_INSTALL_DIR/hugo" ]; then
        echo -e "${YELLOW}Warning: Existing symlink at '$GLOBAL_SYMLINK_PATH' points to a different Hugo installation.${RESET}"
        echo "You may need to remove it manually if you want to use this new version."
    else
        echo -e "${GREEN}Symlink already correctly points to the new installation.${RESET}"
    fi
  else
    echo "Creating symlink in /usr/local/bin (requires sudo)..."
    sudo ln -s "$GLOBAL_INSTALL_DIR/hugo" "$GLOBAL_SYMLINK_PATH"
  fi

else
  # Local Installation
  echo -e "\n${BOLD_GREEN}Starting local installation...${RESET}"
  echo "Hugo will be installed in '$LOCAL_INSTALL_DIR'."

  # Create destination directory if it doesn't exist.
  if [ ! -d "$LOCAL_INSTALL_DIR" ]; then
    echo "Creating destination directory: $LOCAL_INSTALL_DIR"
    mkdir -p "$LOCAL_INSTALL_DIR"
  fi

  # Extract directly into the destination directory.
  echo "Extracting 'hugo' binary to '$LOCAL_INSTALL_DIR'..."
  tar --no-same-owner -xvzf "$HUGO_ARCHIVES" -C "$LOCAL_INSTALL_DIR" hugo
  chmod +x "$LOCAL_INSTALL_DIR/hugo"

  # Check if the install directory is in the user's PATH and provide instructions if not.
  if [[ ":$PATH:" != *":$LOCAL_INSTALL_DIR:"* ]]; then
    echo -e "\n${YELLOW}IMPORTANT POST-INSTALL ACTION${RESET}"
    echo "To use hugo from your terminal, you need to add '$LOCAL_INSTALL_DIR' to your PATH."
    echo "Run the following command, then restart your terminal:"
    echo -e "${BOLD_GREEN}echo 'export PATH=\"\$HOME/.local/bin:\$PATH\"' &amp;gt;&amp;gt; ~/.bashrc${RESET}"
    echo "(If you use Zsh, change '.bashrc' to '.zshrc')"
  fi
fi

# Final Verification
echo -e "\n${BOLD_GREEN}Installation complete!${RESET}"
echo "Verifying Hugo version:"
# Use the full path to ensure we're running the one we just installed.
if [[ $REPLY =~ ^[Nn]$ ]]; then
    "$GLOBAL_SYMLINK_PATH" version
else
    "$LOCAL_INSTALL_DIR/hugo" version
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Whether you do it manually or with the script, you now have a rock-solid Hugo installation that will serve you well.&lt;/p&gt;

</description>
      <category>hugo</category>
      <category>linux</category>
      <category>ubuntu</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The Accidental Framework: How a Simple Warning Became a Hugo Validation Tool</title>
      <dc:creator>Oxypteros</dc:creator>
      <pubDate>Wed, 16 Jul 2025 15:31:44 +0000</pubDate>
      <link>https://dev.to/oxypteros/the-accidental-framework-how-a-simple-warning-became-a-hugo-validation-tool-2fpl</link>
      <guid>https://dev.to/oxypteros/the-accidental-framework-how-a-simple-warning-became-a-hugo-validation-tool-2fpl</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;LiVa&lt;/strong&gt;, a small validation framework for my Hugo theme, &lt;strong&gt;Alpha&lt;/strong&gt;, to catch common errors in &lt;em&gt;config files&lt;/em&gt;, &lt;em&gt;frontmatter&lt;/em&gt;, and &lt;em&gt;shortcodes&lt;/em&gt; before they go live. This is the story of how a simple hack evolved into a core feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why LiVa Exists
&lt;/h2&gt;

&lt;p&gt;While developing Alpha—originally just for myself—I kept running into small but annoying issues. I’d write a shortcode, come back to it days later, and forget which keys or values it accepted.&lt;/p&gt;

&lt;p&gt;That frustration peaked when I spent hours debugging a major issue! &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why does the shortcode work on one page but not another? &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The cause? A classic case of developer error: &lt;strong&gt;A typo&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Nothing unique about that frustration but that day it really stuck. So I stopped everything and wrote a rudimentary block of code that would:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read shortcode inputs.&lt;/li&gt;
&lt;li&gt;Validate them against expected values.&lt;/li&gt;
&lt;li&gt;Throw a &lt;code&gt;warnf&lt;/code&gt; message in Hugo’s terminal if there was a mismatch.&lt;/li&gt;
&lt;li&gt;Append a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; on the page with the same message for visual feedback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple, effective. Copy-pasted (&lt;em&gt;DRY who?&lt;/em&gt;) into every shortcode. And done—so I thought.&lt;/p&gt;

&lt;h2&gt;
  
  
  From One-Time Shortcut to Persistent Helper
&lt;/h2&gt;

&lt;p&gt;At this point, the theme was still personal. That changed when some &lt;em&gt;non-tech&lt;/em&gt; friends grew skeptical after I told them:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Anyone with an email address can have a personal website without spending a penny."&lt;/em&gt;  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They volunteered to try Alpha, and one of them actually loved that &lt;em&gt;"warning thingy"&lt;/em&gt;. &lt;br&gt;
Their excitement after their successful attempt was the catalyst: &lt;strong&gt;Alpha was going public.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Public Release Changed Everything
&lt;/h2&gt;

&lt;p&gt;Going from private to public meant rewriting almost everything. Not for show, but because Alpha had to be as beginner-friendly as possible. &lt;strong&gt;Defaults&lt;/strong&gt; and &lt;strong&gt;fallbacks&lt;/strong&gt; everywhere.&lt;/p&gt;

&lt;p&gt;The most time-consuming refactor was for that &lt;em&gt;"warning thingy"&lt;/em&gt;, which now had to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate config files.&lt;/li&gt;
&lt;li&gt;Check page frontmatter.&lt;/li&gt;
&lt;li&gt;Inspect Markdown content.&lt;/li&gt;
&lt;li&gt;And of course, monitor shortcodes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The plan was simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An error occurs.&lt;/li&gt;
&lt;li&gt;Go templates detects and informs the JS counterpart.&lt;/li&gt;
&lt;li&gt;A FAB (&lt;em&gt;floating action button&lt;/em&gt;) on the page informs the user.&lt;/li&gt;
&lt;li&gt;Clicking the FAB opens a modal with the error message and a suggested solution.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The modal would be hidden by default to avoid distracting from writing, aligning with Alpha’s core goals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unexpected User Behavior Issues
&lt;/h2&gt;

&lt;p&gt;While my setup worked for me, I realized not everyone develops/writes like I do. Some users focus entirely on the editor without previewing pages in the browser.&lt;/p&gt;

&lt;p&gt;Those users &lt;strong&gt;wouldn’t&lt;/strong&gt; see LiVa’s FAB.&lt;/p&gt;

&lt;p&gt;So LiVa needed &lt;strong&gt;terminal warnings&lt;/strong&gt; too. Even during builds. That way, if someone never previews their site but runs &lt;code&gt;hugo&lt;/code&gt; to deploy, they’d still get feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  UI Struggles: Global vs. Local Scope
&lt;/h2&gt;

&lt;p&gt;However a major issue remained, LiVa was not a fully global tool, and this is where things got tricky:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User is viewing &lt;strong&gt;Page A&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Editing &lt;strong&gt;Page B&lt;/strong&gt;, where an error occurs (e.g. &lt;em&gt;typo in SEO image filename&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Hugo rebuilds &lt;strong&gt;Page B&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Page A&lt;/strong&gt; knows nothing of course,  so &lt;strong&gt;no warning&lt;/strong&gt; shown.&lt;/li&gt;
&lt;li&gt;User deploys with hidden errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solutions I Explored:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scanning&lt;/strong&gt; &lt;code&gt;public/&lt;/code&gt; &lt;strong&gt;:&lt;/strong&gt;  Not viable. It would require external dependencies, breaking Alpha’s “works out of the box” rule.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Using a global data store&lt;/strong&gt; (&lt;code&gt;.Store&lt;/code&gt;)&lt;strong&gt;:&lt;/strong&gt; This seemed perfect, but stored values persisted even after errors were fixed, forcing a server restart to clear them. I experimented with clearing the store dynamically, but the results were too unreliable, so I eventually dropped it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s where I left it: &lt;strong&gt;LiVa isn’t globally scoped&lt;/strong&gt; (&lt;em&gt;yet&lt;/em&gt;), but it provides robust feedback within its current limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  How LiVa Works Today
&lt;/h2&gt;

&lt;p&gt;LiVa detects and reports &lt;strong&gt;~40 errors&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  Terminal Warnings
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2Fmsk0k5puqtfgq5yk0ka1.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.amazonaws.com%2Fuploads%2Farticles%2Fmsk0k5puqtfgq5yk0ka1.png" alt="A LiVa warning on the terminal" width="700" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Global scoped.&lt;/li&gt;
&lt;li&gt;Guaranteed even during build.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  LiVa Console
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2Faxgvdqdi7uncybp1fojv.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.amazonaws.com%2Fuploads%2Farticles%2Faxgvdqdi7uncybp1fojv.png" alt="A LiVa warning on the Console" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Page-scoped errors show up only if that page is loaded in the browser.&lt;/li&gt;
&lt;li&gt;Global errors show on every page.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  On-Page Alerts
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2Fra3hoeky1bun6727t0c1.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.amazonaws.com%2Fuploads%2Farticles%2Fra3hoeky1bun6727t0c1.png" alt="A LiVa warning on-page" width="757" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Errors affecting page flow (e.g. in shortcodes or Markdown) also appear inline, right where the issue occurs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Extras
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Offline help for shortcodes, Markdown, LiVa itself.&lt;/li&gt;
&lt;li&gt;Checks for Alpha and Hugo updates.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Developing LiVa taught me more about Hugo than building the theme itself.  &lt;/p&gt;

&lt;p&gt;The self-imposed limitations (&lt;em&gt;zero dependencies, no distractions&lt;/em&gt;) forced me to think more intuitively and balance my &lt;em&gt;"developer ego"&lt;/em&gt; with real-world usability.&lt;/p&gt;

&lt;p&gt;In the end LiVa evolved from a copy-pasted hack into a flexible &lt;strong&gt;framework&lt;/strong&gt; controlled entirely through data files—making it expandable and potentially portable to other themes.&lt;/p&gt;

&lt;p&gt;When I decided to make Alpha public, I didn’t expect that my most valuable contribution wouldn't be just the theme's design, but the tooling built into it. It’s what makes Alpha different from just another Hugo theme.&lt;/p&gt;

&lt;p&gt;It’s a theme that &lt;strong&gt;actively helps you avoid mistakes&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;If you're interested in the theme or the code behind LiVa, you can explore them on GitHub. Feedback or questions are always welcome!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/oxypteros/alpha/" rel="noopener noreferrer"&gt;Explore the Alpha Theme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alpha.oxypteros.com/" rel="noopener noreferrer"&gt;View the Live Demo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>hugo</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
