diff options
| author | Paul Buetow <paul@buetow.org> | 2026-01-24 23:12:14 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-01-24 23:12:14 +0200 |
| commit | c203d379c6bfe637d8234e4d4b56f7456a1ed8db (patch) | |
| tree | 818e28e6db8ee646fd2ec32fb12d64c8331c7959 | |
| parent | 1c8e0a9ccde490cb4eab4cea1b13368950918d7b (diff) | |
freebsd and not fedora
| -rw-r--r-- | about/showcase.gmi.tpl | 534 | ||||
| -rw-r--r-- | about/showcase/debroid/image-1.png | 112 | ||||
| -rw-r--r-- | gemfeed/2025-07-14-f3s-kubernetes-with-freebsd-part-6.gmi.tpl | 24 |
3 files changed, 345 insertions, 325 deletions
diff --git a/about/showcase.gmi.tpl b/about/showcase.gmi.tpl index 7b42e149..8c86dc41 100644 --- a/about/showcase.gmi.tpl +++ b/about/showcase.gmi.tpl @@ -1,6 +1,6 @@ # Project Showcase -Generated on: 2026-01-08 +Generated on: 2026-01-24 This page showcases my side 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 ranked by score, which combines project size and recent activity. @@ -8,25 +8,25 @@ This page showcases my side projects, providing an overview of what each project ## Overall Statistics -* π¦ Total Projects: 58 -* π Total Commits: 11,672 -* π Total Lines of Code: 314,725 -* π Total Lines of Documentation: 32,713 -* π» Languages: Go (28.6%), Java (18.0%), C++ (11.8%), C/C++ (6.6%), C (6.1%), XML (5.6%), Perl (5.6%), Shell (5.2%), HTML (4.6%), YAML (1.9%), Config (1.4%), Ruby (0.9%), HCL (0.9%), Python (0.7%), Make (0.6%), CSS (0.4%), JSON (0.4%), Raku (0.3%), Haskell (0.2%) -* π Documentation: Markdown (55.8%), Text (33.7%), LaTeX (10.5%) -* π Release Status: 38 released, 20 experimental (65.5% with releases, 34.5% experimental) +* π¦ Total Projects: 59 +* π Total Commits: 12,767 +* π Total Lines of Code: 293,318 +* π Total Lines of Documentation: 31,738 +* π» Languages: Go (31.3%), Java (14.0%), C++ (7.7%), C (6.6%), HTML (6.2%), Shell (6.2%), CSS (5.9%), Perl (5.9%), C/C++ (4.9%), YAML (2.8%), Python (2.4%), Config (1.5%), JSON (1.1%), Ruby (1.0%), HCL (0.9%), Make (0.6%), Raku (0.3%), XML (0.3%), Haskell (0.2%), TOML (0.1%) +* π Documentation: Markdown (62.6%), Text (35.6%), LaTeX (1.8%) +* π Release Status: 38 released, 21 experimental (64.4% with releases, 35.6% experimental) ## Projects ### 1. conf -* π» Languages: YAML (51.5%), Perl (17.4%), Shell (14.0%), Python (3.9%), Config (3.1%), CSS (3.0%), TOML (2.7%), Ruby (2.3%), Docker (0.8%), Lua (0.6%), JSON (0.3%), HTML (0.2%) -* π Documentation: Markdown (94.8%), Text (5.2%) -* π Commits: 1148 -* π Lines of Code: 10970 -* π Lines of Documentation: 3649 -* π
Development Period: 2021-12-28 to 2026-01-08 -* π Score: 707.8 (combines code size and activity) +* π» Languages: YAML (55.0%), Shell (18.0%), Perl (13.5%), Python (3.1%), Config (2.4%), CSS (2.3%), TOML (2.1%), Ruby (1.8%), Docker (0.9%), Lua (0.5%), JSON (0.2%), HTML (0.2%) +* π Documentation: Markdown (96.1%), Text (3.9%) +* π Commits: 2167 +* π Lines of Code: 14113 +* π Lines of Documentation: 4886 +* π
Development Period: 2021-12-28 to 2026-01-23 +* π Score: 622.2 (combines code size and activity) * βοΈ License: No license found * π§ͺ Status: Experimental (no releases yet) @@ -40,23 +40,25 @@ The project is organized into distinct subdirectories: `dotfiles/` contains shel --- -### 2. foo.zone +### 2. log4jbench -* π» Languages: XML (98.5%), Shell (1.1%), Go (0.4%) -* π Documentation: Text (86.7%), Markdown (13.3%) -* π Commits: 3376 -* π Lines of Code: 17290 -* π Lines of Documentation: 173 -* π
Development Period: 2021-04-29 to 2026-01-08 -* π Score: 448.1 (combines code size and activity) -* βοΈ License: No license found +* π» Languages: Java (78.9%), XML (21.1%) +* π Documentation: Markdown (100.0%) +* π Commits: 4 +* π Lines of Code: 774 +* π Lines of Documentation: 119 +* π
Development Period: 2026-01-09 to 2026-01-09 +* π Score: 184.8 (combines code size and activity) +* βοΈ License: MIT * π§ͺ Status: Experimental (no releases yet) -foo.zone: source code repository. +This is a Java-based benchmarking tool for measuring Log4j2 logging throughput under different configurations. It allows developers to compare synchronous vs. asynchronous logging strategies by testing five built-in configurations: immediate-flush sync, buffered sync, and async loggers with varying LMAX Disruptor ring buffer sizes (1K/4K/10K). The tool supports configurable thread counts, duration or event-count based testing, custom message sizes, and CSV export for analysis. -=> https://codeberg.org/snonux/foo.zone View on Codeberg -=> https://github.com/snonux/foo.zone View on GitHub +The implementation uses a fat JAR built with Maven, requiring Java 17+. It's designed for realistic benchmarkingβincluding warmup periods and optional Linux filesystem cache dropping between tests. This helps developers make informed decisions about Log4j2 configuration tradeoffs between latency (immediate flush), throughput (buffered/async), and memory usage (ring buffer sizing) for their specific workloads. + +=> https://codeberg.org/snonux/log4jbench View on Codeberg +=> https://github.com/snonux/log4jbench View on GitHub --- @@ -68,7 +70,7 @@ foo.zone: source code repository. * π Lines of Code: 3869 * π Lines of Documentation: 3700 * π
Development Period: 2025-12-30 to 2026-01-06 -* π Score: 393.4 (combines code size and activity) +* π Score: 144.0 (combines code size and activity) * βοΈ License: No license found * π§ͺ Status: Experimental (no releases yet) @@ -92,7 +94,7 @@ The architecture routes current data (<5 min old) through Pushgateway where Prom * π Lines of Code: 452 * π Lines of Documentation: 80 * π
Development Period: 2025-11-25 to 2025-11-25 -* π Score: 59.2 (combines code size and activity) +* π Score: 43.8 (combines code size and activity) * βοΈ License: No license found * π·οΈ Latest Release: v0.1.0 (2025-11-25) @@ -114,7 +116,7 @@ The tool is built as a simple Go CLI application with a standard project layout * π Lines of Code: 28331 * π Lines of Documentation: 562 * π
Development Period: 2025-08-01 to 2025-11-03 -* π Score: 41.9 (combines code size and activity) +* π Score: 36.5 (combines code size and activity) * βοΈ License: No license found * π·οΈ Latest Release: v0.15.3 (2025-11-03) @@ -138,7 +140,7 @@ The project is implemented as an LSP server written in Go, with a TUI component * π Lines of Code: 3408 * π Lines of Documentation: 82 * π
Development Period: 2025-10-01 to 2025-10-24 -* π Score: 37.5 (combines code size and activity) +* π Score: 32.1 (combines code size and activity) * βοΈ License: No license found * π·οΈ Latest Release: v0.3.0 (2025-10-24) @@ -154,15 +156,41 @@ The implementation follows clean Go architecture with domain logic organized und --- -### 7. gitsyncer +### 7. totalrecall + +* π» Languages: Go (99.0%), Shell (0.5%), YAML (0.4%) +* π Documentation: Markdown (99.5%), Text (0.5%) +* π Commits: 101 +* π Lines of Code: 13129 +* π Lines of Documentation: 377 +* π
Development Period: 2025-07-14 to 2026-01-21 +* π Score: 31.8 (combines code size and activity) +* βοΈ License: MIT +* π·οΈ Latest Release: v0.8.0 (2026-01-21) + + +=> showcase/totalrecall/image-1.png totalrecall screenshot + +TotalRecall is a Go-based tool that generates comprehensive Anki flashcard materials for Bulgarian language learning. It creates high-quality audio pronunciations using OpenAI TTS (with 11 voice options), AI-generated contextual images via DALL-E, IPA phonetic transcriptions, and automatic Bulgarian-English translations. The tool supports both single-word and batch processing, making it efficient for building large vocabulary decks. It outputs Anki-compatible packages (APKG) with all media files bundled, ready for immediate import. + +=> showcase/totalrecall/image-2.png totalrecall screenshot + +The project offers both a keyboard-driven GUI for interactive use and a CLI for automation, built with Go using the Cobra framework for command handling. It leverages OpenAI's APIs for both audio synthesis and image generation, creating memorable visual contexts with random art styles to enhance retention. The architecture follows clean Go package structure with separate internal packages for audio, image, config, and Anki format generation, making it maintainable and extensible for future enhancements. + +=> https://codeberg.org/snonux/totalrecall View on Codeberg +=> https://github.com/snonux/totalrecall View on GitHub + +--- + +### 8. gitsyncer * π» Languages: Go (92.2%), Shell (7.4%), JSON (0.4%) * π Documentation: Markdown (100.0%) -* π Commits: 114 +* π Commits: 116 * π Lines of Code: 10075 * π Lines of Documentation: 2432 * π
Development Period: 2025-06-23 to 2025-12-31 -* π Score: 25.8 (combines code size and activity) +* π Score: 23.4 (combines code size and activity) * βοΈ License: BSD-2-Clause * π·οΈ Latest Release: v0.11.0 (2025-12-31) @@ -176,32 +204,6 @@ The implementation uses a git remotes approach: it clones from one organization, --- -### 8. totalrecall - -* π» Languages: Go (98.9%), Shell (0.5%), YAML (0.5%) -* π Documentation: Markdown (100.0%) -* π Commits: 88 -* π Lines of Code: 12003 -* π Lines of Documentation: 361 -* π
Development Period: 2025-07-14 to 2025-08-02 -* π Score: 23.8 (combines code size and activity) -* βοΈ License: MIT -* π·οΈ Latest Release: v0.7.5 (2025-08-02) - - -=> showcase/totalrecall/image-1.png totalrecall screenshot - -TotalRecall is a Go-based tool that generates comprehensive Anki flashcard materials for Bulgarian language learning. It creates high-quality audio pronunciations using OpenAI TTS (with 11 voice options), AI-generated contextual images via DALL-E, IPA phonetic transcriptions, and automatic Bulgarian-English translations. The tool supports both single-word and batch processing, making it efficient for building large vocabulary decks. It outputs Anki-compatible packages (APKG) with all media files bundled, ready for immediate import. - -=> showcase/totalrecall/image-2.png totalrecall screenshot - -The project offers both a keyboard-driven GUI for interactive use and a CLI for automation, built with Go using the Cobra framework for command handling. It leverages OpenAI's APIs for both audio synthesis and image generation, creating memorable visual contexts with random art styles to enhance retention. The architecture follows clean Go package structure with separate internal packages for audio, image, config, and Anki format generation, making it maintainable and extensible for future enhancements. - -=> https://codeberg.org/snonux/totalrecall View on Codeberg -=> https://github.com/snonux/totalrecall View on GitHub - ---- - ### 9. foostats * π» Languages: Perl (100.0%) @@ -210,7 +212,7 @@ The project offers both a keyboard-driven GUI for interactive use and a CLI for * π Lines of Code: 1902 * π Lines of Documentation: 423 * π
Development Period: 2023-01-02 to 2025-11-01 -* π Score: 23.3 (combines code size and activity) +* π Score: 21.0 (combines code size and activity) * βοΈ License: Custom License * π·οΈ Latest Release: v0.2.0 (2025-10-21) @@ -224,7 +226,31 @@ The implementation uses a modular Perl architecture with specialized components: --- -### 10. timr +### 10. gogios + +* π» Languages: Go (98.5%), JSON (0.9%), YAML (0.6%) +* π Documentation: Markdown (94.9%), Text (5.1%) +* π Commits: 101 +* π Lines of Code: 2921 +* π Lines of Documentation: 394 +* π
Development Period: 2023-04-17 to 2026-01-22 +* π Score: 19.1 (combines code size and activity) +* βοΈ License: Custom License +* π·οΈ Latest Release: v1.3.0 (2026-01-06) + + +=> showcase/gogios/image-1.png gogios screenshot + +Gogios is a minimalistic monitoring tool written in Go for small-scale infrastructure (e.g., personal servers and VMs). It executes standard Nagios/Icinga monitoring plugins via CRON jobs, tracks state changes in a JSON file, and sends email notifications through a local MTA only when check statuses change. Unlike full-featured monitoring solutions (Nagios, Icinga, Prometheus), Gogios deliberately avoids complexityβno databases, web UIs, clustering, or contact groupsβmaking it ideal for simple, self-hosted environments with limited monitoring needs. + +The architecture is straightforward: JSON configuration defines checks (plugin paths, arguments, timeouts, dependencies, retries), a state directory persists check results between runs, and concurrent execution with configurable limits keeps things efficient. Key features include check dependencies (skip HTTP checks if ping fails), retry logic, stale alert detection, re-notification schedules, and support for remote checks via NRPE. A basic high-availability setup is achievable by running Gogios on two servers with staggered CRON intervals, though this results in duplicate notifications when both servers are operationalβa deliberate trade-off for simplicity. + +=> https://codeberg.org/snonux/gogios View on Codeberg +=> https://github.com/snonux/gogios View on GitHub + +--- + +### 11. timr * π» Languages: Go (96.0%), Shell (4.0%) * π Documentation: Markdown (100.0%) @@ -232,7 +258,7 @@ The implementation uses a modular Perl architecture with specialized components: * π Lines of Code: 1538 * π Lines of Documentation: 99 * π
Development Period: 2025-06-25 to 2026-01-02 -* π Score: 20.7 (combines code size and activity) +* π Score: 18.7 (combines code size and activity) * βοΈ License: MIT * π·οΈ Latest Release: v0.3.0 (2026-01-02) @@ -246,7 +272,7 @@ The architecture is straightforward: it's a Go-based CLI application that persis --- -### 11. tasksamurai +### 12. tasksamurai * π» Languages: Go (99.8%), YAML (0.2%) * π Documentation: Markdown (100.0%) @@ -254,7 +280,7 @@ The architecture is straightforward: it's a Go-based CLI application that persis * π Lines of Code: 6168 * π Lines of Documentation: 164 * π
Development Period: 2025-06-19 to 2025-11-02 -* π Score: 19.8 (combines code size and activity) +* π Score: 18.3 (combines code size and activity) * βοΈ License: BSD-2-Clause * π·οΈ Latest Release: v0.9.3 (2025-10-05) @@ -272,7 +298,7 @@ Under the hood, Task Samurai acts as a front-end wrapper that invokes the native --- -### 12. ior +### 13. ior * π» Languages: Go (50.4%), C (43.1%), Raku (4.5%), Make (1.1%), C/C++ (1.0%) * π Documentation: Text (69.7%), Markdown (30.3%) @@ -280,7 +306,7 @@ Under the hood, Task Samurai acts as a front-end wrapper that invokes the native * π Lines of Code: 13072 * π Lines of Documentation: 680 * π
Development Period: 2024-01-18 to 2025-10-09 -* π Score: 19.6 (combines code size and activity) +* π Score: 18.3 (combines code size and activity) * βοΈ License: No license found * π§ͺ Status: Experimental (no releases yet) @@ -298,15 +324,15 @@ The tool is implemented in Go and C, leveraging libbpfgo for BPF interaction. It --- -### 13. dtail +### 14. dtail * π» 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: 1046 +* π Commits: 1050 * π Lines of Code: 20091 * π Lines of Documentation: 5674 * π
Development Period: 2020-01-09 to 2025-06-20 -* π Score: 18.2 (combines code size and activity) +* π Score: 17.0 (combines code size and activity) * βοΈ License: Apache-2.0 * π·οΈ Latest Release: v4.3.3 (2024-08-23) @@ -324,7 +350,7 @@ The architecture follows a client-server model where DTail servers run on target --- -### 14. gos +### 15. gos * π» Languages: Go (99.8%), JSON (0.2%) * π Documentation: Markdown (100.0%) @@ -332,7 +358,7 @@ The architecture follows a client-server model where DTail servers run on target * π Lines of Code: 4102 * π Lines of Documentation: 357 * π
Development Period: 2024-05-04 to 2025-12-27 -* π Score: 17.7 (combines code size and activity) +* π Score: 16.4 (combines code size and activity) * βοΈ License: Custom License * π·οΈ Latest Release: v1.2.2 (2025-12-27) @@ -350,7 +376,7 @@ The implementation uses OAuth2 for LinkedIn authentication, stores configuration --- -### 15. ds-sim +### 16. ds-sim * π» Languages: Java (98.9%), Shell (0.6%), CSS (0.5%) * π Documentation: Markdown (98.7%), Text (1.3%) @@ -358,7 +384,7 @@ The implementation uses OAuth2 for LinkedIn authentication, stores configuration * π Lines of Code: 25762 * π Lines of Documentation: 3101 * π
Development Period: 2008-05-15 to 2025-06-27 -* π Score: 16.4 (combines code size and activity) +* π Score: 15.5 (combines code size and activity) * βοΈ License: Custom License * π§ͺ Status: Experimental (no releases yet) @@ -374,14 +400,14 @@ The implementation follows a modular Java architecture with clear separation bet --- -### 16. gemtexter +### 17. gemtexter -* π» Languages: Shell (68.2%), CSS (28.5%), Config (1.9%), HTML (1.3%) -* π Documentation: Text (76.1%), Markdown (23.9%) +* π» Languages: CSS (55.3%), Python (16.1%), HTML (15.3%), JSON (6.6%), Shell (5.3%), Config (1.5%) +* π Documentation: Text (70.2%), Markdown (29.8%) * π Commits: 472 -* π Lines of Code: 2288 -* π Lines of Documentation: 1180 -* π
Development Period: 2021-05-21 to 2025-12-31 +* π Lines of Code: 30319 +* π Lines of Documentation: 1280 +* π
Development Period: 2021-05-21 to 2025-06-22 * π Score: 11.1 (combines code size and activity) * βοΈ License: GPL-3.0 * π·οΈ Latest Release: 3.0.0 (2024-10-01) @@ -396,15 +422,15 @@ The architecture leverages GNU utilities (sed, grep, date) and optional tools li --- -### 17. wireguardmeshgenerator +### 18. wireguardmeshgenerator -* π» Languages: Ruby (73.5%), YAML (26.5%) +* π» Languages: Ruby (65.4%), YAML (34.6%) * π Documentation: Markdown (100.0%) -* π Commits: 33 -* π Lines of Code: 396 +* π Commits: 36 +* π Lines of Code: 563 * π Lines of Documentation: 24 -* π
Development Period: 2025-04-18 to 2025-05-11 -* π Score: 10.2 (combines code size and activity) +* π
Development Period: 2025-04-18 to 2026-01-20 +* π Score: 11.0 (combines code size and activity) * βοΈ License: Custom License * π·οΈ Latest Release: v1.0.0 (2025-05-11) @@ -418,7 +444,7 @@ The tool reads host definitions from a YAML file specifying network interfaces ( --- -### 18. rcm +### 19. rcm * π» Languages: Ruby (99.8%), TOML (0.2%) * π Documentation: Markdown (100.0%) @@ -426,7 +452,7 @@ The tool reads host definitions from a YAML file specifying network interfaces ( * π Lines of Code: 1377 * π Lines of Documentation: 113 * π
Development Period: 2024-12-05 to 2025-11-26 -* π Score: 9.9 (combines code size and activity) +* π Score: 9.5 (combines code size and activity) * βοΈ License: Custom License * π§ͺ Status: Experimental (no releases yet) @@ -440,31 +466,29 @@ The implementation centers around a DSL module that provides keywords like `file --- -### 19. gogios +### 20. terraform -* π» Languages: Go (98.0%), JSON (1.2%), YAML (0.9%) +* π» Languages: HCL (96.6%), Make (1.9%), YAML (1.5%) * π Documentation: Markdown (100.0%) -* π Commits: 85 -* π Lines of Code: 2063 -* π Lines of Documentation: 211 -* π
Development Period: 2023-04-17 to 2026-01-06 -* π Score: 6.3 (combines code size and activity) -* βοΈ License: Custom License -* π·οΈ Latest Release: v1.3.0 (2026-01-06) - +* π Commits: 125 +* π Lines of Code: 2851 +* π Lines of Documentation: 52 +* π
Development Period: 2023-08-27 to 2025-08-08 +* π Score: 5.1 (combines code size and activity) +* βοΈ License: MIT +* π§ͺ Status: Experimental (no releases yet) -=> showcase/gogios/image-1.png gogios screenshot -Gogios is a minimalistic monitoring tool written in Go for small-scale infrastructure (e.g., personal servers and VMs). It executes standard Nagios/Icinga monitoring plugins via CRON jobs, tracks state changes in a JSON file, and sends email notifications through a local MTA only when check statuses change. Unlike full-featured monitoring solutions (Nagios, Icinga, Prometheus), Gogios deliberately avoids complexityβno databases, web UIs, clustering, or contact groupsβmaking it ideal for simple, self-hosted environments with limited monitoring needs. +This is a **Terraform-based AWS infrastructure project** that automates the deployment of a multi-service, self-hosted application platform. It orchestrates containerized services (Nextcloud, Vaultwarden, Wallabag, Anki Sync Server, Audiobookshelf) on AWS ECS/Fargate with shared persistent storage via EFS, load balancing, and proper network isolation. The setup includes automated TLS certificate management, DNS configuration, and a bastion host for administrative access. -The architecture is straightforward: JSON configuration defines checks (plugin paths, arguments, timeouts, dependencies, retries), a state directory persists check results between runs, and concurrent execution with configurable limits keeps things efficient. Key features include check dependencies (skip HTTP checks if ping fails), retry logic, stale alert detection, re-notification schedules, and support for remote checks via NRPE. A basic high-availability setup is achievable by running Gogios on two servers with staggered CRON intervals, though this results in duplicate notifications when both servers are operationalβa deliberate trade-off for simplicity. +The infrastructure uses a **modular, layered architecture** with separate Terraform modules for foundational resources (`org-buetow-base` for VPC/networking), compute layers (`org-buetow-ecs`, `org-buetow-eks`), load balancing (`org-buetow-elb`), storage (`s3-*`), and management (`org-buetow-bastion`). This approach allows incremental deployment and clear separation of concerns, making it useful for anyone wanting to host multiple personal/team services on AWS with infrastructure-as-code practices while maintaining security, scalability, and automated backups. -=> https://codeberg.org/snonux/gogios View on Codeberg -=> https://github.com/snonux/gogios View on GitHub +=> https://codeberg.org/snonux/terraform View on Codeberg +=> https://github.com/snonux/terraform View on GitHub --- -### 20. sillybench +### 21. sillybench * π» Languages: Go (90.9%), Shell (9.1%) * π Documentation: Markdown (100.0%) @@ -472,7 +496,7 @@ The architecture is straightforward: JSON configuration defines checks (plugin p * π Lines of Code: 33 * π Lines of Documentation: 3 * π
Development Period: 2025-04-03 to 2025-04-03 -* π Score: 5.4 (combines code size and activity) +* π Score: 5.1 (combines code size and activity) * βοΈ License: No license found * π§ͺ Status: Experimental (no releases yet) @@ -486,28 +510,6 @@ The implementation is intentionally straightforward, using Go's built-in testing --- -### 21. terraform - -* π» Languages: HCL (96.6%), Make (1.9%), YAML (1.5%) -* π Documentation: Markdown (100.0%) -* π Commits: 125 -* π Lines of Code: 2851 -* π Lines of Documentation: 52 -* π
Development Period: 2023-08-27 to 2025-08-08 -* π Score: 5.2 (combines code size and activity) -* βοΈ License: MIT -* π§ͺ Status: Experimental (no releases yet) - - -This is a **Terraform-based AWS infrastructure project** that automates the deployment of a multi-service, self-hosted application platform. It orchestrates containerized services (Nextcloud, Vaultwarden, Wallabag, Anki Sync Server, Audiobookshelf) on AWS ECS/Fargate with shared persistent storage via EFS, load balancing, and proper network isolation. The setup includes automated TLS certificate management, DNS configuration, and a bastion host for administrative access. - -The infrastructure uses a **modular, layered architecture** with separate Terraform modules for foundational resources (`org-buetow-base` for VPC/networking), compute layers (`org-buetow-ecs`, `org-buetow-eks`), load balancing (`org-buetow-elb`), storage (`s3-*`), and management (`org-buetow-bastion`). This approach allows incremental deployment and clear separation of concerns, making it useful for anyone wanting to host multiple personal/team services on AWS with infrastructure-as-code practices while maintaining security, scalability, and automated backups. - -=> https://codeberg.org/snonux/terraform View on Codeberg -=> https://github.com/snonux/terraform View on GitHub - ---- - ### 22. quicklogger * π» Languages: Go (96.1%), XML (1.9%), Shell (1.2%), TOML (0.7%) @@ -516,7 +518,7 @@ The infrastructure uses a **modular, layered architecture** with separate Terraf * π Lines of Code: 1133 * π Lines of Documentation: 78 * π
Development Period: 2024-01-20 to 2025-09-13 -* π Score: 5.2 (combines code size and activity) +* π Score: 5.1 (combines code size and activity) * βοΈ License: MIT * π·οΈ Latest Release: v0.0.4 (2025-09-13) @@ -542,7 +544,7 @@ The implementation leverages Go's cross-compilation capabilities and Fyne's UI a * π Lines of Code: 1525 * π Lines of Documentation: 15 * π
Development Period: 2023-04-17 to 2023-11-19 -* π Score: 3.6 (combines code size and activity) +* π Score: 3.5 (combines code size and activity) * βοΈ License: Custom License * π§ͺ Status: Experimental (no releases yet) @@ -565,7 +567,7 @@ The architecture consists of client/server components for inter-node communicati * π Lines of Code: 312 * π Lines of Documentation: 416 * π
Development Period: 2013-03-22 to 2025-05-18 -* π Score: 2.7 (combines code size and activity) +* π Score: 2.6 (combines code size and activity) * βοΈ License: No license found * π·οΈ Latest Release: v1.0.0 (2023-04-29) @@ -587,7 +589,7 @@ The implementation uses an object-oriented architecture with specialized classes * π Lines of Code: 40 * π Lines of Documentation: 3 * π
Development Period: 2023-12-31 to 2025-08-11 -* π Score: 2.6 (combines code size and activity) +* π Score: 2.5 (combines code size and activity) * βοΈ License: No license found * π§ͺ Status: Experimental (no releases yet) @@ -669,30 +671,7 @@ The implementation is a straightforward bash script using `qpdf` for PDF extract --- -### 29. 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 -* π Score: 1.7 (combines code size and activity) -* βοΈ 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-based static site generator specifically designed for creating web photo albums on Unix-like systems. It transforms a directory of photos into a pure HTML+CSS website without any JavaScript, making it lightweight, fast, and accessible. The tool uses ImageMagick's `convert` utility for image processing and employs Bash-HTML template files that users can customize to match their preferences. - -The architecture is straightforward and Unix-philosophy driven: users configure a source directory containing photos via an `photoalbumrc` configuration file, run the generation command, and receive a fully static `./dist` directory ready for deployment to any web server. This approach is useful for users who want a simple, dependency-light solution for sharing photo collections online without the overhead of dynamic web applications, databases, or JavaScript frameworksβjust clean, static HTML that works everywhere. - -=> https://codeberg.org/snonux/photoalbum View on Codeberg -=> https://github.com/snonux/photoalbum View on GitHub - ---- - -### 30. ioriot +### 29. ioriot * π» Languages: C (55.5%), C/C++ (24.0%), Config (19.6%), Make (1.0%) * π Documentation: Markdown (100.0%) @@ -700,7 +679,7 @@ The architecture is straightforward and Unix-philosophy driven: users configure * π Lines of Code: 12420 * π Lines of Documentation: 610 * π
Development Period: 2018-03-01 to 2020-01-22 -* π Score: 1.6 (combines code size and activity) +* π Score: 1.5 (combines code size and activity) * βοΈ License: Apache-2.0 * π·οΈ Latest Release: 0.5.1 (2019-01-04) @@ -717,7 +696,7 @@ The key advantage over traditional benchmarking tools is that it reproduces actu --- -### 31. sway-autorotate +### 30. sway-autorotate * π» Languages: Shell (100.0%) * π Documentation: Markdown (100.0%) @@ -739,7 +718,7 @@ The implementation uses a bash script that continuously monitors the `monitor-se --- -### 32. mon +### 31. mon * π» Languages: Perl (96.5%), Shell (1.8%), Make (1.2%), Config (0.4%) * π Documentation: Text (100.0%) @@ -762,7 +741,7 @@ Implemented in Perl, `mon` features automatic JSON backup before modifications ( --- -### 33. staticfarm-apache-handlers +### 32. staticfarm-apache-handlers * π» Languages: Perl (96.4%), Make (3.6%) * π Documentation: Text (100.0%) @@ -785,7 +764,7 @@ Both handlers are implemented as Perl modules using Apache2's mod_perl API, conf --- -### 34. pingdomfetch +### 33. pingdomfetch * π» Languages: Perl (97.3%), Make (2.7%) * π Documentation: Text (100.0%) @@ -808,30 +787,7 @@ The tool is implemented around a hierarchical configuration system (`/etc/pingdo --- -### 35. ychat - -* π» Languages: C++ (54.9%), C/C++ (23.0%), Shell (13.8%), Perl (2.5%), HTML (2.5%), Config (2.3%), Make (0.8%), CSS (0.2%) -* π Documentation: Text (100.0%) -* π Commits: 67 -* π Lines of Code: 67884 -* π Lines of Documentation: 127 -* π
Development Period: 2008-05-15 to 2014-06-30 -* π Score: 0.9 (combines code size and activity) -* βοΈ License: GPL-2.0 -* π·οΈ Latest Release: yhttpd-0.7.2 (2013-04-06) - -β οΈ **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. - -yChat is a high-performance, web-based chat server written in C++ that allows users to connect through standard web browsers without requiring special client software. It functions as a standalone HTTP server on a customizable port (default 2000), eliminating the need for Apache or other web servers, and uses only HTML, CSS, and JavaScript on the client side. The project was developed under the GNU GPL and designed for portability across POSIX-compliant systems including Linux, FreeBSD, and other UNIX variants. - -The architecture emphasizes speed and scalability through several key design choices: multi-threaded POSIX implementation with thread pooling to efficiently handle concurrent users, hash maps for O(1) data lookups, and a smart garbage collection system that caches inactive user and room objects for quick reuse. It features MySQL database support for registered users, a modular plugin system through dynamically loadable modules, HTML template-based customization, XML configuration, and an ncurses-based administration interface with CLI support. The codebase can also be converted to yhttpd, a standalone web server subset. Performance benchmarks show it handling over 1000 requests/second while using minimal CPU resources, with the system supporting comprehensive logging, multi-language support, and Apache-compatible log formats. - -=> https://codeberg.org/snonux/ychat View on Codeberg -=> https://github.com/snonux/ychat View on GitHub - ---- - -### 36. xerl +### 34. xerl * π» Languages: Perl (98.3%), Config (1.2%), Make (0.5%) * π Commits: 670 @@ -852,47 +808,92 @@ The implementation follows strict OO Perl conventions with explicit typing and p --- -### 37. perl-c-fibonacci +### 35. fapi -* π» Languages: C (80.4%), Make (19.6%) +* π» Languages: Python (96.6%), Make (3.1%), Config (0.3%) +* π Documentation: Text (98.3%), Markdown (1.7%) +* π Commits: 221 +* π Lines of Code: 1681 +* π Lines of Documentation: 539 +* π
Development Period: 2014-03-10 to 2026-01-10 +* π Score: 0.8 (combines code size and activity) +* βοΈ License: No license found +* π·οΈ Latest Release: 1.0.2 (2014-11-17) + + +fapi is a command-line tool for managing F5 BigIP load balancers through the iControl API. It provides a simple, human-friendly interface for common load balancer operations including managing nodes, pools, virtual servers, monitors, and network components like VLANs and self IPs. The tool supports various deployment patterns including nPath services, NAT/SNAT configurations, and SSL offloading, while offering intelligent features like automatic FQDN-to-IP resolution and flexible naming conventions. + +The tool is implemented in Python and depends on the bigsuds library (F5's iControl wrapper) to communicate with the F5 API. It's designed as a lightweight alternative to the web GUI or raw API calls, with a straightforward command syntax (e.g., `fapi pool foopool create`, `fapi vserver example.com:80 set pool foopool`) that makes common tasks quick and scriptable. The project is open source and hosted on Codeberg, originally developed as a personal project for Debian-based systems. + +=> https://codeberg.org/snonux/fapi View on Codeberg +=> https://github.com/snonux/fapi View on GitHub + +--- + +### 36. photoalbum + +* π» Languages: Shell (78.1%), Make (13.5%), Config (8.4%) * π Documentation: Text (100.0%) -* π Commits: 4 -* π Lines of Code: 51 -* π Lines of Documentation: 69 -* π
Development Period: 2014-03-24 to 2022-04-23 +* π Commits: 153 +* π Lines of Code: 311 +* π Lines of Documentation: 45 +* π
Development Period: 2011-11-19 to 2022-02-20 * π Score: 0.8 (combines code size and activity) * βοΈ License: No license found -* π§ͺ Status: Experimental (no releases yet) +* π·οΈ 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. -perl-c-fibonacci: source code repository. +**photoalbum** is a minimal Bash-based static site generator specifically designed for creating web photo albums on Unix-like systems. It transforms a directory of photos into a pure HTML+CSS website without any JavaScript, making it lightweight, fast, and accessible. The tool uses ImageMagick's `convert` utility for image processing and employs Bash-HTML template files that users can customize to match their preferences. -=> https://codeberg.org/snonux/perl-c-fibonacci View on Codeberg -=> https://github.com/snonux/perl-c-fibonacci View on GitHub +The architecture is straightforward and Unix-philosophy driven: users configure a source directory containing photos via an `photoalbumrc` configuration file, run the generation command, and receive a fully static `./dist` directory ready for deployment to any web server. This approach is useful for users who want a simple, dependency-light solution for sharing photo collections online without the overhead of dynamic web applications, databases, or JavaScript frameworksβjust clean, static HTML that works everywhere. + +=> https://codeberg.org/snonux/photoalbum View on Codeberg +=> https://github.com/snonux/photoalbum View on GitHub --- -### 38. fapi +### 37. ychat -* π» Languages: Python (96.6%), Make (3.1%), Config (0.3%) -* π Documentation: Text (98.3%), Markdown (1.7%) -* π Commits: 219 -* π Lines of Code: 1681 -* π Lines of Documentation: 539 -* π
Development Period: 2014-03-10 to 2021-11-03 +* π» Languages: C++ (48.9%), Shell (22.7%), C/C++ (20.7%), Perl (2.5%), HTML (2.1%), Config (1.9%), Make (0.9%), CSS (0.2%) +* π Documentation: Text (100.0%) +* π Commits: 67 +* π Lines of Code: 45956 +* π Lines of Documentation: 101 +* π
Development Period: 2008-05-15 to 2014-06-30 * π Score: 0.8 (combines code size and activity) -* βοΈ License: No license found -* π·οΈ Latest Release: 1.0.2 (2014-11-17) +* βοΈ License: GPL-2.0 +* π·οΈ Latest Release: yhttpd-0.7.2 (2013-04-06) β οΈ **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. -fapi is a command-line tool for managing F5 BigIP load balancers through the iControl API. It provides a simple, human-friendly interface for common load balancer operations including managing nodes, pools, virtual servers, monitors, and network components like VLANs and self IPs. The tool supports various deployment patterns including nPath services, NAT/SNAT configurations, and SSL offloading, while offering intelligent features like automatic FQDN-to-IP resolution and flexible naming conventions. +yChat is a high-performance, web-based chat server written in C++ that allows users to connect through standard web browsers without requiring special client software. It functions as a standalone HTTP server on a customizable port (default 2000), eliminating the need for Apache or other web servers, and uses only HTML, CSS, and JavaScript on the client side. The project was developed under the GNU GPL and designed for portability across POSIX-compliant systems including Linux, FreeBSD, and other UNIX variants. -The tool is implemented in Python and depends on the bigsuds library (F5's iControl wrapper) to communicate with the F5 API. It's designed as a lightweight alternative to the web GUI or raw API calls, with a straightforward command syntax (e.g., `fapi pool foopool create`, `fapi vserver example.com:80 set pool foopool`) that makes common tasks quick and scriptable. The project is open source and hosted on Codeberg, originally developed as a personal project for Debian-based systems. +The architecture emphasizes speed and scalability through several key design choices: multi-threaded POSIX implementation with thread pooling to efficiently handle concurrent users, hash maps for O(1) data lookups, and a smart garbage collection system that caches inactive user and room objects for quick reuse. It features MySQL database support for registered users, a modular plugin system through dynamically loadable modules, HTML template-based customization, XML configuration, and an ncurses-based administration interface with CLI support. The codebase can also be converted to yhttpd, a standalone web server subset. Performance benchmarks show it handling over 1000 requests/second while using minimal CPU resources, with the system supporting comprehensive logging, multi-language support, and Apache-compatible log formats. -=> https://codeberg.org/snonux/fapi View on Codeberg -=> https://github.com/snonux/fapi View on GitHub +=> https://codeberg.org/snonux/ychat View on Codeberg +=> https://github.com/snonux/ychat View on GitHub + +--- + +### 38. perl-c-fibonacci + +* π» Languages: C (80.4%), Make (19.6%) +* π Documentation: Text (100.0%) +* π Commits: 4 +* π Lines of Code: 51 +* π Lines of Documentation: 69 +* π
Development Period: 2014-03-24 to 2022-04-23 +* π Score: 0.8 (combines code size and activity) +* βοΈ 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. + +perl-c-fibonacci: source code repository. + +=> https://codeberg.org/snonux/perl-c-fibonacci View on Codeberg +=> https://github.com/snonux/perl-c-fibonacci View on GitHub --- @@ -967,28 +968,26 @@ The implementation uses a concurrent architecture with goroutines for data colle --- -### 42. vs-sim +### 42. fype -* π» Languages: Java (98.8%), Shell (0.7%), XML (0.4%) -* π Documentation: LaTeX (98.4%), Text (1.4%), Markdown (0.2%) -* π Commits: 411 -* π Lines of Code: 16303 -* π Lines of Documentation: 2903 -* π
Development Period: 2008-05-15 to 2021-05-01 +* π» Languages: C (71.1%), C/C++ (20.7%), HTML (6.6%), Make (1.5%) +* π Documentation: Text (69.5%), LaTeX (30.5%) +* π Commits: 99 +* π Lines of Code: 8952 +* π Lines of Documentation: 1867 +* π
Development Period: 2008-05-15 to 2021-11-03 * π Score: 0.7 (combines code size and activity) * βοΈ License: Custom License -* π·οΈ Latest Release: v1.0 (2008-08-24) +* π§ͺ 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. -=> showcase/vs-sim/image-1.jpg vs-sim screenshot - -VS-Sim is a Java-based open source simulator for distributed systems, designed to help students and researchers visualize and understand distributed computing concepts. Based on the roadmap, it appears to support simulating various distributed systems protocols including Lamport and vector clocks for logical time management, and potentially distributed file systems like NFS and AFS. The simulator features event-based simulation, logging capabilities, and a plugin architecture. +Fype is a 32-bit scripting language designed as a fun, AWK-inspired alternative with a simpler syntax. It supports variables with automatic type conversion, functions, loops, control structures, and built-in operations for math, I/O, and system calls. A notable feature is its support for "synonyms" (references/aliases to variables and functions), along with both procedures (using the caller's namespace) and functions (with lexical scoping). The language uses a straightforward syntax with single-character comments (#) and statement-based execution terminated by semicolons. -The project appears to be currently inactive, with the repository containing minimal source code at present. It was originally developed as part of academic work (referenced as "diplomarbeit.pdf" in the roadmap), likely for teaching distributed systems concepts through interactive simulation and protocol visualization. +The implementation uses a simple top-down parser with maximum lookahead of 1, interpreting code simultaneously as it parses, which means syntax errors are only caught at runtime. Written in C and compiled with GCC, it's designed for BSD systems (tested on FreeBSD 7.0) and uses NetBSD Make for building. The project is still unreleased and incomplete, but aims to eventually match AWK's capabilities while potentially adding modern features like function pointers and closures, though explicitly avoiding complexity like OOP, Unicode, or threading. -=> https://codeberg.org/snonux/vs-sim View on Codeberg -=> https://github.com/snonux/vs-sim View on GitHub +=> https://codeberg.org/snonux/fype View on Codeberg +=> https://github.com/snonux/fype View on GitHub --- @@ -1015,30 +1014,7 @@ The tool is implemented as a lightweight Ruby script that prioritizes simplicity --- -### 44. fype - -* π» Languages: C (71.3%), C/C++ (20.6%), HTML (6.6%), Make (1.5%) -* π Documentation: Text (60.2%), LaTeX (39.8%) -* π Commits: 99 -* π Lines of Code: 8906 -* π Lines of Documentation: 1431 -* π
Development Period: 2008-05-15 to 2021-04-29 -* π Score: 0.7 (combines code size and activity) -* βοΈ License: Custom License -* π§ͺ 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. - -Fype is a 32-bit scripting language designed as a fun, AWK-inspired alternative with a simpler syntax. It supports variables with automatic type conversion, functions, loops, control structures, and built-in operations for math, I/O, and system calls. A notable feature is its support for "synonyms" (references/aliases to variables and functions), along with both procedures (using the caller's namespace) and functions (with lexical scoping). The language uses a straightforward syntax with single-character comments (#) and statement-based execution terminated by semicolons. - -The implementation uses a simple top-down parser with maximum lookahead of 1, interpreting code simultaneously as it parses, which means syntax errors are only caught at runtime. Written in C and compiled with GCC, it's designed for BSD systems (tested on FreeBSD 7.0) and uses NetBSD Make for building. The project is still unreleased and incomplete, but aims to eventually match AWK's capabilities while potentially adding modern features like function pointers and closures, though explicitly avoiding complexity like OOP, Unicode, or threading. - -=> https://codeberg.org/snonux/fype View on Codeberg -=> https://github.com/snonux/fype View on GitHub - ---- - -### 45. pwgrep +### 44. pwgrep * π» Languages: Shell (85.0%), Make (15.0%) * π Documentation: Text (80.8%), Markdown (19.2%) @@ -1061,7 +1037,7 @@ The architecture is lightweight and Unix-philosophy driven: password databases a --- -### 46. perldaemon +### 45. perldaemon * π» Languages: Perl (72.3%), Shell (23.8%), Config (3.9%) * π Commits: 110 @@ -1082,7 +1058,7 @@ The implementation centers around an event loop with configurable intervals that --- -### 47. jsmstrade +### 46. jsmstrade * π» Languages: Java (76.0%), Shell (15.4%), XML (8.6%) * π Documentation: Markdown (100.0%) @@ -1107,7 +1083,7 @@ The implementation is minimalistic, consisting of just three main Java classes ( --- -### 48. japi +### 47. japi * π» Languages: Perl (78.3%), Make (21.7%) * π Documentation: Text (100.0%) @@ -1130,7 +1106,7 @@ Implemented in Perl using the JIRA::REST CPAN module, japi supports flexible con --- -### 49. perl-poetry +### 48. perl-poetry * π» Languages: Perl (100.0%) * π Documentation: Markdown (100.0%) @@ -1153,7 +1129,7 @@ This project exemplifies creative coding where Perl keywords and constructs are --- -### 50. muttdelay +### 49. muttdelay * π» Languages: Make (47.1%), Shell (46.3%), Vim Script (5.9%), Config (0.7%) * π Documentation: Text (100.0%) @@ -1176,7 +1152,7 @@ The architecture uses three components working together: a Vim plugin that provi --- -### 51. netdiff +### 50. netdiff * π» Languages: Shell (52.2%), Make (46.3%), Config (1.5%) * π Documentation: Text (100.0%) @@ -1199,7 +1175,7 @@ The tool uses a clever client-server architecture where you run the identical co --- -### 52. debroid +### 51. debroid * π» Languages: Shell (92.0%), Make (8.0%) * π Documentation: Markdown (100.0%) @@ -1224,7 +1200,7 @@ The implementation uses a two-stage debootstrap process: first creating a Debian --- -### 53. hsbot +### 52. hsbot * π» Languages: Haskell (98.5%), Make (1.5%) * π Commits: 80 @@ -1245,7 +1221,7 @@ The implementation uses a modular design with core components separated into Bas --- -### 54. cpuinfo +### 53. cpuinfo * π» Languages: Shell (53.2%), Make (46.8%) * π Documentation: Text (100.0%) @@ -1268,7 +1244,7 @@ The implementation is elegantly simple: a single shell script ([src/cpuinfo](fil --- -### 55. template +### 54. template * π» Languages: Make (89.2%), Shell (10.8%) * π Documentation: Text (100.0%) @@ -1291,7 +1267,7 @@ The implementation uses a **Makefile-based build system** with targets for compi --- -### 56. ipv6test +### 55. ipv6test * π» Languages: Perl (100.0%) * π Commits: 7 @@ -1312,7 +1288,7 @@ The implementation uses a simple CGI script ([index.pl](file:///home/paul/git/gi --- -### 57. awksite +### 56. awksite * π» Languages: AWK (72.1%), HTML (16.4%), Config (11.5%) * π Documentation: Text (60.0%), Markdown (40.0%) @@ -1335,7 +1311,7 @@ The architecture is remarkably simple: a single AWK script ([index.cgi](file:/// --- -### 58. dyndns +### 57. dyndns * π» Languages: Shell (100.0%) * π Documentation: Text (100.0%) @@ -1355,3 +1331,45 @@ The implementation uses a two-tier security architecture: SSH public key authent => https://codeberg.org/snonux/dyndns View on Codeberg => https://github.com/snonux/dyndns View on GitHub + +--- + +### 58. vs-sim + +* π Documentation: Markdown (100.0%) +* π Commits: 411 +* π Lines of Code: 0 +* π Lines of Documentation: 7 +* π
Development Period: 2008-05-15 to 2015-05-23 +* π Score: 0.0 (combines code size and activity) +* βοΈ License: No license found +* π·οΈ Latest Release: v1.0 (2008-08-24) + +β οΈ **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. + +VS-Sim is a Java-based open source simulator for distributed systems, designed to help students and researchers visualize and understand distributed computing concepts. Based on the roadmap, it appears to support simulating various distributed systems protocols including Lamport and vector clocks for logical time management, and potentially distributed file systems like NFS and AFS. The simulator features event-based simulation, logging capabilities, and a plugin architecture. + +The project appears to be currently inactive, with the repository containing minimal source code at present. It was originally developed as part of academic work (referenced as "diplomarbeit.pdf" in the roadmap), likely for teaching distributed systems concepts through interactive simulation and protocol visualization. + +=> https://codeberg.org/snonux/vs-sim View on Codeberg +=> https://github.com/snonux/vs-sim View on GitHub + +--- + +### 59. foo.zone + +* π Documentation: Markdown (100.0%) +* π Commits: 3408 +* π Lines of Code: 0 +* π Lines of Documentation: 23 +* π
Development Period: 2021-05-21 to 2022-04-02 +* π Score: 0.0 (combines code size and activity) +* βοΈ 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. + +foo.zone: source code repository. + +=> https://codeberg.org/snonux/foo.zone View on Codeberg +=> https://github.com/snonux/foo.zone View on GitHub diff --git a/about/showcase/debroid/image-1.png b/about/showcase/debroid/image-1.png index a922de9f..98cbc5b6 100644 --- a/about/showcase/debroid/image-1.png +++ b/about/showcase/debroid/image-1.png @@ -46,44 +46,46 @@ <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-c37d781e2da5.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-dc3bfaf4b78e.css" /> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-b22d9c324b1b.css" /> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-7b2c79a47cf5.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-14019852d837.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-6d0965b43add.css" /> - <script type="application/json" id="client-env">{"locale":"en","featureFlags":["a11y_status_checks_ruleset","actions_custom_images_public_preview_visibility","actions_custom_images_storage_billing_ui_visibility","actions_enable_snapshot_keyword","actions_image_version_event","allow_react_navs_in_turbo","alternate_user_config_repo","api_insights_show_missing_data_banner","arianotify_comprehensive_migration","arianotify_partial_migration","codespaces_prebuild_region_target_update","coding_agent_model_selection","contentful_lp_footnotes","copilot_3p_agent_hovercards","copilot_agent_cli_public_preview","copilot_agent_sessions_alive_updates","copilot_agent_task_list_v2","copilot_agent_tasks_btn_code_nav","copilot_agent_tasks_btn_code_view","copilot_agent_tasks_btn_code_view_lines","copilot_agent_tasks_btn_repo","copilot_api_agentic_issue_marshal_yaml","copilot_api_draft_issue_reference_with_project_id","copilot_api_github_draft_update_issue_skill","copilot_chat_agents_empty_state","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_coding_agent_task_response","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_raycast_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_generate_thread_name_async","copilot_immersive_job_result_preview","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_org_policy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_security_alert_assignee_options","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_public_access_to_user_owned_spaces","copilot_spaces_read_access_to_user_owned_spaces","copilot_spaces_report_abuse","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_spark_loading_webgl","copilot_stable_conversation_view","copilot_swe_agent_progress_commands","copilot_swe_agent_use_subagents","copilot_unconfigured_is_inherited","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","dom_node_counts","dotcom_chat_client_side_skills","enterprise_ai_controls","failbot_report_error_react_apps_on_page","fetch_graphql_improved_error_serialization","flex_cta_groups_mvp","global_nav_react_edit_status_dialog","global_nav_react_feature_preview","global_nav_react_teams_settings_page","global_nav_react_top_repos_api_caching","hyperspace_2025_logged_out_batch_1","initial_per_page_pagination_updates","issue_fields_global_search","issue_fields_report_usage","issue_fields_timeline_events","issues_cca_assign_actor_with_agent","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_client_side_caching_analytics","issues_react_prohibit_title_fallback","issues_react_use_turbo_for_cross_repo_navigation","issues_report_sidebar_interactions","lifecycle_label_name_updates","link_contact_sales_swp_marketo","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_grouped_by_edit_route","memex_mwl_filter_field_delimiter","mission_control_use_body_html","new_traffic_page_banner","open_agent_session_in_vscode_insiders","open_agent_session_in_vscode_stable","projects_assignee_max_limit","react_fetch_graphql_ignore_expected_errors","render_user_display_name","repo_traffic_job","repos_insights_remove_new_url","ruleset_deletion_confirmation","sample_network_conn_type","scheduled_reminders_updated_limits","site_calculator_actions_2025","site_features_copilot_universe","site_homepage_collaborate_video","site_homepage_contentful","site_homepage_eyebrow_banner","site_homepage_universe_animations","site_msbuild_webgl_hero","spark_prompt_secret_scanning","swe_agent_member_requests","viewscreen_sandbox","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"}</script> + <script type="application/json" id="client-env">{"locale":"en","featureFlags":["a11y_status_checks_ruleset","action_yml_language_service","actions_custom_images_public_preview_visibility","actions_custom_images_storage_billing_ui_visibility","actions_enable_snapshot_keyword","actions_image_version_event","actions_workflow_language_service","alternate_user_config_repo","api_insights_show_missing_data_banner","arianotify_comprehensive_migration","codespaces_prebuild_region_target_update","coding_agent_model_selection","contentful_lp_footnotes","copilot_3p_agent_hovercards","copilot_agent_cli_public_preview","copilot_agent_sessions_alive_updates","copilot_agent_task_list_v2","copilot_agent_tasks_btn_code_nav","copilot_agent_tasks_btn_code_view","copilot_agent_tasks_btn_code_view_lines","copilot_agent_tasks_btn_repo","copilot_api_agentic_issue_marshal_yaml","copilot_chat_agents_empty_state","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_coding_agent_task_response","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_raycast_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_generate_thread_name_async","copilot_immersive_job_result_preview","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_org_policy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_security_alert_assignee_options","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_public_access_to_user_owned_spaces","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_stable_conversation_view","copilot_swe_agent_progress_commands","copilot_swe_agent_use_subagents","copilot_unconfigured_is_inherited","custom_properties_split_properties_editing_page","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","dom_node_counts","enterprise_ai_controls","failbot_report_error_react_apps_on_page","flex_cta_groups_mvp","global_nav_react","global_nav_react_feature_preview","global_nav_react_teams_settings_page","hyperspace_2025_logged_out_batch_1","initial_per_page_pagination_updates","issue_fields_global_search","issue_fields_report_usage","issue_fields_timeline_events","issues_cache_operation_timeout","issues_cca_assign_actor_with_agent","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_preheating_dependency_issues","issues_preheating_issue_row","issues_preheating_memex","issues_preheating_parent_issue","issues_preheating_secondary","issues_preheating_sub_issues","issues_preheating_timeline_issues","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_client_side_caching_analytics","issues_react_client_side_caching_cb","issues_react_extended_preheat_analytics","issues_react_hot_cache","issues_react_prohibit_title_fallback","issues_react_safari_scroll_preservation","issues_react_turbo_cache_navigation","issues_react_use_turbo_for_cross_repo_navigation","issues_report_sidebar_interactions","lifecycle_label_name_updates","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_display_button_config_menu","memex_grouped_by_edit_route","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","mission_control_retry_on_401","mission_control_use_body_html","open_agent_session_in_vscode_insiders","open_agent_session_in_vscode_stable","primer_react_css_has_selector_perf","projects_assignee_max_limit","prs_conversations_react_split","pull_request_files_changed_opt_out_notice","pull_request_files_virtualization_containment","react_compiler_sso","react_quality_profiling","repos_insights_remove_new_url","ruleset_deletion_confirmation","sample_network_conn_type","site_calculator_actions_2025","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","swe_agent_member_requests","viewscreen_sandbox","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"}</script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/high-contrast-cookie-ff2c933fbe48.js"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-6b433bcc407d.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/913-ca2305638c53.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-d1388b999201.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/6488-de87864e6818.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/environment-fb75ae3199db.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/78298-e2b301acbc0e.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/82075-fd36cf520df4.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/environment-112a4ebf88e5.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/97068-2c8e697c6e8c.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/43784-4652ae97a661.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/4712-6fc930a63a4b.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/81028-5b8c5e07a4fa.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/74911-6a311b93ee8e.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/81028-4fa90b716172.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/74911-498f12492577.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/91853-448038d8f9ef.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/78143-31968346cf4c.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/87434-48bfcf328cc4.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-526e07998dd3.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-88f5a90e5bf0.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/78954-eeadcb8a29db.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-0fb6acf0f24b.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-44c4d3e56996.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/react-core-b53e33f6993e.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-b492ee0e2c35.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/react-core-8586c8dbbead.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/90780-1a0f3d593ff0.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/28546-ee41c9313871.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/17688-a9e16fb5ed13.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/2869-a4ba8f17edb3.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/15938-1bc2c363d5ed.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/70191-36bdeb9f5eb6.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/7332-5ea4ccf72018.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/3561-5983d983527e.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/24077-adc459723b71.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/51519-0c79d9af86e7.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/27376-4ba8ab45cab5.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/96384-750ef5263abe.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/66721-c03c0d8e4fbe.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/89708-97b7bb596019.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/51519-08058b4d6d41.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/2608-450177e3aea5.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/96384-94f4e11ad43a.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/19718-302da6273821.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-bd33b4bccad6.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/37911-4e7b34638358.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-d4747c5b0c07.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-054e9e1af0ce.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/37911-8ca53539e04e.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-09b60cb040de.js" defer="defer"></script> <title>Page not found Β· GitHub Β· GitHub</title> @@ -93,13 +95,13 @@ <meta name="route-pattern" content="/:user_id/:repository/blob/*name(/*path)" data-turbo-transient> <meta name="route-controller" content="blob" data-turbo-transient> <meta name="route-action" content="show" data-turbo-transient> - <meta name="fetch-nonce" content="v2:29cf13c1-e6c6-b28a-2ff0-696a48dd9f65"> + <meta name="fetch-nonce" content="v2:682a9268-d482-c6f9-a2d4-f51a1458f5ec"> <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb"> - <meta name="request-id" content="CC92:259C0E:4FB6C52:432292A:695FEDBA" data-pjax-transient="true"/><meta name="html-safe-nonce" content="1a8d9ca1b6271790ce2f1c4e92d2bb1acf2f788f3e99cd6f38e19cb8fb2dffef" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDQzkyOjI1OUMwRTo0RkI2QzUyOjQzMjI5MkE6Njk1RkVEQkEiLCJ2aXNpdG9yX2lkIjoiNTg4NzUyMzc3MjIxMjE3ODM2MiIsInJlZ2lvbl9lZGdlIjoiZnJhIiwicmVnaW9uX3JlbmRlciI6ImZyYSJ9" data-pjax-transient="true"/><meta name="visitor-hmac" content="953b94504937854dd9ceba4ee559a13b8c26fb99abc3f80d11ca2ebceb0dafbd" data-pjax-transient="true"/> + <meta name="request-id" content="C17E:F0E37:30DC596:25DC21D:6974BD94" data-pjax-transient="true"/><meta name="html-safe-nonce" content="2479b0b49461fef2f3ccfadb2fda78ee9d9aa533752de96d0c1c0ca3d48d1df9" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDMTdFOkYwRTM3OjMwREM1OTY6MjVEQzIxRDo2OTc0QkQ5NCIsInZpc2l0b3JfaWQiOiI3NDE1MjkxMjA2MTYzNTQ1NDkyIiwicmVnaW9uX2VkZ2UiOiJmcmEiLCJyZWdpb25fcmVuZGVyIjoiZnJhIn0=" data-pjax-transient="true"/><meta name="visitor-hmac" content="7dfd758df9970d28a0931799ccea909e11f19c319fa3d523a1c7c44356d4902b" data-pjax-transient="true"/> @@ -175,14 +177,14 @@ <meta name="expected-hostname" content="github.com"> - <meta http-equiv="x-pjax-version" content="6a001b80b6041f0eebdb89ae60d5900b119515734675721fa264b4a2d0751387" data-turbo-track="reload"> + <meta http-equiv="x-pjax-version" content="559ee17a41dae78c6af2867e7d68ac436884ec056145d7dbe9d241c3eb1b3c15" data-turbo-track="reload"> <meta http-equiv="x-pjax-csp-version" content="21a43568025709b66240454fc92d4f09335a96863f8ab1c46b4a07f6a5b67102" data-turbo-track="reload"> - <meta http-equiv="x-pjax-css-version" content="1629ebc0fb2e8697986ed25f7b1629323621a13719b92f13f56e1ac4fffad60c" data-turbo-track="reload"> - <meta http-equiv="x-pjax-js-version" content="1bd537a5a8c6433e0ad1fb6275b3b424409275afbc13f90d081a108d6a29fd0b" data-turbo-track="reload"> + <meta http-equiv="x-pjax-css-version" content="11db81fa29d9c0cc06e1edce1a65a9d290233af282800834cf371831e6dfea11" data-turbo-track="reload"> + <meta http-equiv="x-pjax-js-version" content="4a4bf5f4e28041a9d2e5c107d7d20b78b4294ba261cab243b28167c16a623a1f" data-turbo-track="reload"> <meta name="turbo-cache-control" content="no-preview" data-turbo-transient=""> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/site-a2f470d940d8.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/site-f5cc67eb9a08.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/error-4eb12c8f65b5.css" /> <meta name="is_logged_out_page" content="true"> <meta name="octolytics-page-type" content="marketing"> @@ -203,7 +205,7 @@ <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors"> - <meta name="release" content="65ce3d45d51e39c2ff9cfffc751f733edcb8c5c6"> + <meta name="release" content="488b30e96dfd057fbbe44c6665ccbc030b729dde"> <meta name="ui-target" content="full"> <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000"> @@ -232,14 +234,14 @@ <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span> </span> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.708873d0ee1f75685f85.module.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.272733bb6899c5359cf5.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.29aaeaafa90f007c6f61.module.css" /> <react-partial partial-name="keyboard-shortcuts-dialog" data-ssr="false" data-attempted-ssr="false" - data-react-profiling="false" + data-react-profiling="true" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script> @@ -257,7 +259,7 @@ <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/43862-5c4df3ba1119.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/85110-5c8beb884518.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/sessions-85a353edb2a3.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/sessions-dc7eea68d186.js" defer="defer"></script> <style> /* Override primer focus outline color for marketing header dropdown links for better contrast */ @@ -267,7 +269,7 @@ } </style> -<header class="HeaderMktg header-logged-out js-details-container js-header Details f4 py-3" role="banner" data-is-top="true" data-color-mode=light data-light-theme=light data-dark-theme=dark> +<header class="HeaderMktg header-logged-out js-details-container js-header Details f4 py-3" role="banner" data-is-top="true" data-color-mode=auto data-light-theme=light data-dark-theme=dark> <h2 class="sr-only">Navigation Menu</h2> <button type="button" class="HeaderMktg-backdrop d-lg-none border-0 position-fixed top-0 left-0 width-full height-full js-details-target" aria-label="Toggle navigation"> @@ -305,20 +307,20 @@ </a> <div class="AppHeader-appearanceSettings"> <react-partial-anchor> - <button data-target="react-partial-anchor.anchor" id="icon-button-d88b6b56-e056-4a49-a3e2-c2a819cc7e5b" aria-labelledby="tooltip-c88d835c-57e8-4f53-be11-44befca17458" type="button" disabled="disabled" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium AppHeader-button HeaderMenu-link border cursor-wait"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-sliders Button-visual"> + <button data-target="react-partial-anchor.anchor" id="icon-button-b4fdf5a2-72da-440f-83f4-3e97de0faca4" aria-labelledby="tooltip-6c82bc0a-49fa-460b-8d5d-cac9bff0aa16" type="button" disabled="disabled" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium AppHeader-button HeaderMenu-link border cursor-wait"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-sliders Button-visual"> <path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path> </svg> -</button><tool-tip id="tooltip-c88d835c-57e8-4f53-be11-44befca17458" for="icon-button-d88b6b56-e056-4a49-a3e2-c2a819cc7e5b" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Appearance settings</tool-tip> +</button><tool-tip id="tooltip-6c82bc0a-49fa-460b-8d5d-cac9bff0aa16" for="icon-button-b4fdf5a2-72da-440f-83f4-3e97de0faca4" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Appearance settings</tool-tip> <template data-target="react-partial-anchor.template"> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.708873d0ee1f75685f85.module.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.272733bb6899c5359cf5.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/appearance-settings.753d458774a2f782559b.module.css" /> <react-partial partial-name="appearance-settings" data-ssr="false" data-attempted-ssr="false" - data-react-profiling="false" + data-react-profiling="true" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{}}</script> @@ -336,14 +338,14 @@ <div class="HeaderMenu js-header-menu height-fit position-lg-relative d-lg-flex flex-column flex-auto top-0"> <div class="HeaderMenu-wrapper d-flex flex-column flex-self-start flex-lg-row flex-auto rounded rounded-lg-0"> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.708873d0ee1f75685f85.module.css" /> -<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/marketing-navigation.4bd5b20d56a72071b91a.module.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.272733bb6899c5359cf5.module.css" /> +<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/marketing-navigation.2a752a3c708bb38a3035.module.css" /> <react-partial partial-name="marketing-navigation" data-ssr="true" data-attempted-ssr="true" - data-react-profiling="false" + data-react-profiling="true" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"should_use_dotcom_links":true}}</script> @@ -356,7 +358,7 @@ -<qbsearch-input class="search-input" data-scope="owner:buetow" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="xc2RxR8rC_RFgJTefvO7dx-hDThg6PHGEaTFjwsCUOubITm2St_TfJYldUoQaOcF4DYyDt8HNM0xwesqNCqIfw" data-max-custom-scopes="10" data-header-redesign-enabled="false" data-initial-value="" data-blackbird-suggestions-path="/search/suggestions" data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations" data-current-repository="" data-current-org="" data-current-owner="" data-logged-in="false" data-copilot-chat-enabled="false" data-nl-search-enabled="false" data-retain-scroll-position="true"> +<qbsearch-input class="search-input" data-scope="owner:buetow" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="5_ES8haZCPX3gM9VSogG9D8p_lCZuL1u1QzTbDTL7vM-9ztoI5kJ5eyWcYSm2ct7W3G1UQGqk4Ym9-daAlwGeQ" data-max-custom-scopes="10" data-header-redesign-enabled="false" data-initial-value="" data-blackbird-suggestions-path="/search/suggestions" data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations" data-current-repository="" data-current-org="" data-current-owner="" data-logged-in="false" data-copilot-chat-enabled="false" data-nl-search-enabled="false" data-retain-scroll-position="true"> <div class="search-input-container search-with-dialog position-relative d-flex flex-row flex-items-center mr-4 rounded" data-action="click:qbsearch-input#searchInputContainerClicked" @@ -420,7 +422,7 @@ ></div> <div class="QueryBuilder-InputWrapper"> <div aria-hidden="true" class="QueryBuilder-Sizer" data-target="query-builder.sizer"></div> - <input id="query-builder-test" name="query-builder-test" value="" autocomplete="off" type="text" role="combobox" spellcheck="false" aria-expanded="false" aria-describedby="validation-bcb85fc3-7638-4110-8b50-ad0555301438" data-target="query-builder.input" data-action=" + <input id="query-builder-test" name="query-builder-test" value="" autocomplete="off" type="text" role="combobox" spellcheck="false" aria-expanded="false" aria-describedby="validation-a913ac83-98a9-4fb8-94fe-cbdfe3b43f06" data-target="query-builder.input" data-action=" input:query-builder#inputChange blur:query-builder#inputBlur keydown:query-builder#inputKeydown @@ -658,7 +660,7 @@ tabindex="-1" ></ul> </div> - <div class="FormControl-inlineValidation" id="validation-bcb85fc3-7638-4110-8b50-ad0555301438" hidden="hidden"> + <div class="FormControl-inlineValidation" id="validation-a913ac83-98a9-4fb8-94fe-cbdfe3b43f06" hidden="hidden"> <span class="FormControl-inlineValidation--visual"> <svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill"> <path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path> @@ -699,7 +701,7 @@ </div> <scrollable-region data-labelled-by="feedback-dialog-title"> - <div data-view-component="true" class="Overlay-body"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="code-search-feedback-form" data-turbo="false" action="/search/feedback" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="x5xVp0K6VxKbVo8P9RO+5lEQ/Ekbf+vzu/liFHQY9lAYD/7Sc1z8/xpzG6JF8DS/CZW7cZMu/6CU7kA70WfD9A==" /> + <div data-view-component="true" class="Overlay-body"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="code-search-feedback-form" data-turbo="false" action="/search/feedback" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="zw7oaXfXkx1vPa/BIBDdQo44Z0CEHCf+AjU+W3nllPwh/ZmoR+mNDFDeM1I+cPKUHehfkQ31kAaJWwga6TiroQ==" /> <p>We read every piece of feedback, and take your input very seriously.</p> <textarea name="feedback" class="form-control width-full mb-2" style="height: 120px" id="feedback"></textarea> <input name="include_email" id="include_email" aria-label="Include my email address so I can be contacted" class="form-control mr-2" type="checkbox"> @@ -737,7 +739,7 @@ <div data-view-component="true" class="Overlay-body"> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <div hidden class="create-custom-scope-form" data-target="custom-scopes.createCustomScopeForm"> - <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="custom-scopes-dialog-form" data-turbo="false" action="/search/custom_scopes" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="5h63W/n1GjjyzuMFayTlyi0iutywkVkvz08iqFJRANiqCKNo+XfzEDONqpU2u4/M6HgcjUPzidEqbtyhqC85qQ==" /> + <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="custom-scopes-dialog-form" data-turbo="false" action="/search/custom_scopes" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="TKgFi2+z5+wpmD3DssGidHno8WpjPXv9XyVtVLrplEjTi2HuFsryqjI3FlTEAGYj2CVS+fFruzaa6su7dQyRlA==" /> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField"> @@ -755,7 +757,7 @@ placeholder="github-ruby" required maxlength="50"> - <input type="hidden" data-csrf="true" value="sdo25p4xmbIV9cEOQ587FRwp28AiwUjFaRGmPuqMxoco0bNOtURWBd3EOT7Uuhj0MSeZ9jvbSfkx6N0F99gvYA==" /> + <input type="hidden" data-csrf="true" value="AH/Aaa2zAIKpKtkx1Ebp0tS/KsnHUrAR85AkOtB89ImLwP+x7rDv2nqvP/AACpwFZQbAIH4PtIZp/KoGJQP4yw==" /> </auto-check> </div> @@ -810,7 +812,7 @@ <h4 data-view-component="true" class="color-fg-default mb-2"> Sign in to GitHub </h4> -<!-- '"` --><!-- </textarea></xmp> --></option></form><form data-turbo="false" action="/session" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="LjitOiGusVGTvOklEb5DniNNqBOAFZJnEZzlVZy29P64b/HxX4K8HfSssqCXrDVTY0+BloQ6szUTgttsoCSKSQ==" /> <input type="hidden" name="add_account" id="add_account" autocomplete="off" class="form-control" /> +<!-- '"` --><!-- </textarea></xmp> --></option></form><form data-turbo="false" action="/session" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="2LU7T2z2cCwKm3H0hffqaNG6tDjLXvq0DTlFeAxKw80b3TreUq1KIvS4kJhvSpu/U43x1iBsX3THfFg6Avm03A==" /> <input type="hidden" name="add_account" id="add_account" autocomplete="off" class="form-control" /> <label for="login_field"> Username or email address @@ -832,9 +834,9 @@ <input type="hidden" name="allow_signup" id="allow_signup" autocomplete="off" class="form-control" /> <input type="hidden" name="client_id" id="client_id" autocomplete="off" class="form-control" /> <input type="hidden" name="integration" id="integration" autocomplete="off" class="form-control" /> -<input class="form-control" type="text" name="required_field_871e" hidden="hidden" /> -<input class="form-control" type="hidden" name="timestamp" value="1767894458763" /> -<input class="form-control" type="hidden" name="timestamp_secret" value="01d971ae1c8c58b532c22a6dc1322b8bfaef79ddb9c7dd88b645f65b31826115" /> +<input class="form-control" type="text" name="required_field_8a4b" hidden="hidden" /> +<input class="form-control" type="hidden" name="timestamp" value="1769258388833" /> +<input class="form-control" type="hidden" name="timestamp_secret" value="87ddb805434adc94333a6cbdd0e771598bc4734535a7a090e225671404db87c0" /> <input type="submit" name="commit" value="Sign in" class="btn btn-primary btn-block js-sign-in-button" data-disable-with="Signing inβ¦" data-signin-label="Sign in" data-sso-label="Sign in with your identity provider" development="false" disable-emu-sso="false" /> @@ -861,20 +863,20 @@ <div class="AppHeader-appearanceSettings"> <react-partial-anchor> - <button data-target="react-partial-anchor.anchor" id="icon-button-16fed6f9-28ec-4204-acad-3994b4007730" aria-labelledby="tooltip-4c1e24f3-5bb7-4c20-8402-2af791ab1d33" type="button" disabled="disabled" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium AppHeader-button HeaderMenu-link border cursor-wait"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-sliders Button-visual"> + <button data-target="react-partial-anchor.anchor" id="icon-button-fc923268-3a9e-45a4-98af-9962f965fc9c" aria-labelledby="tooltip-957c7f76-00f0-45f0-9161-c7ef2aaf41a2" type="button" disabled="disabled" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium AppHeader-button HeaderMenu-link border cursor-wait"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-sliders Button-visual"> <path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path> </svg> -</button><tool-tip id="tooltip-4c1e24f3-5bb7-4c20-8402-2af791ab1d33" for="icon-button-16fed6f9-28ec-4204-acad-3994b4007730" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Appearance settings</tool-tip> +</button><tool-tip id="tooltip-957c7f76-00f0-45f0-9161-c7ef2aaf41a2" for="icon-button-fc923268-3a9e-45a4-98af-9962f965fc9c" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Appearance settings</tool-tip> <template data-target="react-partial-anchor.template"> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.708873d0ee1f75685f85.module.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.272733bb6899c5359cf5.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/appearance-settings.753d458774a2f782559b.module.css" /> <react-partial partial-name="appearance-settings" data-ssr="false" data-attempted-ssr="false" - data-react-profiling="false" + data-react-profiling="true" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{}}</script> @@ -902,10 +904,10 @@ <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> - <button id="icon-button-0f276785-66a4-4c6d-804f-7d6c20e1b548" aria-labelledby="tooltip-733fad38-112c-4343-9003-73a85adf138a" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual"> + <button id="icon-button-5d1e2b70-3e47-4c01-a223-df5e6a2516b6" aria-labelledby="tooltip-d2f6d2d9-d0bc-48ce-996f-ed2f452811a4" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> -</button><tool-tip id="tooltip-733fad38-112c-4343-9003-73a85adf138a" for="icon-button-0f276785-66a4-4c6d-804f-7d6c20e1b548" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip> +</button><tool-tip id="tooltip-d2f6d2d9-d0bc-48ce-996f-ed2f452811a4" for="icon-button-5d1e2b70-3e47-4c01-a223-df5e6a2516b6" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip> diff --git a/gemfeed/2025-07-14-f3s-kubernetes-with-freebsd-part-6.gmi.tpl b/gemfeed/2025-07-14-f3s-kubernetes-with-freebsd-part-6.gmi.tpl index 94470691..ea7c96cd 100644 --- a/gemfeed/2025-07-14-f3s-kubernetes-with-freebsd-part-6.gmi.tpl +++ b/gemfeed/2025-07-14-f3s-kubernetes-with-freebsd-part-6.gmi.tpl @@ -243,7 +243,7 @@ Data replication is the cornerstone of high availability. While CARP handles IP Our storage system has different replication needs: * NFS data (`/data/nfs/k3svolumes`): Soon, it will contain active Kubernetes persistent volumes. Needs frequent replication (every minute) to minimise data loss during failover. -* VM data (`/zroot/bhyve/fedora`): Contains VM images that change less frequently. Can tolerate longer replication intervals (every 10 minutes). +* VM data (`/zroot/bhyve/freebsd`): Contains VM images that change less frequently. Can tolerate longer replication intervals (every 10 minutes). The 1-minute replication window is perfectly acceptable for my personal use cases. This isn't a high-frequency trading system or a real-time databaseβit's storage for personal projects, development work, and home lab experiments. Losing at most 1 minute of work in a disaster scenario is a reasonable trade-off for the reliability and simplicity of snapshot-based replication. Additionally, in the case of a "1 minute of data loss," I would likely still have the data available on the client side. @@ -344,13 +344,13 @@ jobs: grid: 4x7d | 6x30d regex: "^zrepl_.*" - - name: f0_to_f1_fedora + - name: f0_to_f1_freebsd type: push connect: type: tcp address: "192.168.2.131:8888" filesystems: - "zroot/bhyve/fedora": true + "zroot/bhyve/freebsd": true send: encrypted: true snapshotting: @@ -376,9 +376,9 @@ EOF We're using two separate replication jobs with different intervals: * `f0_to_f1_nfsdata`: Replicates NFS data every minute for faster failover recovery -* `f0_to_f1_fedora`: Replicates Fedora VM every ten minutes (less critical) +* `f0_to_f1_freebsd`: Replicates FreeBSD VM every ten minutes (less critical) -The Fedora VM is only used for development purposes, so it doesn't require as frequent replication as the NFS data. It's off-topic to this blog series, but it showcases, hows `zrepl`'s flexibility in handling different datasets with varying replication needs. +The FreeBSD VM is only used for development purposes, so it doesn't require as frequent replication as the NFS data. It's off-topic to this blog series, but it showcases, hows `zrepl`'s flexibility in handling different datasets with varying replication needs. Furthermore: @@ -477,12 +477,12 @@ paul@f0:~ % doas zrepl status => ./f3s-kubernetes-with-freebsd-part-6/zrepl.png zrepl status -With this setup, both `zdata/enc/nfsdata` and `zroot/bhyve/fedora` on `f0` will be automatically replicated to `f1` every 1 minute (or 10 minutes in the case of the Fedora VM), with encrypted snapshots preserved on both sides. The pruning policy ensures that we keep the last 10 snapshots while managing disk space efficiently. +With this setup, both `zdata/enc/nfsdata` and `zroot/bhyve/freebsd` on `f0` will be automatically replicated to `f1` every 1 minute (or 10 minutes in the case of the FreeBSD VM), with encrypted snapshots preserved on both sides. The pruning policy ensures that we keep the last 10 snapshots while managing disk space efficiently. The replicated data appears on `f1` under `zdata/sink/` with the source host and dataset hierarchy preserved: * `zdata/enc/nfsdata` β `zdata/sink/f0/zdata/enc/nfsdata` -* `zroot/bhyve/fedora` β `zdata/sink/f0/zroot/bhyve/fedora` +* `zroot/bhyve/freebsd` β `zdata/sink/f0/zroot/bhyve/freebsd` This is by design - `zrepl` preserves the complete path from the source to ensure there are no conflicts when replicating from multiple sources. @@ -503,14 +503,14 @@ zrepl is running as pid 2309. # Check that new snapshots are being created and replicated paul@f0:~ % doas zfs list -t snapshot | grep `zrepl` | tail -2 zdata/enc/nfsdata@zrepl_20250701_202530_000 0B - 200K - -zroot/bhyve/fedora@zrepl_20250701_202530_000 0B - 2.97G - +zroot/bhyve/freebsd@zrepl_20250701_202530_000 0B - 2.97G - . . . paul@f1:~ % doas zfs list -t snapshot -r zdata/sink | grep 202530 zdata/sink/f0/zdata/enc/nfsdata@zrepl_20250701_202530_000 0B - 176K - -zdata/sink/f0/zroot/bhyve/fedora@zrepl_20250701_202530_000 0B - 2.97G - +zdata/sink/f0/zroot/bhyve/freebsd@zrepl_20250701_202530_000 0B - 2.97G - . . . @@ -706,12 +706,12 @@ paul@f1:~ % doas zfs list -t snapshot | grep nfsdata # Destroy the entire destination dataset to allow clean replication paul@f1:~ % doas zfs destroy -r zdata/sink/f0/zdata/enc/nfsdata -# For VM replication, do the same for the fedora dataset -paul@f1:~ % doas zfs destroy -r zdata/sink/f0/zroot/bhyve/fedora +# For VM replication, do the same for the freebsd dataset +paul@f1:~ % doas zfs destroy -r zdata/sink/f0/zroot/bhyve/freebsd # Wake up zrepl to start fresh replication paul@f0:~ % doas zrepl signal wakeup f0_to_f1_nfsdata -paul@f0:~ % doas zrepl signal wakeup f0_to_f1_fedora +paul@f0:~ % doas zrepl signal wakeup f0_to_f1_freebsd # Check replication status paul@f0:~ % doas zrepl status --mode raw |
