summaryrefslogtreecommitdiff
path: root/about/showcase.html
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-07-09 00:54:06 +0300
committerPaul Buetow <paul@buetow.org>2025-07-09 00:54:06 +0300
commit7c82d9c821a900e8970c8c1c6b1d85ec9bde734a (patch)
tree38d12c1057992259d94f67182e49aa1fec228546 /about/showcase.html
parent7248767f16f90cf241da2e910bb1f181ad7bba1e (diff)
Update content for html
Diffstat (limited to 'about/showcase.html')
-rw-r--r--about/showcase.html2111
1 files changed, 2111 insertions, 0 deletions
diff --git a/about/showcase.html b/about/showcase.html
new file mode 100644
index 00000000..74988153
--- /dev/null
+++ b/about/showcase.html
@@ -0,0 +1,2111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>Project Showcase</title>
+<link rel="shortcut icon" type="image/gif" href="/favicon.ico" />
+<link rel="stylesheet" href="../style.css" />
+<link rel="stylesheet" href="style-override.css" />
+</head>
+<body>
+<p class="header">
+<a href="https://foo.zone">Home</a> | <a href="https://codeberg.org/snonux/foo.zone/src/branch/content-md/about/showcase.md">Markdown</a> | <a href="gemini://foo.zone/about/showcase.gmi">Gemini</a>
+</p>
+<h1 style='display: inline' id='project-showcase'>Project Showcase</h1><br />
+<br />
+<span>Generated on: 2025-07-09</span><br />
+<br />
+<span>This page showcases my open source projects, providing an overview of what each project does, its technical implementation, and key metrics. Each project summary includes information about the programming languages used, development activity, and licensing. The projects are ordered by recent activity, with the most actively maintained projects listed first.</span><br />
+<br />
+<h2 style='display: inline' id='table-of-contents'>Table of Contents</h2><br />
+<br />
+<ul>
+<li><a href='#project-showcase'>Project Showcase</a></li>
+<li>⇢ <a href='#overall-statistics'>Overall Statistics</a></li>
+<li>⇢ <a href='#projects'>Projects</a></li>
+<li>⇢ ⇢ <a href='#gitsyncer'>gitsyncer</a></li>
+<li>⇢ ⇢ <a href='#timr'>timr</a></li>
+<li>⇢ ⇢ <a href='#tasksamurai'>tasksamurai</a></li>
+<li>⇢ ⇢ <a href='#rexfiles'>rexfiles</a></li>
+<li>⇢ ⇢ <a href='#foozone'>foo.zone</a></li>
+<li>⇢ ⇢ <a href='#dtail'>dtail</a></li>
+<li>⇢ ⇢ <a href='#wireguardmeshgenerator'>wireguardmeshgenerator</a></li>
+<li>⇢ ⇢ <a href='#ior'>ior</a></li>
+<li>⇢ ⇢ <a href='#ds-sim'>ds-sim</a></li>
+<li>⇢ ⇢ <a href='#sillybench'>sillybench</a></li>
+<li>⇢ ⇢ <a href='#gos'>gos</a></li>
+<li>⇢ ⇢ <a href='#foostats'>foostats</a></li>
+<li>⇢ ⇢ <a href='#rcm'>rcm</a></li>
+<li>⇢ ⇢ <a href='#gemtexter'>gemtexter</a></li>
+<li>⇢ ⇢ <a href='#quicklogger'>quicklogger</a></li>
+<li>⇢ ⇢ <a href='#docker-gpodder-sync-server'>docker-gpodder-sync-server</a></li>
+<li>⇢ ⇢ <a href='#terraform'>terraform</a></li>
+<li>⇢ ⇢ <a href='#gogios'>gogios</a></li>
+<li>⇢ ⇢ <a href='#docker-radicale-server'>docker-radicale-server</a></li>
+<li>⇢ ⇢ <a href='#docker-anki-sync-server'>docker-anki-sync-server</a></li>
+<li>⇢ ⇢ <a href='#gorum'>gorum</a></li>
+<li>⇢ ⇢ <a href='#randomjournalpage'>randomjournalpage</a></li>
+<li>⇢ ⇢ <a href='#sway-autorotate'>sway-autorotate</a></li>
+<li>⇢ ⇢ <a href='#photoalbum'>photoalbum</a></li>
+<li>⇢ ⇢ <a href='#algorithms'>algorithms</a></li>
+<li>⇢ ⇢ <a href='#geheim'>geheim</a></li>
+<li>⇢ ⇢ <a href='#perl-c-fibonacci'>perl-c-fibonacci</a></li>
+<li>⇢ ⇢ <a href='#guprecords'>guprecords</a></li>
+<li>⇢ ⇢ <a href='#ioriot'>ioriot</a></li>
+<li>⇢ ⇢ <a href='#staticfarm-apache-handlers'>staticfarm-apache-handlers</a></li>
+<li>⇢ ⇢ <a href='#dyndns'>dyndns</a></li>
+<li>⇢ ⇢ <a href='#mon'>mon</a></li>
+<li>⇢ ⇢ <a href='#rubyfy'>rubyfy</a></li>
+<li>⇢ ⇢ <a href='#pingdomfetch'>pingdomfetch</a></li>
+<li>⇢ ⇢ <a href='#gotop'>gotop</a></li>
+<li>⇢ ⇢ <a href='#xerl'>xerl</a></li>
+<li>⇢ ⇢ <a href='#debroid'>debroid</a></li>
+<li>⇢ ⇢ <a href='#fapi'>fapi</a></li>
+<li>⇢ ⇢ <a href='#template'>template</a></li>
+<li>⇢ ⇢ <a href='#muttdelay'>muttdelay</a></li>
+<li>⇢ ⇢ <a href='#netdiff'>netdiff</a></li>
+<li>⇢ ⇢ <a href='#pwgrep'>pwgrep</a></li>
+<li>⇢ ⇢ <a href='#japi'>japi</a></li>
+<li>⇢ ⇢ <a href='#perl-poetry'>perl-poetry</a></li>
+<li>⇢ ⇢ <a href='#ipv6test'>ipv6test</a></li>
+<li>⇢ ⇢ <a href='#cpuinfo'>cpuinfo</a></li>
+<li>⇢ ⇢ <a href='#loadbars'>loadbars</a></li>
+<li>⇢ ⇢ <a href='#perldaemon'>perldaemon</a></li>
+<li>⇢ ⇢ <a href='#awksite'>awksite</a></li>
+<li>⇢ ⇢ <a href='#jsmstrade'>jsmstrade</a></li>
+<li>⇢ ⇢ <a href='#netcalendar'>netcalendar</a></li>
+<li>⇢ ⇢ <a href='#hsbot'>hsbot</a></li>
+<li>⇢ ⇢ <a href='#ychat'>ychat</a></li>
+<li>⇢ ⇢ <a href='#vs-sim'>vs-sim</a></li>
+<li>⇢ ⇢ <a href='#fype'>fype</a></li>
+</ul><br />
+<h2 style='display: inline' id='overall-statistics'>Overall Statistics</h2><br />
+<br />
+<ul>
+<li>📦 Total Projects: 55</li>
+<li>📊 Total Commits: 10,379</li>
+<li>📈 Total Lines of Code: 252,969</li>
+<li>📄 Total Lines of Documentation: 24,167</li>
+<li>💻 Languages: Java (22.4%), Go (17.6%), HTML (14.0%), C++ (8.9%), C (7.3%), Perl (6.3%), Shell (6.3%), C/C++ (5.8%), XML (4.6%), Config (1.5%), Ruby (1.1%), HCL (1.1%), Make (0.7%), Python (0.6%), CSS (0.6%), JSON (0.3%), Raku (0.3%), Haskell (0.2%), YAML (0.2%), TOML (0.1%)</li>
+<li>📚 Documentation: Text (47.4%), Markdown (38.4%), LaTeX (14.2%)</li>
+<li>🤖 AI-Assisted Projects: 8 out of 55 (14.5% AI-assisted, 85.5% human-only)</li>
+<li>🚀 Release Status: 31 released, 24 experimental (56.4% with releases, 43.6% experimental)</li>
+</ul><br />
+<h2 style='display: inline' id='projects'>Projects</h2><br />
+<br />
+<h3 style='display: inline' id='gitsyncer'>gitsyncer</h3><br />
+<br />
+<ul>
+<li>💻 Languages: Go (86.0%), Shell (11.9%), YAML (1.5%), JSON (0.5%)</li>
+<li>📚 Documentation: Markdown (100.0%)</li>
+<li>📊 Commits: 56</li>
+<li>📈 Lines of Code: 6241</li>
+<li>📄 Lines of Documentation: 2306</li>
+<li>📅 Development Period: 2025-06-23 to 2025-07-09</li>
+<li>🔥 Recent Activity: 4.2 days (avg. age of last 42 commits)</li>
+<li>⚖️ License: BSD-2-Clause</li>
+<li>🏷️ Latest Release: v0.4.0 (2025-07-09)</li>
+<li>🤖 AI-Assisted: This project was partially created with the help of generative AI</li>
+</ul><br />
+<br />
+<span>GitSyncer is a cross-platform repository synchronization tool that automatically keeps Git repositories in sync across multiple hosting platforms like GitHub, Codeberg, and private SSH servers. It solves the common problem of maintaining consistent code across different Git hosting services by cloning repositories, adding all configured platforms as remotes, and continuously merging and pushing changes bidirectionally while handling branch creation and conflict detection.</span><br />
+<br />
+<span>The tool is implemented in Go with a clean architecture that supports both individual repository syncing and bulk operations for public repositories. Key features include automatic repository creation, SSH backup locations for private servers, branch exclusion patterns, and an opt-in backup mode for resilient offline backups. It uses a JSON configuration file to define organizations and repositories, employs safe merge strategies that never delete branches, and provides comprehensive error handling for merge conflicts and missing repositories.</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 />
+<br />
+<span>Go from <span class='inlinecode'>internal/version/version.go</span>:</span><br />
+<br />
+<pre>
+var (
+ Version = "0.4.0"
+
+ GitCommit = "unknown"
+
+ BuildDate = "unknown"
+</pre>
+<br />
+<span>---</span><br />
+<br />
+<h3 style='display: inline' id='timr'>timr</h3><br />
+<br />
+<ul>
+<li>💻 Languages: Go (98.3%), YAML (1.7%)</li>
+<li>📚 Documentation: Markdown (100.0%)</li>
+<li>📊 Commits: 19</li>
+<li>📈 Lines of Code: 873</li>
+<li>📄 Lines of Documentation: 135</li>
+<li>📅 Development Period: 2025-06-25 to 2025-06-29</li>
+<li>🔥 Recent Activity: 12.3 days (avg. age of last 42 commits)</li>
+<li>⚖️ License: BSD-2-Clause</li>
+<li>🧪 Status: Experimental (no releases yet)</li>
+<li>🤖 AI-Assisted: This project was partially created with the help of generative AI</li>
+</ul><br />
+<br />
+<span><span class='inlinecode'>timr</span> is a minimalist command-line time tracking tool written in Go that provides a simple stopwatch-style timer for tracking work sessions. It offers commands to start, stop, reset, and check the status of the timer, with all state persisted across sessions in <span class='inlinecode'>~/.config/timr/.timr_state</span>. The tool is particularly useful for developers and professionals who need to track time spent on tasks without the overhead of complex time-tracking applications.</span><br />
+<br />
+<span>The project is implemented using a clean modular architecture with the CLI entry point in <span class='inlinecode'>/cmd/timr/main.go</span>, core timer logic in <span class='inlinecode'>/internal/timer/</span>, and an interactive TUI mode powered by Bubble Tea in <span class='inlinecode'>/internal/live/</span>. Key features include persistent state across sessions, shell prompt integration for displaying timer status, raw output modes for scripting, and a full-screen live timer interface with keyboard controls. The tool maintains atomic state updates and handles unexpected exits gracefully by immediately persisting state changes.</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 />
+<br />
+<span>Go from <span class='inlinecode'>internal/timer/operations.go</span>:</span><br />
+<br />
+<pre>
+func GetRawStatus() (string, error) {
+ state, err := LoadState()
+ if err != nil {
+ return "", fmt.Errorf("error loading state: %w", err)
+ }
+
+ elapsed := state.ElapsedTime
+ if state.Running {
+ elapsed += time.Since(state.StartTime)
+ }
+
+ return fmt.Sprintf("%d", int(elapsed.Seconds())), nil
+}
+</pre>
+<br />
+<span>---</span><br />
+<br />
+<h3 style='display: inline' id='tasksamurai'>tasksamurai</h3><br />
+<br />
+<ul>
+<li>💻 Languages: Go (99.8%), YAML (0.2%)</li>
+<li>📚 Documentation: Markdown (100.0%)</li>
+<li>📊 Commits: 215</li>
+<li>📈 Lines of Code: 6160</li>
+<li>📄 Lines of Documentation: 162</li>
+<li>📅 Development Period: 2025-06-19 to 2025-07-08</li>
+<li>🔥 Recent Activity: 12.7 days (avg. age of last 42 commits)</li>
+<li>⚖️ License: BSD-2-Clause</li>
+<li>🏷️ Latest Release: v0.9.2 (2025-07-02)</li>
+<li>🤖 AI-Assisted: This project was partially created with the help of generative AI</li>
+</ul><br />
+<br />
+<a href='showcase/tasksamurai/image-1.png'><img alt='tasksamurai screenshot' title='tasksamurai screenshot' src='showcase/tasksamurai/image-1.png' /></a><br />
+<br />
+<span>TaskSamurai is a fast terminal user interface (TUI) for Taskwarrior written in Go that provides a keyboard-driven table interface for task management. It acts as a visual frontend to the Taskwarrior command-line tool, displaying tasks in a table format where users can perform operations like adding, completing, starting, and annotating tasks through hotkeys without leaving their keyboard. The application was created to provide a faster alternative to existing Python-based UIs while exploring the Bubble Tea framework for Go terminal applications.</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 implementation follows a clean architecture with clear separation of concerns: the <span class='inlinecode'>internal/task/</span> package handles all Taskwarrior CLI integration by executing task commands and parsing JSON responses, while <span class='inlinecode'>internal/ui/</span> manages the terminal interface using Bubble Tea&#39;s message-driven architecture. The custom table widget in <span class='inlinecode'>internal/atable/</span> provides efficient rendering for large task lists, and the entire system maintains real-time synchronization with Taskwarrior by automatically refreshing the display after each operation. The application supports all standard Taskwarrior filters as command-line arguments and includes features like regex search, customizable themes, and even a "disco mode" that changes colors dynamically.</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 />
+<br />
+<span>Go from <span class='inlinecode'>internal/ui/handlers.go</span>:</span><br />
+<br />
+<pre>
+func (m *Model) getTaskAtCursor() *task.Task {
+ cursor := m.tbl.Cursor()
+ if cursor &lt; 0 || cursor &gt;= len(m.tasks) {
+ return nil
+ }
+ return &amp;m.tasks[cursor]
+}
+</pre>
+<br />
+<span>---</span><br />
+<br />
+<h3 style='display: inline' id='rexfiles'>rexfiles</h3><br />
+<br />
+<ul>
+<li>💻 Languages: Shell (34.8%), Perl (32.9%), Config (8.4%), CSS (8.3%), TOML (7.3%), Ruby (6.0%), Lua (1.8%), JSON (0.5%), INI (0.2%)</li>
+<li>📚 Documentation: Text (97.3%), Markdown (2.7%)</li>
+<li>📊 Commits: 871</li>
+<li>📈 Lines of Code: 3947</li>
+<li>📄 Lines of Documentation: 854</li>
+<li>📅 Development Period: 2021-12-28 to 2025-07-07</li>
+<li>🔥 Recent Activity: 20.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>Based on my analysis of the codebase, **rexfiles** is a comprehensive infrastructure automation and configuration management project built with the Rex framework (a Perl-based alternative to Ansible, Puppet, or Chef). The project provides structured automation for managing multiple aspects of a personal infrastructure, including dotfiles, server configurations, and application deployments.</span><br />
+<br />
+<span>The project consists of three main components: **dotfiles** management for personal development environment configuration (bash, fish shell, helix editor, tmux, etc.), **frontends** for managing production OpenBSD servers with services like DNS (nsd), web servers (httpd), mail (OpenSMTPD), SSL certificates (ACME), and monitoring systems, and **babylon5** containing Docker container startup scripts for self-hosted applications. The implementation leverages Rex&#39;s declarative syntax to define tasks for package installation, file management, service configuration, and system state management, with templates for configuration files and support for multiple operating systems (OpenBSD, FreeBSD, Fedora Linux, Termux). This approach provides a KISS (Keep It Simple, Stupid) alternative to more complex configuration management tools while maintaining the ability to manage both local development environments and production infrastructure consistently.</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 />
+<br />
+<span>Shell from <span class='inlinecode'>frontends/scripts/sitestats.sh</span>:</span><br />
+<br />
+<pre>
+STATSFILE=/tmp/sitestats.csv
+BOTSFILE=/tmp/sitebots.txt
+TOP=20
+</pre>
+<br />
+<span>---</span><br />
+<br />
+<h3 style='display: inline' id='foozone'>foo.zone</h3><br />
+<br />
+<ul>
+<li>💻 Languages: HTML (73.9%), XML (25.9%), CSS (0.2%)</li>
+<li>📚 Documentation: Text (91.8%), Markdown (8.2%)</li>
+<li>📊 Commits: 2892</li>
+<li>📈 Lines of Code: 42772</li>
+<li>📄 Lines of Documentation: 159</li>
+<li>📅 Development Period: 2021-04-29 to 2025-07-01</li>
+<li>🔥 Recent Activity: 26.3 days (avg. age of last 42 commits)</li>
+<li>⚖️ License: No license found</li>
+<li>🧪 Status: Experimental (no releases yet)</li>
+<li>🤖 AI-Assisted: This project was partially created with the help of generative AI</li>
+</ul><br />
+<br />
+<span>This is **foo.zone**, a personal blog and technical website belonging to Paul Buetow, a Site Reliability Engineer based in Sofia, Bulgaria. The project is a static website that serves as a comprehensive platform for sharing technical knowledge, book notes, and personal experiences in the fields of system administration, DevOps, and programming.</span><br />
+<br />
+<span>The site is built using **Gemtexter**, a static site generator that creates both HTML and Gemini protocol content from markdown sources. The architecture is refreshingly simple and follows KISS principles, with content organized into several key sections: a main blog feed (gemfeed) with over 100 technical posts dating back to 2008, detailed book notes and summaries, project documentation (including tools like DTail for distributed log tailing), and personal resources. The website is served by OpenBSD using relayd and httpd, demonstrating the author&#39;s preference for robust, security-focused Unix systems. The project emphasizes clean, semantic HTML, custom CSS styling, and accessibility, while maintaining both web and Gemini protocol compatibility for broader reach across different internet communities.</span><br />
+<br />
+<a class='textlink' href='https://codeberg.org/snonux/foo.zone'>View on Codeberg</a><br />
+<a class='textlink' href='https://github.com/snonux/foo.zone'>View on GitHub</a><br />
+<br />
+<span>HTML from <span class='inlinecode'>gemfeed/2022-01-23-welcome-to-the-foo.zone.html</span>:</span><br />
+<br />
+<pre>
+&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
+&lt;html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"&gt;
+&lt;head&gt;
+&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
+&lt;title&gt;Welcome to the foo.zone&lt;/title&gt;
+&lt;link rel="shortcut icon" type="image/gif" href="/favicon.ico" /&gt;
+&lt;link rel="stylesheet" href="../style.css" /&gt;
+&lt;link rel="stylesheet" href="style-override.css" /&gt;
+&lt;/head&gt;
+&lt;body&gt;
+</pre>
+<br />
+<span>---</span><br />
+<br />
+<h3 style='display: inline' id='dtail'>dtail</h3><br />
+<br />
+<ul>
+<li>💻 Languages: Go (93.9%), JSON (2.8%), C (2.0%), Make (0.5%), C/C++ (0.3%), Config (0.2%), Shell (0.2%), Docker (0.1%)</li>
+<li>📚 Documentation: Text (79.4%), Markdown (20.6%)</li>
+<li>📊 Commits: 1049</li>
+<li>📈 Lines of Code: 20091</li>
+<li>📄 Lines of Documentation: 5674</li>
+<li>📅 Development Period: 2020-01-09 to 2025-06-20</li>
+<li>🔥 Recent Activity: 51.8 days (avg. age of last 42 commits)</li>
+<li>⚖️ License: Apache-2.0</li>
+<li>🏷️ Latest Release: v4.2.0 (2023-06-21)</li>
+<li>🤖 AI-Assisted: This project was partially created with the help of generative AI</li>
+</ul><br />
+<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 is a distributed log processing system written in Go that allows DevOps engineers to tail, cat, and grep log files across thousands of servers concurrently. It provides secure access through SSH authentication and respects UNIX file system permissions, making it ideal for enterprise environments where log analysis needs to scale horizontally across large server fleets. The tool supports advanced features like compressed file handling (gzip/zstd) and distributed MapReduce aggregations for complex log analytics.</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 system uses a client-server architecture where dtail servers run on target machines (listening on port 2222) and clients connect to multiple servers simultaneously. It can also operate in serverless mode for local operations. The implementation leverages SSH for secure communication, includes sophisticated connection throttling and resource management, and provides specialized tools (dcat, dgrep, dmap) for different log processing tasks. The MapReduce functionality supports SQL-like queries with server-side local aggregation and client-side final aggregation, enabling powerful distributed analytics across log data.</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 />
+<br />
+<span>Go from <span class='inlinecode'>internal/clients/baseclient.go</span>:</span><br />
+<br />
+<pre>
+func (c *baseClient) makeConnection(server string, sshAuthMethods []gossh.AuthMethod,
+ hostKeyCallback client.HostKeyCallback) connectors.Connector {
+ if c.Args.Serverless {
+ return connectors.NewServerless(c.UserName, c.maker.makeHandler(server),
+ c.maker.makeCommands())
+ }
+ return connectors.NewServerConnection(server, c.UserName, sshAuthMethods,
+ hostKeyCallback, c.maker.makeHandler(server), c.maker.makeCommands())
+}
+</pre>
+<br />
+<span>---</span><br />
+<br />
+<h3 style='display: inline' id='wireguardmeshgenerator'>wireguardmeshgenerator</h3><br />
+<br />
+<ul>
+<li>💻 Languages: Ruby (73.5%), YAML (26.5%)</li>
+<li>📚 Documentation: Markdown (100.0%)</li>
+<li>📊 Commits: 33</li>
+<li>📈 Lines of Code: 396</li>
+<li>📄 Lines of Documentation: 24</li>
+<li>📅 Development Period: 2025-04-18 to 2025-05-11</li>
+<li>🔥 Recent Activity: 71.1 days (avg. age of last 42 commits)</li>
+<li>⚖️ License: Custom License</li>
+<li>🏷️ Latest Release: v1.0.0 (2025-05-11)</li>
+</ul><br />
+<br />
+<span>WireGuard Mesh Generator is a Ruby-based automation tool that simplifies the creation and management of WireGuard mesh VPN networks across multiple hosts. It automatically generates WireGuard configuration files for each node in the mesh, handles cryptographic key generation and management (including public/private keys and preshared keys), and provides automated deployment to remote machines via SSH/SCP. The tool is particularly useful for setting up secure, encrypted mesh networks between multiple servers or devices, eliminating the manual overhead of configuring WireGuard connections between every pair of nodes.</span><br />
+<br />
+<span>The implementation uses a YAML configuration file to define the network topology, including host details, SSH credentials, and network addressing schemes. It supports mixed operating systems (FreeBSD, Linux, OpenBSD) with OS-specific configuration handling, intelligently determines network connectivity patterns (LAN vs internet-facing hosts), and includes features like NAT traversal detection and persistent keepalive configuration. The tool provides a complete workflow from key generation to deployment, making it ideal for infrastructure automation and maintaining consistent WireGuard mesh networks across diverse environments.</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 />
+<br />
+<span>Ruby from <span class='inlinecode'>wireguardmeshgenerator.rb</span>:</span><br />
+<br />
+<pre>
+def priv = File.read(@privkey_path).strip
+
+def psk(peer)
+ psk_path = "#{@psk_dir}/#{[@myself, peer].sort.join(&#39;_&#39;)}.key"
+</pre>
+<br />
+<span>---</span><br />
+<br />
+<h3 style='display: inline' id='ior'>ior</h3><br />
+<br />
+<ul>
+<li>💻 Languages: C (54.7%), Go (37.4%), Raku (5.4%), Make (1.4%), C/C++ (1.1%)</li>
+<li>📚 Documentation: Text (84.1%), Markdown (15.9%)</li>
+<li>📊 Commits: 316</li>
+<li>📈 Lines of Code: 9835</li>
+<li>📄 Lines of Documentation: 559</li>
+<li>📅 Development Period: 2024-01-18 to 2025-06-14</li>
+<li>🔥 Recent Activity: 83.2 days (avg. age of last 42 commits)</li>
+<li>⚖️ License: No license found</li>
+<li>🧪 Status: Experimental (no releases yet)</li>
+</ul><br />
+<br />
+<a href='showcase/ior/image-1.png'><img alt='ior screenshot' title='ior screenshot' src='showcase/ior/image-1.png' /></a><br />
+<br />
+<span>Based on my analysis of the codebase, here&#39;s a comprehensive summary of the I/O Riot NG (ior) project:</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>**I/O Riot NG** is a Linux-based performance monitoring tool that uses eBPF (extended Berkeley Packet Filter) to trace synchronous I/O system calls and analyze their execution times. This tool is particularly valuable for system performance analysis, allowing developers and system administrators to visualize I/O bottlenecks through detailed flamegraphs. It serves as a modern successor to the original I/O Riot project, migrating from SystemTap/C to a Go/C/BPF implementation for better performance and maintainability.</span><br />
+<br />
+<span>The architecture combines kernel-level tracing with user-space analysis: eBPF programs (<span class='inlinecode'>internal/c/ior.bpf.c</span>) attach to kernel tracepoints to capture syscall entry/exit events, which are then processed by a Go-based event loop (<span class='inlinecode'>internal/eventloop.go</span>) that correlates enter/exit pairs, tracks file descriptors, and measures timing. The tool can operate in real-time mode for live monitoring or post-processing mode to generate flamegraphs from previously collected data using the Inferno flamegraph library. Key features include filtering capabilities for specific processes or file patterns, comprehensive statistics collection, and support for various I/O syscalls like open, read, write, close, and dup operations.</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 />
+<br />
+<span>C from <span class='inlinecode'>internal/c/types.h</span>:</span><br />
+<br />
+<pre>
+struct open_event {
+ __u32 event_type;
+ __u32 trace_id;
+ __u64 time;
+ __u32 pid;
+ __u32 tid;
+ __s32 flags;
+ char filename[MAX_FILENAME_LENGTH];
+ char comm[MAX_PROGNAME_LENGTH];
+};
+</pre>
+<br />
+<span>---</span><br />
+<br />
+<h3 style='display: inline' id='ds-sim'>ds-sim</h3><br />
+<br />
+<ul>
+<li>💻 Languages: Java (98.9%), Shell (0.6%), CSS (0.5%)</li>
+<li>📚 Documentation: Markdown (98.7%), Text (1.3%)</li>
+<li>📊 Commits: 438</li>
+<li>📈 Lines of Code: 25762</li>
+<li>📄 Lines of Documentation: 3101</li>
+<li>📅 Development Period: 2008-05-15 to 2025-06-27</li>
+<li>🔥 Recent Activity: 84.4 days (avg. age of last 42 commits)</li>
+<li>⚖️ License: Custom License</li>
+<li>🧪 Status: Experimental (no releases yet)</li>
+<li>🤖 AI-Assisted: This project was partially created with the help of generative AI</li>
+</ul><br />
+<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 />
+<span>DS-Sim is an open-source Java-based simulator for distributed systems that provides a comprehensive environment for learning and experimenting with distributed algorithms. It features protocol simulation, event handling, and implementations of time concepts like Lamport and Vector timestamps. The simulator includes an interactive Swing GUI and comprehensive logging capabilities, making it particularly valuable for educational purposes and distributed systems research.</span><br />
+<br />
+<span>The project is built on an event-driven architecture with clear component separation. At its core, VSSimulator drives the simulation loop with VSTaskManager executing time-ordered tasks, while VSAbstractProcess provides the foundation for simulation processes. The framework supports pluggable protocols through VSAbstractProtocol base classes, includes sophisticated time management with multiple clock types, and uses VSMessage objects for network communication simulation. The Maven-based architecture follows standard Java conventions and includes 141 unit tests covering core components like Two-Phase Commit, Berkeley Time synchronization, and PingPong protocols.</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 />
+<br />
+<span>Java from <span class='inlinecode'>src/main/java/events/VSAbstractEvent.java</span>:</span><br />
+<br />
+<pre>
+public final void setClassname(String eventClassname) {
+ if (eventClassname.startsWith(CLASS_PREFIX))
+ eventClassname = eventClassname.substring(CLASS_PREFIX_LENGTH);
+
+ this.eventClassname = eventClassname;
+}
+</pre>
+<br />
+<span>---</span><br />
+<br />
+<h3 style='display: inline' id='sillybench'>sillybench</h3><br />
+<br />
+<ul>
+<li>💻 Languages: Go (90.9%), Shell (9.1%)</li>
+<li>📚 Documentation: Markdown (100.0%)</li>
+<li>📊 Commits: 5</li>
+<li>📈 Lines of Code: 33</li>
+<li>📄 Lines of Documentation: 3</li>
+<li>📅 Development Period: 2025-04-03 to 2025-04-03</li>
+<li>🔥 Recent Activity: 97.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>**SillyBench** is a simple Go benchmarking project designed to compare CPU performance between FreeBSD and Linux Bhyve VM environments. The project implements basic mathematical operations (integer multiplication and floating-point arithmetic) to measure computational performance differences across different operating systems and virtualization setups.</span><br />
+<br />
+<span>The implementation is minimal and focused, consisting of a basic Go module with two CPU-intensive benchmark functions: <span class='inlinecode'>BenchmarkCPUSilly1</span> performs simple integer squaring operations, while <span class='inlinecode'>BenchmarkCPUSilly2</span> executes more complex floating-point calculations involving addition, multiplication, and division. The project includes a simple shell script (<span class='inlinecode'>run.sh</span>) that executes the benchmarks using Go&#39;s built-in testing framework, making it easy to run consistent performance comparisons across different systems.</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 />
+<br />
+<span>Go from <span class='inlinecode'>main.go</span>:</span><br />
+<br />
+<pre>
+func main() {
+ println("Hello world")
+}
+</pre>
+<br />
+<span>---</span><br />
+<br />
+<h3 style='display: inline' id='gos'>gos</h3><br />
+<br />
+<ul>
+<li>💻 Languages: Go (98.6%), YAML (1.1%), JSON (0.2%)</li>
+<li>📚 Documentation: Markdown (100.0%)</li>
+<li>📊 Commits: 381</li>
+<li>📈 Lines of Code: 3967</li>
+<li>📄 Lines of Documentation: 411</li>
+<li>📅 Development Period: 2024-05-04 to 2025-06-12</li>
+<li>🔥 Recent Activity: 113.9 days (avg. age of last 42 commits)</li>
+<li>⚖️ License: Custom License</li>
+<li>🏷️ Latest Release: v1.0.0 (2025-03-04)</li>
+<li>🤖 AI-Assisted: This project was partially created with the help of generative AI</li>
+</ul><br />
+<br />
+<a href='showcase/gos/image-1.png'><img alt='gos screenshot' title='gos screenshot' src='showcase/gos/image-1.png' /></a><br />
+<br />
+<span>Gos is a command-line social media scheduling tool written in Go that serves as a self-hosted replacement for Buffer.com. It allows users to create, queue, and schedule posts across multiple platforms (currently Mastodon, LinkedIn, and a "Noop" tracker platform) using a simple file-based approach. Users compose posts as text files in a designated directory (<span class='inlinecode'>~/.gosdir</span>), and can control posting behavior through filename tags (e.g., <span class='inlinecode'>share:mastodon</span>, <span class='inlinecode'>prio</span>, <span class='inlinecode'>now</span>) or inline tags within the content.</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>The tool is architected around a file-based queueing system where posts progress through lifecycle stages: <span class='inlinecode'>.txt</span> files are processed into platform-specific queues (<span class='inlinecode'>.queued</span> files), then marked as <span class='inlinecode'>.posted</span> after successful publishing. It features intelligent scheduling based on configurable targets (posts per week), pause periods between posts, priority handling, and OAuth2 authentication for LinkedIn. The system includes pause functionality for vacations, dry-run mode for testing, and can generate Gemini Gemtext summaries of posted content. Its design emphasizes automation, configurability, and integration into command-line workflows while maintaining a clean separation between platforms through a common interface.</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 />
+<br />
+<span>Go from <span class='inlinecode'>internal/summary/summary.go</span>:</span><br />
+<br />
+<pre>
+func prepare(content string) string {
+ content = newlineRegex.ReplaceAllString(content, " ")
+ content = urlRegex.ReplaceAllString(content, "")
+ content = multiSpaceRegex.ReplaceAllString(content, " ")
+ content = strings.TrimSpace(content)
+ content = tagRegex.ReplaceAllString(content, "`$0`")
+ return content
+}
+</pre>
+<br />
+<span>---</span><br />
+<br />
+<h3 style='display: inline' id='foostats'>foostats</h3><br />
+<br />
+<ul>
+<li>💻 Languages: Perl (100.0%)</li>
+<li>📚 Documentation: Markdown (85.1%), Text (14.9%)</li>
+<li>📊 Commits: 67</li>
+<li>📈 Lines of Code: 1299</li>
+<li>📄 Lines of Documentation: 154</li>
+<li>📅 Development Period: 2023-01-02 to 2025-07-07</li>
+<li>🔥 Recent Activity: 133.5 days (avg. age of last 42 commits)</li>
+<li>⚖️ License: Custom License</li>
+<li>🧪 Status: Experimental (no releases yet)</li>
+</ul><br />
+<br />
+<span>Based on the README and project structure, **foostats** is a privacy-respecting web analytics tool written in Perl specifically designed for OpenBSD systems. It processes both traditional HTTP/HTTPS logs and Gemini protocol logs to generate comprehensive traffic statistics while maintaining visitor privacy through SHA3-512 IP hashing. The tool is built for the foo.zone ecosystem and similar sites that need analytics without compromising user privacy.</span><br />
+<br />
+<span>The project implements a modular architecture with seven core components: FileHelper for I/O operations, DateHelper for date management, Logreader for log parsing, Filter for security filtering, Aggregator for statistics collection, FileOutputter for compressed JSON storage, Replicator for multi-node data sharing, Merger for combining statistics, and Reporter for generating human-readable Gemtext reports. It supports distributed deployments with replication between partner nodes and includes security features like suspicious request filtering based on configurable patterns (blocking common attack vectors like WordPress admin paths and PHP files).</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 />
+<br />
+<span>Perl from <span class='inlinecode'>foostats.pl</span>:</span><br />
+<br />
+<pre>
+my sub parse_date ( $year, @line ) {
+ my $timestr = "$line[0] $line[1]";
+ return Time::Piece-&gt;strptime( $timestr, &#39;%b %d&#39; )
+ -&gt;strftime("$year%m%d");
+}
+</pre>
+<br />
+<span>---</span><br />
+<br />
+<h3 style='display: inline' id='rcm'>rcm</h3><br />
+<br />
+<ul>
+<li>💻 Languages: Ruby (99.8%), TOML (0.2%)</li>
+<li>📚 Documentation: Markdown (100.0%)</li>
+<li>📊 Commits: 76</li>
+<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: 137.7 days (avg. age of last 42 commits)</li>
+<li>⚖️ License: Custom License</li>
+<li>🧪 Status: Experimental (no releases yet)</li>
+</ul><br />
+<br />
+<span>RCM (Ruby Configuration Management) is a lightweight, KISS (Keep It Simple, Stupid) configuration management system written in Ruby and designed for personal use. The project provides a domain-specific language (DSL) for declaratively managing system configuration, including files, directories, symlinks, and packages. It serves as an alternative to more complex configuration management tools like Ansible or Puppet, focusing on simplicity and ease of use for individual system administration tasks.</span><br />
+<br />
+<span>The system is implemented with a modular architecture centered around a DSL class that provides keywords for different resource types (file, directory, symlink, touch, package). Each resource type inherits from a base Resource class and implements specific evaluation logic for creating, modifying, or removing system resources. Key features include automatic backup functionality (with SHA256 checksums), ERB template support, conditional execution, parent directory management, and support for file permissions and ownership. The system uses a declarative approach where users define desired states in configuration blocks, and RCM handles the imperative steps to achieve those states, making it particularly useful for personal dotfile management and system configuration automation.</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 />
+<br />
+<span>Ruby from <span class='inlinecode'>lib/dsl.rb</span>:</span><br />
+<br />
+<pre>
+def to_s = @id
+def evaluate! = @scheduled.each(&amp;:evaluate!)
+
+def &lt;&lt;(obj)
+ raise DuplicateResource, "#{obj.id} already declared!" if @@objs.key?(obj.id)
+</pre>
+<br />
+<span>---</span><br />
+<br />
+<h3 style='display: inline' id='gemtexter'>gemtexter</h3><br />
+<br />
+<ul>
+<li>💻 Languages: Shell (67.9%), CSS (28.9%), Config (2.0%), HTML (1.3%)</li>
+<li>📚 Documentation: Text (76.8%), Markdown (23.2%)</li>
+<li>📊 Commits: 461</li>
+<li>📈 Lines of Code: 2253</li>
+<li>📄 Lines of Documentation: 1170</li>
+<li>📅 Development Period: 2021-05-21 to 2025-06-11</li>
+<li>🔥 Recent Activity: