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:
```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
### Adding New Blog Posts

344
build.sh
View File

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

View File

@ -1,149 +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=""One Year of Craftering: Building Connections in the System Crafters Community"">
<meta property="og:description" content="">
<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>
<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>[community, webring, systemcrafters, reflection]</span>
<span></span>
<time datetime="2025-04-02">April 2, 2025</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">"One Year of Craftering: Building Connections in the System Crafters Community"</h1>
<div class="flex items-center gap-4 text-palenight-300 mt-4">
<time datetime="2025-04-02">2025-04-02</time>
<span></span>
<span>3 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">[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>
</header>
<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>
<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>
<!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>

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
# Function to show usage
show_usage() {
echo "Usage: $0 [--ftp]"
echo "Options:"
echo " --ftp Upload to FTP server (requires .env.gpg file with encrypted credentials)"
exit 1
}
# Function to decrypt credentials
decrypt_credentials() {
if [ ! -f ".env.gpg" ]; then
echo "Error: .env.gpg file not found!"
exit 1
fi
# Create a temporary file for decrypted credentials
TEMP_ENV=$(mktemp)
# Decrypt the credentials
if ! gpg --quiet --decrypt .env.gpg > "$TEMP_ENV"; then
echo "Error: Failed to decrypt credentials!"
rm "$TEMP_ENV"
exit 1
fi
# Source the decrypted credentials
source "$TEMP_ENV"
# Securely remove the temporary file
rm "$TEMP_ENV"
}
# Parse command line arguments
USE_FTP=false
while [[ "$#" -gt 0 ]]; do
case $1 in
--ftp) USE_FTP=true ;;
-h|--help) show_usage ;;
*) echo "Unknown parameter: $1"; show_usage ;;
esac
shift
done
# Ensure deploy directory structure exists
mkdir -p deploy/content/posts
# Temporarily save the posts
if [ -d "deploy/content/posts" ]; then
mkdir -p .tmp_posts
mv deploy/content/posts/* .tmp_posts/ 2>/dev/null || true
fi
# Clean up deploy directory
rm -rf deploy/*
# Restore the directory structure
mkdir -p deploy/content/posts
# Restore the posts if they existed
if [ -d ".tmp_posts" ]; then
mv .tmp_posts/* deploy/content/posts/ 2>/dev/null || true
rm -rf .tmp_posts
fi
# Run build process to ensure latest CSS
echo "Building CSS..."
npm run build
echo "Generating RSS feed..."
node src/js/generate-rss.js
# Copy necessary files
echo "Copying files..."
cp index.html deploy/
cp favicon.svg deploy/
cp -r dist deploy/
cp -r src/js deploy/js
cp feed.xml deploy/
# Create deployment package
echo "Creating zip archive..."
cd deploy && zip -r ../website-deploy.zip ./*
cd ..
echo "Deployment package created successfully!"
echo "Your files are ready in the 'website-deploy.zip' file"
echo "You can also find individual files in the 'deploy' directory"
# FTP Upload if requested
if [ "$USE_FTP" = true ]; then
# Decrypt and load credentials
decrypt_credentials
if [ -z "$FTP_HOST" ] || [ -z "$FTP_USER" ] || [ -z "$FTP_PASS" ] || [ -z "$FTP_DIR" ]; then
echo "Error: Missing FTP credentials!"
exit 1
fi
# Check if lftp is installed
if ! command -v lftp &> /dev/null; then
echo "Error: lftp is not installed. Please install it first."
exit 1
fi
echo "Starting FTP upload..."
lftp -c "
set ssl:verify-certificate no;
open -u $FTP_USER,$FTP_PASS $FTP_HOST;
lcd deploy;
cd $FTP_DIR;
mirror -R --parallel=4 --verbose;
bye"
echo "FTP upload completed!"
fi
#!/bin/bash
# Function to show usage
show_usage() {
echo "Usage: $0 [--ftp]"
echo "Options:"
echo " --ftp Upload to FTP server (requires .env.gpg file with encrypted credentials)"
exit 1
}
# Function to decrypt credentials
decrypt_credentials() {
if [ ! -f ".env.gpg" ]; then
echo "Error: .env.gpg file not found!"
exit 1
fi
# Create a temporary file for decrypted credentials
TEMP_ENV=$(mktemp)
# Decrypt the credentials
if ! gpg --quiet --decrypt .env.gpg > "$TEMP_ENV"; then
echo "Error: Failed to decrypt credentials!"
rm "$TEMP_ENV"
exit 1
fi
# Source the decrypted credentials
source "$TEMP_ENV"
# Securely remove the temporary file
rm "$TEMP_ENV"
}
# Parse command line arguments
USE_FTP=false
while [[ "$#" -gt 0 ]]; do
case $1 in
--ftp) USE_FTP=true ;;
-h|--help) show_usage ;;
*) echo "Unknown parameter: $1"; show_usage ;;
esac
shift
done
# Ensure deploy directory structure exists
mkdir -p deploy/content/posts
# Temporarily save the posts
if [ -d "deploy/content/posts" ]; then
mkdir -p .tmp_posts
mv deploy/content/posts/* .tmp_posts/ 2>/dev/null || true
fi
# Clean up deploy directory
rm -rf deploy/*
# Restore the directory structure
mkdir -p deploy/content/posts
# Restore the posts if they existed
if [ -d ".tmp_posts" ]; then
mv .tmp_posts/* deploy/content/posts/ 2>/dev/null || true
rm -rf .tmp_posts
fi
# Run build process to ensure latest CSS
echo "Building CSS..."
npm run build
echo "Generating RSS feed..."
node src/js/generate-rss.js
# Copy necessary files
echo "Copying files..."
cp index.html deploy/
cp favicon.svg deploy/
cp -r dist deploy/
cp -r src/js deploy/js
cp feed.xml deploy/
# Create deployment package
echo "Creating zip archive..."
cd deploy && zip -r ../website-deploy.zip ./*
cd ..
echo "Deployment package created successfully!"
echo "Your files are ready in the 'website-deploy.zip' file"
echo "You can also find individual files in the 'deploy' directory"
# FTP Upload if requested
if [ "$USE_FTP" = true ]; then
# Decrypt and load credentials
decrypt_credentials
if [ -z "$FTP_HOST" ] || [ -z "$FTP_USER" ] || [ -z "$FTP_PASS" ] || [ -z "$FTP_DIR" ]; then
echo "Error: Missing FTP credentials!"
exit 1
fi
# Check if lftp is installed
if ! command -v lftp &> /dev/null; then
echo "Error: lftp is not installed. Please install it first."
exit 1
fi
echo "Starting FTP upload..."
lftp -c "
set ssl:verify-certificate no;
open -u $FTP_USER,$FTP_PASS $FTP_HOST;
lcd deploy;
cd $FTP_DIR;
mirror -R --parallel=4 --verbose;
bye"
echo "FTP upload completed!"
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">
<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>
<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">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<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>
<time datetime="2025-03-13">March 13, 2025</time>
</div>
<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">
Lessons Learned: One Year with a Custom Static Site Generator
</a>
</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>
<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>
</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>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>
<time datetime="2025-03-08">March 8, 2025</time>
</div>
<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">
My Development Environment in 2025: From Editor to Deployment
</a>
</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>
<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>
</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>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>
<time datetime="2025-01-02">January 2, 2025</time>
</div>
<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">
From Hugo to Haunt to Custom: My Journey in Static Site Generation
</a>
</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>
<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>
</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>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>
<time datetime="2024-12-03">December 3, 2024</time>
</div>
<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">
Beyond Theory: Building Practical Tools with Guile Scheme
</a>
</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>
<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>
</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>guile</span><span></span><span>scheme</span><span></span><span>gnu</span><span></span><span>development</span>
<span></span>
<time datetime="2024-09-24">September 24, 2024</time>
</div>
<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 Journey into Scheme
</a>
</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>
<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>
</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>gnu</span><span></span><span>guix</span><span></span><span>swaywm</span><span></span><span>nvidia</span>
<span></span>
<time datetime="2024-07-26">July 26, 2024</time>
</div>
<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 Journey Through GNU Guix: From Installation to Returning to Arch Linux
</a>
</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>
<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>
</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-05-15">May 15, 2024</time>
</div>
<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">
Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix
</a>
</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>
<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>
<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 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">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</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>
<time datetime="2025-09-28">September 28, 2025</time>
</div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2025-09-28-dev-environment-evolution-guix-home.html" class="hover:text-accent-cyan transition-colors">
Development Environment Evolution: Embracing Guix Home and Enhanced Emacs Workflow
</a>
</h3>
<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">
<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>
</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>community</span><span></span><span>webring</span><span></span><span>systemcrafters</span><span></span><span>reflection</span>
<span></span>
<time datetime="2025-04-02">April 2, 2025</time>
</div>
<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">
One Year of Craftering: Building Connections in the System Crafters Community
</a>
</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>
<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>
</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>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>
<time datetime="2025-03-13">March 13, 2025</time>
</div>
<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">
Lessons Learned: One Year with a Custom Static Site Generator
</a>
</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>
<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>
</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>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>
<time datetime="2025-03-08">March 8, 2025</time>
</div>
<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">
My Development Environment in 2025: From Editor to Deployment
</a>
</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>
<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>
</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>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>
<time datetime="2025-01-02">January 2, 2025</time>
</div>
<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">
From Hugo to Haunt to Custom: My Journey in Static Site Generation
</a>
</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>
<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>
</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>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>
<time datetime="2024-12-03">December 3, 2024</time>
</div>
<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">
Beyond Theory: Building Practical Tools with Guile Scheme
</a>
</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>
<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>
</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>guile</span><span></span><span>scheme</span><span></span><span>gnu</span><span></span><span>development</span>
<span></span>
<time datetime="2024-09-24">September 24, 2024</time>
</div>
<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 Journey into Scheme
</a>
</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>
<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>
</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>gnu</span><span></span><span>guix</span><span></span><span>swaywm</span><span></span><span>nvidia</span>
<span></span>
<time datetime="2024-07-26">July 26, 2024</time>
</div>
<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 Journey Through GNU Guix: From Installation to Returning to Arch Linux
</a>
</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>
<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>
</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-05-15">May 15, 2024</time>
</div>
<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">
Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix
</a>
</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>
<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>
<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>
</section>

View File

@ -223,15 +223,28 @@ async function updateIndexWithSummaries() {
// Extract metadata
const metadata = {};
content.replace(/^---\n([\s\S]*?)\n---\n/, (_, frontMatter) => {
frontMatter.split('\n').forEach(line => {
const [key, ...valueParts] = line.split(':');
if (key && valueParts.length > 0) {
metadata[key.trim()] = valueParts.join(':').trim();
// More flexible regex to handle different line endings
const frontMatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);
if (frontMatterMatch) {
const frontMatter = frontMatterMatch[1];
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
const summary = extractSummary(content);
@ -239,18 +252,45 @@ async function updateIndexWithSummaries() {
// Parse and format the date
let formattedDate = '';
let isoDate = '';
if (!metadata.date) {
console.warn(`No date found for ${file}`);
continue;
}
try {
// Handle date formats like "2024-04-08 16:50" or "2024-04-08"
const dateStr = metadata.date.split(' ')[0];
let dateStr = '';
// 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);
formattedDate = date.toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
isoDate = dateStr;
if (!isNaN(date.getTime())) {
formattedDate = date.toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
isoDate = dateStr;
} else {
console.warn(`Invalid date format for ${file}: ${metadata.date} (type: ${typeof metadata.date})`);
continue;
}
} catch (e) {
console.error(`Error parsing date for ${file}:`, e);
continue;
}
// 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">
<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>
<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">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<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>
<time datetime="2025-04-02">April 2, 2025</time>
</div>
<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">
One Year of Craftering: Building Connections in the System Crafters Community
</a>
</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>
<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>
</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>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>
<time datetime="2025-03-13">March 13, 2025</time>
</div>
<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">
Lessons Learned: One Year with a Custom Static Site Generator
</a>
</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>
<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>
</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>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>
<time datetime="2025-03-08">March 8, 2025</time>
</div>
<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">
My Development Environment in 2025: From Editor to Deployment
</a>
</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>
<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>
</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>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>
<time datetime="2025-01-02">January 2, 2025</time>
</div>
<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">
From Hugo to Haunt to Custom: My Journey in Static Site Generation
</a>
</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>
<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>
</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>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>
<time datetime="2024-12-03">December 3, 2024</time>
</div>
<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">
Beyond Theory: Building Practical Tools with Guile Scheme
</a>
</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>
<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>
</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>guile</span><span></span><span>scheme</span><span></span><span>gnu</span><span></span><span>development</span>
<span></span>
<time datetime="2024-09-24">September 24, 2024</time>
</div>
<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 Journey into Scheme
</a>
</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>
<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>
</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>gnu</span><span></span><span>guix</span><span></span><span>swaywm</span><span></span><span>nvidia</span>
<span></span>
<time datetime="2024-07-26">July 26, 2024</time>
</div>
<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 Journey Through GNU Guix: From Installation to Returning to Arch Linux
</a>
</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>
<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>
</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-05-15">May 15, 2024</time>
</div>
<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">
Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix
</a>
</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>
<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>
<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 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">
<div class="flex flex-wrap items-center gap-2 text-accent-yellow text-sm mb-2 font-bold">
<span>Tech</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>
<time datetime="2025-09-28">September 28, 2025</time>
</div>
<h3 class="text-xl font-serif font-bold text-accent-yellow mb-3">
<a href="/content/posts/2025-09-28-dev-environment-evolution-guix-home.html" class="hover:text-accent-cyan transition-colors">
Development Environment Evolution: Embracing Guix Home and Enhanced Emacs Workflow
</a>
</h3>
<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">
<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>
</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>community</span><span></span><span>webring</span><span></span><span>systemcrafters</span><span></span><span>reflection</span>
<span></span>
<time datetime="2025-04-02">April 2, 2025</time>
</div>
<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">
One Year of Craftering: Building Connections in the System Crafters Community
</a>
</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>
<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>
</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>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>
<time datetime="2025-03-13">March 13, 2025</time>
</div>
<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">
Lessons Learned: One Year with a Custom Static Site Generator
</a>
</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>
<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>
</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>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>
<time datetime="2025-03-08">March 8, 2025</time>
</div>
<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">
My Development Environment in 2025: From Editor to Deployment
</a>
</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>
<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>
</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>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>
<time datetime="2025-01-02">January 2, 2025</time>
</div>
<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">
From Hugo to Haunt to Custom: My Journey in Static Site Generation
</a>
</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>
<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>
</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>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>
<time datetime="2024-12-03">December 3, 2024</time>
</div>
<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">
Beyond Theory: Building Practical Tools with Guile Scheme
</a>
</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>
<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>
</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>guile</span><span></span><span>scheme</span><span></span><span>gnu</span><span></span><span>development</span>
<span></span>
<time datetime="2024-09-24">September 24, 2024</time>
</div>
<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 Journey into Scheme
</a>
</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>
<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>
</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>gnu</span><span></span><span>guix</span><span></span><span>swaywm</span><span></span><span>nvidia</span>
<span></span>
<time datetime="2024-07-26">July 26, 2024</time>
</div>
<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 Journey Through GNU Guix: From Installation to Returning to Arch Linux
</a>
</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>
<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>
</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-05-15">May 15, 2024</time>
</div>
<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">
Transitioning from Hugo to Haunt: Embracing Scheme and GNU Guix
</a>
</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>
<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>
<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>
</section>

View File

@ -223,15 +223,28 @@ async function updateIndexWithSummaries() {
// Extract metadata
const metadata = {};
content.replace(/^---\n([\s\S]*?)\n---\n/, (_, frontMatter) => {
frontMatter.split('\n').forEach(line => {
const [key, ...valueParts] = line.split(':');
if (key && valueParts.length > 0) {
metadata[key.trim()] = valueParts.join(':').trim();
// More flexible regex to handle different line endings
const frontMatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);
if (frontMatterMatch) {
const frontMatter = frontMatterMatch[1];
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
const summary = extractSummary(content);
@ -239,18 +252,45 @@ async function updateIndexWithSummaries() {
// Parse and format the date
let formattedDate = '';
let isoDate = '';
if (!metadata.date) {
console.warn(`No date found for ${file}`);
continue;
}
try {
// Handle date formats like "2024-04-08 16:50" or "2024-04-08"
const dateStr = metadata.date.split(' ')[0];
let dateStr = '';
// 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);
formattedDate = date.toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
isoDate = dateStr;
if (!isNaN(date.getTime())) {
formattedDate = date.toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
isoDate = dateStr;
} else {
console.warn(`Invalid date format for ${file}: ${metadata.date} (type: ${typeof metadata.date})`);
continue;
}
} catch (e) {
console.error(`Error parsing date for ${file}:`, e);
continue;
}
// Parse tags

Binary file not shown.