summaryrefslogtreecommitdiff
path: root/about
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-08-31 15:58:17 +0300
committerPaul Buetow <paul@buetow.org>2025-08-31 15:58:17 +0300
commitdb0c7935ca4fd1aeb2f6500366ff6f0ef8c01a03 (patch)
tree414e1595fb951ccf4d43992384b8ad354a1a1c8d /about
parent68b1042c9711b5898764d2b0d889d6bf39f8d45b (diff)
Update content for html
Diffstat (limited to 'about')
-rw-r--r--about/showcase.html521
-rw-r--r--about/showcase/debroid/image-1.png38
2 files changed, 255 insertions, 304 deletions
diff --git a/about/showcase.html b/about/showcase.html
index 546015b1..86186ee0 100644
--- a/about/showcase.html
+++ b/about/showcase.html
@@ -24,68 +24,37 @@
<li>⇢ <a href='#overall-statistics'>Overall Statistics</a></li>
<li>⇢ <a href='#projects'>Projects</a></li>
<li>⇢ ⇢ <a href='#hexai'>hexai</a></li>
-<li><a href='#hexai'>Hexai</a></li>
<li>⇢ ⇢ <a href='#conf'>conf</a></li>
<li>⇢ ⇢ <a href='#rexfiles'>rexfiles</a></li>
<li>⇢ ⇢ <a href='#hxcode'>hxcode</a></li>
-<li><a href='#hxcode'>HxCode</a></li>
<li>⇢ ⇢ <a href='#totalrecall'>totalrecall</a></li>
-<li><a href='#totalrecall---bulgarian-anki-flashcard-generator'>totalrecall - Bulgarian Anki Flashcard Generator</a></li>
<li>⇢ ⇢ <a href='#gitsyncer'>gitsyncer</a></li>
-<li><a href='#gitsyncer'>GitSyncer</a></li>
<li>⇢ ⇢ <a href='#timr'>timr</a></li>
-<li><a href='#timr'>timr</a></li>
<li>⇢ ⇢ <a href='#tasksamurai'>tasksamurai</a></li>
-<li><a href='#task-samurai'>Task Samurai</a></li>
<li>⇢ ⇢ <a href='#ior'>ior</a></li>
-<li><a href='#io-riot-ng-aka-ior'>I/O Riot NG (aka ior)</a></li>
<li>⇢ ⇢ <a href='#dtail'>dtail</a></li>
<li>⇢ ⇢ <a href='#wireguardmeshgenerator'>wireguardmeshgenerator</a></li>
-<li><a href='#wireguard-mesh-generator'>WireGuard Mesh Generator</a></li>
<li>⇢ ⇢ <a href='#foostats'>foostats</a></li>
-<li><a href='#foostats'>foostats</a></li>
<li>⇢ ⇢ <a href='#ds-sim'>ds-sim</a></li>
-<li><a href='#ds-sim'>DS-Sim</a></li>
<li>⇢ ⇢ <a href='#sillybench'>sillybench</a></li>
-<li><a href='#silly-benchmark'>Silly Benchmark</a></li>
<li>⇢ ⇢ <a href='#gos'>gos</a></li>
-<li><a href='#gos-go-social-media'>Gos (Go Social Media)</a></li>
<li>⇢ ⇢ <a href='#rcm'>rcm</a></li>
-<li><a href='#rcm'>rcm</a></li>
<li>⇢ ⇢ <a href='#gemtexter'>gemtexter</a></li>
<li>⇢ ⇢ <a href='#docker-gpodder-sync-server'>docker-gpodder-sync-server</a></li>
<li>⇢ ⇢ <a href='#docker-radicale-server'>docker-radicale-server</a></li>
<li>⇢ ⇢ <a href='#quicklogger'>quicklogger</a></li>
-<li><a href='#quick-logger'>Quick logger</a></li>
<li>⇢ ⇢ <a href='#terraform'>terraform</a></li>
-<li><a href='#terraform'>Terraform</a></li>
<li>⇢ ⇢ <a href='#docker-anki-sync-server'>docker-anki-sync-server</a></li>
<li>⇢ ⇢ <a href='#gogios'>gogios</a></li>
-<li><a href='#gogios'>Gogios</a></li>
<li>⇢ ⇢ <a href='#gorum'>gorum</a></li>
-<li><a href='#gorum'>Gorum</a></li>
<li>⇢ ⇢ <a href='#guprecords'>guprecords</a></li>
-<li><a href='#guprecords---global-uptime-records'>guprecords - Global uptime records</a></li>
<li>⇢ ⇢ <a href='#randomjournalpage'>randomjournalpage</a></li>
-<li><a href='#read-a-random-journal'>Read a random journal</a></li>
<li>⇢ ⇢ <a href='#sway-autorotate'>sway-autorotate</a></li>
-<li><a href='#sway-autorotate'>sway-autorotate</a></li>
<li>⇢ ⇢ <a href='#algorithms'>algorithms</a></li>
<li>⇢ ⇢ <a href='#geheim'>geheim</a></li>
-<li><a href='#geheimrb'>geheim.rb</a></li>
<li>⇢ ⇢ <a href='#foozone'>foo.zone</a></li>
<li>⇢ ⇢ <a href='#perl-c-fibonacci'>perl-c-fibonacci</a></li>
<li>⇢ ⇢ <a href='#ioriot'>ioriot</a></li>
-<li><a href='#io-riot'>I/O Riot </a></li>
-<li>⇢ <a href='#overview'>Overview </a></li>
-<li>⇢ <a href='#benefits'>Benefits </a></li>
-<li><a href='#send-in-patches'>Send in patches </a></li>
-<li><a href='#how-to-install-io-riot'>How to install I/O Riot </a></li>
-<li><a href='#how-to-use-io-riot'>How to use I/O Riot </a></li>
-<li><a href='#appendix'>Appendix </a></li>
-<li>⇢ <a href='#supported-file-systems'>Supported file systems </a></li>
-<li>⇢ <a href='#supported-syscalls'>Supported syscalls </a></li>
-<li>⇢ <a href='#source-code-documentation'>Source code documentation </a></li>
<li>⇢ ⇢ <a href='#photoalbum'>photoalbum</a></li>
<li>⇢ ⇢ <a href='#staticfarm-apache-handlers'>staticfarm-apache-handlers</a></li>
<li>⇢ ⇢ <a href='#dyndns'>dyndns</a></li>
@@ -119,9 +88,9 @@
<ul>
<li>📦 Total Projects: 59</li>
<li>📊 Total Commits: 11,848</li>
-<li>📈 Total Lines of Code: 206,416</li>
+<li>📈 Total Lines of Code: 205,836</li>
<li>📄 Total Lines of Documentation: 23,246</li>
-<li>💻 Languages: Go (32.9%), Java (19.6%), Perl (8.5%), C++ (8.3%), C (8.2%), C/C++ (5.9%), Shell (3.5%), Config (1.9%), HTML (1.8%), Ruby (1.7%), YAML (1.6%), HCL (1.3%), JSON (0.9%), Python (0.8%), CSS (0.8%), Make (0.7%), Raku (0.4%), TOML (0.4%), XML (0.3%), Haskell (0.3%), TypeScript (0.2%)</li>
+<li>💻 Languages: Go (32.9%), Java (19.7%), C++ (8.3%), Perl (8.3%), C (8.2%), C/C++ (5.9%), Shell (3.5%), Config (1.9%), HTML (1.8%), Ruby (1.7%), YAML (1.6%), HCL (1.3%), JSON (0.9%), Python (0.8%), CSS (0.8%), Make (0.7%), Raku (0.4%), TOML (0.4%), XML (0.3%), Haskell (0.3%), TypeScript (0.2%)</li>
<li>📚 Documentation: Text (50.6%), Markdown (49.4%)</li>
<li>🎵 Vibe-Coded Projects: 4 out of 59 (6.8%)</li>
<li>🤖 AI-Assisted Projects (including vibe-coded): 9 out of 59 (15.3% AI-assisted, 84.7% human-only)</li>
@@ -135,7 +104,7 @@
<li>💻 Languages: Go (100.0%)</li>
<li>📚 Documentation: Markdown (100.0%)</li>
<li>📊 Commits: 103</li>
-<li>📈 Lines of Code: 5521</li>
+<li>📈 Lines of Code: 5479</li>
<li>📄 Lines of Documentation: 399</li>
<li>📅 Development Period: 2025-08-01 to 2025-08-29</li>
<li>🔥 Recent Activity: 8.1 days (avg. age of last 42 commits)</li>
@@ -146,7 +115,9 @@
<br />
<a href='showcase/hexai/image-1.png'><img alt='hexai screenshot' title='hexai screenshot' src='showcase/hexai/image-1.png' /></a><br />
<br />
-<h1 style='display: inline' id='hexai'>Hexai</h1><br />
+<span>Hexai is an AI-powered extension designed to enhance the Helix Editor by integrating advanced code assistance features through Language Server Protocol (LSP) and large language models (LLMs). Its core capabilities include LSP-based code auto-completion, code actions, and an in-editor chat interface that allows users to interact directly with AI models for coding help and suggestions. Additionally, Hexai provides a standalone command-line tool for interacting with LLMs outside the editor. It supports multiple AI backends, including OpenAI, GitHub Copilot, and Ollama, making it flexible for various user preferences and workflows.</span><br />
+<br />
+<span>The project is implemented primarily in Go and uses Mage as its build and task automation tool. The architecture consists of two main binaries: one for general LLM interaction and another for LSP integration with the editor. Hexai communicates with LLM providers via their APIs, relaying code context and user queries to generate intelligent responses or code completions. The modular design allows for easy configuration and extension, and while it is tailored for Helix, it may work with other editors that support LSP. This makes Hexai a valuable tool for developers seeking AI-assisted productivity directly within their coding environment.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/hexai'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/hexai'>View on GitHub</a><br />
@@ -167,9 +138,9 @@
<li>🧪 Status: Experimental (no releases yet)</li>
</ul><br />
<br />
-<span>Certainly! However, the provided description ("Bapdidu di du di du dap dap dap!") does not contain any technical or contextual information about the "Jupdidu" project. To give a meaningful summary, I would need details such as the project&#39;s purpose, its main features, how it is implemented, and its architecture.</span><br />
+<span>Certainly! However, the project description you provided for "Jupdidu" only contains a playful phrase ("Bapdidu di du di du dap dap dap!") and does not include any technical or functional details about the project itself. Without additional information—such as its purpose, features, or implementation details—it&#39;s not possible to summarize what the project does, why it&#39;s useful, or how it&#39;s architected.</span><br />
<br />
-<span>If you can provide a README, project documentation, or a brief description of what Jupdidu does, I can summarize it clearly and concisely, focusing on its functionality, usefulness, and technical implementation. Please share more information or context about the project!</span><br />
+<span>If you can provide a README, code snippet, or a more detailed description of "Jupdidu," I&#39;d be happy to analyze it and provide a concise, informative summary focusing on its key features and architecture. Please share more context or documentation for a meaningful explanation.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/conf'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/conf'>View on GitHub</a><br />
@@ -185,13 +156,14 @@
<li>📈 Lines of Code: 5715</li>
<li>📄 Lines of Documentation: 1183</li>
<li>📅 Development Period: 2021-12-28 to 2025-08-13</li>
-<li>🔥 Recent Activity: 22.6 days (avg. age of last 42 commits)</li>
+<li>🔥 Recent Activity: 22.7 days (avg. age of last 42 commits)</li>
<li>⚖️ License: No license found</li>
<li>🧪 Status: Experimental (no releases yet)</li>
</ul><br />
<br />
-<span>Jupdidu</span><br />
-<span>=======</span><br />
+<span>Certainly! However, the provided project description ("Bapdidu di du di du dap dap dap!") does not contain any technical or descriptive information about the project "Jupdidu." To provide a meaningful summary, I would need details such as the project&#39;s purpose, main features, target users, and implementation approach.</span><br />
+<br />
+<span>If you can share a README file, code snippets, or a more detailed description, I can analyze that information and deliver a concise, informative summary focusing on what the project does, its usefulness, and its key architectural features. Please provide more context or documentation for "Jupdidu," and I&#39;ll be happy to help!</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/rexfiles'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/rexfiles'>View on GitHub</a><br />
@@ -212,7 +184,9 @@
<li>🧪 Status: Experimental (no releases yet)</li>
</ul><br />
<br />
-<h1 style='display: inline' id='hxcode'>HxCode</h1><br />
+<span>The HxCode project provides seamless integration between the Helix text editor and Visual Studio Code (VSCode) through a set of extensions and plugins. Its primary goal is to enable users to leverage the advanced features and ecosystem of VSCode—such as language servers, debugging, and extensions—directly within the Helix editor, which is known for its modal editing and performance. This interoperability is particularly useful for developers who prefer Helix&#39;s editing model but require the rich tooling and language support available in VSCode.</span><br />
+<br />
+<span>The project is organized into two main components: the ./hxcode directory contains the VSCode extension, which acts as a bridge to expose Helix&#39;s capabilities within the VSCode environment, while the ./helix directory provides the necessary integration hooks and configuration for Helix to communicate with VSCode services. The architecture relies on standardized protocols (such as the Language Server Protocol) and inter-process communication to synchronize features like code completion, diagnostics, and navigation between the two editors. This modular design makes it easy to maintain and extend, allowing users to benefit from the strengths of both platforms without sacrificing workflow efficiency.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/hxcode'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/hxcode'>View on GitHub</a><br />
@@ -236,7 +210,13 @@
<br />
<a href='showcase/totalrecall/image-1.png'><img alt='totalrecall screenshot' title='totalrecall screenshot' src='showcase/totalrecall/image-1.png' /></a><br />
<br />
-<h1 style='display: inline' id='totalrecall---bulgarian-anki-flashcard-generator'>totalrecall - Bulgarian Anki Flashcard Generator</h1><br />
+<span>**Summary of totalrecall - Bulgarian Anki Flashcard Generator**</span><br />
+<br />
+<a href='showcase/totalrecall/image-2.png'><img alt='totalrecall screenshot' title='totalrecall screenshot' src='showcase/totalrecall/image-2.png' /></a><br />
+<br />
+<span><span class='inlinecode'>totalrecall</span> is a specialized tool designed to streamline the creation of Anki flashcards for Bulgarian vocabulary learners. It automates the generation of high-quality study materials—including audio pronunciations, AI-generated contextual images, phonetic transcriptions (IPA), and translations—by leveraging OpenAI’s TTS and DALL-E APIs. The tool supports both a fast, keyboard-driven graphical user interface (GUI) and a flexible command-line interface (CLI), making it accessible for users with different preferences. Key features include batch processing of word lists, randomization of voices and art styles for variety, and seamless export to Anki-compatible formats (APKG and CSV), ensuring that learners can quickly build rich, multimedia flashcard decks.</span><br />
+<br />
+<span>Architecturally, totalrecall is implemented in Go and integrates with OpenAI services via API keys for audio and image generation. It processes input in various formats, automatically handling translation and media generation as needed. Output files—including MP3s, images, and Anki packages—are organized in a user’s local state directory, with configuration options for customization. The project’s modular design allows for easy installation, desktop integration (especially on GNOME/Fedora), and extensibility. By automating the most time-consuming aspects of flashcard creation and enhancing cards with multimedia and phonetic data, totalrecall significantly improves the efficiency and quality of language learning for Bulgarian.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/totalrecall'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/totalrecall'>View on GitHub</a><br />
@@ -249,7 +229,7 @@
<li>💻 Languages: Go (90.6%), Shell (7.8%), YAML (1.0%), JSON (0.7%)</li>
<li>📚 Documentation: Markdown (100.0%)</li>
<li>📊 Commits: 104</li>
-<li>📈 Lines of Code: 9605</li>
+<li>📈 Lines of Code: 9567</li>
<li>📄 Lines of Documentation: 2433</li>
<li>📅 Development Period: 2025-06-23 to 2025-08-19</li>
<li>🔥 Recent Activity: 44.9 days (avg. age of last 42 commits)</li>
@@ -258,7 +238,9 @@
<li>🎵 Vibe-Coded: This project has been vibe coded</li>
</ul><br />
<br />
-<h1 style='display: inline' id='gitsyncer'>GitSyncer</h1><br />
+<span>**GitSyncer** is an automation tool designed to synchronize git repositories across multiple organizations and hosting platforms, such as GitHub, Codeberg, and private SSH servers. Its primary purpose is to keep all branches and tags in sync between these platforms, ensuring that codebases remain consistent and up-to-date everywhere. GitSyncer is especially useful for developers and teams managing projects across different git hosts, providing features like automatic branch and repository creation, one-way backups to offline or private servers, and robust error handling for merge conflicts and missing resources. It also includes advanced capabilities like AI-powered project showcase generation, batch synchronization for automation, and flexible configuration for branch exclusions and backup strategies.</span><br />
+<br />
+<span>The tool is implemented as a modern CLI application in Go, with a modular, command-based architecture. Users configure organizations, repositories, and backup locations via a JSON file, and interact with GitSyncer through intuitive commands (e.g., <span class='inlinecode'>gitsyncer sync</span>, <span class='inlinecode'>gitsyncer release create</span>). Under the hood, GitSyncer clones repositories, adds all remotes, fetches and merges branches, and pushes updates to all destinations, handling repository and branch creation as needed. SSH backup locations are supported for one-way, opt-in backups, with automatic bare repo initialization. The AI-powered showcase feature analyzes repositories and uses Claude or other AI tools to generate comprehensive project summaries and statistics. The architecture emphasizes automation, safety (never deleting branches), and extensibility, making GitSyncer a powerful solution for multi-platform git management and backup.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/gitsyncer'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/gitsyncer'>View on GitHub</a><br />
@@ -280,7 +262,11 @@
<li>🎵 Vibe-Coded: This project has been vibe coded</li>
</ul><br />
<br />
-<h1 style='display: inline' id='timr'>timr</h1><br />
+<span>**Summary of the <span class='inlinecode'>timr</span> Project**</span><br />
+<br />
+<span><span class='inlinecode'>timr</span> is a lightweight, command-line time tracking tool designed to help users monitor the time they spend on tasks directly from their terminal. Its core functionality revolves around simple commands to start, stop, pause, reset, and check the status of a stopwatch-style timer, making it ideal for developers, freelancers, or anyone who prefers a minimalist workflow without the overhead of complex time-tracking applications. The tool also offers a live, full-screen timer mode with keyboard controls and can display the timer status in real-time within the fish shell prompt, enhancing productivity by keeping time tracking seamlessly integrated into the user&#39;s environment.</span><br />
+<br />
+<span>From an architectural standpoint, <span class='inlinecode'>timr</span> is implemented in Go, ensuring cross-platform compatibility and efficient performance. The timer&#39;s state is persistently stored on the user&#39;s system, allowing for accurate tracking even across sessions. The command structure is straightforward, with subcommands for each primary action (<span class='inlinecode'>start</span>, <span class='inlinecode'>stop</span>, <span class='inlinecode'>status</span>, etc.), and the project includes shell integration scripts for fish to display timer status in the prompt. This combination of simplicity, persistence, and shell integration makes <span class='inlinecode'>timr</span> a practical and unobtrusive solution for time management at the command line.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/timr'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/timr'>View on GitHub</a><br />
@@ -304,7 +290,11 @@
<br />
<a href='showcase/tasksamurai/image-1.png'><img alt='tasksamurai screenshot' title='tasksamurai screenshot' src='showcase/tasksamurai/image-1.png' /></a><br />
<br />
-<h1 style='display: inline' id='task-samurai'>Task Samurai</h1><br />
+<span>**Task Samurai** is a fast, keyboard-driven terminal interface for [Taskwarrior](https://taskwarrior.org/), designed to streamline task management directly from the command line. Built in Go using the [Bubble Tea](https://github.com/charmbracelet/bubbletea) TUI framework, it displays tasks in an interactive table and allows users to add, modify, and complete tasks efficiently using intuitive hotkeys. The interface is optimized for speed and responsiveness, offering a modern alternative to other Taskwarrior UIs like <span class='inlinecode'>vit</span>.</span><br />
+<br />
+<a href='showcase/tasksamurai/image-2.png'><img alt='tasksamurai screenshot' title='tasksamurai screenshot' src='showcase/tasksamurai/image-2.png' /></a><br />
+<br />
+<span>The core architecture leverages the Bubble Tea framework for rendering the terminal UI, while all task operations are performed by invoking the native <span class='inlinecode'>task</span> command-line tool. Each user action—such as adding or completing a task—triggers the corresponding Taskwarrior command, and the UI refreshes automatically to reflect changes. Key features include hotkey-driven task management, real-time updates, and support for all Taskwarrior filters and queries. Optional features like "disco mode" add visual flair by changing the theme after each task modification. Installation is straightforward via Go tooling, and the project is particularly useful for users who want a fast, fully keyboard-controlled Taskwarrior experience in the terminal.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/tasksamurai'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/tasksamurai'>View on GitHub</a><br />
@@ -328,7 +318,11 @@
<br />
<a href='showcase/ior/image-1.png'><img alt='ior screenshot' title='ior screenshot' src='showcase/ior/image-1.png' /></a><br />
<br />
-<h1 style='display: inline' id='io-riot-ng-aka-ior'>I/O Riot NG (aka ior)</h1><br />
+<span>**I/O Riot NG (ior)** is a Linux-based tool designed to trace and analyze synchronous I/O system calls using BPF (Berkeley Packet Filter) technology. Its primary function is to monitor how long each synchronous I/O syscall takes, providing detailed timing information that can be visualized as flamegraphs. These flamegraphs help developers and system administrators identify performance bottlenecks in I/O operations, making it easier to optimize applications and systems.</span><br />
+<br />
+<a href='showcase/ior/image-2.svg'><img alt='ior screenshot' title='ior screenshot' src='showcase/ior/image-2.svg' /></a><br />
+<br />
+<span>The project is implemented using a combination of Go, C, and BPF, leveraging the <span class='inlinecode'>libbpfgo</span> library to interface with BPF from Go. Unlike its predecessor (which used SystemTap and C), I/O Riot NG offers a more modern and flexible architecture. The tool captures syscall events at the kernel level, processes the timing data in user space, and outputs results suitable for visualization with tools like Inferno Flamegraphs. Its architecture consists of BPF programs for efficient kernel tracing, a Go-based user-space component for data aggregation, and integration with third-party visualization tools. This makes I/O Riot NG a powerful and extensible solution for low-overhead, high-resolution I/O performance analysis on Linux systems.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/ior'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/ior'>View on GitHub</a><br />
@@ -352,8 +346,11 @@
<br />
<a href='showcase/dtail/image-1.png'><img alt='dtail screenshot' title='dtail screenshot' src='showcase/dtail/image-1.png' /></a><br />
<br />
-<span>DTail</span><br />
-<span>=====</span><br />
+<span>DTail is an open-source distributed log management tool designed for DevOps engineers to efficiently tail, cat, and grep log files across thousands of servers simultaneously. Written in Go, it supports advanced features such as on-the-fly decompression (gzip, zstd) and distributed MapReduce-style aggregations, making it highly useful for large-scale log analysis and troubleshooting in complex environments. By leveraging SSH for secure communication and adhering to UNIX file permission models, DTail ensures both security and compatibility with existing infrastructure.</span><br />
+<br />
+<a href='showcase/dtail/image-2.gif'><img alt='dtail screenshot' title='dtail screenshot' src='showcase/dtail/image-2.gif' /></a><br />
+<br />
+<span>The architecture consists of a client-server model: DTail servers run on each target machine, while a DTail client—typically on an engineer’s workstation—connects to all servers concurrently to aggregate and process logs in real time. This design enables scalable, parallel log operations and can be extended to a serverless mode for added flexibility. DTail’s implementation emphasizes performance, security, and ease of use, making it a valuable tool for organizations needing to monitor and analyze distributed logs efficiently.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/dtail'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/dtail'>View on GitHub</a><br />
@@ -374,7 +371,9 @@
<li>🏷️ Latest Release: v1.0.0 (2025-05-11)</li>
</ul><br />
<br />
-<h1 style='display: inline' id='wireguard-mesh-generator'>WireGuard Mesh Generator</h1><br />
+<span>The **WireGuard Mesh Generator** is a tool designed to automate the creation and deployment of WireGuard VPN configurations for a network of machines, forming a secure mesh network. This is particularly useful for system administrators or DevOps engineers who need to connect multiple servers or nodes (for example, in a Kubernetes cluster) with encrypted, peer-to-peer tunnels, ensuring secure and private communication across potentially untrusted networks.</span><br />
+<br />
+<span>The project is implemented using Ruby, with tasks managed via Rake, and configuration defined in a YAML file (<span class='inlinecode'>wireguardmeshgenerator.yaml</span>). Key features include automated generation of WireGuard configuration files (<span class='inlinecode'>rake generate</span>), streamlined installation of these files to remote machines (<span class='inlinecode'>rake install</span>), and easy cleanup of generated artifacts (<span class='inlinecode'>rake clean</span>). The architecture leverages WireGuard’s lightweight VPN capabilities and Ruby’s scripting power to simplify and standardize the setup of complex mesh VPN topologies, reducing manual errors and saving time in multi-node deployments.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/wireguardmeshgenerator'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/wireguardmeshgenerator'>View on GitHub</a><br />
@@ -395,7 +394,9 @@
<li>🏷️ Latest Release: v0.1.0 (2025-07-12)</li>
</ul><br />
<br />
-<h1 style='display: inline' id='foostats'>foostats</h1><br />
+<span>**foostats** is a privacy-focused web analytics tool designed specifically for OpenBSD environments, with support for both traditional web (HTTP/HTTPS) and Gemini protocol logs. Its primary function is to generate anonymous, comprehensive site statistics for the foo.zone ecosystem and similar sites, while strictly preserving visitor privacy. This is achieved by hashing all IP addresses with SHA3-512 before storage, ensuring no personally identifiable information is retained. The tool provides detailed daily, monthly, and summary reports in Gemtext format, tracks feed subscribers, and includes robust filtering to block and log suspicious requests based on configurable patterns.</span><br />
+<br />
+<span>Architecturally, foostats is modular, with components for log parsing, filtering, aggregation, replication, and reporting. It processes logs from OpenBSD httpd and Gemini servers (vger/relayd), aggregates statistics, and outputs compressed JSON files and human-readable reports. Its distributed design allows replication and merging of stats across multiple nodes, supporting comprehensive analytics for federated sites. Key features include multi-protocol and IPv4/IPv6 support, privacy-first data handling, and flexible configuration for filtering and reporting, making it a secure and privacy-respecting alternative to conventional analytics platforms.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/foostats'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/foostats'>View on GitHub</a><br />
@@ -419,7 +420,9 @@
<br />
<a href='showcase/ds-sim/image-1.png'><img alt='ds-sim screenshot' title='ds-sim screenshot' src='showcase/ds-sim/image-1.png' /></a><br />
<br />
-<h1 style='display: inline' id='ds-sim'>DS-Sim</h1><br />
+<span>DS-Sim is an open-source Java-based simulator designed for modeling and experimenting with distributed systems. It provides a robust environment for simulating distributed protocols, handling events, and visualizing system behavior through an interactive Swing GUI. Key features include support for simulating core distributed algorithms (such as Lamport clocks, vector clocks, PingPong, Two-Phase Commit, and Berkeley Time), comprehensive event handling, and detailed logging. DS-Sim is particularly useful for students, educators, and developers who want to learn about or prototype distributed systems concepts in a controlled, observable setting.</span><br />
+<br />
+<span>Architecturally, DS-Sim is organized into modular components: core process and message handling, an extensible event system, protocol implementations, and a main simulation engine. The project uses Maven for build automation and dependency management, and includes a thorough suite of unit tests and a dedicated protocol simulation testing framework. Users can quickly build and run the simulator via Maven commands, and the project structure is well-documented to support both usage and extension. This modular, test-driven approach makes DS-Sim both a practical teaching tool and a flexible platform for distributed systems research and development.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/ds-sim'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/ds-sim'>View on GitHub</a><br />
@@ -440,7 +443,9 @@
<li>🧪 Status: Experimental (no releases yet)</li>
</ul><br />
<br />
-<h1 style='display: inline' id='silly-benchmark'>Silly Benchmark</h1><br />
+<span>The **Silly Benchmark** project is a simple benchmarking tool designed to compare the performance of code execution between a native FreeBSD system and a Linux virtual machine running under Bhyve (the FreeBSD hypervisor). Its primary purpose is to provide a straightforward, reproducible way to measure and contrast the computational speed or efficiency of these two environments. This can help users or system administrators understand the performance impact of virtualization and the differences between operating systems when running the same workload.</span><br />
+<br />
+<span>Implementation-wise, the project likely consists of a small, easily portable program—often written in C or a scripting language—that performs a set of computational tasks or loops, measuring the time taken to complete them. The key features include its simplicity, ease of use, and focus on raw execution speed rather than complex benchmarking scenarios. The architecture is minimal: the benchmark is run natively on FreeBSD and then inside a Linux VM managed by Bhyve, with results compared to highlight any performance discrepancies attributable to the OS or virtualization overhead. This approach is useful for system tuning, hardware evaluation, or making informed decisions about deployment environments.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/sillybench'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/sillybench'>View on GitHub</a><br />
@@ -463,7 +468,11 @@
<br />
<a href='showcase/gos/image-1.png'><img alt='gos screenshot' title='gos screenshot' src='showcase/gos/image-1.png' /></a><br />
<br />
-<h1 style='display: inline' id='gos-go-social-media'>Gos (Go Social Media)</h1><br />
+<span>**Gos (Go Social Media)** is a command-line tool written in Go that serves as a self-hosted, scriptable alternative to Buffer.com for scheduling and managing social media posts. Designed for users who prefer automation, privacy, and control, Gos enables posting to Mastodon and LinkedIn (with OAuth2 authentication for LinkedIn) directly from the terminal. It supports features like dry-run mode for safe testing, flexible configuration via flags and environment variables, image previews for LinkedIn, and a pseudo-platform ("Noop") for tracking posts without publishing. Gos is particularly useful for developers, power users, or anyone who wants to automate their social media workflow, avoid third-party service limitations, and integrate posting into their own scripts or shell startup routines.</span><br />
+<br />
+<a href='showcase/gos/image-2.png'><img alt='gos screenshot' title='gos screenshot' src='showcase/gos/image-2.png' /></a><br />
+<br />
+<span>**Architecturally**, Gos operates on a file-based queueing system: users compose posts as text files (optionally using the companion <span class='inlinecode'>gosc</span> composer tool) in a designated directory. Posts are tagged via filenames or inline tags to control target platforms, priorities, and behaviors (e.g., immediate posting, pausing, or requiring confirmation). When Gos runs, it processes these files, moves them through platform-specific queues, and posts them according to user-defined cadence, priorities, and pause intervals. The configuration is managed via a JSON file storing API credentials and scheduling preferences. Gos also supports generating Gemini Gemtext summaries of posted content for blogging or archival purposes. The system is highly scriptable, easy to integrate into automated workflows, and can be synced or backed up using tools like Syncthing, making it a robust, extensible solution for personal or small-team social media management.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/gos'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/gos'>View on GitHub</a><br />
@@ -479,12 +488,14 @@
<li>📈 Lines of Code: 1373</li>
<li>📄 Lines of Documentation: 48</li>
<li>📅 Development Period: 2024-12-05 to 2025-02-28</li>
-<li>🔥 Recent Activity: 191.3 days (avg. age of last 42 commits)</li>
+<li>🔥 Recent Activity: 191.4 days (avg. age of last 42 commits)</li>
<li>⚖️ License: Custom License</li>
<li>🧪 Status: Experimental (no releases yet)</li>
</ul><br />
<br />
-<h1 style='display: inline' id='rcm'>rcm</h1><br />
+<span>The **rcm** project is a lightweight, personal Ruby-based configuration management system designed with the KISS (Keep It Simple, Stupid) principle in mind. Its primary purpose is to automate and manage configuration tasks, such as setting up services or environments, in a straightforward and minimalistic way. This makes it especially useful for users who want a simple, customizable tool for managing their own system configurations without the overhead and complexity of larger solutions like Ansible or Chef.</span><br />
+<br />
+<span>Key features include a test suite (run via <span class='inlinecode'>rake test</span>) to ensure reliability, and a task-based invocation system using Rake, Ruby&#39;s build automation tool. Users can execute specific configuration tasks (e.g., <span class='inlinecode'>rake wireguard -- --debug</span>) from within a project directory, allowing for modular and scriptable management of services. The architecture leverages Ruby and Rake for task definition and execution, keeping dependencies minimal and the codebase easy to understand and extend for personal workflows.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/rcm'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/rcm'>View on GitHub</a><br />
@@ -505,8 +516,11 @@
<li>🏷️ Latest Release: 3.0.0 (2024-10-01)</li>
</ul><br />
<br />
-<span>The Gemtexter blog engine and static site generator</span><br />
-<span>===================================================</span><br />
+<span>**Summary of the Gemtexter Project**</span><br />
+<br />
+<span>Gemtexter is a static site generator and blog engine designed to manage and publish content written in the Gemini Gemtext format, a lightweight markup language used in the Gemini protocol. Its key feature is the ability to convert Gemtext source files into multiple static output formats—specifically Gemini Gemtext, XHTML (HTML), and Markdown—without relying on JavaScript. This enables the same content to be served across different platforms, including Gemini capsules, traditional web pages, and code hosting services like Codeberg and GitHub Pages. Gemtexter also supports Atom feed generation, source code syntax highlighting, theming, and advanced templating, making it a versatile tool for technical bloggers and those interested in multi-platform publishing.</span><br />
+<br />
+<span>The project is implemented as a large Bash script, leveraging standard GNU utilities (sed, grep, date, etc.) for text processing and file management. Content is organized in a configurable directory structure, with separate folders for each output format. The script automates tasks such as content conversion, Atom feed updates, and Git integration for version control and deployment. Advanced features include content filtering for selective regeneration, customizable themes, Bash-based templating for dynamic content generation, and support for source code highlighting via GNU Source Highlight. Configuration is flexible, supporting both local and user-specific config files, and the system is designed to be extensible and maintainable despite being written in Bash. This architecture makes Gemtexter particularly useful for users who value simplicity, transparency, and control over their publishing workflow, especially in environments where minimalism and static content are preferred.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/gemtexter'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/gemtexter'>View on GitHub</a><br />
@@ -527,9 +541,9 @@
<li>🧪 Status: Experimental (no releases yet)</li>
</ul><br />
<br />
-<span>This project provides a Dockerized build environment for the GPodder sync server, specifically targeting the [mygpo](https://github.com/gpodder/mygpo) backend. The GPodder sync server enables users to synchronize podcast subscriptions and playback progress across multiple devices and clients, making it easier to keep listening experiences consistent. By containerizing the server with Docker, the project simplifies deployment and management, ensuring that all dependencies and configurations are encapsulated and reproducible.</span><br />
+<span>This project provides a Docker-based deployment solution for the GPodder sync server, specifically targeting the open-source [mygpo](https://github.com/gpodder/mygpo) backend. GPodder is a popular podcast manager, and the sync server enables users to synchronize their podcast subscriptions, episode progress, and device data across multiple clients and devices. By containerizing the sync server with Docker, this project simplifies installation, configuration, and maintenance, making it easy to run the service in a consistent and isolated environment regardless of the host system.</span><br />
<br />
-<span>The implementation centers around a Dockerfile and related configuration files that automate the setup of the mygpo server, including its Python dependencies and any required services (such as a database). Key features include ease of deployment (just a few Docker commands to get started), isolation from the host system, and portability across different environments. The architecture leverages Docker’s layered image system to build, run, and update the GPodder sync server efficiently, making it accessible for both development and production use.</span><br />
+<span>The implementation leverages Docker to encapsulate all dependencies and runtime requirements of the mygpo server. The provided Dockerfile and configuration scripts automate the setup process, including installing necessary Python packages, configuring the database, and exposing the appropriate network ports. This architecture enables rapid deployment, scalability, and straightforward updates, while also supporting best practices for security and resource management. Key features include reproducible builds, environment variable configuration, and compatibility with orchestration tools like Docker Compose, making it a practical solution for both personal and small-scale public GPodder sync services.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/docker-gpodder-sync-server'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/docker-gpodder-sync-server'>View on GitHub</a><br />
@@ -545,14 +559,14 @@
<li>📈 Lines of Code: 40</li>
<li>📄 Lines of Documentation: 3</li>
<li>📅 Development Period: 2023-12-31 to 2025-08-11</li>
-<li>🔥 Recent Activity: 490.9 days (avg. age of last 42 commits)</li>
+<li>🔥 Recent Activity: 491.0 days (avg. age of last 42 commits)</li>
<li>⚖️ License: No license found</li>
<li>🧪 Status: Experimental (no releases yet)</li>
</ul><br />
<br />
-<span>This project provides a Docker image for the [Radicale server](https://radicale.org), an open-source CalDAV and CardDAV server for managing calendars and contacts. By containerizing Radicale, the project makes it easy to deploy and run the server in isolated, reproducible environments, simplifying installation and upgrades. Users can quickly set up a personal or small-team calendar/contact server without worrying about system dependencies or manual configuration.</span><br />
+<span>This project provides a Docker image for the [Radicale server](https://radicale.org), an open-source CalDAV and CardDAV server for managing calendars and contacts. By containerizing Radicale, the project makes it easy to deploy and run the server in isolated, reproducible environments, ensuring consistent behavior across different systems. This is particularly useful for users who want to quickly set up personal or small-team calendar/contact synchronization without complex installation steps or dependency management.</span><br />
<br />
-<span>The Docker image is built to be lightweight and configurable, exposing necessary ports and allowing persistent storage of data via Docker volumes. The architecture typically involves a Dockerfile that installs Radicale and its dependencies, sets up configuration files, and defines entrypoints for running the server. This approach ensures portability, consistency across environments, and ease of integration with orchestration tools like Docker Compose or Kubernetes. Key features include simplified deployment, secure isolation, and support for custom configuration through environment variables or mounted files.</span><br />
+<span>The Docker image is typically implemented using a <span class='inlinecode'>Dockerfile</span> that installs Radicale and its dependencies into a minimal base image, exposes the necessary ports, and defines configuration options via environment variables or mounted volumes. Key features include ease of deployment, portability, and simplified updates—users can start a Radicale server with a single <span class='inlinecode'>docker run</span> command, mount their data/configuration for persistence, and benefit from Docker’s security and resource isolation. The architecture leverages Docker’s containerization to encapsulate Radicale, making it suitable for both development and production use.</span><br />
<br />
<a class='textlink' href='https://codeberg.org/snonux/docker-radicale-server'>View on Codeberg</a><br />
<a class='textlink' href='https://github.com/snonux/docker-radicale-server'>View on GitHub</a><br />
@@ -575,7 +589,11 @@
<br />
<a href='showcase/quicklogger/image-1.png'><img alt='quicklogger screenshot' title='quicklogger screenshot' src='showcase/quicklogger/image-1.png' /></a><br />
<br />
-<h1 style='display: inline' id='quick-logger'>Quick logger</h1><br />
+<span>Quick Logger is a lightweight graphical application designed for quickly capturing and saving ideas or notes as plain text files, primarily targeting Android devices but also runnable on Linux desktops. Built with the Go programming language and the Fyne GUI framework, the app provides a simple interface where users can enter a message, which is then saved to a designated folder. This folder can be synchronized across devices using tools like Syncthing, ensuring that notes taken on a mobile device are automatically available on a home computer.</span><br />
+<br />
+<a href='showcase/quicklogger/image-2.png'><img alt='quicklogger screenshot' title='quicklogger screenshot' src='showcase/quicklogger/image-2.png' /></a><br />
+<br />
+<span>The project’s key features include its minimalistic design, cross-platform compatibility (Android and Linux), and seamless integration with file synchronization workflows. Architecturally, Quick Logger leverages Fyne for its user interface, enabling a consistent look and feel across platforms, and uses Go’s standard library for file operations. The build process supports both direct compilation and containerized cross-compilation (using fyne-cross and Podman/Docker), making it accessible to developers on different systems. This combination of simplicity, portability, and easy synchronization makes Quick Logger a practical tool for quickly