From the blog

Post illustration
emacs · org-roam · vulpea

Vulpea v0.3

Announcing Vulpea v0.3, with major performance improvements for note querying operations. The release introduces a materialized view table that provides a 4.5x speed boost for general queries, plus specialized query functions that can be up to 150x faster in certain scenarios. While write operations take a small hit, the trade-off is worth it for large note collections. I've also added several quality-of-life improvements like better metadata handling and new tag utility functions.

Post illustration
emacs-plus

emacs-plus: PATH injection

Sharing how I improved PATH handling in Emacs+ to solve a common pain point. By injecting the user's PATH into Emacs.app during build, users now get the expected environment variables when launching Emacs from anywhere on macOS. This change also simplifies native-comp configuration and helps avoid common compilation issues. While it's not as dynamic as exec-path-from-shell, it provides a solid out-of-box experience for Emacs+ users.provided by Emacs+ that injects PATH value during build

Post illustration
emacs-plus

emacs-plus: stats

Sharing some analytics insights from Emacs Plus and how they'll influence future maintenance. Looking at installation data, Emacs 28 is currently the most popular version, and features like native-comp and xwidgets are heavily used. I'm considering deprecating some rarely-used options while making it easier to enable simple build flags. For icons, modern-doom3, nobu417-big-sur, and spacemacs lead in popularity. Any major changes will be well-communicated to avoid disrupting users' workflows.

Post illustration
yabai

Automatic setup of spaces with yabai

Sharing my yabai configuration for automatically setting up workspaces in macOS. I walk through how to create a consistent set of labeled spaces, clean up extras, and automatically move applications to specific workspaces on startup. While tiling window managers aren't for everyone, this setup helps maintain an organized workflow by ensuring applications always land in their designated spaces.

blog

War and World

A personal note explaining that while I'll be less available due to the war in Ukraine, projects will continue - though help from the community would be welcome.

Post illustration
emacs · org-roam

Path to org-roam v2

Sharing my migration experience from org-roam v1 to v2. The update brings major improvements like mandatory IDs, better note structure, and improved database queries - though it requires effort to migrate. I've included my migration script and explained the key changes, especially around note tagging and database access. V2 is a big step forward, making org-roam more stable and powerful for non-hierarchical note-taking.

Post illustration
emacs

Fixing PATH in fish with nix-darwin

Sharing how I fixed a PATH order issue when using Fish shell with nix-darwin. Since Fish reimplements macOS's path_helper behavior, it was reordering PATH and putting .nix-profile/bin at the end. By remembering the original PATH before Fish's initialization and restoring the order afterward, I got nix packages to properly override system binaries. I've included detailed debugging steps using Fish's event handlers in case others run into similar issues.

Post illustration
emacs · org-roam

Task management with org-roam Vol. 7: Capture

Sharing my org-roam capture workflow, focusing on quick task entry and efficient processing. I've set up a dedicated inbox file per machine to avoid sync issues, and use org-agenda with the REFILE tag to process captured items. For meetings, I've created a smarter capture template that automatically places one-on-one notes in the right person's file - a nice example of using org-roam's query capabilities to streamline capture.

Post illustration
emacs

Project management tool for Emacs packages

I'm sharing my experience and observations about build tools for Emacs packages. While makem.sh is wonderfully simple and cask is a robust classic, I've found eldev's extensibility and native Emacs Lisp implementation particularly useful. The choice really depends on your needs - makem.sh is great for simpler projects, but when you need more customization, tools like eldev or cask become more attractive.

Post illustration
emacs

Towards future-safe emacs.d

I've helped make my Emacs configurations more maintainable by creating a structured approach to testing, linting and compilation. By using eldev for project management, straight.el for packages, and organizing code into init/lib/config files with proper autoloads, I've achieved both quick startup and robust development. The solution includes proper byte compilation, linting with elisp-lint, and testing with buttercup - all while maintaining performance. I've shared the complete setup including Makefiles and helper scripts to automate the process.

Post illustration
emacs

Retries with straight.el

Sharing a quick fix for handling network issues when updating Emacs packages with straight.el. I created a simple retry wrapper that automatically retries failed network operations. Just wrap the problematic functions with an advice, and you won't have to restart the whole update process when your connection hiccups!

Post illustration
emacs · org-roam

Task management with org-roam Vol. 6: Select a person and view related tasks

Sharing a quick utility I wrote to view all tasks related to a specific person in org-roam. By combining vulpea's selection functions with org-agenda's tag matching, we can easily see everything tagged with a person's name (including their aliases). Just a few lines of code, but it makes a big difference in managing person-related tasks!

Post illustration
emacs · org-roam

Task management with org-roam Vol. 5: Dynamic and fast agenda

Sharing a significant performance optimization I created for org-roam agenda generation. By dynamically tracking notes containing TODOs with a 'project' tag, I reduced agenda loading from over 50 seconds to under 1 second. The solution automatically updates tags when files are visited or saved, querying only relevant files when building the agenda view. I've included all the code and explained the implementation details, from checking for TODO entries to SQL queries.

Post illustration
emacs · org-roam

Task management with org-roam Vol. 4: Automatic tagging

Sharing how I automated task tagging in org-roam with vulpea. When you mention someone in a task by linking to their note, the task automatically gets tagged with that person's name. I'm using vulpea-insert hooks to handle this cleanly, avoiding the need for advice on org-roam functions. The code includes checks to ensure we only add person tags to actual TODO items.

Post illustration
emacs · org-roam

Task management with org-roam Vol. 3: FILETAGS

Sharing my approach to managing person-related tasks in org-roam notes. I explain how to use filetags to automatically tag all tasks in a person's note (like @FrodoBaggins), maintaining the tag inheritance functionality from regular org-mode while moving to individual roam notes. I've included code to automate the tagging process, making it easier to maintain consistency when adding new people notes.

Post illustration
emacs · org-roam

Task management with org-roam Vol. 2: Categories

Sharing how I improved the agenda view for org-roam notes by fixing category display. Rather than showing file IDs, we can now show meaningful categories based on note titles or explicit CATEGORY properties. I've included a function to automatically extract and format categories, plus options to handle long titles gracefully. The result is a cleaner, more readable agenda that better integrates with org-roam's note-taking approach.

Post illustration
emacs · org-roam

Task management with org-roam Vol. 1: Path to Roam

Sharing my approach to task management in org-roam, showing how to organize tasks and projects across notes while maintaining compatibility with org-mode's agenda features. While org-roam favors smaller files over larger ones, we can still implement a familiar structure of tasks, projects, and meta-projects. The article explains the basic setup, though there are some visual quirks in the agenda buffer that we'll address in a follow-up post.

Post illustration
emacs · org-roam

Org-roam tags

Sharing some functions I wrote to better manage tags in org-roam notes. While this functionality is now part of org-roam v2 (use org-roam-tag-add and org-roam-tag-remove instead), the code demonstrates how to extend org-roam's capabilities and work with its database. The implementation focused on making tag management more intuitive with completion support.

Post illustration
emacs

Emacs: moving to beginning of line

Sharing my custom Emacs functions for smarter line navigation. I've created enhanced alternatives to move-to-beginning-of-line that first jump to meaningful content before the actual line start. The org-mode version is particularly useful, handling headlines, TODO items, and list bullets intelligently. These functions make code navigation more intuitive without adding external package dependencies.

Post illustration
haskell · readings

Readings Vol. I: precondition encoding

A look at different ways to handle preconditions in Haskell libraries, exploring approaches from simple Maybe types to more sophisticated type-level guarantees. Through examples from Alexis King's "Parse, don't validate" and Matt Noonan's "Ghosts of Departed Proofs", I discuss how we can leverage Haskell's type system to make illegal states unrepresentable while maintaining runtime performance.

Post illustration
haskell

Predicate composition

A deep dive into predicate composition in Haskell, exploring different implementation approaches - from simple function composition to using Semigroup and coercion. I've shown how we can create elegant abstractions without runtime penalties by leveraging GHC's optimization capabilities and newtype wrappers. Complete with Core dumps and performance benchmarks to prove there's no performance cost.

Post illustration
emacs-plus

emacs-plus: current state

Sharing a status update on emacs-plus, my Homebrew formula that started as an April Fool's joke with just a Spacemacs icon. I've made some recent improvements like moving to GitHub Workflows for faster builds, better patch management, and improved visibility into build failures. While I'm considering simplifying the available options, I'm grateful for the community support that's kept this project going!

Post illustration
haskell · release · env-exta

env-extra v1.0.0.0

Introducing env-extra, my small Haskell library that improves environment variable handling with features like Text input support, flexible return types, and better error handling. It wraps System.Environment to reduce boilerplate while adding some nice parsing capabilities. Check it out on Hackage if you're tired of Text.pack/unpack and liftIO everywhere!

Post illustration
emacs · release · flyspell-correct

flyspell-correct v0.6

Announcing flyspell-correct 0.6, featuring a new avy-menu interface and several improvements including fixed point movements and lexical binding. Special thanks to @clemera and @Ergus for their contributions. Check out the full changelog and let me know if you run into any issues!

Post illustration
emacs

Emacs: reusing window for helpful buffers

Sharing a quick tip for improving how the helpful package manages windows in Emacs. By customizing helpful-switch-buffer-function, we can make help navigation more intuitive - keeping the original code visible while browsing documentation. The solution is just a few lines of Elisp that makes help buffers behave more predictably.

shell

Asking for input in Bash

Sharing how I improved a configuration script by creating a reusable 'ask' function that handles both required and optional inputs. Instead of using eval for variable manipulation, I opted for bash's safer indirection and declare features. The result is cleaner, more maintainable code that's still compatible across different bash versions.

shell

Revisiting Eru

Introducing Eru.sh, my system bootstrapping script. This bash script helps me set up my development environment across different machines by installing applications, configuring tools like Emacs and Fish shell, and syncing repositories. I've also shared some interesting bash programming patterns I used to make the code more maintainable, like mapping over files and handling optional themes. While it's not the most elegant solution, it gets the job done efficiently!

Post illustration
emacs

Equality of booleans in Emacs

Sharing some fun quirks about booleans in Emacs Lisp - or rather, the lack of them! Since everything is either nil (the empty list) or some form of "true", comparing boolean values gets interesting. I've explored a few different approaches using if/when, not, and xor functions to handle boolean comparisons properly.

shell

High quality GIF from video

Sharing my script 'gifify' that simplifies creating high-quality GIFs with FFmpeg using custom palettes. It wraps FFmpeg's powerful features in a user-friendly interface, letting you control quality settings like FPS and scaling while automating the palette generation process. I've included visual examples comparing default vs custom palettes, plus complete installation instructions and source code.

Post illustration
emacs · release · flyspell-correct

flyspell-correct v0.5

Announcing flyspell-correct 0.5, with a new rapid mode for fixing multiple words in one run, plus some function renames and bug fixes. The update also improves skipping behavior and adds test coverage. Check out the full changelog and let me know if you encounter any issues!

shell

Random bytes generation with OpenSSL

Sharing a quick OpenSSL tip for generating random bytes - using the rand command with hex or base64 encoding lets you create high-entropy random strings for passwords and other uses. Just remember to account for the encoding's effect on output length.

Post illustration
emacs · org-mode

Structure templates in Org mode

A tip about Org mode's built-in structure templates that make inserting source blocks and other structural elements much easier - no need for custom solutions when you can use C-c C-, or the legacy Easy Template system with <s<TAB>.

applescript

AppleScript and the GitHub API

Sharing my initial venture into AppleScript with a GitHub API client I wrote while building an OmniFocus integration. While it works for my needs - fetching GitHub issue details to create OmniFocus tasks - it's quite basic and has some limitations. The script supports simple authentication and data extraction, though it could be more efficient when fetching multiple values.

Post illustration
fish · environment

Fish: notify me when you finish

Sharing a simple Fish shell hack I built to help stay focused - it notifies me when long-running commands complete instead of getting distracted while waiting. The solution uses Fish's CMD_DURATION variable to detect lengthy commands and send notifications when they finish. While originally made for macOS, you can easily adapt it for other systems.

git

Git: conditional configurations

Exploring Git's conditional includes feature and comparing it to my git-config-manager tool - while the native solution elegantly handles many use cases, there might still be room for some unique features I've been planning to add.

blog

Deep in the black bashic

How a simple desire to write a new blog post led me down a rabbit hole of infrastructure improvements - from EC2 to S3, Hakyll to Docker, and everything in between. Sometimes the technical detours are as interesting as the destination.

Post illustration
emacs · org-mode

Being an org-mode addict

A personal reflection on my love-hate relationship with org-mode in Emacs - how its deceptively simple outliner keeps drawing me back in, gradually leading to more complex features while remaining an essential tool for organizing my life.

shell

Errors in shell scripts

A practical guide on error handling in shell scripts, focusing on the use of set -e (exit-on-error mode) and trap commands to manage failures and cleanup operations, with clear examples demonstrating how to write more robust shell scripts.

Post illustration
emacs

Using Spacemacs with several Emacs versions

A helpful tip for Spacemacs users about using version-specific package directories to avoid reinstalling packages when switching between different Emacs versions, featuring a simple configuration solution.

Post illustration
emacs · release · flyspell-correct

flyspell-correct v0.1

Announcing the first release of flyspell-correct, now restructured into separate core and interface packages, with a new function for correcting misspelled words before the cursor position.

Post illustration
emacs

Emacs and Composability

An opinion piece defending Emacs' extensibility approach versus Vim's composability, highlighting how Emacs' flexible architecture allows for implementing Vim-like features while offering multiple paths to customization through community-driven configurations.

Post illustration
emacs · release · flyspell-correct

flyspell-correct

An introduction to flyspell-correct, an Emacs package offering flexible spell-checking interfaces through popular completion frameworks like Ivy, Helm, and Popup, while providing distraction-free word correction capabilities and customizable interface options.

Post illustration
haskell

Cabal and executables

A detailed exploration of managing Cabal dependency issues in Haskell, offering practical solutions through sandbox usage and custom Fish shell functions.

Post illustration
fish

Make the Fish fly

A comprehensive review of the Fish shell, exploring its unique features, configurations, and advantages over traditional shells like Zsh, while highlighting its excellent out-of-the-box experience and performance benefits despite some POSIX compatibility trade-offs.

Post illustration
haskell · release

CanonicalPath v0.3.0.0

A summary of the third major release of CanonicalPath library, highlighting API changes, performance improvements, and enhanced testing infrastructure while maintaining compatibility with major Haskell package repositories.