From a39dddfa69efc96cf894fdd4f686af547e17976c Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Wed, 9 Jul 2025 00:48:10 +0300 Subject: clean up the stats --- about/resources.gmi | 192 ++-- about/showcase.gmi | 1818 ++++++++++++++++++++++++++---------- about/showcase.gmi.tpl | 1730 ++++++++++++++++++++++++---------- about/showcase/debroid/image-1.png | 56 +- 4 files changed, 2719 insertions(+), 1077 deletions(-) (limited to 'about') diff --git a/about/resources.gmi b/about/resources.gmi index 7ab7ee49..bc724817 100644 --- a/about/resources.gmi +++ b/about/resources.gmi @@ -35,105 +35,105 @@ You won't find any links on this site because, over time, the links will break. In random order: -* Site Reliability Engineering; How Google runs production systems; O'Reilly +* Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner * The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional -* Leanring eBPF; Liz Rice; O'Reilly -* Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O'Reilly +* Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers +* Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly +* Raku Recipes; J.J. Merelo; Apress +* Raku Fundamentals; Moritz Lenz; Apress +* Pro Puppet; James Turnbull, Jeffrey McCune; Apress +* The Pragmatic Programmer; David Thomas; Addison-Wesley +* Concurrency in Go; Katherine Cox-Buday; O'Reilly +* Polished Ruby Programming; Jeremy Evans; Packt Publishing * Java ist auch eine Insel; Christian Ullenboom; +* Effective Java; Joshua Bloch; Addison-Wesley Professional +* The Docker Book; James Turnbull; Kindle +* Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson +* Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications * DNS and BIND; Cricket Liu; O'Reilly -* 100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications * Funktionale Programmierung; Peter Pepper; Springer -* The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton -* Perl New Features; Joshua McAdams, brian d foy; Perl School -* The Kubernetes Book; Nigel Poulton; Unabridged Audiobook -* Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers -* Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson -* Effective Java; Joshua Bloch; Addison-Wesley Professional -* Concurrency in Go; Katherine Cox-Buday; O'Reilly -* Polished Ruby Programming; Jeremy Evans; Packt Publishing * Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press -* Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O'Reilly -* Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly -* Raku Recipes; J.J. Merelo; Apress -* The DevOps Handbook; Gene Kim, Jez Humble, Patrick Debois, John Willis; Audible -* The Pragmatic Programmer; David Thomas; Addison-Wesley +* Developing Games in Java; David Brackeen and others...; New Riders * 97 things every SRE should know; Emil Stolarsky, Jaime Woo; O'Reilly -* Pro Puppet; James Turnbull, Jeffrey McCune; Apress -* 21st Century C: C Tips from the New School; Ben Klemens; O'Reilly -* Systemprogrammierung in Go; Frank Müller; dpunkt +* DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible +* Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt +* Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers * Ultimate Go Notebook; Bill Kennedy -* Raku Fundamentals; Moritz Lenz; Apress -* The Docker Book; James Turnbull; Kindle +* The Kubernetes Book; Nigel Poulton; Unabridged Audiobook +* Leanring eBPF; Liz Rice; O'Reilly +* Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O'Reilly +* Terraform Cookbook; Mikael Krief; Packt Publishing +* Systemprogrammierung in Go; Frank Müller; dpunkt +* Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press +* Data Science at the Command Line; Jeroen Janssens; O'Reilly * Clusterbau mit Linux-HA; Michael Schwartzkopff; O'Reilly -* Modern Perl; Chromatic ; Onyx Neon Press -* Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt -* Effective awk programming; Arnold Robbins; O'Reilly -* Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner +* Perl New Features; Joshua McAdams, brian d foy; Perl School * C++ Programming Language; Bjarne Stroustrup; -* Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press +* Site Reliability Engineering; How Google runs production systems; O'Reilly +* Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O'Reilly +* Effective awk programming; Arnold Robbins; O'Reilly * Programming Ruby 3.3 (5th Edition); Noel Rappin, with Dave Thomas; The Pragmatic Bookshelf +* 21st Century C: C Tips from the New School; Ben Klemens; O'Reilly +* 100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications +* The DevOps Handbook; Gene Kim, Jez Humble, Patrick Debois, John Willis; Audible * Higher Order Perl; Mark Dominus; Morgan Kaufmann -* Developing Games in Java; David Brackeen and others...; New Riders -* Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers +* Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly +* Modern Perl; Chromatic ; Onyx Neon Press * The Practise of System and Network Administration; Thomas A. Limoncelli, Christina J. Hogan, Strata R. Chalup; Addison-Wesley Professional Pro Git; Scott Chacon, Ben Straub; Apress -* Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly -* DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible -* Data Science at the Command Line; Jeroen Janssens; O'Reilly -* Terraform Cookbook; Mikael Krief; Packt Publishing -* Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications +* The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton ## Technical references I didn't read them from the beginning to the end, but I am using them to look up things. The books are in random order: * BPF Performance Tools - Linux System and Application Observability, Brendan Gregg; Addison Wesley -* Implementing Service Level Objectives; Alex Hidalgo; O'Reilly * Go: Design Patterns for Real-World Projects; Mat Ryer; Packt -* The Linux Programming Interface; Michael Kerrisk; No Starch Press -* Groovy Kurz & Gut; Joerg Staudemeier; O'Reilly -* Understanding the Linux Kernel; Daniel P. Bovet, Marco Cesati; O'Reilly * Relayd and Httpd Mastery; Michael W Lucas +* Understanding the Linux Kernel; Daniel P. Bovet, Marco Cesati; O'Reilly +* Groovy Kurz & Gut; Joerg Staudemeier; O'Reilly +* The Linux Programming Interface; Michael Kerrisk; No Starch Press * Algorithms; Robert Sedgewick, Kevin Wayne; Addison Wesley +* Implementing Service Level Objectives; Alex Hidalgo; O'Reilly ## Self-development and soft-skills books In random order: +* Ultralearning; Anna Laurent; Self-published via Amazon +* So Good They Can't Ignore You; Cal Newport; Business Plus +* Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion +* Time Management for System Administrators; Thomas A. Limoncelli; O'Reilly +* Deep Work; Cal Newport; Piatkus +* Ultralearning; Scott Young; Thorsons +* Solve for Happy; Mo Gawdat (RE-READ 1ST TIME) * Never Split the Difference; Chris Voss, Tahl Raz; Random House Business +* The Bullet Journal Method; Ryder Carroll; Fourth Estate +* The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books +* The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME) * Eat That Frog!; Brian Tracy; Hodder Paperbacks +* Stop starting, start finishing; Arne Roock; Lean-Kanban University +* The Joy of Missing Out; Christina Crook; New Society Publishers +* The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select +* Staff Engineer: Leadership beyond the management track; Will Larson; Audiobook +* Soft Skills; John Sommez; Manning Publications +* The Complete Software Developer's Career Guide; John Sonmez; Unabridged Audiobook * Slow Productivity; Cal Newport; Penguin Random House +* 101 Essays that change the way you think; Brianna Wiest; Audiobook +* Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook +* Influence without Authority; A. Cohen, D. Bradford; Wiley * The Good Enough Job; Simone Stolzoff; Ebury Edge +* Atomic Habits; James Clear; Random House Business +* The Power of Now; Eckhard Tolle; Yellow Kite * Eat That Frog; Brian Tracy -* Getting Things Done; David Allen -* Soft Skills; John Sommez; Manning Publications -* Psycho-Cybernetics; Maxwell Maltz; Perigee Books * Digital Minimalism; Cal Newport; Portofolio Penguin -* The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd -* Staff Engineer: Leadership beyond the management track; Will Larson; Audiobook -* Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook -* Deep Work; Cal Newport; Piatkus +* Psycho-Cybernetics; Maxwell Maltz; Perigee Books * Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing -* Time Management for System Administrators; Thomas A. Limoncelli; O'Reilly -* The Joy of Missing Out; Christina Crook; New Society Publishers -* The Power of Now; Eckhard Tolle; Yellow Kite -* Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press -* Ultralearning; Scott Young; Thorsons -* Search Inside Yourself - The Unexpected path to Achieving Success, Happiness (and World Peace); Chade-Meng Tan, Daniel Goleman, Jon Kabat-Zinn; HarperOne -* Solve for Happy; Mo Gawdat (RE-READ 1ST TIME) -* So Good They Can't Ignore You; Cal Newport; Business Plus -* The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME) * Meditation for Mortals, Oliver Burkeman, Audiobook -* The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books -* Ultralearning; Anna Laurent; Self-published via Amazon -* Atomic Habits; James Clear; Random House Business -* Influence without Authority; A. Cohen, D. Bradford; Wiley -* The Bullet Journal Method; Ryder Carroll; Fourth Estate +* Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press * The 7 Habits Of Highly Effective People; Stephen R. Covey; Simon & Schuster UK -* Stop starting, start finishing; Arne Roock; Lean-Kanban University -* The Complete Software Developer's Career Guide; John Sonmez; Unabridged Audiobook -* 101 Essays that change the way you think; Brianna Wiest; Audiobook -* Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion -* The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select +* Getting Things Done; David Allen +* Search Inside Yourself - The Unexpected path to Achieving Success, Happiness (and World Peace); Chade-Meng Tan, Daniel Goleman, Jon Kabat-Zinn; HarperOne +* The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd => ../notes/index.gmi Here are notes of mine for some of the books @@ -141,30 +141,30 @@ In random order: Some of these were in-person with exams; others were online learning lectures only. In random order: -* AWS Immersion Day; Amazon; 1-day interactive online training -* F5 Loadbalancers Training; 2-day on-site training; F5, Inc. * Cloud Operations on AWS - Learn how to configure, deploy, maintain, and troubleshoot your AWS environments; 3-day online live training with labs; Amazon -* Functional programming lecture; Remote University of Hagen -* MySQL Deep Dive Workshop; 2-day on-site training +* Ultimate Go Programming; Bill Kennedy; O'Reilly Online +* Structure and Interpretation of Computer Programs; Harold Abelson and more...; +* AWS Immersion Day; Amazon; 1-day interactive online training * Apache Tomcat Best Practises; 3-day on-site training -* The Ultimate Kubernetes Bootcamp; School of Devops; O'Reilly Online +* The Well-Grounded Rubyist Video Edition; David. A. Black; O'Reilly Online * Scripting Vim; Damian Conway; O'Reilly Online -* Algorithms Video Lectures; Robert Sedgewick; O'Reilly Online -* Developing IaC with Terraform (with Live Lessons); O'Reilly Online +* F5 Loadbalancers Training; 2-day on-site training; F5, Inc. * Linux Security and Isolation APIs Training; Michael Kerrisk; 3-day on-site training -* Structure and Interpretation of Computer Programs; Harold Abelson and more...; -* The Well-Grounded Rubyist Video Edition; David. A. Black; O'Reilly Online -* Ultimate Go Programming; Bill Kennedy; O'Reilly Online -* Red Hat Certified System Administrator; Course + certification (Although I had the option, I decided not to take the next course as it is more effective to self learn what I need) * Protocol buffers; O'Reilly Online +* The Ultimate Kubernetes Bootcamp; School of Devops; O'Reilly Online +* Functional programming lecture; Remote University of Hagen +* Developing IaC with Terraform (with Live Lessons); O'Reilly Online +* Red Hat Certified System Administrator; Course + certification (Although I had the option, I decided not to take the next course as it is more effective to self learn what I need) +* Algorithms Video Lectures; Robert Sedgewick; O'Reilly Online +* MySQL Deep Dive Workshop; 2-day on-site training ## Technical guides These are not whole books, but guides (smaller or larger) which I found very useful. in random order: +* Raku Guide at https://raku.guide * How CPUs work at https://cpu.land * Advanced Bash-Scripting Guide -* Raku Guide at https://raku.guide ## Podcasts @@ -172,56 +172,56 @@ These are not whole books, but guides (smaller or larger) which I found very use In random order: -* The ProdCast (Google SRE Podcast) -* Modern Mentor -* The Changelog Podcast(s) -* Maintainable -* Pratical AI * Fork Around And Find Out * Backend Banter +* The Changelog Podcast(s) * Hidden Brain -* Fallthrough [Golang] -* Cup o' Go [Golang] +* Maintainable * BSD Now [BSD] -* The Pragmatic Engineer Podcast +* Modern Mentor +* Cup o' Go [Golang] * Deep Questions with Cal Newport * Dev Interrupted +* The ProdCast (Google SRE Podcast) +* Fallthrough [Golang] +* The Pragmatic Engineer Podcast +* Pratical AI ### Podcasts I liked I liked them but am not listening to them anymore. The podcasts have either "finished" (no more episodes) or I stopped listening to them due to time constraints or a shift in my interests. -* FLOSS weekly -* CRE: Chaosradio Express [german] * Modern Mentor -* Go Time (predecessor of fallthrough) * Java Pub House +* FLOSS weekly * Ship It (predecessor of Fork Around And Find Out) +* Go Time (predecessor of fallthrough) +* CRE: Chaosradio Express [german] ## Newsletters I like This is a mix of tech and non-tech newsletters I am subscribed to. In random order: -* Monospace Mentor +* Register Spill +* Ruby Weekly +* Applied Go Weekly Newsletter +* byteSizeGo * Golang Weekly +* VK Newsletter +* Monospace Mentor +* The Pragmatic Engineer * The Imperfectionist -* Andreas Brandhorst Newsletter (Sci-Fi author) * Changelog News -* Applied Go Weekly Newsletter -* Register Spill +* Andreas Brandhorst Newsletter (Sci-Fi author) * The Valuable Dev -* byteSizeGo -* Ruby Weekly -* The Pragmatic Engineer -* VK Newsletter ## Magazines I like(d) This is a mix of tech I like(d). I may not be a current subscriber, but now and then, I buy an issue. In random order: -* Linux User * Linux Magazine * freeX (not published anymore) +* Linux User * LWN (online only) # Formal education diff --git a/about/showcase.gmi b/about/showcase.gmi index c864ff28..23fa377e 100644 --- a/about/showcase.gmi +++ b/about/showcase.gmi @@ -1,6 +1,8 @@ # Project Showcase -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. +Generated on: 2025-07-09 + +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. ## Table of Contents @@ -28,14 +30,13 @@ This page showcases my open source projects, providing an overview of what each * ⇢ ⇢ ⇢ docker-radicale-server * ⇢ ⇢ ⇢ docker-anki-sync-server * ⇢ ⇢ ⇢ gorum -* ⇢ ⇢ ⇢ guprecords * ⇢ ⇢ ⇢ randomjournalpage * ⇢ ⇢ ⇢ sway-autorotate * ⇢ ⇢ ⇢ photoalbum * ⇢ ⇢ ⇢ algorithms * ⇢ ⇢ ⇢ geheim -* ⇢ ⇢ ⇢ xerl * ⇢ ⇢ ⇢ perl-c-fibonacci +* ⇢ ⇢ ⇢ guprecords * ⇢ ⇢ ⇢ ioriot * ⇢ ⇢ ⇢ staticfarm-apache-handlers * ⇢ ⇢ ⇢ dyndns @@ -43,6 +44,7 @@ This page showcases my open source projects, providing an overview of what each * ⇢ ⇢ ⇢ rubyfy * ⇢ ⇢ ⇢ pingdomfetch * ⇢ ⇢ ⇢ gotop +* ⇢ ⇢ ⇢ xerl * ⇢ ⇢ ⇢ debroid * ⇢ ⇢ ⇢ fapi * ⇢ ⇢ ⇢ template @@ -65,47 +67,64 @@ This page showcases my open source projects, providing an overview of what each ## Overall Statistics -* Total Projects: 55 -* Total Commits: 10,358 -* Total Lines of Code: 225,423 -* Total Lines of Documentation: 24,618 -* Languages: Java (25.1%), Go (19.3%), HTML (15.7%), C++ (10.0%), C (8.2%), C/C++ (6.5%), XML (5.4%), Shell (2.1%), Perl (1.9%), Config (1.7%), Ruby (1.3%), CSS (0.8%), Make (0.8%), JSON (0.3%), Python (0.3%), Haskell (0.3%), YAML (0.2%), TOML (0.1%) -* Documentation: Text (46.9%), Markdown (39.2%), LaTeX (13.9%) - -Generated on: 2025-07-08 +* 📦 Total Projects: 55 +* 📊 Total Commits: 10,373 +* 📈 Total Lines of Code: 252,766 +* 📄 Total Lines of Documentation: 24,100 +* 💻 Languages: Java (22.4%), Go (17.5%), HTML (14.0%), C++ (8.9%), C (7.3%), Perl (6.3%), Shell (6.3%), C/C++ (5.8%), XML (4.7%), 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%) +* 📚 Documentation: Text (47.5%), Markdown (38.3%), LaTeX (14.2%) +* 🤖 AI-Assisted Projects: 8 out of 55 (14.5% AI-assisted, 85.5% human-only) +* 🚀 Release Status: 31 released, 24 experimental (56.4% with releases, 43.6% experimental) ## Projects ### gitsyncer -* Languages: Go (83.6%), Shell (14.0%), YAML (1.8%), JSON (0.6%) -* Documentation: Markdown (100.0%) -* Commits: 35 -* Lines of Code: 5314 -* Lines of Documentation: 2239 -* Development Period: 2025-06-23 to 2025-07-08 -* Recent Activity: 11.0 days (avg. age of last 42 commits) -* License: BSD-2-Clause +* 💻 Languages: Go (85.6%), Shell (12.3%), YAML (1.6%), JSON (0.5%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 50 +* 📈 Lines of Code: 6038 +* 📄 Lines of Documentation: 2239 +* 📅 Development Period: 2025-06-23 to 2025-07-08 +* 🔥 Recent Activity: 6.4 days (avg. age of last 42 commits) +* ⚖️ License: BSD-2-Clause +* 🏷️ Latest Release: v0.3.0 (2025-07-07) +* 🤖 AI-Assisted: This project was partially created with the help of generative AI -GitSyncer is a comprehensive Git repository synchronization tool that automatically keeps repositories in sync across multiple hosting platforms like GitHub and Codeberg. It's particularly useful for developers who maintain the same repository on multiple platforms or want to create resilient backups of their code. The tool supports both individual repository sync and bulk operations to sync all public repositories from one platform to another, with intelligent branch management that never deletes branches but creates them as needed. -The architecture follows a clean Go project structure with the core implementation handling repository cloning, remote management, and branch synchronization. It uses a JSON configuration file to define organizations and repositories, supports SSH backup locations with automatic bare repository creation, and includes features like branch exclusion patterns, dry-run mode, and merge conflict detection. The tool is designed to be resilient, with opt-in backup functionality that allows it to work normally even when backup servers are offline. +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. + +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. => https://codeberg.org/snonux/gitsyncer View on Codeberg => https://github.com/snonux/gitsyncer View on GitHub +Go from `internal/version/version.go`: + +```AUTO +var ( + Version = "0.4.0" + + GitCommit = "unknown" + + BuildDate = "unknown" +``` + --- ### timr -* Languages: Go (98.3%), YAML (1.7%) -* Documentation: Markdown (100.0%) -* Commits: 19 -* Lines of Code: 873 -* Lines of Documentation: 135 -* Development Period: 2025-06-25 to 2025-06-29 -* Recent Activity: 12.2 days (avg. age of last 42 commits) -* License: BSD-2-Clause +* 💻 Languages: Go (98.3%), YAML (1.7%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 19 +* 📈 Lines of Code: 873 +* 📄 Lines of Documentation: 135 +* 📅 Development Period: 2025-06-25 to 2025-06-29 +* 🔥 Recent Activity: 12.3 days (avg. age of last 42 commits) +* ⚖️ License: BSD-2-Clause +* 🧪 Status: Experimental (no releases yet) +* 🤖 AI-Assisted: This project was partially created with the help of generative AI + `timr` 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 `~/.config/timr/.timr_state`. 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. @@ -114,18 +133,36 @@ The project is implemented using a clean modular architecture with the CLI entry => https://codeberg.org/snonux/timr View on Codeberg => https://github.com/snonux/timr View on GitHub +Go from `internal/timer/timer.go`: + +```AUTO +func GetStateFile() (string, error) { + if stateFilePathOverride != "" { + return stateFilePathOverride, nil + } + configDir, err := os.UserConfigDir() + if err != nil { + return "", err + } + return filepath.Join(configDir, "timr", stateFile), nil +} +``` + --- ### tasksamurai -* Languages: Go (99.8%), YAML (0.2%) -* Documentation: Markdown (100.0%) -* Commits: 215 -* Lines of Code: 6160 -* Lines of Documentation: 162 -* Development Period: 2025-06-19 to 2025-07-08 -* Recent Activity: 12.6 days (avg. age of last 42 commits) -* License: BSD-2-Clause +* 💻 Languages: Go (99.8%), YAML (0.2%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 215 +* 📈 Lines of Code: 6160 +* 📄 Lines of Documentation: 162 +* 📅 Development Period: 2025-06-19 to 2025-07-08 +* 🔥 Recent Activity: 12.7 days (avg. age of last 42 commits) +* ⚖️ License: BSD-2-Clause +* 🏷️ Latest Release: v0.9.2 (2025-07-02) +* 🤖 AI-Assisted: This project was partially created with the help of generative AI + => showcase/tasksamurai/image-1.png tasksamurai screenshot @@ -138,18 +175,52 @@ The implementation follows a clean architecture with clear separation of concern => https://codeberg.org/snonux/tasksamurai View on Codeberg => https://github.com/snonux/tasksamurai View on GitHub +Go from `cmd/tasksamurai/main.go`: + +```AUTO +func main() { + debugLog := flag.String("debug-log", "", "path to debug log file") + browserCmd := flag.String("browser-cmd", "firefox", "command used to open URLs") + disco := flag.Bool("disco", false, "enable disco mode") + flag.Parse() + + if err := task.SetDebugLog(*debugLog); err != nil { + fmt.Fprintln(os.Stderr, "failed to enable debug log:", err) + os.Exit(1) + } + + m, err := ui.New(flag.Args(), *browserCmd) + if err != nil { + fmt.Fprintln(os.Stderr, "failed to load tasks:", err) + os.Exit(1) + } + + m.SetDisco(*disco) + + fmt.Print("\033[H\033[2J") + + p := tea.NewProgram(&m, tea.WithAltScreen()) + if _, err := p.Run(); err != nil { + fmt.Fprintln(os.Stderr, "error running ui:", err) + os.Exit(1) + } +} +``` + --- ### rexfiles -* Languages: Perl (34.8%), Shell (31.0%), Config (8.9%), CSS (8.7%), TOML (7.7%), Ruby (6.3%), Lua (1.9%), JSON (0.5%), INI (0.2%) -* Documentation: Text (97.3%), Markdown (2.7%) -* Commits: 871 -* Lines of Code: 3734 -* Lines of Documentation: 854 -* Development Period: 2021-12-28 to 2025-07-07 -* Recent Activity: 19.9 days (avg. age of last 42 commits) -* License: No license found +* 💻 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%) +* 📚 Documentation: Text (97.3%), Markdown (2.7%) +* 📊 Commits: 871 +* 📈 Lines of Code: 3947 +* 📄 Lines of Documentation: 854 +* 📅 Development Period: 2021-12-28 to 2025-07-07 +* 🔥 Recent Activity: 20.0 days (avg. age of last 42 commits) +* ⚖️ License: No license found +* 🧪 Status: Experimental (no releases yet) + 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. @@ -158,18 +229,29 @@ The project consists of three main components: **dotfiles** management for perso => https://codeberg.org/snonux/rexfiles View on Codeberg => https://github.com/snonux/rexfiles View on GitHub +Shell from `frontends/scripts/sitestats.sh`: + +```AUTO +STATSFILE=/tmp/sitestats.csv +BOTSFILE=/tmp/sitebots.txt +TOP=20 +``` + --- ### foo.zone -* Languages: HTML (73.9%), XML (25.9%), CSS (0.2%) -* Documentation: Text (91.8%), Markdown (8.2%) -* Commits: 2892 -* Lines of Code: 42772 -* Lines of Documentation: 159 -* Development Period: 2021-04-29 to 2025-07-01 -* Recent Activity: 26.3 days (avg. age of last 42 commits) -* License: No license found +* 💻 Languages: HTML (73.9%), XML (25.9%), CSS (0.2%) +* 📚 Documentation: Text (91.8%), Markdown (8.2%) +* 📊 Commits: 2892 +* 📈 Lines of Code: 42772 +* 📄 Lines of Documentation: 159 +* 📅 Development Period: 2021-04-29 to 2025-07-01 +* 🔥 Recent Activity: 26.3 days (avg. age of last 42 commits) +* ⚖️ License: No license found +* 🧪 Status: Experimental (no releases yet) +* 🤖 AI-Assisted: This project was partially created with the help of generative AI + 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. @@ -178,18 +260,36 @@ The site is built using **Gemtexter**, a static site generator that creates both => https://codeberg.org/snonux/foo.zone View on Codeberg => https://github.com/snonux/foo.zone View on GitHub +HTML from `gemfeed/2024-08-05-typing-127.1-words-per-minute.html`: + +```AUTO +Sometimes, there were brain farts, and I couldn't type at all. The trick was not to freak out about it, but to move on. If your average goes down a bit for a day, it doesn't matter; the long-term trend over several days and weeks matters, not the one-off wpm high score.
+
+Although my wrist pain seemed to go away aftre the first week of using the Kinesis, my fingers became tired of adjusting to the new way of typing. My hands were stiff, as if I had been training for the Olympics. Only after three weeks did I start to feel comfortable with it. If it weren't for the comments I read online, I would have sent it back after week 2.
+
+I also had a problem with the left pinky finger, where I could not comfortably reach the p key. This involved moving the whole hand. An easy fix was to swap p with ; on the keyboard layout.
+
+

Considering alternate layouts


+
+As I was going to learn 10-finger touch typing from scratch, I also played with the thought of switching from the Qwerty to the Dvorak or Colemak keymap, but after reading some comments on the internet, I decided against it:
+
+``` + --- ### dtail -* Languages: Go (94.0%), JSON (2.8%), C (2.0%), Make (0.5%), C/C++ (0.3%), Config (0.2%), Shell (0.1%), Docker (0.1%) -* Documentation: Text (79.4%), Markdown (20.6%) -* Commits: 1049 -* Lines of Code: 20088 -* Lines of Documentation: 5674 -* Development Period: 2020-01-09 to 2025-06-20 -* Recent Activity: 51.7 days (avg. age of last 42 commits) -* License: Apache-2.0 +* 💻 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%) +* 📚 Documentation: Text (79.4%), Markdown (20.6%) +* 📊 Commits: 1049 +* 📈 Lines of Code: 20091 +* 📄 Lines of Documentation: 5674 +* 📅 Development Period: 2020-01-09 to 2025-06-20 +* 🔥 Recent Activity: 51.8 days (avg. age of last 42 commits) +* ⚖️ License: Apache-2.0 +* 🏷️ Latest Release: v4.2.0 (2023-06-21) +* 🤖 AI-Assisted: This project was partially created with the help of generative AI + => showcase/dtail/image-1.png dtail screenshot @@ -202,18 +302,41 @@ The system uses a client-server architecture where dtail servers run on target m => https://codeberg.org/snonux/dtail View on Codeberg => https://github.com/snonux/dtail View on GitHub +Go from `internal/server/filldates.go`: + +```AUTO +func fillDates(str string) string { + yyyesterday := time.Now().Add(-3 * constants.DayDuration).Format("20060102") + str = strings.ReplaceAll(str, "$yyyesterday", yyyesterday) + + yyesterday := time.Now().Add(-2 * constants.DayDuration).Format("20060102") + str = strings.ReplaceAll(str, "$yyesterday", yyesterday) + + yesterday := time.Now().Add(-1 * constants.DayDuration).Format("20060102") + str = strings.ReplaceAll(str, "$yesterday", yesterday) + + today := time.Now().Format("20060102") + str = strings.ReplaceAll(str, "$today", today) + + tomorrow := time.Now().Add(1 * constants.DayDuration).Format("20060102") + return strings.ReplaceAll(str, "$tomorrow", tomorrow) +} +``` + --- ### wireguardmeshgenerator -* Languages: Ruby (73.5%), YAML (26.5%) -* Documentation: Markdown (100.0%) -* Commits: 33 -* Lines of Code: 396 -* Lines of Documentation: 24 -* Development Period: 2025-04-18 to 2025-05-11 -* Recent Activity: 71.0 days (avg. age of last 42 commits) -* License: Custom License +* 💻 Languages: Ruby (73.5%), YAML (26.5%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 33 +* 📈 Lines of Code: 396 +* 📄 Lines of Documentation: 24 +* 📅 Development Period: 2025-04-18 to 2025-05-11 +* 🔥 Recent Activity: 71.1 days (avg. age of last 42 commits) +* ⚖️ License: Custom License +* 🏷️ Latest Release: v1.0.0 (2025-05-11) + 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. @@ -222,38 +345,67 @@ The implementation uses a YAML configuration file to define the network topology => https://codeberg.org/snonux/wireguardmeshgenerator View on Codeberg => https://github.com/snonux/wireguardmeshgenerator View on GitHub +Ruby from `wireguardmeshgenerator.rb`: + +```AUTO +def priv = File.read(@privkey_path).strip + +def psk(peer) + psk_path = "#{@psk_dir}/#{[@myself, peer].sort.join('_')}.key" +``` + --- ### ior -* Languages: C (57.8%), Go (39.6%), Make (1.5%), C/C++ (1.2%) -* Documentation: Text (84.1%), Markdown (15.9%) -* Commits: 316 -* Lines of Code: 9307 -* Lines of Documentation: 559 -* Development Period: 2024-01-18 to 2025-06-14 -* Recent Activity: 83.1 days (avg. age of last 42 commits) -* License: No license found +* 💻 Languages: C (54.7%), Go (37.4%), Raku (5.4%), Make (1.4%), C/C++ (1.1%) +* 📚 Documentation: Text (84.1%), Markdown (15.9%) +* 📊 Commits: 316 +* 📈 Lines of Code: 9835 +* 📄 Lines of Documentation: 559 +* 📅 Development Period: 2024-01-18 to 2025-06-14 +* 🔥 Recent Activity: 83.2 days (avg. age of last 42 commits) +* ⚖️ License: No license found +* 🧪 Status: Experimental (no releases yet) + + +=> showcase/ior/image-1.png ior screenshot -**I/O Riot NG (ior)** is a Linux-only system performance analysis tool that uses eBPF (Extended Berkeley Packet Filter) to trace and analyze synchronous I/O system calls in real-time. The tool captures detailed timing information for I/O operations and generates flamegraphs to visualize performance bottlenecks, making it particularly useful for identifying slow I/O patterns and understanding where applications spend time waiting for disk operations. This is a spiritual successor to the original I/O Riot project, reimplemented using modern Go and eBPF technology instead of the older SystemTap approach. +Based on my analysis of the codebase, here's a comprehensive summary of the I/O Riot NG (ior) project: -The implementation follows a hybrid architecture combining Go for the userspace application logic and C for the eBPF kernel programs. The tool attaches to kernel tracepoints for various syscalls (like `sys_enter_read`, `sys_exit_write`, etc.), collects timing data through eBPF ring buffers, and processes this data in userspace to generate collapsed stack traces suitable for flamegraph visualization using the Inferno flamegraph tool. The codebase is well-structured with separate packages for event handling, flamegraph generation, file operations, and BPF program management, making it a comprehensive solution for I/O performance analysis. +=> showcase/ior/image-2.svg ior screenshot + +**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. + +The architecture combines kernel-level tracing with user-space analysis: eBPF programs (`internal/c/ior.bpf.c`) attach to kernel tracepoints to capture syscall entry/exit events, which are then processed by a Go-based event loop (`internal/eventloop.go`) 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. => https://codeberg.org/snonux/ior View on Codeberg => https://github.com/snonux/ior View on GitHub +C from `internal/c/maps.h`: + +```AUTO +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 1 << 24); +} event_map SEC(".maps"); +``` + --- ### ds-sim -* Languages: Java (98.9%), Shell (0.6%), CSS (0.5%) -* Documentation: Markdown (98.7%), Text (1.3%) -* Commits: 438 -* Lines of Code: 25762 -* Lines of Documentation: 3101 -* Development Period: 2008-05-15 to 2025-06-27 -* Recent Activity: 84.4 days (avg. age of last 42 commits) -* License: Custom License +* 💻 Languages: Java (98.9%), Shell (0.6%), CSS (0.5%) +* 📚 Documentation: Markdown (98.7%), Text (1.3%) +* 📊 Commits: 438 +* 📈 Lines of Code: 25762 +* 📄 Lines of Documentation: 3101 +* 📅 Development Period: 2008-05-15 to 2025-06-27 +* 🔥 Recent Activity: 84.4 days (avg. age of last 42 commits) +* ⚖️ License: Custom License +* 🧪 Status: Experimental (no releases yet) +* 🤖 AI-Assisted: This project was partially created with the help of generative AI + => showcase/ds-sim/image-1.png ds-sim screenshot @@ -264,18 +416,32 @@ The project is built on an event-driven architecture with clear component separa => https://codeberg.org/snonux/ds-sim View on Codeberg => https://github.com/snonux/ds-sim View on GitHub +Java from `src/main/java/testing/LogType.java`: + +```AUTO +public enum LogType { + GLOBAL, + + PROCESS, + + SYSTEM +} +``` + --- ### sillybench -* Languages: Go (90.9%), Shell (9.1%) -* Documentation: Markdown (100.0%) -* Commits: 5 -* Lines of Code: 33 -* Lines of Documentation: 3 -* Development Period: 2025-04-03 to 2025-04-03 -* Recent Activity: 96.9 days (avg. age of last 42 commits) -* License: No license found +* 💻 Languages: Go (90.9%), Shell (9.1%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 5 +* 📈 Lines of Code: 33 +* 📄 Lines of Documentation: 3 +* 📅 Development Period: 2025-04-03 to 2025-04-03 +* 🔥 Recent Activity: 97.0 days (avg. age of last 42 commits) +* ⚖️ License: No license found +* 🧪 Status: Experimental (no releases yet) + **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. @@ -284,18 +450,29 @@ The implementation is minimal and focused, consisting of a basic Go module with => https://codeberg.org/snonux/sillybench View on Codeberg => https://github.com/snonux/sillybench View on GitHub +Go from `main.go`: + +```AUTO +func main() { + println("Hello world") +} +``` + --- ### gos -* Languages: Go (98.6%), YAML (1.1%), JSON (0.2%) -* Documentation: Markdown (100.0%) -* Commits: 381 -* Lines of Code: 3967 -* Lines of Documentation: 411 -* Development Period: 2024-05-04 to 2025-06-12 -* Recent Activity: 113.9 days (avg. age of last 42 commits) -* License: Custom License +* 💻 Languages: Go (98.6%), YAML (1.1%), JSON (0.2%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 381 +* 📈 Lines of Code: 3967 +* 📄 Lines of Documentation: 411 +* 📅 Development Period: 2024-05-04 to 2025-06-12 +* 🔥 Recent Activity: 113.9 days (avg. age of last 42 commits) +* ⚖️ License: Custom License +* 🏷️ Latest Release: v1.0.0 (2025-03-04) +* 🤖 AI-Assisted: This project was partially created with the help of generative AI + => showcase/gos/image-1.png gos screenshot @@ -308,18 +485,30 @@ The tool is architected around a file-based queueing system where posts progress => https://codeberg.org/snonux/gos View on Codeberg => https://github.com/snonux/gos View on GitHub +Go from `internal/table/table.go`: + +```AUTO +func (t *Table) MustRender() { + if err := t.Render(); err != nil { + panic(err) + } +} +``` + --- ### foostats -* Languages: Perl (100.0%) -* Documentation: Markdown (85.1%), Text (14.9%) -* Commits: 67 -* Lines of Code: 1299 -* Lines of Documentation: 154 -* Development Period: 2023-01-02 to 2025-07-07 -* Recent Activity: 133.4 days (avg. age of last 42 commits) -* License: Custom License +* 💻 Languages: Perl (100.0%) +* 📚 Documentation: Markdown (85.1%), Text (14.9%) +* 📊 Commits: 67 +* 📈 Lines of Code: 1299 +* 📄 Lines of Documentation: 154 +* 📅 Development Period: 2023-01-02 to 2025-07-07 +* 🔥 Recent Activity: 133.5 days (avg. age of last 42 commits) +* ⚖️ License: Custom License +* 🧪 Status: Experimental (no releases yet) + 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. @@ -328,18 +517,30 @@ The project implements a modular architecture with seven core components: FileHe => https://codeberg.org/snonux/foostats View on Codeberg => https://github.com/snonux/foostats View on GitHub +Perl from `foostats.pl`: + +```AUTO +my sub parse_date ( $year, @line ) { + my $timestr = "$line[0] $line[1]"; + return Time::Piece->strptime( $timestr, '%b %d' ) + ->strftime("$year%m%d"); +} +``` + --- ### rcm -* Languages: Ruby (99.8%), TOML (0.2%) -* Documentation: Markdown (100.0%) -* Commits: 76 -* Lines of Code: 1373 -* Lines of Documentation: 48 -* Development Period: 2024-12-05 to 2025-02-28 -* Recent Activity: 137.6 days (avg. age of last 42 commits) -* License: Custom License +* 💻 Languages: Ruby (99.8%), TOML (0.2%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 76 +* 📈 Lines of Code: 1373 +* 📄 Lines of Documentation: 48 +* 📅 Development Period: 2024-12-05 to 2025-02-28 +* 🔥 Recent Activity: 137.7 days (avg. age of last 42 commits) +* ⚖️ License: Custom License +* 🧪 Status: Experimental (no releases yet) + 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. @@ -348,18 +549,32 @@ The system is implemented with a modular architecture centered around a DSL clas => https://codeberg.org/snonux/rcm View on Codeberg => https://github.com/snonux/rcm View on GitHub +Ruby from `lib/dslkeywords/given.rb`: + +```AUTO +def respond_to_missing? = true + +def met? + return false if @conds.key?(:hostname) && Socket.gethostname != @conds[:hostname].to_s + + true +end +``` + --- ### gemtexter -* Languages: Shell (64.6%), CSS (31.8%), Config (2.1%), HTML (1.5%) -* Documentation: Text (76.8%), Markdown (23.2%) -* Commits: 461 -* Lines of Code: 2047 -* Lines of Documentation: 1170 -* Development Period: 2021-05-21 to 2025-06-11 -* Recent Activity: 230.4 days (avg. age of last 42 commits) -* License: GPL-3.0 +* 💻 Languages: Shell (67.9%), CSS (28.9%), Config (2.0%), HTML (1.3%) +* 📚 Documentation: Text (76.8%), Markdown (23.2%) +* 📊 Commits: 461 +* 📈 Lines of Code: 2253 +* 📄 Lines of Documentation: 1170 +* 📅 Development Period: 2021-05-21 to 2025-06-11 +* 🔥 Recent Activity: 230.5 days (avg. age of last 42 commits) +* ⚖️ License: GPL-3.0 +* 🏷️ Latest Release: 3.0.0 (2024-10-01) + **Gemtexter** is a static site generator and blog engine that transforms content written in Gemini Gemtext format into multiple output formats. It's a comprehensive Bash-based tool designed to support the Gemini protocol (a simpler alternative to HTTP) while maintaining compatibility with traditional web technologies. The project converts a single source of Gemtext content into HTML (XHTML 1.0 Transitional), Markdown, and native Gemtext formats, enabling authors to write once and publish across multiple platforms including Gemini capsules, traditional websites, and GitHub/Codeberg pages. @@ -368,18 +583,35 @@ The implementation is built entirely in Bash (version 5.x+) using a modular libr => https://codeberg.org/snonux/gemtexter View on Codeberg => https://github.com/snonux/gemtexter View on GitHub +Shell from `lib/git.source.sh`: + +```AUTO + find "$CONTENT_BASE_DIR" -maxdepth 1 -mindepth 1 -type d | + while read -r content_dir; do + if [ -d "$content_dir/.git" ]; then + echo "$content_dir" + fi + done +} + +git::add_all () { + local message="$1"; shift +``` + --- ### quicklogger -* Languages: Go (97.6%), Shell (1.5%), TOML (0.9%) -* Documentation: Markdown (100.0%) -* Commits: 32 -* Lines of Code: 917 -* Lines of Documentation: 33 -* Development Period: 2024-01-20 to 2025-07-06 -* Recent Activity: 447.6 days (avg. age of last 42 commits) -* License: MIT +* 💻 Languages: Go (97.6%), Shell (1.5%), TOML (0.9%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 32 +* 📈 Lines of Code: 917 +* 📄 Lines of Documentation: 33 +* 📅 Development Period: 2024-01-20 to 2025-07-06 +* 🔥 Recent Activity: 447.7 days (avg. age of last 42 commits) +* ⚖️ License: MIT +* 🏷️ Latest Release: v0.0.3 (2025-07-06) + => showcase/quicklogger/image-1.png quicklogger screenshot @@ -392,18 +624,62 @@ The project follows a clean, single-file architecture with all functionality con => https://codeberg.org/snonux/quicklogger View on Codeberg => https://github.com/snonux/quicklogger View on GitHub +Go from `main.go`: + +```AUTO +func createPreferenceWindow(a fyne.App) fyne.Window { + window := a.NewWindow("Preferences") + directoryPreference := widget.NewEntry() + directoryPreference.SetText(a.Preferences().StringWithFallback("Directory", defaultDirectory)) + + tagDropdownPreference := widget.NewEntry() + tagDropdownPreference.SetText(a.Preferences().StringWithFallback("Tags", strings.Join(defaultTagItems, ","))) + + whatDropdownPreference := widget.NewEntry() + whatDropdownPreference.SetText(a.Preferences().StringWithFallback("Whats", strings.Join(defaultWhatItems, ","))) + + window.SetContent(container.NewVBox( + container.NewVBox( + widget.NewLabel("Directory:"), + directoryPreference, + widget.NewLabel("Tags:"), + tagDropdownPreference, + widget.NewLabel("Whats:"), + whatDropdownPreference, + ), + container.NewHBox( + widget.NewButton("Save", func() { + a.Preferences().SetString("Directory", directoryPreference.Text) + a.Preferences().SetString("Tags", tagDropdownPreference.Text) + a.Preferences().SetString("Whats", whatDropdownPreference.Text) + window.Hide() + }), + widget.NewButton("Reset dropdowns", func() { + tagDropdownPreference.SetText(strings.Join(defaultTagItems, ",")) + whatDropdownPreference.SetText(strings.Join(defaultWhatItems, ",")) + }, + ), + ))) + window.Resize(windowSize) + + return window +} +``` + --- ### docker-gpodder-sync-server -* Languages: Make (100.0%) -* Documentation: Markdown (100.0%) -* Commits: 3 -* Lines of Code: 12 -* Lines of Documentation: 3 -* Development Period: 2024-03-24 to 2024-03-24 -* Recent Activity: 471.4 days (avg. age of last 42 commits) -* License: Custom License +* 💻 Languages: Make (100.0%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 3 +* 📈 Lines of Code: 12 +* 📄 Lines of Documentation: 3 +* 📅 Development Period: 2024-03-24 to 2024-03-24 +* 🔥 Recent Activity: 471.5 days (avg. age of last 42 commits) +* ⚖️ License: Custom License +* 🧪 Status: Experimental (no releases yet) + This project is a **Docker containerization wrapper for a GPodder sync server**, specifically built around the micro-gpodder-server implementation from https://github.com/bohwaz/micro-gpodder-server. GPodder is a podcast client that allows users to synchronize their podcast subscriptions and episode states across multiple devices. The sync server enables this synchronization by providing a centralized service that podcast clients can connect to for managing subscriptions, episode progress, and playback history. @@ -412,18 +688,35 @@ The project is implemented as a simple Docker build system with a Makefile that => https://codeberg.org/snonux/docker-gpodder-sync-server View on Codeberg => https://github.com/snonux/docker-gpodder-sync-server View on GitHub +Make from `Makefile`: + +```AUTO +build: + docker build -t micro-gpodder-server ./micro-gpodder-server +run: build + if [ ! -d ./data ]; then mkdir ./data; fi + docker run \ + --name micro-gpodder-server \ + -v ./data:/var/www/server/data \ + --hostname gpodder.example.org \ + -p 8080:8080 micro-gpodder-server +aws: build +``` + --- ### terraform -* Languages: Make (56.1%), YAML (43.9%) -* Documentation: Markdown (100.0%) -* Commits: 123 -* Lines of Code: 98 -* Lines of Documentation: 52 -* Development Period: 2023-08-27 to 2025-04-05 -* Recent Activity: 501.5 days (avg. age of last 42 commits) -* License: MIT +* 💻 Languages: HCL (96.6%), Make (1.9%), YAML (1.5%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 123 +* 📈 Lines of Code: 2850 +* 📄 Lines of Documentation: 52 +* 📅 Development Period: 2023-08-27 to 2025-04-05 +* 🔥 Recent Activity: 501.5 days (avg. age of last 42 commits) +* ⚖️ License: MIT +* 🧪 Status: Experimental (no releases yet) + This is a comprehensive personal cloud infrastructure project built with Terraform that deploys a multi-tier AWS architecture for hosting self-hosted services. The infrastructure is organized into modular components: `org-buetow-base` provides the foundation (VPC, subnets, EFS storage, ECR), `org-buetow-bastion` creates a bastion host for secure access, `org-buetow-elb` sets up application load balancing, and `org-buetow-ecs` runs containerized services on AWS Fargate. The project also includes an EKS cluster option with EFS CSI driver integration for Kubernetes workloads. @@ -432,18 +725,36 @@ The system is designed to host multiple personal services including Anki sync se => https://codeberg.org/snonux/terraform View on Codeberg => https://github.com/snonux/terraform View on GitHub +HCL from `org-buetow-eks/remotestates.tf`: + +```AUTO +data "terraform_remote_state" "base" { + backend = "s3" + config = { + bucket = "org-buetow-tfstate" + key = "org-buetow-base/terraform.tfstate" + region = "eu-central-1" + } +} + +data "terraform_remote_state" "elb" { +``` + --- ### gogios -* Languages: Go (94.4%), YAML (3.4%), JSON (2.2%) -* Documentation: Markdown (100.0%) -* Commits: 77 -* Lines of Code: 1096 -* Lines of Documentation: 287 -* Development Period: 2023-04-17 to 2025-06-12 -* Recent Activity: 514.3 days (avg. age of last 42 commits) -* License: Custom License +* 💻 Languages: Go (94.4%), YAML (3.4%), JSON (2.2%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 77 +* 📈 Lines of Code: 1096 +* 📄 Lines of Documentation: 287 +* 📅 Development Period: 2023-04-17 to 2025-06-12 +* 🔥 Recent Activity: 514.4 days (avg. age of last 42 commits) +* ⚖️ License: Custom License +* 🏷️ Latest Release: v1.1.0 (2024-05-03) +* 🤖 AI-Assisted: This project was partially created with the help of generative AI + => showcase/gogios/image-1.png gogios screenshot @@ -454,18 +765,30 @@ The implementation follows a clean architecture with concurrent check execution, => https://codeberg.org/snonux/gogios View on Codeberg => https://github.com/snonux/gogios View on GitHub +Go from `internal/state.go`: + +```AUTO +func (s state) reportStaleAlerts(sb *strings.Builder) int { + return s.reportBy(sb, false, true, func(cs checkState) bool { + return cs.Epoch < s.staleEpoch + }) +} +``` + --- ### docker-radicale-server -* Languages: Docker (53.1%), Make (46.9%) -* Documentation: Markdown (100.0%) -* Commits: 4 -* Lines of Code: 32 -* Lines of Documentation: 3 -* Development Period: 2023-12-31 to 2023-12-31 -* Recent Activity: 555.0 days (avg. age of last 42 commits) -* License: No license found +* 💻 Languages: Docker (53.1%), Make (46.9%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 4 +* 📈 Lines of Code: 32 +* 📄 Lines of Documentation: 3 +* 📅 Development Period: 2023-12-31 to 2023-12-31 +* 🔥 Recent Activity: 555.1 days (avg. age of last 42 commits) +* ⚖️ License: No license found +* 🧪 Status: Experimental (no releases yet) + This project is a **Docker containerization setup for Radicale**, a CalDAV and CardDAV server written in Python. Radicale is a lightweight, standards-compliant calendar and contacts server that allows users to synchronize their calendars and address books across multiple devices and applications. The project provides a complete Docker image and deployment configuration that makes it easy to run a personal or small-team calendar/contacts server. @@ -474,18 +797,35 @@ The implementation uses Alpine Linux as the base image for a minimal footprint, => https://codeberg.org/snonux/docker-radicale-server View on Codeberg => https://github.com/snonux/docker-radicale-server View on GitHub +Make from `Makefile`: + +```AUTO +build: + docker build -t radicale . +run: build + if [ ! -d collections ]; then mkdir collections; fi + if [ ! -d auth ]; then mkdir auth; fi + cp -v htpasswd-test auth/htpasswd + sh -c 'docker rm radicale; exit 0' + docker run \ + -v collections:/collections \ + -v auth:/auth \ +``` + --- ### docker-anki-sync-server -* Languages: Docker (62.1%), Make (37.9%) -* Documentation: Markdown (100.0%) -* Commits: 3 -* Lines of Code: 29 -* Lines of Documentation: 3 -* Development Period: 2023-08-13 to 2024-01-01 -* Recent Activity: 648.2 days (avg. age of last 42 commits) -* License: MIT +* 💻 Languages: Docker (62.1%), Make (37.9%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 3 +* 📈 Lines of Code: 29 +* 📄 Lines of Documentation: 3 +* 📅 Development Period: 2023-08-13 to 2024-01-01 +* 🔥 Recent Activity: 648.3 days (avg. age of last 42 commits) +* ⚖️ License: MIT +* 🧪 Status: Experimental (no releases yet) + This project is a Docker containerization of the Anki sync server, designed to provide a self-hosted synchronization service for Anki flashcard applications. Anki is a popular spaced repetition learning tool, and this project allows users to run their own sync server instead of relying on AnkiWeb's hosted service, giving them full control over their data privacy and synchronization infrastructure. @@ -494,18 +834,35 @@ The implementation is built using a Rocky Linux base image with Python 3.9, and => https://codeberg.org/snonux/docker-anki-sync-server View on Codeberg => https://github.com/snonux/docker-anki-sync-server View on GitHub +Make from `Makefile`: + +```AUTO +all: + if [ ! -d anki-sync-server ]; then \ + git clone https://github.com/ankicommunity/anki-sync-server; \ + else \ + cd anki-sync-server && git pull && cd ..; \ + fi + docker build -t anki-sync-server:latest . +aws: + docker build -t anki-sync-server:latest . + docker tag anki-sync-server:latest 634617747016.dkr.ecr.eu-central-1.amazonaws.com/anki-sync-server:latest +``` + --- ### gorum -* Languages: Go (91.3%), JSON (6.4%), YAML (2.3%) -* Documentation: Markdown (100.0%) -* Commits: 82 -* Lines of Code: 1525 -* Lines of Documentation: 15 -* Development Period: 2023-04-17 to 2023-11-19 -* Recent Activity: 700.4 days (avg. age of last 42 commits) -* License: Custom License +* 💻 Languages: Go (91.3%), JSON (6.4%), YAML (2.3%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 82 +* 📈 Lines of Code: 1525 +* 📄 Lines of Documentation: 15 +* 📅 Development Period: 2023-04-17 to 2023-11-19 +* 🔥 Recent Activity: 700.4 days (avg. age of last 42 commits) +* ⚖️ License: Custom License +* 🧪 Status: Experimental (no releases yet) + Gorum is a minimalistic distributed quorum manager written in Go that implements a leader election and consensus mechanism across multiple nodes in a network. The system enables nodes to continuously vote for which node should be the leader based on priority scores, with automatic failover when nodes become unavailable. It's particularly useful for distributed systems that need to maintain a single authoritative node while providing high availability and fault tolerance. @@ -514,37 +871,57 @@ The architecture consists of several key components: a quorum manager that handl => https://codeberg.org/snonux/gorum View on Codeberg => https://github.com/snonux/gorum View on GitHub ---- - -### guprecords - -* Documentation: Markdown (100.0%) -* Commits: 95 -* Lines of Code: 0 -* Lines of Documentation: 416 -* Development Period: 2013-03-22 to 2025-05-18 -* Recent Activity: 750.4 days (avg. age of last 42 commits) -* License: No license found - -`guprecords` is a Raku-based command-line tool that analyzes and reports on system uptime statistics across multiple hosts. It reads uptime records from the `uptimed` daemon and generates comprehensive reports that help system administrators track host reliability and performance across their infrastructure. - -The tool is particularly useful for organizations managing multiple servers, as it provides a unified view of system uptime patterns. It parses raw uptime records (containing uptime duration, boot time, and OS information) from files collected from the `uptimed` daemon running on various hosts. The implementation uses an object-oriented design with classes for data aggregation (`Aggregator`, `Aggregate`, `HostAggregate`) and report generation (`Reporter`, `HostReporter`). It supports multiple analysis categories (Host, Kernel versions, OS families) and metrics (boot count, uptime, downtime, lifespan, and a composite score), with output in plaintext, Markdown, or Gemtext formats. The tool includes comprehensive testing with fixture files and can generate individual reports or complete analysis suites, making it valuable for infrastructure monitoring and capacity planning. - -=> https://codeberg.org/snonux/guprecords View on Codeberg -=> https://github.com/snonux/guprecords View on GitHub +Go from `internal/client/tcpclient.go`: + +```AUTO +func tcpClientRun(ctx context.Context, address string, ch <-chan vote.Vote) error { + conn, err := net.Dial("tcp", address) + if err != nil { + return err + } + defer conn.Close() + + for { + votes, ok := <-ch + if !ok { + return fmt.Errorf("channel closed - breaking tcpClientRun loop") + } + + message, err := votes.ToJSON() + if err != nil { + return err + } + + log.Println("tcpclient: sending", message, "to address", address) + if err := iorw.WriteStr(conn, message); err != nil { + return err + } + + response, err := iorw.ReadStr(conn) + if err != nil { + return err + } + + log.Println("tcpclient: received", response, "from address", address) + } +} +``` --- ### randomjournalpage -* Languages: Shell (94.1%), Make (5.9%) -* Documentation: Markdown (100.0%) -* Commits: 8 -* Lines of Code: 51 -* Lines of Documentation: 26 -* Development Period: 2022-06-02 to 2024-04-20 -* Recent Activity: 765.1 days (avg. age of last 42 commits) -* License: No license found +* 💻 Languages: Shell (94.1%), Make (5.9%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 8 +* 📈 Lines of Code: 51 +* 📄 Lines of Documentation: 26 +* 📅 Development Period: 2022-06-02 to 2024-04-20 +* 🔥 Recent Activity: 765.2 days (avg. age of last 42 commits) +* ⚖️ License: No license found +* 🧪 Status: Experimental (no releases yet) + +⚠️ **Notice**: This project appears to be finished, obsolete, or no longer maintained. Last meaningful activity was over 2 years ago. Use at your own risk. **Random Journal Page** is a personal utility script designed to help with journal reflection and review. The project randomly selects a PDF file from a collection of scanned bullet journals and extracts a random set of pages (42 by default) to create a smaller PDF for reading and reflection. This is particularly useful for revisiting past thoughts, book notes, and ideas that were written down over time. @@ -553,18 +930,30 @@ The implementation is straightforward - a bash script that uses `find` to locate => https://codeberg.org/snonux/randomjournalpage View on Codeberg => https://github.com/snonux/randomjournalpage View on GitHub +Shell from `randomjournalpage.sh`: + +```AUTO +declare -r ARG="$1" + +declare -r JOURNAL_DIR="$HOME/Journals/" +declare -r OUT_PDF=$JOURNAL_DIR/random_journal_extract.pdf +declare -i NUM_PAGES_TO_EXTRACT=42 # This is the answear! +``` + --- ### sway-autorotate -* Languages: Shell (100.0%) -* Documentation: Markdown (100.0%) -* Commits: 8 -* Lines of Code: 41 -* Lines of Documentation: 17 -* Development Period: 2020-01-30 to 2025-04-30 -* Recent Activity: 1058.6 days (avg. age of last 42 commits) -* License: GPL-3.0 +* 💻 Languages: Shell (100.0%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 8 +* 📈 Lines of Code: 41 +* 📄 Lines of Documentation: 17 +* 📅 Development Period: 2020-01-30 to 2025-04-30 +* 🔥 Recent Activity: 1058.7 days (avg. age of last 42 commits) +* ⚖️ License: GPL-3.0 +* 🧪 Status: Experimental (no releases yet) + **sway-autorotate** is a bash script for automatic screen rotation on tablets running the Sway window manager. It's specifically designed for touch-enabled devices like the Microsoft Surface Go 2 tablet, addressing the common need for automatic screen orientation changes when the device is physically rotated. The project is particularly useful for tablet users who frequently switch between portrait and landscape orientations, as it eliminates the need to manually rotate the display through system settings. @@ -573,18 +962,33 @@ The implementation consists of two main components: `autorotate.sh` monitors the => https://codeberg.org/snonux/sway-autorotate View on Codeberg => https://github.com/snonux/sway-autorotate View on GitHub +Shell from `autorotate.sh`: + +```AUTO +set -euf -o pipefail + +declare -r WAYLANDINPUT=( + '1118:2485:Microsoft_Surface_Keyboard_Touchpad' + '1267:10780:ELAN9038:00_04F3:2A1C' +) +declare -r SCREEN=eDP-1 +``` + --- ### photoalbum -* Languages: Shell (80.1%), Make (12.3%), Config (7.6%) -* Documentation: Markdown (100.0%) -* Commits: 153 -* Lines of Code: 342 -* Lines of Documentation: 39 -* Development Period: 2011-11-19 to 2022-04-02 -* Recent Activity: 1278.2 days (avg. age of last 42 commits) -* License: No license found +* 💻 Languages: Shell (80.1%), Make (12.3%), Config (7.6%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 153 +* 📈 Lines of Code: 342 +* 📄 Lines of Documentation: 39 +* 📅 Development Period: 2011-11-19 to 2022-04-02 +* 🔥 Recent Activity: 1278.3 days (avg. age of last 42 commits) +* ⚖️ License: No license found +* 🏷️ Latest Release: 0.5.0 (2022-02-21) + +⚠️ **Notice**: This project appears to be finished, obsolete, or no longer maintained. Last meaningful activity was over 2 years ago. Use at your own risk. PhotoAlbum is a minimal Bash script for Unix-like systems that generates static web photo albums from directories of images. It creates pure HTML+CSS galleries without JavaScript, making them lightweight and universally compatible. The tool is designed for simplicity and portability - users point it at a directory of photos, configure basic settings like thumbnail size and gallery title, and it automatically generates a complete static website with image previews, navigation, and optional download archives. @