Add new blog post: Development Environment Evolution with Guix Home

- New post: 2025-09-28-dev-environment-evolution-guix-home.md
- Documents transition to Guix Home on WSL2 Ubuntu
- Covers custom Emacs 31.0.50 build and Scheme development setup
- Includes real Guix Home configuration with guile-hoot
- Updated build and deploy scripts with line ending fixes
- Regenerated RSS feed and site index with new post
This commit is contained in:
Glenn 2025-09-28 11:27:10 +03:00
parent 15a4e025ec
commit dc4a5654ab
16 changed files with 2228 additions and 4454 deletions

View File

@ -32,9 +32,14 @@ Visit the live site at [https://glenneth.org](https://glenneth.org)
``` ```
3. Start the development server: 3. Start the development server:
```bash ```bash
./serve.sh # Option 1: Build and serve with auto-reload
./build.sh --serve
# Option 2: Development mode with CSS watching
npm run dev
``` ```
This will start a live-server instance with auto-reload on port 3001. - `./build.sh --serve` starts a live-server on port 9000 (or next available port)
- `npm run dev` runs Tailwind CSS in watch mode + live-server on port 3000
## Content Management ## Content Management
### Adding New Blog Posts ### Adding New Blog Posts

344
build.sh
View File

@ -1,172 +1,172 @@
#!/bin/bash #!/bin/bash
# Default settings # Default settings
PORT=9000 # Changed default to avoid common conflicts PORT=9000 # Changed default to avoid common conflicts
SERVE=false SERVE=false
DEBUG=false DEBUG=false
# Parse command line arguments # Parse command line arguments
while [[ "$#" -gt 0 ]]; do while [[ "$#" -gt 0 ]]; do
case $1 in case $1 in
--serve) SERVE=true ;; --serve) SERVE=true ;;
--port) PORT="$2"; shift ;; --port) PORT="$2"; shift ;;
--debug) DEBUG=true ;; --debug) DEBUG=true ;;
*) echo "Unknown parameter: $1"; exit 1 ;; *) echo "Unknown parameter: $1"; exit 1 ;;
esac esac
shift shift
done done
# Function to log debug messages # Function to log debug messages
log_debug() { log_debug() {
if [ "$DEBUG" = true ]; then if [ "$DEBUG" = true ]; then
echo "[DEBUG] $1" echo "[DEBUG] $1"
fi fi
} }
# Function to cleanup and exit # Function to cleanup and exit
cleanup() { cleanup() {
echo -e "\nShutting down server..." echo -e "\nShutting down server..."
pkill -f "live-server.*:$PORT" 2>/dev/null pkill -f "live-server.*:$PORT" 2>/dev/null
exit 0 exit 0
} }
# Function to check if a port is in use # Function to check if a port is in use
check_port() { check_port() {
local port=$1 local port=$1
nc -z localhost "$port" >/dev/null 2>&1 nc -z localhost "$port" >/dev/null 2>&1
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
return 0 # Port is in use return 0 # Port is in use
fi fi
return 1 # Port is free return 1 # Port is free
} }
# Function to find next available port # Function to find next available port
find_available_port() { find_available_port() {
local port=$1 local port=$1
local max_port=$((port + 100)) # Don't search indefinitely local max_port=$((port + 100)) # Don't search indefinitely
while [ "$port" -lt "$max_port" ]; do while [ "$port" -lt "$max_port" ]; do
if ! check_port "$port"; then if ! check_port "$port"; then
echo "$port" echo "$port"
return 0 return 0
fi fi
port=$((port + 1)) port=$((port + 1))
done done
echo "Error: No available ports found between $1 and $max_port" >&2 echo "Error: No available ports found between $1 and $max_port" >&2
exit 1 exit 1
} }
# Set up trap for Ctrl+C (SIGINT) if serving # Set up trap for Ctrl+C (SIGINT) if serving
if [ "$SERVE" = true ]; then if [ "$SERVE" = true ]; then
trap cleanup SIGINT trap cleanup SIGINT
fi fi
# Directory structure # Directory structure
MD_DIR="content/posts" MD_DIR="content/posts"
DEPLOY_DIR="deploy" DEPLOY_DIR="deploy"
POSTS_DEPLOY_DIR="$DEPLOY_DIR/content/posts" POSTS_DEPLOY_DIR="$DEPLOY_DIR/content/posts"
DIST_DIR="$DEPLOY_DIR/dist" DIST_DIR="$DEPLOY_DIR/dist"
SRC_DIR="src" SRC_DIR="src"
# Ensure all required directories exist # Ensure all required directories exist
dirs_to_create=( dirs_to_create=(
"$MD_DIR" "$MD_DIR"
"$DEPLOY_DIR" "$DEPLOY_DIR"
"$POSTS_DEPLOY_DIR" "$POSTS_DEPLOY_DIR"
"$DIST_DIR" "$DIST_DIR"
"$SRC_DIR" "$SRC_DIR"
) )
for dir in "${dirs_to_create[@]}"; do for dir in "${dirs_to_create[@]}"; do
if [ ! -d "$dir" ]; then if [ ! -d "$dir" ]; then
echo "Creating directory: $dir" echo "Creating directory: $dir"
mkdir -p "$dir" mkdir -p "$dir"
fi fi
done done
# Build CSS first to ensure styles are available # Build CSS first to ensure styles are available
echo "Building CSS..." echo "Building CSS..."
if ! npm run build; then if ! npm run build; then
echo "Error: Failed to build CSS" echo "Error: Failed to build CSS"
exit 1 exit 1
fi fi
echo "Checking for new markdown files..." echo "Checking for new markdown files..."
CONVERTED_COUNT=0 CONVERTED_COUNT=0
# Loop through all markdown files # Loop through all markdown files
for md_file in "$MD_DIR"/*.md; do for md_file in "$MD_DIR"/*.md; do
# Skip if no markdown files found # Skip if no markdown files found
[[ -e "$md_file" ]] || continue [[ -e "$md_file" ]] || continue
base_name=$(basename "$md_file") base_name=$(basename "$md_file")
html_file="$POSTS_DEPLOY_DIR/${base_name%.md}.html" html_file="$POSTS_DEPLOY_DIR/${base_name%.md}.html"
local_html_file="$MD_DIR/${base_name%.md}.html" local_html_file="$MD_DIR/${base_name%.md}.html"
log_debug "Processing $base_name" log_debug "Processing $base_name"
# Check if HTML file doesn't exist or markdown file is newer # Check if HTML file doesn't exist or markdown file is newer
if [[ ! -f "$html_file" ]] || [[ "$md_file" -nt "$html_file" ]]; then if [[ ! -f "$html_file" ]] || [[ "$md_file" -nt "$html_file" ]]; then
echo "Converting $base_name to HTML..." echo "Converting $base_name to HTML..."
if ! node "$SRC_DIR/js/md-to-html.js" "$md_file" "$html_file"; then if ! node "$SRC_DIR/js/md-to-html.js" "$md_file" "$html_file"; then
echo "Error: Failed to convert $base_name to HTML" echo "Error: Failed to convert $base_name to HTML"
exit 1 exit 1
fi fi
cp "$html_file" "$local_html_file" cp "$html_file" "$local_html_file"
((CONVERTED_COUNT++)) ((CONVERTED_COUNT++))
fi fi
done done
echo "Converted $CONVERTED_COUNT new or modified files" echo "Converted $CONVERTED_COUNT new or modified files"
# Update summaries in index.html # Update summaries in index.html
echo "Updating blog post summaries in index.html..." echo "Updating blog post summaries in index.html..."
if ! npm run update-summaries; then if ! npm run update-summaries; then
echo "Error: Failed to update summaries" echo "Error: Failed to update summaries"
exit 1 exit 1
fi fi
# Generate RSS feed # Generate RSS feed
echo "Generating RSS feed..." echo "Generating RSS feed..."
if ! node "$SRC_DIR/js/generate-rss.js"; then if ! node "$SRC_DIR/js/generate-rss.js"; then
echo "Error: Failed to generate RSS feed" echo "Error: Failed to generate RSS feed"
exit 1 exit 1
fi fi
# Copy necessary files to deploy directory # Copy necessary files to deploy directory
echo "Copying files to deploy directory..." echo "Copying files to deploy directory..."
cp index.html "$DEPLOY_DIR/" cp index.html "$DEPLOY_DIR/"
cp -r dist/* "$DEPLOY_DIR/dist/" cp -r dist/* "$DEPLOY_DIR/dist/"
# If --serve flag is provided, start the server # If --serve flag is provided, start the server
if [ "$SERVE" = true ]; then if [ "$SERVE" = true ]; then
# Find available port if specified port is in use # Find available port if specified port is in use
FINAL_PORT=$(find_available_port "$PORT") FINAL_PORT=$(find_available_port "$PORT")
echo "Starting local server on port $FINAL_PORT..." echo "Starting local server on port $FINAL_PORT..."
echo "Visit http://localhost:$FINAL_PORT to view your site" echo "Visit http://localhost:$FINAL_PORT to view your site"
echo "Press Ctrl+C to stop the server" echo "Press Ctrl+C to stop the server"
# Copy deploy files to root for local development # Copy deploy files to root for local development
cp -r "$DEPLOY_DIR"/* . cp -r "$DEPLOY_DIR"/* .
# Ensure live-server exists # Ensure live-server exists
if [ ! -f "./node_modules/.bin/live-server" ]; then if [ ! -f "./node_modules/.bin/live-server" ]; then
echo "Error: live-server not found. Please run 'npm install' first." echo "Error: live-server not found. Please run 'npm install' first."
exit 1 exit 1
fi fi
# Start live-server with specific options # Start live-server with specific options
./node_modules/.bin/live-server \ ./node_modules/.bin/live-server \
--port="$FINAL_PORT" \ --port="$FINAL_PORT" \
--no-browser \ --no-browser \
--watch="*.html,*.css,content/**/*.html" \ --watch="*.html,*.css,content/**/*.html" \
--wait=50 \ --wait=50 \
--quiet \ --quiet \
--ignore=node_modules \ --ignore=node_modules \
. .
# Keep script running until Ctrl+C # Keep script running until Ctrl+C
wait wait
fi fi

View File

@ -1,149 +1,148 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" class="bg-base-bg"> <html lang="en" class="bg-base-bg">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content=""> <meta name="description" content="">
<meta property="og:title" content=""One Year of Craftering: Building Connections in the System Crafters Community""> <meta property="og:title" content="Blog Post">
<meta property="og:description" content=""> <meta property="og:description" content="">
<meta property="og:url" content="https://glenneth.orgcontent/posts/2025-04-04-one-year-of-craftering"> <meta property="og:url" content="https://glenneth.orgcontent/posts/2025-04-04-one-year-of-craftering">
<title>"One Year of Craftering: Building Connections in the System Crafters Community" - Glenn Thompson</title> <title>Blog Post - Glenn Thompson</title>
<link rel="alternate" type="application/rss+xml" title="Glenn Thompson's Blog" href="/feed.xml" /> <link rel="alternate" type="application/rss+xml" title="Glenn Thompson's Blog" href="/feed.xml" />
<link href="/dist/styles.css" rel="stylesheet"> <link href="/dist/styles.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
<style> <style>
.prose-palenight { .prose-palenight {
--tw-prose-body: #bfc7d5; --tw-prose-body: #bfc7d5;
--tw-prose-headings: #ffd580; --tw-prose-headings: #ffd580;
--tw-prose-links: #82aaff; --tw-prose-links: #82aaff;
--tw-prose-code: #c792ea; --tw-prose-code: #c792ea;
--tw-prose-pre-bg: #1b1e2b; --tw-prose-pre-bg: #1b1e2b;
} }
.prose h2 { .prose h2 {
color: var(--tw-prose-headings); color: var(--tw-prose-headings);
font-family: Merriweather, serif; font-family: Merriweather, serif;
font-weight: 700; font-weight: 700;
font-size: 1.5rem; font-size: 1.5rem;
margin-top: 2rem; margin-top: 2rem;
margin-bottom: 1rem; margin-bottom: 1rem;
} }
.prose p { .prose p {
margin-bottom: 1rem; margin-bottom: 1rem;
line-height: 1.625; line-height: 1.625;
} }
.prose a { .prose a {
color: var(--tw-prose-links); color: var(--tw-prose-links);
text-decoration: none; text-decoration: none;
} }
.prose a:hover { .prose a:hover {
color: #89ddff; color: #89ddff;
} }
.prose code { .prose code {
color: var(--tw-prose-code); color: var(--tw-prose-code);
font-family: 'JetBrains Mono', monospace; font-family: 'JetBrains Mono', monospace;
} }
.prose pre { .prose pre {
background-color: var(--tw-prose-pre-bg); background-color: var(--tw-prose-pre-bg);
padding: 1rem; padding: 1rem;
border-radius: 0.5rem; border-radius: 0.5rem;
overflow-x: auto; overflow-x: auto;
margin-bottom: 1rem; margin-bottom: 1rem;
} }
.prose ul, .prose ol { .prose ul, .prose ol {
margin-top: 0.5rem; margin-top: 0.5rem;
margin-bottom: 1rem; margin-bottom: 1rem;
padding-left: 1.5rem; padding-left: 1.5rem;
} }
.prose ul { .prose ul {
list-style-type: disc; list-style-type: disc;
} }
.prose ol { .prose ol {
list-style-type: decimal; list-style-type: decimal;
} }
</style> </style>
</head> </head>
<body class="bg-base-bg text-palenight-50"> <body class="bg-base-bg text-palenight-50">
<nav class="bg-base-darker/80 backdrop-blur-sm shadow-sm border-b border-palenight-400/20 mb-8"> <nav class="bg-base-darker/80 backdrop-blur-sm shadow-sm border-b border-palenight-400/20 mb-8">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex items-center justify-between h-16"> <div class="flex items-center justify-between h-16">
<a href="/" class="text-accent-yellow font-serif text-xl font-bold">Glenn Thompson</a> <a href="/" class="text-accent-yellow font-serif text-xl font-bold">Glenn Thompson</a>
<div class="flex items-center gap-2 text-accent-yellow text-sm font-bold"> <div class="flex items-center gap-2 text-accent-yellow text-sm font-bold">
<span>[community, webring, systemcrafters, reflection]</span> <span>Tech</span>
<span></span> <span></span>
<time datetime="2025-04-02">April 2, 2025</time> <time datetime="undefined">Invalid Date</time>
<span></span> <span></span>
<span>3 min read</span> <span>3 min read</span>
</div> </div>
</div> </div>
</div> </div>
</nav> </nav>
<main class="pt-24 pb-16 px-4"> <main class="pt-24 pb-16 px-4">
<div class="max-w-4xl mx-auto"> <div class="max-w-4xl mx-auto">
<div class="content text-palenight-100 space-y-6"> <div class="content text-palenight-100 space-y-6">
<header class="mb-8"> <header class="mb-8">
<h1 class="text-4xl font-serif font-bold text-accent-yellow">"One Year of Craftering: Building Connections in the System Crafters Community"</h1> <h1 class="text-4xl font-serif font-bold text-accent-yellow">Blog Post</h1>
<div class="flex items-center gap-4 text-palenight-300 mt-4"> <div class="flex items-center gap-4 text-palenight-300 mt-4">
<time datetime="2025-04-02">2025-04-02</time> <time datetime=""></time>
<span></span> <span></span>
<span>3 min read</span> <span>3 min read</span>
<span></span> <span></span>
<span>By Glenn Thompson</span> <span>By Glenn Thompson</span>
</div> </div>
<div class="flex flex-wrap gap-2 mt-4"> </header>
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">[community</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">webring</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">systemcrafters</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">reflection]</span>
</div> <article class="prose prose-palenight max-w-none">
</header> <hr>
<h2>title: &quot;One Year of Craftering: Building Connections in the System Crafters Community&quot;<br>date: 2025-04-02<br>tags: [community, webring, systemcrafters, reflection]</h2>
<article class="prose prose-palenight max-w-none"> <p>Next Thursday, 03-APR-2025, marks the first anniversary of the <a href="https://craftering.shom.dev/">Craftering webring</a>, a vibrant community initiative started by <a href="https://shom.dev">shom</a> that connects personal websites and blogs within the System Crafters community. As one of the members of this webring, I&#39;ve had the privilege of being part of this journey from its early days.</p>
<p>Next Thursday, 03-APR-2025, marks the first anniversary of the <a href="https://craftering.shom.dev/">Craftering webring</a>, a vibrant community initiative started by <a href="https://shom.dev">shom</a> that connects personal websites and blogs within the System Crafters community. As one of the members of this webring, I&#39;ve had the privilege of being part of this journey from its early days.</p> <h2>My First Pull Request</h2>
<h2>My First Pull Request</h2> <p>Joining Craftering was actually my first experience with the pull request workflow on Codeberg. As someone new to contributing to open source projects, I was initially intimidated by the process. However, shom took the time to walk me through each step, providing clear guidance and encouragement. This hands-on experience with git and PR workflows proved invaluable, making the technical aspects of contribution much less daunting.</p>
<p>Joining Craftering was actually my first experience with the pull request workflow on Codeberg. As someone new to contributing to open source projects, I was initially intimidated by the process. However, shom took the time to walk me through each step, providing clear guidance and encouragement. This hands-on experience with git and PR workflows proved invaluable, making the technical aspects of contribution much less daunting.</p> <p>As shom <a href="https://shom.dev/posts/20250401_how-i-accidentally-got-better-at-self-hosting-and-foss-contributing">recently reflected</a>, this kind of supportive onboarding was an intentional part of Craftering&#39;s design - creating opportunities for community members to learn and grow together through practical experience.</p>
<p>As shom <a href="https://shom.dev/posts/20250401_how-i-accidentally-got-better-at-self-hosting-and-foss-contributing">recently reflected</a>, this kind of supportive onboarding was an intentional part of Craftering&#39;s design - creating opportunities for community members to learn and grow together through practical experience.</p> <h2>The Power of Connected Personal Spaces</h2>
<h2>The Power of Connected Personal Spaces</h2> <p>The Craftering webring represents more than just a collection of links - it&#39;s a testament to the enduring value of personal websites and the importance of community-driven content. In an era dominated by social media platforms and algorithmic feeds, webrings offer a refreshing return to the web&#39;s roots: direct connections between individually crafted spaces.</p>
<p>The Craftering webring represents more than just a collection of links - it&#39;s a testament to the enduring value of personal websites and the importance of community-driven content. In an era dominated by social media platforms and algorithmic feeds, webrings offer a refreshing return to the web&#39;s roots: direct connections between individually crafted spaces.</p> <h2>Community Impact and Discoveries</h2>
<h2>Community Impact and Discoveries</h2> <p>Being part of the Craftering webring has enriched my own blogging experience in several ways:</p>
<p>Being part of the Craftering webring has enriched my own blogging experience in several ways:</p> <ol>
<ol> <li><p><strong>Diverse Perspectives</strong>: Through the webring, I&#39;ve discovered fellow creators sharing their experiences with everything from Emacs configurations to system design principles.</p>
<li><p><strong>Diverse Perspectives</strong>: Through the webring, I&#39;ve discovered fellow creators sharing their experiences with everything from Emacs configurations to system design principles.</p> </li>
</li> <li><p><strong>Technical Cross-Pollination</strong>: Reading other members&#39; blogs has introduced me to new tools and approaches. For instance, my recent <a href="/content/posts/2025-01-02-from-haunt-to-custom.html">transition to a custom static site generator</a> was partly inspired by discussions and posts from the community.</p>
<li><p><strong>Technical Cross-Pollination</strong>: Reading other members&#39; blogs has introduced me to new tools and approaches. For instance, my recent <a href="/content/posts/2025-01-02-from-haunt-to-custom.html">transition to a custom static site generator</a> was partly inspired by discussions and posts from the community.</p> </li>
</li> <li><p><strong>Consistent Motivation</strong>: Knowing that my blog is part of an interconnected community has encouraged more regular writing and sharing.</p>
<li><p><strong>Consistent Motivation</strong>: Knowing that my blog is part of an interconnected community has encouraged more regular writing and sharing.</p> </li>
</li> </ol>
</ol> <h2>Technical Integration and RSS</h2>
<h2>Technical Integration and RSS</h2> <p>One of the strengths of the Craftering webring is its embrace of RSS feeds, making it easy to follow updates from all community members. The webring&#39;s <a href="https://craftering.shom.dev/Craftering.opml">OPML file</a> allows for quick subscription to all member feeds, creating a genuine sense of connection through content updates.</p>
<p>One of the strengths of the Craftering webring is its embrace of RSS feeds, making it easy to follow updates from all community members. The webring&#39;s <a href="https://craftering.shom.dev/Craftering.opml">OPML file</a> allows for quick subscription to all member feeds, creating a genuine sense of connection through content updates.</p> <h2>Looking Forward</h2>
<h2>Looking Forward</h2> <p>As we celebrate this first year, it&#39;s exciting to see how the webring has grown and evolved. From the initial members to our current diverse group, each addition has brought new perspectives and valuable contributions to our community.</p>
<p>As we celebrate this first year, it&#39;s exciting to see how the webring has grown and evolved. From the initial members to our current diverse group, each addition has brought new perspectives and valuable contributions to our community.</p> <p>The success of Craftering demonstrates that the spirit of the early web - decentralized, personal, and community-driven - is very much alive. It shows that there&#39;s still tremendous value in maintaining personal spaces on the web, connected through shared interests and mutual respect for individual expression.</p>
<p>The success of Craftering demonstrates that the spirit of the early web - decentralized, personal, and community-driven - is very much alive. It shows that there&#39;s still tremendous value in maintaining personal spaces on the web, connected through shared interests and mutual respect for individual expression.</p> <h3>Join the Ring</h3>
<h3>Join the Ring</h3> <p>If you maintain a personal website and are interested in connecting with like-minded individuals, consider <a href="https://codeberg.org/SystemCrafters/craftering">joining the Craftering webring</a>. The process is straightforward, and you&#39;ll be joining a supportive community of creators and thinkers who value personal expression and technical craftsmanship.</p>
<p>If you maintain a personal website and are interested in connecting with like-minded individuals, consider <a href="https://codeberg.org/SystemCrafters/craftering">joining the Craftering webring</a>. The process is straightforward, and you&#39;ll be joining a supportive community of creators and thinkers who value personal expression and technical craftsmanship.</p> <p>Here&#39;s to another year of crafting, sharing, and building connections in our corner of the web!</p>
<p>Here&#39;s to another year of crafting, sharing, and building connections in our corner of the web!</p>
</article>
</article> </div>
</div> </div>
</div> </main>
</main> <footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="text-center">
<div class="text-center"> <p class="text-palenight-300">&copy; 2024 Glenn Thompson. All rights reserved.</p>
<p class="text-palenight-300">&copy; 2024 Glenn Thompson. All rights reserved.</p> <div class="webring-text mt-6">
<div class="webring-text mt-6"> <p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p> </div>
</div> <div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue"> <a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">Previous</a>
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">Previous</a> <a href="https://craftering.systemcrafters.net/@glenneth" class="hover:text-accent-cyan">Random</a>
<a href="https://craftering.systemcrafters.net/@glenneth" class="hover:text-accent-cyan">Random</a> <a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">Next</a>
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">Next</a> </div>
</div> <p class="text-palenight-300 mt-2">
<p class="text-palenight-300 mt-2"> <a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> | <a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a> </p>
</p> </div>
</div> </div>
</div> </footer>
</footer> </body>
</body>
</html> </html>

View File

@ -0,0 +1,273 @@
<!DOCTYPE html>
<html lang="en" class="bg-base-bg">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content=""Six months after my comprehensive development environment overview, I share the significant evolution to Guix Home and enhanced Emacs configurations that have transformed my daily workflow."">
<meta property="og:title" content=""Development Environment Evolution: Embracing Guix Home and Enhanced Emacs Workflow"">
<meta property="og:description" content=""Six months after my comprehensive development environment overview, I share the significant evolution to Guix Home and enhanced Emacs configurations that have transformed my daily workflow."">
<meta property="og:url" content="https://glenneth.orgcontent/posts/2025-09-28-dev-environment-evolution-guix-home">
<title>"Development Environment Evolution: Embracing Guix Home and Enhanced Emacs Workflow" - Glenn Thompson</title>
<link rel="alternate" type="application/rss+xml" title="Glenn Thompson's Blog" href="/feed.xml" />
<link href="/dist/styles.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
<style>
.prose-palenight {
--tw-prose-body: #bfc7d5;
--tw-prose-headings: #ffd580;
--tw-prose-links: #82aaff;
--tw-prose-code: #c792ea;
--tw-prose-pre-bg: #1b1e2b;
}
.prose h2 {
color: var(--tw-prose-headings);
font-family: Merriweather, serif;
font-weight: 700;
font-size: 1.5rem;
margin-top: 2rem;
margin-bottom: 1rem;
}
.prose p {
margin-bottom: 1rem;
line-height: 1.625;
}
.prose a {
color: var(--tw-prose-links);
text-decoration: none;
}
.prose a:hover {
color: #89ddff;
}
.prose code {
color: var(--tw-prose-code);
font-family: 'JetBrains Mono', monospace;
}
.prose pre {
background-color: var(--tw-prose-pre-bg);
padding: 1rem;
border-radius: 0.5rem;
overflow-x: auto;
margin-bottom: 1rem;
}
.prose ul, .prose ol {
margin-top: 0.5rem;
margin-bottom: 1rem;
padding-left: 1.5rem;
}
.prose ul {
list-style-type: disc;
}
.prose ol {
list-style-type: decimal;
}
</style>
</head>
<body class="bg-base-bg text-palenight-50">
<nav class="bg-base-darker/80 backdrop-blur-sm shadow-sm border-b border-palenight-400/20 mb-8">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex items-center justify-between h-16">
<a href="/" class="text-accent-yellow font-serif text-xl font-bold">Glenn Thompson</a>
<div class="flex items-center gap-2 text-accent-yellow text-sm font-bold">
<span>["development", "guix", "guix-home", "emacs", "workflow", "productivity", "evolution"]</span>
<span></span>
<time datetime=""2025-09-28 10:05"">Invalid Date</time>
<span></span>
<span>8 min read</span>
</div>
</div>
</div>
</nav>
<main class="pt-24 pb-16 px-4">
<div class="max-w-4xl mx-auto">
<div class="content text-palenight-100 space-y-6">
<header class="mb-8">
<h1 class="text-4xl font-serif font-bold text-accent-yellow">"Development Environment Evolution: Embracing Guix Home and Enhanced Emacs Workflow"</h1>
<div class="flex items-center gap-4 text-palenight-300 mt-4">
<time datetime=""2025-09-28 10:05"">"2025-09-28 10:05"</time>
<span></span>
<span>8 min read</span>
<span></span>
<span>By Glenn Thompson</span>
</div>
<div class="flex flex-wrap gap-2 mt-4">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">["development"</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">"guix"</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">"guix-home"</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">"emacs"</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">"workflow"</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">"productivity"</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">"evolution"]</span>
</div>
</header>
<article class="prose prose-palenight max-w-none">
<h2>Introduction</h2>
<p>Six months ago, I shared a detailed look at my <a href="/content/posts/2025-03-08-my-dev-environment-2025.html">development environment in 2025</a>, covering my hybrid approach with ArcoLinux, Guix package management, and Emacs-centered workflow. Since then, my setup has undergone a significant evolution driven by both choice and necessity.</p>
<p>The most significant change has been a transition to <strong>WSL2 on Windows 11</strong> for my work environment, necessitated by corporate requirements. Rather than seeing this as a limitation, I&#39;ve embraced it as an opportunity to refine my development approach, adopting <strong>Guix Home</strong> for complete environment management and building a custom Emacs installation from the master branch.</p>
<p>This evolution has taught me valuable lessons about adaptability and the power of declarative configuration in maintaining consistency across different underlying systems.</p>
<h2>The Guix Home Revolution</h2>
<h3>From Hybrid to Unified</h3>
<p>In March, I described my hybrid approach using both pacman/AUR and Guix for different aspects of my system. While this worked well, I found myself constantly managing the boundary between system and user packages, dealing with occasional conflicts, and maintaining separate configuration files.</p>
<p><strong>Guix Home</strong> changed everything. Now I can declaratively manage:</p>
<ul>
<li>All my development tools and applications</li>
<li>Shell configuration and environment variables </li>
<li>Dotfiles and configuration files</li>
<li>Services and background processes</li>
<li>Desktop environment customizations</li>
</ul>
<h3>Current Guix Home Configuration</h3>
<p>My <code>home-configuration.scm</code> has become the single source of truth for my development environment, particularly focused on Scheme/Guile development:</p>
<pre><code class="language-scheme">;; Guix Home configuration for Glenn&#39;s Scheme development environment
(use-modules (gnu home)
(gnu packages)
(gnu services)
(gnu home services)
(gnu home services shells)
(gnu home services guix)
(gnu home services mcron)
(guix gexp))
(home-environment
;; Packages to install in the home environment
(packages (specifications-&gt;packages
&#39;(;; System essentials
&quot;glibc-locales&quot;
;; Scheme/Guile development environment
&quot;guile-next&quot; ; Latest Guile development version
&quot;guile-hoot&quot; ; Scheme to WebAssembly compiler
&quot;guile-goblins&quot; ; Distributed programming environment
&quot;guile-lib&quot; ; Useful Guile libraries
&quot;guile-reader&quot; ; Reader extensions for Guile
&quot;guile-json&quot; ; JSON support for Guile
;; Development tools
;; Note: Using custom-built Emacs 31.0.50 installation
&quot;git&quot; ; Version control
&quot;make&quot; ; Build system
&quot;gcc-toolchain&quot; ; C compiler and tools
&quot;pkg-config&quot; ; Package configuration
&quot;texinfo&quot; ; Documentation system
&quot;rlwrap&quot;))) ; Readline wrapper for better REPL experience
;; Services for the home environment
(services
(list
;; Set up environment variables for Scheme development
(simple-service &#39;scheme-dev-env-vars
home-environment-variables-service-type
&#39;((&quot;EDITOR&quot; . &quot;emacs&quot;)
(&quot;GUILE_LOAD_PATH&quot; . &quot;$HOME/.guix-home/profile/share/guile/site/3.0:$GUILE_LOAD_PATH&quot;)
(&quot;GUILE_LOAD_COMPILED_PATH&quot; . &quot;$HOME/.guix-home/profile/lib/guile/3.0/site-ccache:$GUILE_LOAD_COMPILED_PATH&quot;)
(&quot;GUIX_LOCPATH&quot; . &quot;$HOME/.guix-home/profile/lib/locale&quot;)
(&quot;GUILE_AUTO_COMPILE&quot; . &quot;1&quot;)
(&quot;GUILE_WARN_DEPRECATED&quot; . &quot;detailed&quot;)))
;; Add a simple mcron job for keeping system updated
(simple-service &#39;update-reminder
home-mcron-service-type
(list #~(job &quot;0 12 * * 0&quot; ; Every Sunday at noon
&quot;echo &#39;Consider running: guix pull &amp;&amp; guix home reconfigure ~/.config/guix/home-configuration.scm&#39;&quot;))))))
</code></pre>
<h3>Benefits Realized</h3>
<p>The transition to Guix Home has delivered on its promises:</p>
<p><strong>Complete Reproducibility</strong>: I can now recreate my entire user environment on any machine with a single command: <code>guix home reconfigure home-configuration.scm</code></p>
<p><strong>Atomic Updates</strong>: Changes to my environment are atomic - either they work completely or roll back cleanly. No more broken states from partial updates.</p>
<p><strong>Version Control Everything</strong>: My entire environment configuration lives in Git, with meaningful commit messages tracking every change to my setup.</p>
<p><strong>Effortless Rollbacks</strong>: When an update breaks something, <code>guix home roll-back</code> instantly restores the previous working state.</p>
<p><strong>Dependency Isolation</strong>: Each application gets exactly the dependencies it needs, eliminating conflicts between different tools requiring different library versions.</p>
<h2>Enhanced Emacs Workflow</h2>
<h3>Custom Emacs Build from Master</h3>
<p>One of the most significant changes in my setup has been building Emacs from the master branch rather than relying on distribution packages. This decision was driven by several factors:</p>
<ul>
<li><strong>Latest Features</strong>: Access to cutting-edge features and improvements before they reach stable releases</li>
<li><strong>WSL2 Optimization</strong>: Better integration with the WSL2 environment through custom compilation flags</li>
<li><strong>Performance Tuning</strong>: Ability to optimize the build for my specific use case and hardware</li>
</ul>
<p>Building Emacs 31.0.50 from source on WSL2 Ubuntu has given me a more responsive and feature-rich editing environment, particularly for Scheme development where the latest improvements in language support make a noticeable difference.</p>
<h3>Configuration Management Evolution</h3>
<p>While I was already using Emacs extensively in March, my configuration approach has matured significantly. I&#39;ve moved from a monolithic configuration to a modular, feature-based system that&#39;s easier to maintain and debug.</p>
<h3>New Emacs Enhancements</h3>
<p><strong>Improved LSP Integration</strong>: My language server setup now provides more consistent and reliable code intelligence across all my projects.</p>
<p><strong>Enhanced Org Mode Workflow</strong>: I&#39;ve integrated Org mode more deeply into my daily workflow for:</p>
<ul>
<li>Project planning and tracking</li>
<li>Meeting notes and documentation</li>
<li>Time tracking and productivity analysis</li>
<li>Knowledge management and linking</li>
</ul>
<p><strong>Better Terminal Integration</strong>: Using <code>vterm</code> and <code>multi-vterm</code>, I now have seamless terminal integration within Emacs, reducing context switching.</p>
<p><strong>Refined Completion System</strong>: My completion setup with Vertico, Consult, and Marginalia has been fine-tuned for faster, more intuitive navigation.</p>
<h3>Development Workflow Improvements</h3>
<p><strong>Project Management</strong>: Using <code>projectile</code> with enhanced project templates and automated setup scripts.</p>
<p><strong>Code Quality</strong>: Integrated formatting, linting, and testing directly into my editing workflow with immediate feedback.</p>
<p><strong>Documentation</strong>: Streamlined documentation generation and maintenance using Org mode&#39;s export capabilities.</p>
<h2>Workflow Integration Benefits</h2>
<h3>Seamless Environment Switching</h3>
<p>With Guix Home managing my entire environment, switching between different project contexts has become effortless. Each project can specify its exact dependencies, and Guix ensures they&#39;re available without affecting other projects.</p>
<h3>Consistent Across Machines</h3>
<p>Whether I&#39;m working on my desktop, laptop, or a remote server, my environment is identical. This consistency has eliminated the &quot;works on my machine&quot; problem entirely.</p>
<h3>Simplified Onboarding</h3>
<p>Setting up a new development machine now takes minutes instead of hours. Clone my configuration repository, run <code>guix home reconfigure</code>, and everything is ready.</p>
<h2>Challenges and Solutions</h2>
<h3>Learning Curve</h3>
<p><strong>Challenge</strong>: Guix Home&#39;s declarative approach required rethinking how I manage my environment.</p>
<p><strong>Solution</strong>: Incremental migration, starting with simple configurations and gradually adding complexity as I became more comfortable with the system.</p>
<h3>Documentation Gaps</h3>
<p><strong>Challenge</strong>: Guix Home is relatively new, with fewer examples and tutorials compared to traditional dotfile management.</p>
<p><strong>Solution</strong>: Active participation in the Guix community, reading source code, and documenting my own discoveries.</p>
<h3>Integration Complexity</h3>
<p><strong>Challenge</strong>: Some applications required custom integration work to play nicely with Guix Home.</p>
<p><strong>Solution</strong>: Creating custom service definitions and contributing them back to the community when possible.</p>
<h2>Performance and Productivity Impact</h2>
<p>The move to Guix Home has had measurable impacts on my productivity:</p>
<ul>
<li><strong>Reduced Setup Time</strong>: New project environments spin up in seconds</li>
<li><strong>Fewer Context Switches</strong>: Everything I need is consistently available</li>
<li><strong>Less Debugging</strong>: Reproducible environments mean fewer environment-related issues</li>
<li><strong>Improved Focus</strong>: Less time managing tools means more time creating</li>
</ul>
<h2>Future Directions</h2>
<p>Looking ahead, I&#39;m exploring:</p>
<p><strong>Custom Guix Channels</strong>: Creating personal channels for specialized tools and configurations not yet in the main Guix repository.</p>
<p><strong>Advanced Service Integration</strong>: Developing more sophisticated service definitions for complex development workflows.</p>
<p><strong>Cross-Machine Synchronization</strong>: Using Guix Home with remote development servers and cloud environments.</p>
<p><strong>Community Contributions</strong>: Sharing useful service definitions and configurations with the broader Guix community.</p>
<h2>Lessons Learned</h2>
<h3>Embrace Gradual Migration</h3>
<p>Don&#39;t try to convert everything at once. Start with core tools and gradually expand your Guix Home configuration as you become more comfortable with the system.</p>
<h3>Document Everything</h3>
<p>Keep detailed notes about your configuration choices. The declarative nature of Guix Home makes it easy to forget why you made certain decisions.</p>
<h3>Engage with the Community</h3>
<p>The Guix community is incredibly helpful and knowledgeable. Don&#39;t hesitate to ask questions and share your experiences.</p>
<h3>Version Control is Essential</h3>
<p>Treat your Guix Home configuration like any other important code - use meaningful commit messages, create branches for experiments, and maintain good version control hygiene.</p>
<h2>Conclusion</h2>
<p>The evolution from my March setup to the current Guix Home-based environment represents more than just a tool change - it&#39;s a fundamental shift in how I think about development environment management. The move from imperative to declarative configuration has brought a level of reliability and reproducibility that has transformed my daily workflow.</p>
<p>For anyone considering similar changes, I&#39;d recommend starting small and gradually expanding your declarative configuration. The initial learning curve is worth the long-term benefits of having a truly reproducible, version-controlled development environment.</p>
<p>The combination of Guix Home for environment management and a refined Emacs configuration has created a development setup that feels both powerful and effortless. It&#39;s a foundation I&#39;m confident will serve me well as my projects and requirements continue to evolve.</p>
<p>What aspects of environment management do you find most challenging? Have you experimented with declarative configuration approaches? I&#39;d love to hear about your experiences and any questions you might have about making similar transitions.</p>
</article>
</div>
</div>
</main>
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center">
<p class="text-palenight-300">&copy; 2024 Glenn Thompson. All rights reserved.</p>
<div class="webring-text mt-6">
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
</div>
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">Previous</a>
<a href="https://craftering.systemcrafters.net/@glenneth" class="hover:text-accent-cyan">Random</a>
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">Next</a>
</div>
<p class="text-palenight-300 mt-2">
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
</p>
</div>
</div>
</footer>
</body>
</html>

View File

@ -0,0 +1,222 @@
---
title: "Development Environment Evolution: Embracing Guix Home and Enhanced Emacs Workflow"
date: "2025-09-28 10:05"
tags: ["development", "guix", "guix-home", "emacs", "workflow", "productivity", "evolution"]
description: "Six months after my comprehensive development environment overview, I share the significant evolution to Guix Home and enhanced Emacs configurations that have transformed my daily workflow."
---
## Introduction
Six months ago, I shared a detailed look at my [development environment in 2025](/content/posts/2025-03-08-my-dev-environment-2025.html), covering my hybrid approach with ArcoLinux, Guix package management, and Emacs-centered workflow. Since then, my setup has undergone a significant evolution driven by both choice and necessity.
The most significant change has been a transition to **WSL2 on Windows 11** for my work environment, necessitated by corporate requirements. Rather than seeing this as a limitation, I've embraced it as an opportunity to refine my development approach, adopting **Guix Home** for complete environment management and building a custom Emacs installation from the master branch.
This evolution has taught me valuable lessons about adaptability and the power of declarative configuration in maintaining consistency across different underlying systems.
## The Guix Home Revolution
### From Hybrid to Unified
In March, I described my hybrid approach using both pacman/AUR and Guix for different aspects of my system. While this worked well, I found myself constantly managing the boundary between system and user packages, dealing with occasional conflicts, and maintaining separate configuration files.
**Guix Home** changed everything. Now I can declaratively manage:
- All my development tools and applications
- Shell configuration and environment variables
- Dotfiles and configuration files
- Services and background processes
- Desktop environment customizations
### Current Guix Home Configuration
My `home-configuration.scm` has become the single source of truth for my development environment, particularly focused on Scheme/Guile development:
```scheme
;; Guix Home configuration for Glenn's Scheme development environment
(use-modules (gnu home)
(gnu packages)
(gnu services)
(gnu home services)
(gnu home services shells)
(gnu home services guix)
(gnu home services mcron)
(guix gexp))
(home-environment
;; Packages to install in the home environment
(packages (specifications->packages
'(;; System essentials
"glibc-locales"
;; Scheme/Guile development environment
"guile-next" ; Latest Guile development version
"guile-hoot" ; Scheme to WebAssembly compiler
"guile-goblins" ; Distributed programming environment
"guile-lib" ; Useful Guile libraries
"guile-reader" ; Reader extensions for Guile
"guile-json" ; JSON support for Guile
;; Development tools
;; Note: Using custom-built Emacs 31.0.50 installation
"git" ; Version control
"make" ; Build system
"gcc-toolchain" ; C compiler and tools
"pkg-config" ; Package configuration
"texinfo" ; Documentation system
"rlwrap"))) ; Readline wrapper for better REPL experience
;; Services for the home environment
(services
(list
;; Set up environment variables for Scheme development
(simple-service 'scheme-dev-env-vars
home-environment-variables-service-type
'(("EDITOR" . "emacs")
("GUILE_LOAD_PATH" . "$HOME/.guix-home/profile/share/guile/site/3.0:$GUILE_LOAD_PATH")
("GUILE_LOAD_COMPILED_PATH" . "$HOME/.guix-home/profile/lib/guile/3.0/site-ccache:$GUILE_LOAD_COMPILED_PATH")
("GUIX_LOCPATH" . "$HOME/.guix-home/profile/lib/locale")
("GUILE_AUTO_COMPILE" . "1")
("GUILE_WARN_DEPRECATED" . "detailed")))
;; Add a simple mcron job for keeping system updated
(simple-service 'update-reminder
home-mcron-service-type
(list #~(job "0 12 * * 0" ; Every Sunday at noon
"echo 'Consider running: guix pull && guix home reconfigure ~/.config/guix/home-configuration.scm'"))))))
```
### Benefits Realized
The transition to Guix Home has delivered on its promises:
**Complete Reproducibility**: I can now recreate my entire user environment on any machine with a single command: `guix home reconfigure home-configuration.scm`
**Atomic Updates**: Changes to my environment are atomic - either they work completely or roll back cleanly. No more broken states from partial updates.
**Version Control Everything**: My entire environment configuration lives in Git, with meaningful commit messages tracking every change to my setup.
**Effortless Rollbacks**: When an update breaks something, `guix home roll-back` instantly restores the previous working state.
**Dependency Isolation**: Each application gets exactly the dependencies it needs, eliminating conflicts between different tools requiring different library versions.
## Enhanced Emacs Workflow
### Custom Emacs Build from Master
One of the most significant changes in my setup has been building Emacs from the master branch rather than relying on distribution packages. This decision was driven by several factors:
- **Latest Features**: Access to cutting-edge features and improvements before they reach stable releases
- **WSL2 Optimization**: Better integration with the WSL2 environment through custom compilation flags
- **Performance Tuning**: Ability to optimize the build for my specific use case and hardware
Building Emacs 31.0.50 from source on WSL2 Ubuntu has given me a more responsive and feature-rich editing environment, particularly for Scheme development where the latest improvements in language support make a noticeable difference.
### Configuration Management Evolution
While I was already using Emacs extensively in March, my configuration approach has matured significantly. I've moved from a monolithic configuration to a modular, feature-based system that's easier to maintain and debug.
### New Emacs Enhancements
**Improved LSP Integration**: My language server setup now provides more consistent and reliable code intelligence across all my projects.
**Enhanced Org Mode Workflow**: I've integrated Org mode more deeply into my daily workflow for:
- Project planning and tracking
- Meeting notes and documentation
- Time tracking and productivity analysis
- Knowledge management and linking
**Better Terminal Integration**: Using `vterm` and `multi-vterm`, I now have seamless terminal integration within Emacs, reducing context switching.
**Refined Completion System**: My completion setup with Vertico, Consult, and Marginalia has been fine-tuned for faster, more intuitive navigation.
### Development Workflow Improvements
**Project Management**: Using `projectile` with enhanced project templates and automated setup scripts.
**Code Quality**: Integrated formatting, linting, and testing directly into my editing workflow with immediate feedback.
**Documentation**: Streamlined documentation generation and maintenance using Org mode's export capabilities.
## Workflow Integration Benefits
### Seamless Environment Switching
With Guix Home managing my entire environment, switching between different project contexts has become effortless. Each project can specify its exact dependencies, and Guix ensures they're available without affecting other projects.
### Consistent Across Machines
Whether I'm working on my desktop, laptop, or a remote server, my environment is identical. This consistency has eliminated the "works on my machine" problem entirely.
### Simplified Onboarding
Setting up a new development machine now takes minutes instead of hours. Clone my configuration repository, run `guix home reconfigure`, and everything is ready.
## Challenges and Solutions
### Learning Curve
**Challenge**: Guix Home's declarative approach required rethinking how I manage my environment.
**Solution**: Incremental migration, starting with simple configurations and gradually adding complexity as I became more comfortable with the system.
### Documentation Gaps
**Challenge**: Guix Home is relatively new, with fewer examples and tutorials compared to traditional dotfile management.
**Solution**: Active participation in the Guix community, reading source code, and documenting my own discoveries.
### Integration Complexity
**Challenge**: Some applications required custom integration work to play nicely with Guix Home.
**Solution**: Creating custom service definitions and contributing them back to the community when possible.
## Performance and Productivity Impact
The move to Guix Home has had measurable impacts on my productivity:
- **Reduced Setup Time**: New project environments spin up in seconds
- **Fewer Context Switches**: Everything I need is consistently available
- **Less Debugging**: Reproducible environments mean fewer environment-related issues
- **Improved Focus**: Less time managing tools means more time creating
## Future Directions
Looking ahead, I'm exploring:
**Custom Guix Channels**: Creating personal channels for specialized tools and configurations not yet in the main Guix repository.
**Advanced Service Integration**: Developing more sophisticated service definitions for complex development workflows.
**Cross-Machine Synchronization**: Using Guix Home with remote development servers and cloud environments.
**Community Contributions**: Sharing useful service definitions and configurations with the broader Guix community.
## Lessons Learned
### Embrace Gradual Migration
Don't try to convert everything at once. Start with core tools and gradually expand your Guix Home configuration as you become more comfortable with the system.
### Document Everything
Keep detailed notes about your configuration choices. The declarative nature of Guix Home makes it easy to forget why you made certain decisions.
### Engage with the Community
The Guix community is incredibly helpful and knowledgeable. Don't hesitate to ask questions and share your experiences.
### Version Control is Essential
Treat your Guix Home configuration like any other important code - use meaningful commit messages, create branches for experiments, and maintain good version control hygiene.
## Conclusion
The evolution from my March setup to the current Guix Home-based environment represents more than just a tool change - it's a fundamental shift in how I think about development environment management. The move from imperative to declarative configuration has brought a level of reliability and reproducibility that has transformed my daily workflow.
For anyone considering similar changes, I'd recommend starting small and gradually expanding your declarative configuration. The initial learning curve is worth the long-term benefits of having a truly reproducible, version-controlled development environment.
The combination of Guix Home for environment management and a refined Emacs configuration has created a development setup that feels both powerful and effortless. It's a foundation I'm confident will serve me well as my projects and requirements continue to evolve.
What aspects of environment management do you find most challenging? Have you experimented with declarative configuration approaches? I'd love to hear about your experiences and any questions you might have about making similar transitions.

234
deploy.sh
View File

@ -1,117 +1,117 @@
#!/bin/bash #!/bin/bash
# Function to show usage # Function to show usage
show_usage() { show_usage() {
echo "Usage: $0 [--ftp]" echo "Usage: $0 [--ftp]"
echo "Options:" echo "Options:"
echo " --ftp Upload to FTP server (requires .env.gpg file with encrypted credentials)" echo " --ftp Upload to FTP server (requires .env.gpg file with encrypted credentials)"
exit 1 exit 1
} }
# Function to decrypt credentials # Function to decrypt credentials
decrypt_credentials() { decrypt_credentials() {
if [ ! -f ".env.gpg" ]; then if [ ! -f ".env.gpg" ]; then
echo "Error: .env.gpg file not found!" echo "Error: .env.gpg file not found!"
exit 1 exit 1
fi fi
# Create a temporary file for decrypted credentials # Create a temporary file for decrypted credentials
TEMP_ENV=$(mktemp) TEMP_ENV=$(mktemp)
# Decrypt the credentials # Decrypt the credentials
if ! gpg --quiet --decrypt .env.gpg > "$TEMP_ENV"; then if ! gpg --quiet --decrypt .env.gpg > "$TEMP_ENV"; then
echo "Error: Failed to decrypt credentials!" echo "Error: Failed to decrypt credentials!"
rm "$TEMP_ENV" rm "$TEMP_ENV"
exit 1 exit 1
fi fi
# Source the decrypted credentials # Source the decrypted credentials
source "$TEMP_ENV" source "$TEMP_ENV"
# Securely remove the temporary file # Securely remove the temporary file
rm "$TEMP_ENV" rm "$TEMP_ENV"
} }
# Parse command line arguments # Parse command line arguments
USE_FTP=false USE_FTP=false
while [[ "$#" -gt 0 ]]; do while [[ "$#" -gt 0 ]]; do
case $1 in case $1 in
--ftp) USE_FTP=true ;; --ftp) USE_FTP=true ;;
-h|--help) show_usage ;; -h|--help) show_usage ;;
*) echo "Unknown parameter: $1"; show_usage ;; *) echo "Unknown parameter: $1"; show_usage ;;
esac esac
shift shift
done done
# Ensure deploy directory structure exists # Ensure deploy directory structure exists
mkdir -p deploy/content/posts mkdir -p deploy/content/posts
# Temporarily save the posts # Temporarily save the posts
if [ -d "deploy/content/posts" ]; then if [ -d "deploy/content/posts" ]; then
mkdir -p .tmp_posts mkdir -p .tmp_posts
mv deploy/content/posts/* .tmp_posts/ 2>/dev/null || true mv deploy/content/posts/* .tmp_posts/ 2>/dev/null || true
fi fi
# Clean up deploy directory # Clean up deploy directory
rm -rf deploy/* rm -rf deploy/*
# Restore the directory structure # Restore the directory structure
mkdir -p deploy/content/posts mkdir -p deploy/content/posts
# Restore the posts if they existed # Restore the posts if they existed
if [ -d ".tmp_posts" ]; then if [ -d ".tmp_posts" ]; then
mv .tmp_posts/* deploy/content/posts/ 2>/dev/null || true mv .tmp_posts/* deploy/content/posts/ 2>/dev/null || true
rm -rf .tmp_posts rm -rf .tmp_posts
fi fi
# Run build process to ensure latest CSS # Run build process to ensure latest CSS
echo "Building CSS..." echo "Building CSS..."
npm run build npm run build
echo "Generating RSS feed..." echo "Generating RSS feed..."
node src/js/generate-rss.js node src/js/generate-rss.js
# Copy necessary files # Copy necessary files
echo "Copying files..." echo "Copying files..."
cp index.html deploy/ cp index.html deploy/
cp favicon.svg deploy/ cp favicon.svg deploy/
cp -r dist deploy/ cp -r dist deploy/
cp -r src/js deploy/js cp -r src/js deploy/js
cp feed.xml deploy/ cp feed.xml deploy/
# Create deployment package # Create deployment package
echo "Creating zip archive..." echo "Creating zip archive..."
cd deploy && zip -r ../website-deploy.zip ./* cd deploy && zip -r ../website-deploy.zip ./*
cd .. cd ..
echo "Deployment package created successfully!" echo "Deployment package created successfully!"
echo "Your files are ready in the 'website-deploy.zip' file" echo "Your files are ready in the 'website-deploy.zip' file"
echo "You can also find individual files in the 'deploy' directory" echo "You can also find individual files in the 'deploy' directory"
# FTP Upload if requested # FTP Upload if requested
if [ "$USE_FTP" = true ]; then if [ "$USE_FTP" = true ]; then
# Decrypt and load credentials # Decrypt and load credentials
decrypt_credentials decrypt_credentials
if [ -z "$FTP_HOST" ] || [ -z "$FTP_USER" ] || [ -z "$FTP_PASS" ] || [ -z "$FTP_DIR" ]; then if [ -z "$FTP_HOST" ] || [ -z "$FTP_USER" ] || [ -z "$FTP_PASS" ] || [ -z "$FTP_DIR" ]; then
echo "Error: Missing FTP credentials!" echo "Error: Missing FTP credentials!"
exit 1 exit 1
fi fi
# Check if lftp is installed # Check if lftp is installed
if ! command -v lftp &> /dev/null; then if ! command -v lftp &> /dev/null; then
echo "Error: lftp is not installed. Please install it first." echo "Error: lftp is not installed. Please install it first."
exit 1 exit 1
fi fi
echo "Starting FTP upload..." echo "Starting FTP upload..."
lftp -c " lftp -c "
set ssl:verify-certificate no; set ssl:verify-certificate no;
open -u $FTP_USER,$FTP_PASS $FTP_HOST; open -u $FTP_USER,$FTP_PASS $FTP_HOST;
lcd deploy; lcd deploy;
cd $FTP_DIR; cd $FTP_DIR;
mirror -R --parallel=4 --verbose; mirror -R --parallel=4 --verbose;
bye" bye"
echo "FTP upload completed!" echo "FTP upload completed!"
fi fi

View File

@ -0,0 +1,148 @@
<!DOCTYPE html>
<html lang="en" class="bg-base-bg">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta property="og:title" content="Blog Post">
<meta property="og:description" content="">
<meta property="og:url" content="https://glenneth.orgcontent/posts/2025-04-04-one-year-of-craftering">
<title>Blog Post - Glenn Thompson</title>
<link rel="alternate" type="application/rss+xml" title="Glenn Thompson's Blog" href="/feed.xml" />
<link href="/dist/styles.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
<style>
.prose-palenight {
--tw-prose-body: #bfc7d5;
--tw-prose-headings: #ffd580;
--tw-prose-links: #82aaff;
--tw-prose-code: #c792ea;
--tw-prose-pre-bg: #1b1e2b;
}
.prose h2 {
color: var(--tw-prose-headings);
font-family: Merriweather, serif;
font-weight: 700;
font-size: 1.5rem;
margin-top: 2rem;
margin-bottom: 1rem;
}
.prose p {
margin-bottom: 1rem;
line-height: 1.625;
}
.prose a {
color: var(--tw-prose-links);
text-decoration: none;
}
.prose a:hover {
color: #89ddff;
}
.prose code {
color: var(--tw-prose-code);
font-family: 'JetBrains Mono', monospace;
}
.prose pre {
background-color: var(--tw-prose-pre-bg);
padding: 1rem;
border-radius: 0.5rem;
overflow-x: auto;
margin-bottom: 1rem;
}
.prose ul, .prose ol {
margin-top: 0.5rem;
margin-bottom: 1rem;
padding-left: 1.5rem;
}
.prose ul {
list-style-type: disc;
}
.prose ol {
list-style-type: decimal;
}
</style>
</head>
<body class="bg-base-bg text-palenight-50">
<nav class="bg-base-darker/80 backdrop-blur-sm shadow-sm border-b border-palenight-400/20 mb-8">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex items-center justify-between h-16">
<a href="/" class="text-accent-yellow font-serif text-xl font-bold">Glenn Thompson</a>
<div class="flex items-center gap-2 text-accent-yellow text-sm font-bold">
<span>Tech</span>
<span></span>
<time datetime="undefined">Invalid Date</time>
<span></span>
<span>3 min read</span>
</div>
</div>
</div>
</nav>
<main class="pt-24 pb-16 px-4">
<div class="max-w-4xl mx-auto">
<div class="content text-palenight-100 space-y-6">
<header class="mb-8">
<h1 class="text-4xl font-serif font-bold text-accent-yellow">Blog Post</h1>
<div class="flex items-center gap-4 text-palenight-300 mt-4">
<time datetime=""></time>
<span></span>
<span>3 min read</span>
<span></span>
<span>By Glenn Thompson</span>
</div>
</header>
<article class="prose prose-palenight max-w-none">
<hr>
<h2>title: &quot;One Year of Craftering: Building Connections in the System Crafters Community&quot;<br>date: 2025-04-02<br>tags: [community, webring, systemcrafters, reflection]</h2>
<p>Next Thursday, 03-APR-2025, marks the first anniversary of the <a href="https://craftering.shom.dev/">Craftering webring</a>, a vibrant community initiative started by <a href="https://shom.dev">shom</a> that connects personal websites and blogs within the System Crafters community. As one of the members of this webring, I&#39;ve had the privilege of being part of this journey from its early days.</p>
<h2>My First Pull Request</h2>
<p>Joining Craftering was actually my first experience with the pull request workflow on Codeberg. As someone new to contributing to open source projects, I was initially intimidated by the process. However, shom took the time to walk me through each step, providing clear guidance and encouragement. This hands-on experience with git and PR workflows proved invaluable, making the technical aspects of contribution much less daunting.</p>
<p>As shom <a href="https://shom.dev/posts/20250401_how-i-accidentally-got-better-at-self-hosting-and-foss-contributing">recently reflected</a>, this kind of supportive onboarding was an intentional part of Craftering&#39;s design - creating opportunities for community members to learn and grow together through practical experience.</p>
<h2>The Power of Connected Personal Spaces</h2>
<p>The Craftering webring represents more than just a collection of links - it&#39;s a testament to the enduring value of personal websites and the importance of community-driven content. In an era dominated by social media platforms and algorithmic feeds, webrings offer a refreshing return to the web&#39;s roots: direct connections between individually crafted spaces.</p>
<h2>Community Impact and Discoveries</h2>
<p>Being part of the Craftering webring has enriched my own blogging experience in several ways:</p>
<ol>
<li><p><strong>Diverse Perspectives</strong>: Through the webring, I&#39;ve discovered fellow creators sharing their experiences with everything from Emacs configurations to system design principles.</p>
</li>
<li><p><strong>Technical Cross-Pollination</strong>: Reading other members&#39; blogs has introduced me to new tools and approaches. For instance, my recent <a href="/content/posts/2025-01-02-from-haunt-to-custom.html">transition to a custom static site generator</a> was partly inspired by discussions and posts from the community.</p>
</li>
<li><p><strong>Consistent Motivation</strong>: Knowing that my blog is part of an interconnected community has encouraged more regular writing and sharing.</p>
</li>
</ol>
<h2>Technical Integration and RSS</h2>
<p>One of the strengths of the Craftering webring is its embrace of RSS feeds, making it easy to follow updates from all community members. The webring&#39;s <a href="https://craftering.shom.dev/Craftering.opml">OPML file</a> allows for quick subscription to all member feeds, creating a genuine sense of connection through content updates.</p>
<h2>Looking Forward</h2>
<p>As we celebrate this first year, it&#39;s exciting to see how the webring has grown and evolved. From the initial members to our current diverse group, each addition has brought new perspectives and valuable contributions to our community.</p>
<p>The success of Craftering demonstrates that the spirit of the early web - decentralized, personal, and community-driven - is very much alive. It shows that there&#39;s still tremendous value in maintaining personal spaces on the web, connected through shared interests and mutual respect for individual expression.</p>
<h3>Join the Ring</h3>
<p>If you maintain a personal website and are interested in connecting with like-minded individuals, consider <a href="https://codeberg.org/SystemCrafters/craftering">joining the Craftering webring</a>. The process is straightforward, and you&#39;ll be joining a supportive community of creators and thinkers who value personal expression and technical craftsmanship.</p>
<p>Here&#39;s to another year of crafting, sharing, and building connections in our corner of the web!</p>
</article>
</div>
</div>
</main>
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center">
<p class="text-palenight-300">&copy; 2024 Glenn Thompson. All rights reserved.</p>
<div class="webring-text mt-6">
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
</div>
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">Previous</a>
<a href="https://craftering.systemcrafters.net/@glenneth" class="hover:text-accent-cyan">Random</a>
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">Next</a>
</div>
<p class="text-palenight-300 mt-2">
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
</p>
</div>
</div>
</footer>
</body>
</html>

View File

@ -0,0 +1,273 @@
<!DOCTYPE html>
<html lang="en" class="bg-base-bg">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content=""Six months after my comprehensive development environment overview, I share the significant evolution to Guix Home and enhanced Emacs configurations that have transformed my daily workflow."">
<meta property="og:title" content=""Development Environment Evolution: Embracing Guix Home and Enhanced Emacs Workflow"">
<meta property="og:description" content=""Six months after my comprehensive development environment overview, I share the significant evolution to Guix Home and enhanced Emacs configurations that have transformed my daily workflow."">
<meta property="og:url" content="https://glenneth.orgcontent/posts/2025-09-28-dev-environment-evolution-guix-home">
<title>"Development Environment Evolution: Embracing Guix Home and Enhanced Emacs Workflow" - Glenn Thompson</title>
<link rel="alternate" type="application/rss+xml" title="Glenn Thompson's Blog" href="/feed.xml" />
<link href="/dist/styles.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Merriweather:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
<style>
.prose-palenight {
--tw-prose-body: #bfc7d5;
--tw-prose-headings: #ffd580;
--tw-prose-links: #82aaff;
--tw-prose-code: #c792ea;
--tw-prose-pre-bg: #1b1e2b;
}
.prose h2 {
color: var(--tw-prose-headings);
font-family: Merriweather, serif;
font-weight: 700;
font-size: 1.5rem;
margin-top: 2rem;
margin-bottom: 1rem;
}
.prose p {
margin-bottom: 1rem;
line-height: 1.625;
}
.prose a {
color: var(--tw-prose-links);
text-decoration: none;
}
.prose a:hover {
color: #89ddff;
}
.prose code {
color: var(--tw-prose-code);
font-family: 'JetBrains Mono', monospace;
}
.prose pre {
background-color: var(--tw-prose-pre-bg);
padding: 1rem;
border-radius: 0.5rem;
overflow-x: auto;
margin-bottom: 1rem;
}
.prose ul, .prose ol {
margin-top: 0.5rem;
margin-bottom: 1rem;
padding-left: 1.5rem;
}
.prose ul {
list-style-type: disc;
}
.prose ol {
list-style-type: decimal;
}
</style>
</head>
<body class="bg-base-bg text-palenight-50">
<nav class="bg-base-darker/80 backdrop-blur-sm shadow-sm border-b border-palenight-400/20 mb-8">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex items-center justify-between h-16">
<a href="/" class="text-accent-yellow font-serif text-xl font-bold">Glenn Thompson</a>
<div class="flex items-center gap-2 text-accent-yellow text-sm font-bold">
<span>["development", "guix", "guix-home", "emacs", "workflow", "productivity", "evolution"]</span>
<span></span>
<time datetime=""2025-09-28 10:05"">Invalid Date</time>
<span></span>
<span>8 min read</span>
</div>
</div>
</div>
</nav>
<main class="pt-24 pb-16 px-4">
<div class="max-w-4xl mx-auto">
<div class="content text-palenight-100 space-y-6">
<header class="mb-8">
<h1 class="text-4xl font-serif font-bold text-accent-yellow">"Development Environment Evolution: Embracing Guix Home and Enhanced Emacs Workflow"</h1>
<div class="flex items-center gap-4 text-palenight-300 mt-4">
<time datetime=""2025-09-28 10:05"">"2025-09-28 10:05"</time>
<span></span>
<span>8 min read</span>
<span></span>
<span>By Glenn Thompson</span>
</div>
<div class="flex flex-wrap gap-2 mt-4">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">["development"</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">"guix"</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">"guix-home"</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">"emacs"</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">"workflow"</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">"productivity"</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">"evolution"]</span>
</div>
</header>
<article class="prose prose-palenight max-w-none">
<h2>Introduction</h2>
<p>Six months ago, I shared a detailed look at my <a href="/content/posts/2025-03-08-my-dev-environment-2025.html">development environment in 2025</a>, covering my hybrid approach with ArcoLinux, Guix package management, and Emacs-centered workflow. Since then, my setup has undergone a significant evolution driven by both choice and necessity.</p>
<p>The most significant change has been a transition to <strong>WSL2 on Windows 11</strong> for my work environment, necessitated by corporate requirements. Rather than seeing this as a limitation, I&#39;ve embraced it as an opportunity to refine my development approach, adopting <strong>Guix Home</strong> for complete environment management and building a custom Emacs installation from the master branch.</p>
<p>This evolution has taught me valuable lessons about adaptability and the power of declarative configuration in maintaining consistency across different underlying systems.</p>
<h2>The Guix Home Revolution</h2>
<h3>From Hybrid to Unified</h3>
<p>In March, I described my hybrid approach using both pacman/AUR and Guix for different aspects of my system. While this worked well, I found myself constantly managing the boundary between system and user packages, dealing with occasional conflicts, and maintaining separate configuration files.</p>
<p><strong>Guix Home</strong> changed everything. Now I can declaratively manage:</p>
<ul>
<li>All my development tools and applications</li>
<li>Shell configuration and environment variables </li>
<li>Dotfiles and configuration files</li>
<li>Services and background processes</li>
<li>Desktop environment customizations</li>
</ul>
<h3>Current Guix Home Configuration</h3>
<p>My <code>home-configuration.scm</code> has become the single source of truth for my development environment, particularly focused on Scheme/Guile development:</p>
<pre><code class="language-scheme">;; Guix Home configuration for Glenn&#39;s Scheme development environment
(use-modules (gnu home)
(gnu packages)
(gnu services)
(gnu home services)
(gnu home services shells)
(gnu home services guix)
(gnu home services mcron)
(guix gexp))
(home-environment
;; Packages to install in the home environment
(packages (specifications-&gt;packages
&#39;(;; System essentials
&quot;glibc-locales&quot;
;; Scheme/Guile development environment
&quot;guile-next&quot; ; Latest Guile development version
&quot;guile-hoot&quot; ; Scheme to WebAssembly compiler
&quot;guile-goblins&quot; ; Distributed programming environment
&quot;guile-lib&quot; ; Useful Guile libraries
&quot;guile-reader&quot; ; Reader extensions for Guile
&quot;guile-json&quot; ; JSON support for Guile
;; Development tools
;; Note: Using custom-built Emacs 31.0.50 installation
&quot;git&quot; ; Version control
&quot;make&quot; ; Build system
&quot;gcc-toolchain&quot; ; C compiler and tools
&quot;pkg-config&quot; ; Package configuration
&quot;texinfo&quot; ; Documentation system
&quot;rlwrap&quot;))) ; Readline wrapper for better REPL experience
;; Services for the home environment
(services
(list
;; Set up environment variables for Scheme development
(simple-service &#39;scheme-dev-env-vars
home-environment-variables-service-type
&#39;((&quot;EDITOR&quot; . &quot;emacs&quot;)
(&quot;GUILE_LOAD_PATH&quot; . &quot;$HOME/.guix-home/profile/share/guile/site/3.0:$GUILE_LOAD_PATH&quot;)
(&quot;GUILE_LOAD_COMPILED_PATH&quot; . &quot;$HOME/.guix-home/profile/lib/guile/3.0/site-ccache:$GUILE_LOAD_COMPILED_PATH&quot;)
(&quot;GUIX_LOCPATH&quot; . &quot;$HOME/.guix-home/profile/lib/locale&quot;)
(&quot;GUILE_AUTO_COMPILE&quot; . &quot;1&quot;)
(&quot;GUILE_WARN_DEPRECATED&quot; . &quot;detailed&quot;)))
;; Add a simple mcron job for keeping system updated
(simple-service &#39;update-reminder
home-mcron-service-type
(list #~(job &quot;0 12 * * 0&quot; ; Every Sunday at noon
&quot;echo &#39;Consider running: guix pull &amp;&amp; guix home reconfigure ~/.config/guix/home-configuration.scm&#39;&quot;))))))
</code></pre>
<h3>Benefits Realized</h3>
<p>The transition to Guix Home has delivered on its promises:</p>
<p><strong>Complete Reproducibility</strong>: I can now recreate my entire user environment on any machine with a single command: <code>guix home reconfigure home-configuration.scm</code></p>
<p><strong>Atomic Updates</strong>: Changes to my environment are atomic - either they work completely or roll back cleanly. No more broken states from partial updates.</p>
<p><strong>Version Control Everything</strong>: My entire environment configuration lives in Git, with meaningful commit messages tracking every change to my setup.</p>
<p><strong>Effortless Rollbacks</strong>: When an update breaks something, <code>guix home roll-back</code> instantly restores the previous working state.</p>
<p><strong>Dependency Isolation</strong>: Each application gets exactly the dependencies it needs, eliminating conflicts between different tools requiring different library versions.</p>
<h2>Enhanced Emacs Workflow</h2>
<h3>Custom Emacs Build from Master</h3>
<p>One of the most significant changes in my setup has been building Emacs from the master branch rather than relying on distribution packages. This decision was driven by several factors:</p>
<ul>
<li><strong>Latest Features</strong>: Access to cutting-edge features and improvements before they reach stable releases</li>
<li><strong>WSL2 Optimization</strong>: Better integration with the WSL2 environment through custom compilation flags</li>
<li><strong>Performance Tuning</strong>: Ability to optimize the build for my specific use case and hardware</li>
</ul>
<p>Building Emacs 31.0.50 from source on WSL2 Ubuntu has given me a more responsive and feature-rich editing environment, particularly for Scheme development where the latest improvements in language support make a noticeable difference.</p>
<h3>Configuration Management Evolution</h3>
<p>While I was already using Emacs extensively in March, my configuration approach has matured significantly. I&#39;ve moved from a monolithic configuration to a modular, feature-based system that&#39;s easier to maintain and debug.</p>
<h3>New Emacs Enhancements</h3>
<p><strong>Improved LSP Integration</strong>: My language server setup now provides more consistent and reliable code intelligence across all my projects.</p>
<p><strong>Enhanced Org Mode Workflow</strong>: I&#39;ve integrated Org mode more deeply into my daily workflow for:</p>
<ul>
<li>Project planning and tracking</li>
<li>Meeting notes and documentation</li>
<li>Time tracking and productivity analysis</li>
<li>Knowledge management and linking</li>
</ul>
<p><strong>Better Terminal Integration</strong>: Using <code>vterm</code> and <code>multi-vterm</code>, I now have seamless terminal integration within Emacs, reducing context switching.</p>
<p><strong>Refined Completion System</strong>: My completion setup with Vertico, Consult, and Marginalia has been fine-tuned for faster, more intuitive navigation.</p>
<h3>Development Workflow Improvements</h3>
<p><strong>Project Management</strong>: Using <code>projectile</code> with enhanced project templates and automated setup scripts.</p>
<p><strong>Code Quality</strong>: Integrated formatting, linting, and testing directly into my editing workflow with immediate feedback.</p>
<p><strong>Documentation</strong>: Streamlined documentation generation and maintenance using Org mode&#39;s export capabilities.</p>
<h2>Workflow Integration Benefits</h2>
<h3>Seamless Environment Switching</h3>
<p>With Guix Home managing my entire environment, switching between different project contexts has become effortless. Each project can specify its exact dependencies, and Guix ensures they&#39;re available without affecting other projects.</p>
<h3>Consistent Across Machines</h3>
<p>Whether I&#39;m working on my desktop, laptop, or a remote server, my environment is identical. This consistency has eliminated the &quot;works on my machine&quot; problem entirely.</p>
<h3>Simplified Onboarding</h3>
<p>Setting up a new development machine now takes minutes instead of hours. Clone my configuration repository, run <code>guix home reconfigure</code>, and everything is ready.</p>
<h2>Challenges and Solutions</h2>
<h3>Learning Curve</h3>
<p><strong>Challenge</strong>: Guix Home&#39;s declarative approach required rethinking how I manage my environment.</p>
<p><strong>Solution</strong>: Incremental migration, starting with simple configurations and gradually adding complexity as I became more comfortable with the system.</p>
<h3>Documentation Gaps</h3>
<p><strong>Challenge</strong>: Guix Home is relatively new, with fewer examples and tutorials compared to traditional dotfile management.</p>
<p><strong>Solution</strong>: Active participation in the Guix community, reading source code, and documenting my own discoveries.</p>
<h3>Integration Complexity</h3>
<p><strong>Challenge</strong>: Some applications required custom integration work to play nicely with Guix Home.</p>
<p><strong>Solution</strong>: Creating custom service definitions and contributing them back to the community when possible.</p>
<h2>Performance and Productivity Impact</h2>
<p>The move to Guix Home has had measurable impacts on my productivity:</p>
<ul>
<li><strong>Reduced Setup Time</strong>: New project environments spin up in seconds</li>
<li><strong>Fewer Context Switches</strong>: Everything I need is consistently available</li>
<li><strong>Less Debugging</strong>: Reproducible environments mean fewer environment-related issues</li>
<li><strong>Improved Focus</strong>: Less time managing tools means more time creating</li>
</ul>
<h2>Future Directions</h2>
<p>Looking ahead, I&#39;m exploring:</p>
<p><strong>Custom Guix Channels</strong>: Creating personal channels for specialized tools and configurations not yet in the main Guix repository.</p>
<p><strong>Advanced Service Integration</strong>: Developing more sophisticated service definitions for complex development workflows.</p>
<p><strong>Cross-Machine Synchronization</strong>: Using Guix Home with remote development servers and cloud environments.</p>
<p><strong>Community Contributions</strong>: Sharing useful service definitions and configurations with the broader Guix community.</p>
<h2>Lessons Learned</h2>
<h3>Embrace Gradual Migration</h3>
<p>Don&#39;t try to convert everything at once. Start with core tools and gradually expand your Guix Home configuration as you become more comfortable with the system.</p>
<h3>Document Everything</h3>
<p>Keep detailed notes about your configuration choices. The declarative nature of Guix Home makes it easy to forget why you made certain decisions.</p>
<h3>Engage with the Community</h3>
<p>The Guix community is incredibly helpful and knowledgeable. Don&#39;t hesitate to ask questions and share your experiences.</p>
<h3>Version Control is Essential</h3>
<p>Treat your Guix Home configuration like any other important code - use meaningful commit messages, create branches for experiments, and maintain good version control hygiene.</p>
<h2>Conclusion</h2>
<p>The evolution from my March setup to the current Guix Home-based environment represents more than just a tool change - it&#39;s a fundamental shift in how I think about development environment management. The move from imperative to declarative configuration has brought a level of reliability and reproducibility that has transformed my daily workflow.</p>
<p>For anyone considering similar changes, I&#39;d recommend starting small and gradually expanding your declarative configuration. The initial learning curve is worth the long-term benefits of having a truly reproducible, version-controlled development environment.</p>
<p>The combination of Guix Home for environment management and a refined Emacs configuration has created a development setup that feels both powerful and effortless. It&#39;s a foundation I&#39;m confident will serve me well as my projects and requirements continue to evolve.</p>
<p>What aspects of environment management do you find most challenging? Have you experimented with declarative configuration approaches? I&#39;d love to hear about your experiences and any questions you might have about making similar transitions.</p>
</article>
</div>
</div>
</main>
<footer class="bg-base-darker text-palenight-200 py-12 border-t border-palenight-400/20">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center">
<p class="text-palenight-300">&copy; 2024 Glenn Thompson. All rights reserved.</p>
<div class="webring-text mt-6">
<p class="text-palenight-300">I am part of the <a href="https://systemcrafters.net" target="_blank" class="text-accent-blue hover:text-accent-cyan">System Crafters</a> webring:</p>
</div>
<div class="craftering mt-2 flex items-center justify-center gap-4 text-accent-blue">
<a href="https://craftering.systemcrafters.net/@glenneth/previous" class="hover:text-accent-cyan">Previous</a>
<a href="https://craftering.systemcrafters.net/@glenneth" class="hover:text-accent-cyan">Random</a>
<a href="https://craftering.systemcrafters.net/@glenneth/next" class="hover:text-accent-cyan">Next</a>
</div>
<p class="text-palenight-300 mt-2">
<a href="mailto:glenn@glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenn@glenneth.org</a> |
<a href="https://glenneth.org" class="text-accent-blue hover:text-accent-cyan transition-colors">glenneth.org</a>
</p>
</div>
</div>
</footer>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -58,178 +58,216 @@
<section id="blog" class="py-16"> <section id="blog" class="py-16">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 class="text-3xl font-serif font-bold text-accent-yellow mb-8">Blog Posts</h2> <h2 class="text-3xl font-serif font-bold text-accent-yellow mb-8">Blog Posts</h2>
<div class="grid gap-8 md:grid-cols-2"> <div class="grid gap-8 md:grid-cols-2">
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>web</span><span></span><span>development</span><span></span><span>javascript</span><span></span><span>static-site</span><span></span><span>lessons</span> <span></span><span>development</span><span></span><span>guix</span><span></span><span>guix-home</span><span></span><span>emacs</span><span></span><span>workflow</span><span></span><span>productivity</span><span></span><span>evolution</span>
<span></span> <span></span>
<time datetime="2025-03-13">March 13, 2025</time> <time datetime="2025-09-28">September 28, 2025</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2025-03-12-lessons-learned-custom-ssg.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2025-09-28-dev-environment-evolution-guix-home.html" class="hover:text-accent-cyan transition-colors">
Lessons Learned: One Year with a Custom Static Site Generator Development Environment Evolution: Embracing Guix Home and Enhanced Emacs Workflow
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">It's been just over a year since I transitioned from Haunt to my own custom static site generator for this website. What started as an experiment to gain more control over my publishing workflow has e...</p> <p class="text-palenight-100 mb-4">Six months ago, I shared a detailed look at my development environment in 2025, covering my hybrid approach with ArcoLinux, Guix package management, and Emacs-centered workflow. Since then, my setup h...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">web</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">javascript</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">static-site</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">lessons</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guix</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guix-home</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">emacs</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">workflow</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">productivity</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">evolution</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>development</span><span></span><span>guix</span><span></span><span>tools</span><span></span><span>workflow</span><span></span><span>productivity</span><span></span><span>web</span> <span></span><span>community</span><span></span><span>webring</span><span></span><span>systemcrafters</span><span></span><span>reflection</span>
<span></span> <span></span>
<time datetime="2025-03-08">March 8, 2025</time> <time datetime="2025-04-02">April 2, 2025</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2025-03-08-my-dev-environment-2025.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2025-04-04-one-year-of-craftering.html" class="hover:text-accent-cyan transition-colors">
My Development Environment in 2025: From Editor to Deployment One Year of Craftering: Building Connections in the System Crafters Community
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">The tools we use shape how we work. Over the years, my development environment has evolved alongside my technical journey through different programming languages, paradigms, and projects. This post of...</p> <p class="text-palenight-100 mb-4">Next Thursday, 03-APR-2025, marks the first anniversary of the Craftering webring, a vibrant community initiative started by shom that connects personal websites and blogs within the System Crafters c...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guix</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tools</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">workflow</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">productivity</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">web</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">community</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">webring</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">systemcrafters</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">reflection</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>web</span><span></span><span>development</span><span></span><span>javascript</span><span></span><span>static-site</span><span></span><span>haunt</span><span></span><span>guile</span><span></span><span>hugo</span> <span></span><span>web</span><span></span><span>development</span><span></span><span>javascript</span><span></span><span>static-site</span><span></span><span>lessons</span>
<span></span> <span></span>
<time datetime="2025-01-02">January 2, 2025</time> <time datetime="2025-03-13">March 13, 2025</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2025-01-02-from-haunt-to-custom.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2025-03-12-lessons-learned-custom-ssg.html" class="hover:text-accent-cyan transition-colors">
From Hugo to Haunt to Custom: My Journey in Static Site Generation Lessons Learned: One Year with a Custom Static Site Generator
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">My journey with static site generators has been one of continuous learning and evolution. It started with Hugo, transitioned through Haunt, and has now led me to build my own custom solution. Each ste...</p> <p class="text-palenight-100 mb-4">It's been just over a year since I transitioned from Haunt to my own custom static site generator for this website. What started as an experiment to gain more control over my publishing workflow has e...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">web</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">javascript</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">static-site</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">haunt</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guile</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">hugo</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">web</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">javascript</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">static-site</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">lessons</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>tech</span><span></span><span>guile</span><span></span><span>scheme</span><span></span><span>development</span><span></span><span>functional-programming</span> <span></span><span>development</span><span></span><span>guix</span><span></span><span>tools</span><span></span><span>workflow</span><span></span><span>productivity</span><span></span><span>web</span>
<span></span> <span></span>
<time datetime="2024-12-03">December 3, 2024</time> <time datetime="2025-03-08">March 8, 2025</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-12-03-practical-scheme.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2025-03-08-my-dev-environment-2025.html" class="hover:text-accent-cyan transition-colors">
Beyond Theory: Building Practical Tools with Guile Scheme My Development Environment in 2025: From Editor to Deployment
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">A few months ago, I shared my journey into learning Scheme through building stash, a symlink manager. Since then, I've discovered that the gap between learning Scheme and applying it to real-world pro...</p> <p class="text-palenight-100 mb-4">The tools we use shape how we work. Over the years, my development environment has evolved alongside my technical journey through different programming languages, paradigms, and projects. This post of...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guile</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">scheme</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">functional-programming</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guix</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tools</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">workflow</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">productivity</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">web</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>personal</span><span></span><span>tech</span><span></span><span>guile</span><span></span><span>scheme</span><span></span><span>gnu</span><span></span><span>development</span> <span></span><span>web</span><span></span><span>development</span><span></span><span>javascript</span><span></span><span>static-site</span><span></span><span>haunt</span><span></span><span>guile</span><span></span><span>hugo</span>
<span></span> <span></span>
<time datetime="2024-09-24">September 24, 2024</time> <time datetime="2025-01-02">January 2, 2025</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-09-24-scheme-journey.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2025-01-02-from-haunt-to-custom.html" class="hover:text-accent-cyan transition-colors">
A Journey into Scheme From Hugo to Haunt to Custom: My Journey in Static Site Generation
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">I've spent my career as an electrical engineer, not a software developer. However, my recent journey in to GNU/Liniux required a tool for managing symlinks, and that's how I began learning Scheme—spec...</p> <p class="text-palenight-100 mb-4">My journey with static site generators has been one of continuous learning and evolution. It started with Hugo, transitioned through Haunt, and has now led me to build my own custom solution. Each ste...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guile</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">scheme</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">gnu</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">web</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">javascript</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">static-site</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">haunt</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guile</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">hugo</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>personal</span><span></span><span>tech</span><span></span><span>gnu</span><span></span><span>guix</span><span></span><span>swaywm</span><span></span><span>nvidia</span> <span></span><span>tech</span><span></span><span>guile</span><span></span><span>scheme</span><span></span><span>development</span><span></span><span>functional-programming</span>
<span></span> <span></span>
<time datetime="2024-07-26">July 26, 2024</time> <time datetime="2024-12-03">December 3, 2024</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-07-26-gnu-guix-journey.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2024-12-03-practical-scheme.html" class="hover:text-accent-cyan transition-colors">
A Journey Through GNU Guix: From Installation to Returning to Arch Linux Beyond Theory: Building Practical Tools with Guile Scheme
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">As a long-time user of Arch Linux, I decided to explore the world of GNU Guix to see if it could better suit my needs, especially with my growing interest in functional package management. The journey...</p> <p class="text-palenight-100 mb-4">A few months ago, I shared my journey into learning Scheme through building stash, a symlink manager. Since then, I've discovered that the gap between learning Scheme and applying it to real-world pro...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">gnu</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guix</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">swaywm</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">nvidia</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guile</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">scheme</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">functional-programming</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>personal</span><span></span><span>tech</span><span></span><span>keyboards</span><span></span><span>glove80</span> <span></span><span>personal</span><span></span><span>tech</span><span></span><span>guile</span><span></span><span>scheme</span><span></span><span>gnu</span><span></span><span>development</span>
<span></span> <span></span>
<time datetime="2024-05-15">May 15, 2024</time> <time datetime="2024-09-24">September 24, 2024</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-05-15-hugo-to-haunt.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2024-09-24-scheme-journey.html" class="hover:text-accent-cyan transition-colors">
Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix A Journey into Scheme
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">Hello there! I'm Glenn Thompson, and today, I want to share a significant part of my recent journey into the world of Scheme, GNU Guix, and static site generation.</p> <p class="text-palenight-100 mb-4">I've spent my career as an electrical engineer, not a software developer. However, my recent journey in to GNU/Liniux required a tool for managing symlinks, and that's how I began learning Scheme—spec...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">keyboards</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">glove80</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guile</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">scheme</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">gnu</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>work</span><span></span><span>travel</span> <span></span><span>personal</span><span></span><span>tech</span><span></span><span>gnu</span><span></span><span>guix</span><span></span><span>swaywm</span><span></span><span>nvidia</span>
<span></span> <span></span>
<time datetime="2024-05-01">May 1, 2024</time> <time datetime="2024-07-26">July 26, 2024</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-05-01-amman-newcastle-journey.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2024-07-26-gnu-guix-journey.html" class="hover:text-accent-cyan transition-colors">
A Rollercoaster Week: From Amman to Newcastle, and back again A Journey Through GNU Guix: From Installation to Returning to Arch Linux
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">Two weeks ago was a whirlwind of events, taking me from the conforting embrace of Amman, Jordan to the vibrant streets of Newcastle, England. It was a journey filled with highs and lows, professional...</p> <p class="text-palenight-100 mb-4">As a long-time user of Arch Linux, I decided to explore the world of GNU Guix to see if it could better suit my needs, especially with my growing interest in functional package management. The journey...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">work</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">travel</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">gnu</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guix</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">swaywm</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">nvidia</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>personal</span><span></span><span>tech</span><span></span><span>keyboards</span><span></span><span>glove80</span> <span></span><span>personal</span><span></span><span>tech</span><span></span><span>keyboards</span><span></span><span>glove80</span>
<span></span> <span></span>
<time datetime=""2024-04-08">April 8, 2024</time> <time datetime="2024-05-15">May 15, 2024</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-04-08-glove80-review.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2024-05-15-hugo-to-haunt.html" class="hover:text-accent-cyan transition-colors">
Aesthetic Meets Ergonomics: My Deep Dive into the Glove80 Keyboard Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">As my career trajectory veered from being an integral member of an electrical engineering team to assuming the role of Deputy Project Manager, the nature of my daily activities underwent a significant...</p> <p class="text-palenight-100 mb-4">Hello there! I'm Glenn Thompson, and today, I want to share a significant part of my recent journey into the world of Scheme, GNU Guix, and static site generation.</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">keyboards</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">glove80</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">keyboards</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">glove80</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span>
<span></span><span>work</span><span></span><span>travel</span>
<span></span>
<time datetime="2024-05-01">May 1, 2024</time>
</div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-05-01-amman-newcastle-journey.html" class="hover:text-accent-cyan transition-colors">
A Rollercoaster Week: From Amman to Newcastle, and back again
</a>
</h3>
<p class="text-palenight-100 mb-4">Two weeks ago was a whirlwind of events, taking me from the conforting embrace of Amman, Jordan to the vibrant streets of Newcastle, England. It was a journey filled with highs and lows, professional...</p>
<div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">work</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">travel</span>
</div>
</article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span>
<span></span><span>personal</span><span></span><span>tech</span><span></span><span>keyboards</span><span></span><span>glove80</span>
<span></span>
<time datetime="2024-04-08">April 8, 2024</time>
</div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-04-08-glove80-review.html" class="hover:text-accent-cyan transition-colors">
Aesthetic Meets Ergonomics: My Deep Dive into the Glove80 Keyboard
</a>
</h3>
<p class="text-palenight-100 mb-4">As my career trajectory veered from being an integral member of an electrical engineering team to assuming the role of Deputy Project Manager, the nature of my daily activities underwent a significant...</p>
<div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">keyboards</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">glove80</span>
</div>
</article>
</div><!-- End blog posts --> </div><!-- End blog posts -->
</div> </div>
</section> </section>

View File

@ -223,15 +223,28 @@ async function updateIndexWithSummaries() {
// Extract metadata // Extract metadata
const metadata = {}; const metadata = {};
content.replace(/^---\n([\s\S]*?)\n---\n/, (_, frontMatter) => { // More flexible regex to handle different line endings
frontMatter.split('\n').forEach(line => { const frontMatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);
const [key, ...valueParts] = line.split(':'); if (frontMatterMatch) {
if (key && valueParts.length > 0) { const frontMatter = frontMatterMatch[1];
metadata[key.trim()] = valueParts.join(':').trim(); frontMatter.split(/\r?\n/).forEach(line => {
const colonIndex = line.indexOf(':');
if (colonIndex > 0) {
const key = line.substring(0, colonIndex).trim();
let value = line.substring(colonIndex + 1).trim();
// Remove quotes if present
if ((value.startsWith('"') && value.endsWith('"')) ||
(value.startsWith("'") && value.endsWith("'"))) {
value = value.slice(1, -1);
}
if (key && value) {
metadata[key] = value;
}
} }
}); });
return ''; }
});
// Extract summary // Extract summary
const summary = extractSummary(content); const summary = extractSummary(content);
@ -239,18 +252,45 @@ async function updateIndexWithSummaries() {
// Parse and format the date // Parse and format the date
let formattedDate = ''; let formattedDate = '';
let isoDate = ''; let isoDate = '';
if (!metadata.date) {
console.warn(`No date found for ${file}`);
continue;
}
try { try {
// Handle date formats like "2024-04-08 16:50" or "2024-04-08" let dateStr = '';
const dateStr = metadata.date.split(' ')[0];
// Handle different date formats
if (typeof metadata.date === 'string') {
// String format: "2024-04-08 16:50" or "2024-04-08"
dateStr = metadata.date.split(' ')[0];
} else if (typeof metadata.date === 'number') {
// Number format: 2025-04-02 (YAML parsed as number)
dateStr = metadata.date.toString();
} else if (metadata.date instanceof Date) {
// Date object
dateStr = metadata.date.toISOString().split('T')[0];
} else {
// Fallback: convert to string and extract date part
dateStr = String(metadata.date).split(' ')[0];
}
const date = new Date(dateStr); const date = new Date(dateStr);
formattedDate = date.toLocaleDateString('en-US', { if (!isNaN(date.getTime())) {
year: 'numeric', formattedDate = date.toLocaleDateString('en-US', {
month: 'long', year: 'numeric',
day: 'numeric' month: 'long',
}); day: 'numeric'
isoDate = dateStr; });
isoDate = dateStr;
} else {
console.warn(`Invalid date format for ${file}: ${metadata.date} (type: ${typeof metadata.date})`);
continue;
}
} catch (e) { } catch (e) {
console.error(`Error parsing date for ${file}:`, e); console.error(`Error parsing date for ${file}:`, e);
continue;
} }
// Parse tags // Parse tags

1598
dist/styles.css vendored

File diff suppressed because one or more lines are too long

1199
feed.xml

File diff suppressed because it is too large Load Diff

View File

@ -58,197 +58,216 @@
<section id="blog" class="py-16"> <section id="blog" class="py-16">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 class="text-3xl font-serif font-bold text-accent-yellow mb-8">Blog Posts</h2> <h2 class="text-3xl font-serif font-bold text-accent-yellow mb-8">Blog Posts</h2>
<div class="grid gap-8 md:grid-cols-2"> <div class="grid gap-8 md:grid-cols-2">
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>community</span><span></span><span>webring</span><span></span><span>systemcrafters</span><span></span><span>reflection</span> <span></span><span>development</span><span></span><span>guix</span><span></span><span>guix-home</span><span></span><span>emacs</span><span></span><span>workflow</span><span></span><span>productivity</span><span></span><span>evolution</span>
<span></span> <span></span>
<time datetime="2025-04-02">April 2, 2025</time> <time datetime="2025-09-28">September 28, 2025</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2025-04-04-one-year-of-craftering.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2025-09-28-dev-environment-evolution-guix-home.html" class="hover:text-accent-cyan transition-colors">
One Year of Craftering: Building Connections in the System Crafters Community Development Environment Evolution: Embracing Guix Home and Enhanced Emacs Workflow
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">Next Thursday, 03-APR-2025, marks the first anniversary of the Craftering webring, a vibrant community initiative started by shom that connects personal websites and blogs within the System Crafters c...</p> <p class="text-palenight-100 mb-4">Six months ago, I shared a detailed look at my development environment in 2025, covering my hybrid approach with ArcoLinux, Guix package management, and Emacs-centered workflow. Since then, my setup h...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">community</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">webring</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">systemcrafters</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">reflection</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guix</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guix-home</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">emacs</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">workflow</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">productivity</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">evolution</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>web</span><span></span><span>development</span><span></span><span>javascript</span><span></span><span>static-site</span><span></span><span>lessons</span> <span></span><span>community</span><span></span><span>webring</span><span></span><span>systemcrafters</span><span></span><span>reflection</span>
<span></span> <span></span>
<time datetime="2025-03-13">March 13, 2025</time> <time datetime="2025-04-02">April 2, 2025</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2025-03-12-lessons-learned-custom-ssg.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2025-04-04-one-year-of-craftering.html" class="hover:text-accent-cyan transition-colors">
Lessons Learned: One Year with a Custom Static Site Generator One Year of Craftering: Building Connections in the System Crafters Community
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">It's been just over a year since I transitioned from Haunt to my own custom static site generator for this website. What started as an experiment to gain more control over my publishing workflow has e...</p> <p class="text-palenight-100 mb-4">Next Thursday, 03-APR-2025, marks the first anniversary of the Craftering webring, a vibrant community initiative started by shom that connects personal websites and blogs within the System Crafters c...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">web</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">javascript</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">static-site</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">lessons</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">community</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">webring</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">systemcrafters</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">reflection</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>development</span><span></span><span>guix</span><span></span><span>tools</span><span></span><span>workflow</span><span></span><span>productivity</span><span></span><span>web</span> <span></span><span>web</span><span></span><span>development</span><span></span><span>javascript</span><span></span><span>static-site</span><span></span><span>lessons</span>
<span></span> <span></span>
<time datetime="2025-03-08">March 8, 2025</time> <time datetime="2025-03-13">March 13, 2025</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2025-03-08-my-dev-environment-2025.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2025-03-12-lessons-learned-custom-ssg.html" class="hover:text-accent-cyan transition-colors">
My Development Environment in 2025: From Editor to Deployment Lessons Learned: One Year with a Custom Static Site Generator
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">The tools we use shape how we work. Over the years, my development environment has evolved alongside my technical journey through different programming languages, paradigms, and projects. This post of...</p> <p class="text-palenight-100 mb-4">It's been just over a year since I transitioned from Haunt to my own custom static site generator for this website. What started as an experiment to gain more control over my publishing workflow has e...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guix</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tools</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">workflow</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">productivity</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">web</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">web</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">javascript</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">static-site</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">lessons</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>web</span><span></span><span>development</span><span></span><span>javascript</span><span></span><span>static-site</span><span></span><span>haunt</span><span></span><span>guile</span><span></span><span>hugo</span> <span></span><span>development</span><span></span><span>guix</span><span></span><span>tools</span><span></span><span>workflow</span><span></span><span>productivity</span><span></span><span>web</span>
<span></span> <span></span>
<time datetime="2025-01-02">January 2, 2025</time> <time datetime="2025-03-08">March 8, 2025</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2025-01-02-from-haunt-to-custom.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2025-03-08-my-dev-environment-2025.html" class="hover:text-accent-cyan transition-colors">
From Hugo to Haunt to Custom: My Journey in Static Site Generation My Development Environment in 2025: From Editor to Deployment
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">My journey with static site generators has been one of continuous learning and evolution. It started with Hugo, transitioned through Haunt, and has now led me to build my own custom solution. Each ste...</p> <p class="text-palenight-100 mb-4">The tools we use shape how we work. Over the years, my development environment has evolved alongside my technical journey through different programming languages, paradigms, and projects. This post of...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">web</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">javascript</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">static-site</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">haunt</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guile</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">hugo</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guix</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tools</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">workflow</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">productivity</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">web</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>tech</span><span></span><span>guile</span><span></span><span>scheme</span><span></span><span>development</span><span></span><span>functional-programming</span> <span></span><span>web</span><span></span><span>development</span><span></span><span>javascript</span><span></span><span>static-site</span><span></span><span>haunt</span><span></span><span>guile</span><span></span><span>hugo</span>
<span></span> <span></span>
<time datetime="2024-12-03">December 3, 2024</time> <time datetime="2025-01-02">January 2, 2025</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-12-03-practical-scheme.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2025-01-02-from-haunt-to-custom.html" class="hover:text-accent-cyan transition-colors">
Beyond Theory: Building Practical Tools with Guile Scheme From Hugo to Haunt to Custom: My Journey in Static Site Generation
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">A few months ago, I shared my journey into learning Scheme through building stash, a symlink manager. Since then, I've discovered that the gap between learning Scheme and applying it to real-world pro...</p> <p class="text-palenight-100 mb-4">My journey with static site generators has been one of continuous learning and evolution. It started with Hugo, transitioned through Haunt, and has now led me to build my own custom solution. Each ste...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guile</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">scheme</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">functional-programming</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">web</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">javascript</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">static-site</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">haunt</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guile</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">hugo</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>personal</span><span></span><span>tech</span><span></span><span>guile</span><span></span><span>scheme</span><span></span><span>gnu</span><span></span><span>development</span> <span></span><span>tech</span><span></span><span>guile</span><span></span><span>scheme</span><span></span><span>development</span><span></span><span>functional-programming</span>
<span></span> <span></span>
<time datetime="2024-09-24">September 24, 2024</time> <time datetime="2024-12-03">December 3, 2024</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-09-24-scheme-journey.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2024-12-03-practical-scheme.html" class="hover:text-accent-cyan transition-colors">
A Journey into Scheme Beyond Theory: Building Practical Tools with Guile Scheme
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">I've spent my career as an electrical engineer, not a software developer. However, my recent journey in to GNU/Liniux required a tool for managing symlinks, and that's how I began learning Scheme—spec...</p> <p class="text-palenight-100 mb-4">A few months ago, I shared my journey into learning Scheme through building stash, a symlink manager. Since then, I've discovered that the gap between learning Scheme and applying it to real-world pro...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guile</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">scheme</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">gnu</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guile</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">scheme</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">functional-programming</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>personal</span><span></span><span>tech</span><span></span><span>gnu</span><span></span><span>guix</span><span></span><span>swaywm</span><span></span><span>nvidia</span> <span></span><span>personal</span><span></span><span>tech</span><span></span><span>guile</span><span></span><span>scheme</span><span></span><span>gnu</span><span></span><span>development</span>
<span></span> <span></span>
<time datetime="2024-07-26">July 26, 2024</time> <time datetime="2024-09-24">September 24, 2024</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-07-26-gnu-guix-journey.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2024-09-24-scheme-journey.html" class="hover:text-accent-cyan transition-colors">
A Journey Through GNU Guix: From Installation to Returning to Arch Linux A Journey into Scheme
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">As a long-time user of Arch Linux, I decided to explore the world of GNU Guix to see if it could better suit my needs, especially with my growing interest in functional package management. The journey...</p> <p class="text-palenight-100 mb-4">I've spent my career as an electrical engineer, not a software developer. However, my recent journey in to GNU/Liniux required a tool for managing symlinks, and that's how I began learning Scheme—spec...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">gnu</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guix</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">swaywm</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">nvidia</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guile</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">scheme</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">gnu</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">development</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>personal</span><span></span><span>tech</span><span></span><span>keyboards</span><span></span><span>glove80</span> <span></span><span>personal</span><span></span><span>tech</span><span></span><span>gnu</span><span></span><span>guix</span><span></span><span>swaywm</span><span></span><span>nvidia</span>
<span></span> <span></span>
<time datetime="2024-05-15">May 15, 2024</time> <time datetime="2024-07-26">July 26, 2024</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-05-15-hugo-to-haunt.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2024-07-26-gnu-guix-journey.html" class="hover:text-accent-cyan transition-colors">
Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix A Journey Through GNU Guix: From Installation to Returning to Arch Linux
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">Hello there! I'm Glenn Thompson, and today, I want to share a significant part of my recent journey into the world of Scheme, GNU Guix, and static site generation.</p> <p class="text-palenight-100 mb-4">As a long-time user of Arch Linux, I decided to explore the world of GNU Guix to see if it could better suit my needs, especially with my growing interest in functional package management. The journey...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">keyboards</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">glove80</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">gnu</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">guix</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">swaywm</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">nvidia</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>work</span><span></span><span>travel</span> <span></span><span>personal</span><span></span><span>tech</span><span></span><span>keyboards</span><span></span><span>glove80</span>
<span></span> <span></span>
<time datetime="2024-05-01">May 1, 2024</time> <time datetime="2024-05-15">May 15, 2024</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-05-01-amman-newcastle-journey.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2024-05-15-hugo-to-haunt.html" class="hover:text-accent-cyan transition-colors">
A Rollercoaster Week: From Amman to Newcastle, and back again Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">Two weeks ago was a whirlwind of events, taking me from the conforting embrace of Amman, Jordan to the vibrant streets of Newcastle, England. It was a journey filled with highs and lows, professional...</p> <p class="text-palenight-100 mb-4">Hello there! I'm Glenn Thompson, and today, I want to share a significant part of my recent journey into the world of Scheme, GNU Guix, and static site generation.</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">work</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">travel</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">keyboards</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">glove80</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors"> <article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold"> <div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span> <span>Tech</span>
<span></span><span>personal</span><span></span><span>tech</span><span></span><span>keyboards</span><span></span><span>glove80</span> <span></span><span>work</span><span></span><span>travel</span>
<span></span> <span></span>
<time datetime=""2024-04-08">April 8, 2024</time> <time datetime="2024-05-01">May 1, 2024</time>
</div> </div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3"> <h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-04-08-glove80-review.html" class="hover:text-accent-cyan transition-colors"> <a href="/content/posts/2024-05-01-amman-newcastle-journey.html" class="hover:text-accent-cyan transition-colors">
Aesthetic Meets Ergonomics: My Deep Dive into the Glove80 Keyboard A Rollercoaster Week: From Amman to Newcastle, and back again
</a> </a>
</h3> </h3>
<p class="text-palenight-100 mb-4">As my career trajectory veered from being an integral member of an electrical engineering team to assuming the role of Deputy Project Manager, the nature of my daily activities underwent a significant...</p> <p class="text-palenight-100 mb-4">Two weeks ago was a whirlwind of events, taking me from the conforting embrace of Amman, Jordan to the vibrant streets of Newcastle, England. It was a journey filled with highs and lows, professional...</p>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">keyboards</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">glove80</span> <span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">work</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">travel</span>
</div> </div>
</article> </article>
<article class="bg-base-darker p-6 rounded-lg shadow-lg border border-palenight-400/20 hover:border-accent-purple/40 transition-colors">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</span>
<span></span><span>personal</span><span></span><span>tech</span><span></span><span>keyboards</span><span></span><span>glove80</span>
<span></span>
<time datetime="2024-04-08">April 8, 2024</time>
</div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2024-04-08-glove80-review.html" class="hover:text-accent-cyan transition-colors">
Aesthetic Meets Ergonomics: My Deep Dive into the Glove80 Keyboard
</a>
</h3>
<p class="text-palenight-100 mb-4">As my career trajectory veered from being an integral member of an electrical engineering team to assuming the role of Deputy Project Manager, the nature of my daily activities underwent a significant...</p>
<div class="flex flex-wrap gap-2">
<span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">personal</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">tech</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">keyboards</span><span class="text-accent-yellow px-2 py-1 rounded-full bg-base-bg text-xs">glove80</span>
</div>
</article>
</div><!-- End blog posts --> </div><!-- End blog posts -->
</div> </div>
</section> </section>

View File

@ -223,15 +223,28 @@ async function updateIndexWithSummaries() {
// Extract metadata // Extract metadata
const metadata = {}; const metadata = {};
content.replace(/^---\n([\s\S]*?)\n---\n/, (_, frontMatter) => { // More flexible regex to handle different line endings
frontMatter.split('\n').forEach(line => { const frontMatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);
const [key, ...valueParts] = line.split(':'); if (frontMatterMatch) {
if (key && valueParts.length > 0) { const frontMatter = frontMatterMatch[1];
metadata[key.trim()] = valueParts.join(':').trim(); frontMatter.split(/\r?\n/).forEach(line => {
const colonIndex = line.indexOf(':');
if (colonIndex > 0) {
const key = line.substring(0, colonIndex).trim();
let value = line.substring(colonIndex + 1).trim();
// Remove quotes if present
if ((value.startsWith('"') && value.endsWith('"')) ||
(value.startsWith("'") && value.endsWith("'"))) {
value = value.slice(1, -1);
}
if (key && value) {
metadata[key] = value;
}
} }
}); });
return ''; }
});
// Extract summary // Extract summary
const summary = extractSummary(content); const summary = extractSummary(content);
@ -239,18 +252,45 @@ async function updateIndexWithSummaries() {
// Parse and format the date // Parse and format the date
let formattedDate = ''; let formattedDate = '';
let isoDate = ''; let isoDate = '';
if (!metadata.date) {
console.warn(`No date found for ${file}`);
continue;
}
try { try {
// Handle date formats like "2024-04-08 16:50" or "2024-04-08" let dateStr = '';
const dateStr = metadata.date.split(' ')[0];
// Handle different date formats
if (typeof metadata.date === 'string') {
// String format: "2024-04-08 16:50" or "2024-04-08"
dateStr = metadata.date.split(' ')[0];
} else if (typeof metadata.date === 'number') {
// Number format: 2025-04-02 (YAML parsed as number)
dateStr = metadata.date.toString();
} else if (metadata.date instanceof Date) {
// Date object
dateStr = metadata.date.toISOString().split('T')[0];
} else {
// Fallback: convert to string and extract date part
dateStr = String(metadata.date).split(' ')[0];
}
const date = new Date(dateStr); const date = new Date(dateStr);
formattedDate = date.toLocaleDateString('en-US', { if (!isNaN(date.getTime())) {
year: 'numeric', formattedDate = date.toLocaleDateString('en-US', {
month: 'long', year: 'numeric',
day: 'numeric' month: 'long',
}); day: 'numeric'
isoDate = dateStr; });
isoDate = dateStr;
} else {
console.warn(`Invalid date format for ${file}: ${metadata.date} (type: ${typeof metadata.date})`);
continue;
}
} catch (e) { } catch (e) {
console.error(`Error parsing date for ${file}:`, e); console.error(`Error parsing date for ${file}:`, e);
continue;
} }
// Parse tags // Parse tags

Binary file not shown.