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

View File

@ -4,10 +4,10 @@
<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: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>"One Year of Craftering: Building Connections in the System Crafters Community" - Glenn Thompson</title>
<title>Blog Post - Glenn Thompson</title>
<link rel="alternate" type="application/rss+xml" title="Glenn Thompson's Blog" href="/feed.xml" />
<link 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">
@ -68,9 +68,9 @@
<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>Tech</span>
<span></span>
<time datetime="2025-04-02">April 2, 2025</time>
<time datetime="undefined">Invalid Date</time>
<span></span>
<span>3 min read</span>
</div>
@ -82,22 +82,21 @@
<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>
<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="2025-04-02">2025-04-02</time>
<time datetime=""></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>
<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>

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.

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

@ -60,6 +60,44 @@
<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>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>
@ -217,7 +255,7 @@
<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>
<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">

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);
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

1141
feed.xml

File diff suppressed because it is too large Load Diff

View File

@ -60,6 +60,25 @@
<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>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>
@ -236,7 +255,7 @@
<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>
<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">

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);
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.