diff options
| author | Paul Buetow <paul@buetow.org> | 2026-02-21 12:07:04 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-02-21 12:07:04 +0200 |
| commit | 01ba8ba47bee0f90e5ab9bfc0a6761932401556d (patch) | |
| tree | 954222c807263cde291a7aeeaff28806f7ae83f5 | |
| parent | 1cfb05bede2e71b0e137afc868755dde20686702 (diff) | |
Update content for md
| -rw-r--r-- | about/resources.md | 216 | ||||
| -rw-r--r-- | about/showcase.md | 432 | ||||
| -rw-r--r-- | about/showcase/debroid/image-1.png | 128 |
3 files changed, 401 insertions, 375 deletions
diff --git a/about/resources.md b/about/resources.md index 0d22166e..63c3b1eb 100644 --- a/about/resources.md +++ b/about/resources.md @@ -35,110 +35,110 @@ You won't find any links on this site because, over time, the links will break. In random order: +* DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible +* Modern Perl; Chromatic ; Onyx Neon Press +* 100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications +* 21st Century C: C Tips from the New School; Ben Klemens; O'Reilly +* Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press +* Perl New Features; Joshua McAdams, brian d foy; Perl School +* Pro Puppet; James Turnbull, Jeffrey McCune; Apress +* Polished Ruby Programming; Jeremy Evans; Packt Publishing +* Chaos Engineering - System Resiliency in Practice; Casey Rosenthal and Nora Jones; eBook +* Funktionale Programmierung; Peter Pepper; Springer * Java ist auch eine Insel; Christian Ullenboom; -* Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications -* DNS and BIND; Cricket Liu; O'Reilly -* Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner +* Ultimate Go Notebook; Bill Kennedy * Data Science at the Command Line; Jeroen Janssens; O'Reilly +* Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly +* Concurrency in Go; Katherine Cox-Buday; O'Reilly +* Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly * The DevOps Handbook; Gene Kim, Jez Humble, Patrick Debois, John Willis; Audible -* Site Reliability Engineering; How Google runs production systems; O'Reilly +* Raku Fundamentals; Moritz Lenz; Apress +* Seeking SRE: Conversations About Running Production Systems at Scale; David N. Blank-Edelman; eBook +* Clusterbau mit Linux-HA; Michael Schwartzkopff; O'Reilly +* 97 things every SRE should know; Emil Stolarsky, Jaime Woo; O'Reilly +* The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional +* Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications +* DNS and BIND; Cricket Liu; O'Reilly +* Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O'Reilly * Programming Ruby 3.3 (5th Edition); Noel Rappin, with Dave Thomas; The Pragmatic Bookshelf -* Raku Recipes; J.J. Merelo; Apress -* Terraform Cookbook; Mikael Krief; Packt Publishing +* The Pragmatic Programmer; David Thomas; Addison-Wesley * C++ Programming Language; Bjarne Stroustrup; -* DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible -* Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt -* Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press -* Concurrency in Go; Katherine Cox-Buday; O'Reilly -* Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly -* The Docker Book; James Turnbull; Kindle -* Ultimate Go Notebook; Bill Kennedy * The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton -* The Practise of System and Network Administration; Thomas A. Limoncelli, Christina J. Hogan, Strata R. Chalup; Addison-Wesley Professional Pro Git; Scott Chacon, Ben Straub; Apress -* Pro Puppet; James Turnbull, Jeffrey McCune; Apress -* The Pragmatic Programmer; David Thomas; Addison-Wesley -* Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson * Effective awk programming; Arnold Robbins; O'Reilly -* Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers -* Modern Perl; Chromatic ; Onyx Neon Press -* Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O'Reilly -* The Kubernetes Book; Nigel Poulton; Unabridged Audiobook -* Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers -* 100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications +* Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner +* Raku Recipes; J.J. Merelo; Apress +* Developing Games in Java; David Brackeen and others...; New Riders * Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press * Systemprogrammierung in Go; Frank Müller; dpunkt -* 21st Century C: C Tips from the New School; Ben Klemens; O'Reilly -* 97 things every SRE should know; Emil Stolarsky, Jaime Woo; O'Reilly -* Chaos Engineering - System Resiliency in Practice; Casey Rosenthal and Nora Jones; eBook -* Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly -* Polished Ruby Programming; Jeremy Evans; Packt Publishing -* Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O'Reilly -* Raku Fundamentals; Moritz Lenz; Apress -* Perl New Features; Joshua McAdams, brian d foy; Perl School -* Funktionale Programmierung; Peter Pepper; Springer -* Clusterbau mit Linux-HA; Michael Schwartzkopff; O'Reilly -* Seeking SRE: Conversations About Running Production Systems at Scale; David N. Blank-Edelman; eBook -* Higher Order Perl; Mark Dominus; Morgan Kaufmann -* Leanring eBPF; Liz Rice; O'Reilly * Effective Java; Joshua Bloch; Addison-Wesley Professional -* Developing Games in Java; David Brackeen and others...; New Riders -* The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional +* The Kubernetes Book; Nigel Poulton; Unabridged Audiobook +* Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers +* Terraform Cookbook; Mikael Krief; Packt Publishing +* Site Reliability Engineering; How Google runs production systems; O'Reilly +* Leanring eBPF; Liz Rice; O'Reilly +* Higher Order Perl; Mark Dominus; Morgan Kaufmann +* Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers +* The Docker Book; James Turnbull; Kindle +* Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson +* The Practise of System and Network Administration; Thomas A. Limoncelli, Christina J. Hogan, Strata R. Chalup; Addison-Wesley Professional Pro Git; Scott Chacon, Ben Straub; Apress +* Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O'Reilly +* Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt ## Technical references I didn't read them from the beginning to the end, but I am using them to look up things. The books are in random order: -* The Linux Programming Interface; Michael Kerrisk; No Starch Press -* BPF Performance Tools - Linux System and Application Observability, Brendan Gregg; Addison Wesley * Implementing Service Level Objectives; Alex Hidalgo; O'Reilly -* Understanding the Linux Kernel; Daniel P. Bovet, Marco Cesati; O'Reilly +* Algorithms; Robert Sedgewick, Kevin Wayne; Addison Wesley +* BPF Performance Tools - Linux System and Application Observability, Brendan Gregg; Addison Wesley +* Groovy Kurz & Gut; Joerg Staudemeier; O'Reilly * Relayd and Httpd Mastery; Michael W Lucas +* The Linux Programming Interface; Michael Kerrisk; No Starch Press * Go: Design Patterns for Real-World Projects; Mat Ryer; Packt -* Groovy Kurz & Gut; Joerg Staudemeier; O'Reilly -* Algorithms; Robert Sedgewick, Kevin Wayne; Addison Wesley +* Understanding the Linux Kernel; Daniel P. Bovet, Marco Cesati; O'Reilly ## Self-development and soft-skills books In random order: -* The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books -* Never Split the Difference; Chris Voss, Tahl Raz; Random House Business -* Search Inside Yourself - The Unexpected path to Achieving Success, Happiness (and World Peace); Chade-Meng Tan, Daniel Goleman, Jon Kabat-Zinn; HarperOne -* Psycho-Cybernetics; Maxwell Maltz; Perigee Books -* Time Management for System Administrators; Thomas A. Limoncelli; O'Reilly -* Ultralearning; Anna Laurent; Self-published via Amazon -* So Good They Can't Ignore You; Cal Newport; Business Plus -* Ultralearning; Scott Young; Thorsons -* 97 Things Every Engineering Manager Should Know; Camille Fournier; Audiobook -* Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion +* Staff Engineer: Leadership beyond the management track; Will Larson; Audiobook +* 101 Essays that change the way you think; Brianna Wiest; Audiobook * Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing -* Atomic Habits; James Clear; Random House Business -* Digital Minimalism; Cal Newport; Portofolio Penguin -* The Software Engineer's Guidebook: Navigating senior, tech lead, and staff engineer positions at tech companies and startups; Gergely Orosz; Audiobook -* The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd -* Slow Productivity; Cal Newport; Penguin Random House +* The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books +* Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook +* The Good Enough Job; Simone Stolzoff; Ebury Edge +* The Courage to Be Disliked; Ichiro Kishimi and Fumitake Koga; Audiobook +* Eat That Frog!; Brian Tracy; Hodder Paperbacks * The 7 Habits Of Highly Effective People; Stephen R. Covey; Simon & Schuster UK +* Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion +* Deep Work; Cal Newport; Piatkus * Solve for Happy; Mo Gawdat (RE-READ 1ST TIME) +* The Power of Now; Eckhard Tolle; Yellow Kite +* The Joy of Missing Out; Christina Crook; New Society Publishers +* 97 Things Every Engineering Manager Should Know; Camille Fournier; Audiobook * Stop starting, start finishing; Arne Roock; Lean-Kanban University +* Influence without Authority; A. Cohen, D. Bradford; Wiley +* Search Inside Yourself - The Unexpected path to Achieving Success, Happiness (and World Peace); Chade-Meng Tan, Daniel Goleman, Jon Kabat-Zinn; HarperOne +* The Software Engineer's Guidebook: Navigating senior, tech lead, and staff engineer positions at tech companies and startups; Gergely Orosz; Audiobook +* Psycho-Cybernetics; Maxwell Maltz; Perigee Books +* Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press * Meditation for Mortals, Oliver Burkeman, Audiobook -* 101 Essays that change the way you think; Brianna Wiest; Audiobook -* Eat That Frog; Brian Tracy -* The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select +* Getting Things Done; David Allen * Soft Skills; John Sommez; Manning Publications -* Deep Work; Cal Newport; Piatkus -* The Joy of Missing Out; Christina Crook; New Society Publishers +* Slow Productivity; Cal Newport; Penguin Random House +* The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select +* Never Split the Difference; Chris Voss, Tahl Raz; Random House Business * The Bullet Journal Method; Ryder Carroll; Fourth Estate -* The Power of Now; Eckhard Tolle; Yellow Kite -* Getting Things Done; David Allen -* Staff Engineer: Leadership beyond the management track; Will Larson; Audiobook -* Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook -* Influence without Authority; A. Cohen, D. Bradford; Wiley -* The Complete Software Developer's Career Guide; John Sonmez; Unabridged Audiobook -* The Courage to Be Disliked; Ichiro Kishimi and Fumitake Koga; Audiobook -* Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press +* Eat That Frog; Brian Tracy +* So Good They Can't Ignore You; Cal Newport; Business Plus +* Ultralearning; Anna Laurent; Self-published via Amazon +* Digital Minimalism; Cal Newport; Portofolio Penguin +* The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd +* Time Management for System Administrators; Thomas A. Limoncelli; O'Reilly +* Ultralearning; Scott Young; Thorsons * The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME) -* The Good Enough Job; Simone Stolzoff; Ebury Edge -* Eat That Frog!; Brian Tracy; Hodder Paperbacks +* Atomic Habits; James Clear; Random House Business +* The Complete Software Developer's Career Guide; John Sonmez; Unabridged Audiobook [Here are notes of mine for some of the books](../notes/index.md) @@ -146,30 +146,30 @@ In random order: Some of these were in-person with exams; others were online learning lectures only. In random order: -* Developing IaC with Terraform (with Live Lessons); O'Reilly Online -* Algorithms Video Lectures; Robert Sedgewick; O'Reilly Online +* Ultimate Go Programming; Bill Kennedy; O'Reilly Online +* The Well-Grounded Rubyist Video Edition; David. A. Black; O'Reilly Online +* Scripting Vim; Damian Conway; O'Reilly Online * AWS Immersion Day; Amazon; 1-day interactive online training -* The Ultimate Kubernetes Bootcamp; School of Devops; O'Reilly Online -* MySQL Deep Dive Workshop; 2-day on-site training +* Protocol buffers; O'Reilly Online +* Red Hat Certified System Administrator; Course + certification (Although I had the option, I decided not to take the next course as it is more effective to self learn what I need) +* Developing IaC with Terraform (with Live Lessons); O'Reilly Online * Linux Security and Isolation APIs Training; Michael Kerrisk; 3-day on-site training * Cloud Operations on AWS - Learn how to configure, deploy, maintain, and troubleshoot your AWS environments; 3-day online live training with labs; Amazon -* Scripting Vim; Damian Conway; O'Reilly Online -* Red Hat Certified System Administrator; Course + certification (Although I had the option, I decided not to take the next course as it is more effective to self learn what I need) -* Protocol buffers; O'Reilly Online -* The Well-Grounded Rubyist Video Edition; David. A. Black; O'Reilly Online -* Functional programming lecture; Remote University of Hagen -* F5 Loadbalancers Training; 2-day on-site training; F5, Inc. -* Ultimate Go Programming; Bill Kennedy; O'Reilly Online +* Algorithms Video Lectures; Robert Sedgewick; O'Reilly Online * Apache Tomcat Best Practises; 3-day on-site training +* MySQL Deep Dive Workshop; 2-day on-site training +* F5 Loadbalancers Training; 2-day on-site training; F5, Inc. +* Functional programming lecture; Remote University of Hagen * Structure and Interpretation of Computer Programs; Harold Abelson and more...; +* The Ultimate Kubernetes Bootcamp; School of Devops; O'Reilly Online ## Technical guides These are not whole books, but guides (smaller or larger) which I found very useful. in random order: -* How CPUs work at https://cpu.land -* Raku Guide at https://raku.guide * Advanced Bash-Scripting Guide +* Raku Guide at https://raku.guide +* How CPUs work at https://cpu.land ## Podcasts @@ -177,58 +177,58 @@ These are not whole books, but guides (smaller or larger) which I found very use In random order: -* Pratical AI -* Hidden Brain +* Modern Mentor * Dev Interrupted -* Deep Questions with Cal Newport -* BSD Now [BSD] -* Fallthrough [Golang] -* The Changelog Podcast(s) -* Fork Around And Find Out -* The ProdCast (Google SRE Podcast) +* The Pragmatic Engineer Podcast * Wednesday Wisdom -* Modern Mentor +* Pratical AI +* The ProdCast (Google SRE Podcast) * Backend Banter -* The Pragmatic Engineer Podcast +* The Changelog Podcast(s) +* Hidden Brain * Cup o' Go [Golang] +* BSD Now [BSD] +* Fallthrough [Golang] * Maintainable +* Fork Around And Find Out +* Deep Questions with Cal Newport ### Podcasts I liked I liked them but am not listening to them anymore. The podcasts have either "finished" (no more episodes) or I stopped listening to them due to time constraints or a shift in my interests. -* FLOSS weekly -* CRE: Chaosradio Express [german] * Ship It (predecessor of Fork Around And Find Out) -* Java Pub House +* FLOSS weekly * Modern Mentor * Go Time (predecessor of fallthrough) +* Java Pub House +* CRE: Chaosradio Express [german] ## Newsletters I like This is a mix of tech and non-tech newsletters I am subscribed to. In random order: -* Changelog News +* VK Newsletter +* Golang Weekly * The Valuable Dev +* byteSizeGo * The Imperfectionist -* Ruby Weekly -* Applied Go Weekly Newsletter -* The Pragmatic Engineer * Monospace Mentor -* Register Spill +* Changelog News +* The Pragmatic Engineer * Andreas Brandhorst Newsletter (Sci-Fi author) -* byteSizeGo -* VK Newsletter -* Golang Weekly +* Register Spill +* Ruby Weekly +* Applied Go Weekly Newsletter ## Magazines I like(d) This is a mix of tech I like(d). I may not be a current subscriber, but now and then, I buy an issue. In random order: * Linux Magazine -* LWN (online only) * Linux User * freeX (not published anymore) +* LWN (online only) # Formal education diff --git a/about/showcase.md b/about/showcase.md index 4884461b..a37aeb45 100644 --- a/about/showcase.md +++ b/about/showcase.md @@ -1,6 +1,6 @@ # Project Showcase -Generated on: 2026-02-14 +Generated on: 2026-02-21 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. @@ -10,10 +10,10 @@ This page showcases my side projects, providing an overview of what each project * [⇢ ⇢ Overall Statistics](#overall-statistics) * [⇢ ⇢ Projects](#projects) * [⇢ ⇢ ⇢ 1. hexai](#1-hexai) -* [⇢ ⇢ ⇢ 2. epimetheus](#2-epimetheus) -* [⇢ ⇢ ⇢ 3. conf](#3-conf) -* [⇢ ⇢ ⇢ 4. dotfiles](#4-dotfiles) -* [⇢ ⇢ ⇢ 5. conf.bak](#5-confbak) +* [⇢ ⇢ ⇢ 2. dotfiles](#2-dotfiles) +* [⇢ ⇢ ⇢ 3. epimetheus](#3-epimetheus) +* [⇢ ⇢ ⇢ 4. conf](#4-conf) +* [⇢ ⇢ ⇢ 5. dotfiles.bak](#5-dotfilesbak) * [⇢ ⇢ ⇢ 6. foo.zone](#6-foozone) * [⇢ ⇢ ⇢ 7. scifi](#7-scifi) * [⇢ ⇢ ⇢ 8. log4jbench](#8-log4jbench) @@ -21,10 +21,10 @@ This page showcases my side projects, providing an overview of what each project * [⇢ ⇢ ⇢ 10. yoga](#10-yoga) * [⇢ ⇢ ⇢ 11. perc](#11-perc) * [⇢ ⇢ ⇢ 12. totalrecall](#12-totalrecall) -* [⇢ ⇢ ⇢ 13. gitsyncer](#13-gitsyncer) -* [⇢ ⇢ ⇢ 14. foostats](#14-foostats) +* [⇢ ⇢ ⇢ 13. ior](#13-ior) +* [⇢ ⇢ ⇢ 14. gitsyncer](#14-gitsyncer) * [⇢ ⇢ ⇢ 15. tasksamurai](#15-tasksamurai) -* [⇢ ⇢ ⇢ 16. ior](#16-ior) +* [⇢ ⇢ ⇢ 16. foostats](#16-foostats) * [⇢ ⇢ ⇢ 17. timr](#17-timr) * [⇢ ⇢ ⇢ 18. dtail](#18-dtail) * [⇢ ⇢ ⇢ 19. gos](#19-gos) @@ -35,52 +35,53 @@ This page showcases my side projects, providing an overview of what each project * [⇢ ⇢ ⇢ 24. terraform](#24-terraform) * [⇢ ⇢ ⇢ 25. quicklogger](#25-quicklogger) * [⇢ ⇢ ⇢ 26. sillybench](#26-sillybench) -* [⇢ ⇢ ⇢ 27. gorum](#27-gorum) -* [⇢ ⇢ ⇢ 28. guprecords](#28-guprecords) -* [⇢ ⇢ ⇢ 29. geheim](#29-geheim) -* [⇢ ⇢ ⇢ 30. docker-radicale-server](#30-docker-radicale-server) -* [⇢ ⇢ ⇢ 31. algorithms](#31-algorithms) -* [⇢ ⇢ ⇢ 32. randomjournalpage](#32-randomjournalpage) -* [⇢ ⇢ ⇢ 33. photoalbum](#33-photoalbum) -* [⇢ ⇢ ⇢ 34. ioriot](#34-ioriot) -* [⇢ ⇢ ⇢ 35. ipv6test](#35-ipv6test) -* [⇢ ⇢ ⇢ 36. sway-autorotate](#36-sway-autorotate) -* [⇢ ⇢ ⇢ 37. mon](#37-mon) -* [⇢ ⇢ ⇢ 38. staticfarm-apache-handlers](#38-staticfarm-apache-handlers) -* [⇢ ⇢ ⇢ 39. pingdomfetch](#39-pingdomfetch) -* [⇢ ⇢ ⇢ 40. xerl](#40-xerl) -* [⇢ ⇢ ⇢ 41. ychat](#41-ychat) -* [⇢ ⇢ ⇢ 42. fapi](#42-fapi) -* [⇢ ⇢ ⇢ 43. perl-c-fibonacci](#43-perl-c-fibonacci) -* [⇢ ⇢ ⇢ 44. netcalendar](#44-netcalendar) -* [⇢ ⇢ ⇢ 45. loadbars](#45-loadbars) -* [⇢ ⇢ ⇢ 46. gotop](#46-gotop) -* [⇢ ⇢ ⇢ 47. fype](#47-fype) -* [⇢ ⇢ ⇢ 48. rubyfy](#48-rubyfy) -* [⇢ ⇢ ⇢ 49. pwgrep](#49-pwgrep) -* [⇢ ⇢ ⇢ 50. perldaemon](#50-perldaemon) -* [⇢ ⇢ ⇢ 51. jsmstrade](#51-jsmstrade) -* [⇢ ⇢ ⇢ 52. japi](#52-japi) -* [⇢ ⇢ ⇢ 53. perl-poetry](#53-perl-poetry) -* [⇢ ⇢ ⇢ 54. muttdelay](#54-muttdelay) -* [⇢ ⇢ ⇢ 55. netdiff](#55-netdiff) -* [⇢ ⇢ ⇢ 56. debroid](#56-debroid) -* [⇢ ⇢ ⇢ 57. hsbot](#57-hsbot) -* [⇢ ⇢ ⇢ 58. cpuinfo](#58-cpuinfo) -* [⇢ ⇢ ⇢ 59. template](#59-template) -* [⇢ ⇢ ⇢ 60. awksite](#60-awksite) -* [⇢ ⇢ ⇢ 61. dyndns](#61-dyndns) -* [⇢ ⇢ ⇢ 62. vs-sim](#62-vs-sim) +* [⇢ ⇢ ⇢ 27. goprecords](#27-goprecords) +* [⇢ ⇢ ⇢ 28. gorum](#28-gorum) +* [⇢ ⇢ ⇢ 29. guprecords](#29-guprecords) +* [⇢ ⇢ ⇢ 30. geheim](#30-geheim) +* [⇢ ⇢ ⇢ 31. docker-radicale-server](#31-docker-radicale-server) +* [⇢ ⇢ ⇢ 32. algorithms](#32-algorithms) +* [⇢ ⇢ ⇢ 33. randomjournalpage](#33-randomjournalpage) +* [⇢ ⇢ ⇢ 34. photoalbum](#34-photoalbum) +* [⇢ ⇢ ⇢ 35. ioriot](#35-ioriot) +* [⇢ ⇢ ⇢ 36. ipv6test](#36-ipv6test) +* [⇢ ⇢ ⇢ 37. sway-autorotate](#37-sway-autorotate) +* [⇢ ⇢ ⇢ 38. mon](#38-mon) +* [⇢ ⇢ ⇢ 39. staticfarm-apache-handlers](#39-staticfarm-apache-handlers) +* [⇢ ⇢ ⇢ 40. pingdomfetch](#40-pingdomfetch) +* [⇢ ⇢ ⇢ 41. fype](#41-fype) +* [⇢ ⇢ ⇢ 42. xerl](#42-xerl) +* [⇢ ⇢ ⇢ 43. ychat](#43-ychat) +* [⇢ ⇢ ⇢ 44. fapi](#44-fapi) +* [⇢ ⇢ ⇢ 45. perl-c-fibonacci](#45-perl-c-fibonacci) +* [⇢ ⇢ ⇢ 46. netcalendar](#46-netcalendar) +* [⇢ ⇢ ⇢ 47. loadbars](#47-loadbars) +* [⇢ ⇢ ⇢ 48. gotop](#48-gotop) +* [⇢ ⇢ ⇢ 49. rubyfy](#49-rubyfy) +* [⇢ ⇢ ⇢ 50. pwgrep](#50-pwgrep) +* [⇢ ⇢ ⇢ 51. perldaemon](#51-perldaemon) +* [⇢ ⇢ ⇢ 52. jsmstrade](#52-jsmstrade) +* [⇢ ⇢ ⇢ 53. japi](#53-japi) +* [⇢ ⇢ ⇢ 54. perl-poetry](#54-perl-poetry) +* [⇢ ⇢ ⇢ 55. muttdelay](#55-muttdelay) +* [⇢ ⇢ ⇢ 56. netdiff](#56-netdiff) +* [⇢ ⇢ ⇢ 57. debroid](#57-debroid) +* [⇢ ⇢ ⇢ 58. hsbot](#58-hsbot) +* [⇢ ⇢ ⇢ 59. cpuinfo](#59-cpuinfo) +* [⇢ ⇢ ⇢ 60. template](#60-template) +* [⇢ ⇢ ⇢ 61. awksite](#61-awksite) +* [⇢ ⇢ ⇢ 62. dyndns](#62-dyndns) +* [⇢ ⇢ ⇢ 63. vs-sim](#63-vs-sim) ## Overall Statistics -* 📦 Total Projects: 62 -* 📊 Total Commits: 14,734 -* 📈 Total Lines of Code: 326,878 -* 📄 Total Lines of Documentation: 44,373 -* 💻 Languages: Go (32.9%), Java (12.6%), YAML (9.3%), C++ (7.7%), Shell (6.5%), C (5.9%), XML (5.9%), Perl (5.9%), C/C++ (5.0%), HTML (1.8%), Config (1.3%), Ruby (1.0%), HCL (0.8%), Python (0.8%), CSS (0.7%), Make (0.6%), JSON (0.4%), Raku (0.3%), TOML (0.2%), Haskell (0.2%), JavaScript (0.2%), Docker (0.1%) -* 📚 Documentation: Markdown (72.6%), Text (26.1%), LaTeX (1.3%) -* 🚀 Release Status: 38 released, 24 experimental (61.3% with releases, 38.7% experimental) +* 📦 Total Projects: 63 +* 📊 Total Commits: 13,313 +* 📈 Total Lines of Code: 314,278 +* 📄 Total Lines of Documentation: 41,499 +* 💻 Languages: Go (36.1%), Java (13.1%), C++ (8.1%), Shell (6.5%), C (6.3%), XML (6.1%), Perl (5.5%), C/C++ (5.2%), YAML (5.0%), HTML (1.9%), Config (1.3%), Ruby (1.0%), HCL (0.9%), CSS (0.7%), Python (0.7%), Make (0.5%), JSON (0.4%), TOML (0.2%), Haskell (0.2%), JavaScript (0.2%), Raku (0.1%) +* 📚 Documentation: Markdown (70.1%), Text (28.6%), LaTeX (1.4%) +* 🚀 Release Status: 39 released, 24 experimental (61.9% with releases, 38.1% experimental) ## Projects @@ -92,7 +93,7 @@ This page showcases my side projects, providing an overview of what each project * 📈 Lines of Code: 29895 * 📄 Lines of Documentation: 5502 * 📅 Development Period: 2025-08-01 to 2026-02-13 -* 🏆 Score: 783.9 (combines code size and activity) +* 🏆 Score: 365.1 (combines code size and activity) * ⚖️ License: No license found * 🏷️ Latest Release: v0.21.0 (2026-02-12) @@ -108,7 +109,29 @@ The project is implemented as an LSP server written in Go, with a TUI component --- -### 2. epimetheus +### 2. dotfiles + +* 💻 Languages: Shell (58.9%), CSS (11.0%), Config (10.2%), TOML (10.1%), Ruby (8.4%), JSON (1.1%), INI (0.2%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 776 +* 📈 Lines of Code: 2960 +* 📄 Lines of Documentation: 653 +* 📅 Development Period: 2023-07-30 to 2026-02-21 +* 🏆 Score: 364.6 (combines code size and activity) +* ⚖️ License: No license found +* 🧪 Status: Experimental (no releases yet) + + +This is a personal dotfiles management project that uses [Rex](https://www.rexify.org/) (a Perl-based infrastructure automation framework) to declaratively install and synchronize configuration files across local machines and remote servers. The `Rexfile` defines individual tasks for each config area — shell (bash, zsh, fish), editor (Helix), terminal (Ghostty, tmux), window manager (Sway/Waybar), SSH, scripts, Pipewire audio, AI prompt links, and more — plus OS-specific package installation tasks for Fedora, FreeBSD, and Termux. A top-level `home` task runs all `home_*` tasks at once for a full install. + +The architecture is straightforward: config files live in subdirectories mirroring their purpose, and helper functions (`ensure_file`, `ensure_dir`) copy or symlink them into the appropriate `$HOME` locations with correct permissions. It supports both a public repo (this one) and a private companion repo for sensitive configs like calendar data, keeping secrets separate while sharing the same deployment mechanism. + +[View on Codeberg](https://codeberg.org/snonux/dotfiles) +[View on GitHub](https://github.com/snonux/dotfiles) + +--- + +### 3. epimetheus * 💻 Languages: Go (85.2%), Shell (14.8%) * 📚 Documentation: Markdown (100.0%) @@ -116,7 +139,7 @@ The project is implemented as an LSP server written in Go, with a TUI component * 📈 Lines of Code: 5199 * 📄 Lines of Documentation: 1734 * 📅 Development Period: 2026-02-07 to 2026-02-14 -* 🏆 Score: 703.4 (combines code size and activity) +* 🏆 Score: 314.1 (combines code size and activity) * ⚖️ License: No license found * 🧪 Status: Experimental (no releases yet) @@ -132,7 +155,7 @@ The architecture routes current data (<5 min old) through Pushgateway where Prom --- -### 3. conf +### 4. conf * 💻 Languages: YAML (80.7%), Perl (10.0%), Shell (6.1%), Python (2.3%), Docker (0.7%), Config (0.2%), HTML (0.1%) * 📚 Documentation: Markdown (97.1%), Text (2.9%) @@ -140,7 +163,7 @@ The architecture routes current data (<5 min old) through Pushgateway where Prom * 📈 Lines of Code: 19079 * 📄 Lines of Documentation: 6585 * 📅 Development Period: 2021-12-28 to 2026-02-08 -* 🏆 Score: 407.1 (combines code size and activity) +* 🏆 Score: 250.9 (combines code size and activity) * ⚖️ License: No license found * 🧪 Status: Experimental (no releases yet) @@ -154,7 +177,7 @@ The project is organized into distinct subdirectories: `dotfiles/` contains shel --- -### 4. dotfiles +### 5. dotfiles.bak * 💻 Languages: Shell (59.2%), CSS (10.9%), Config (10.1%), TOML (10.0%), Ruby (8.4%), JSON (1.1%), INI (0.2%) * 📚 Documentation: Markdown (100.0%) @@ -162,39 +185,17 @@ The project is organized into distinct subdirectories: `dotfiles/` contains shel * 📈 Lines of Code: 2988 * 📄 Lines of Documentation: 423 * 📅 Development Period: 2023-07-30 to 2026-02-14 -* 🏆 Score: 390.7 (combines code size and activity) +* 🏆 Score: 225.0 (combines code size and activity) * ⚖️ License: No license found * 🧪 Status: Experimental (no releases yet) -This is a personal dotfiles management project that uses [Rex](https://www.rexify.org/) (a Perl-based infrastructure automation framework) to declaratively install and synchronize configuration files across local machines and remote servers. The `Rexfile` defines individual tasks for each config area — shell (bash, zsh, fish), editor (Helix), terminal (Ghostty, tmux), window manager (Sway/Waybar), SSH, scripts, Pipewire audio, AI prompt links, and more — plus OS-specific package installation tasks for Fedora, FreeBSD, and Termux. A top-level `home` task runs all `home_*` tasks at once for a full install. +This is a **personal dotfiles management repository** that uses [Rex](https://www.rexify.org/) (a Perl-based infrastructure automation framework) to declaratively install configuration files across multiple machines — both locally (laptop/workstation) and remotely (servers). The `Rexfile` defines granular tasks (e.g., `home_bash`, `home_tmux`, `home_sway`) that copy or symlink config files for tools like Bash, Fish, ZSH, tmux, Helix, Ghostty, Sway/Waybar, Pipewire, SSH, and AI coding assistants (Cursor, Claude, Amp, OpenCode). A top-level `home` task runs all `home_*` tasks at once. It also includes platform-specific package installation tasks for Fedora, FreeBSD, and Termux. -The architecture is straightforward: config files live in subdirectories mirroring their purpose, and helper functions (`ensure_file`, `ensure_dir`) copy or symlink them into the appropriate `$HOME` locations with correct permissions. It supports both a public repo (this one) and a private companion repo for sensitive configs like calendar data, keeping secrets separate while sharing the same deployment mechanism. +The architecture is straightforward: source configs live in categorized subdirectories (e.g., `bash/`, `fish/`, `tmux/`), and Rex's `file` resource ensures they're placed at the correct `~/.config/...` or `~/...` paths with proper permissions. Some configs (like fish and gitsyncer) use symlinks instead of copies for live editing. The repo also supports a private companion repo (`conf_private/dotfiles`) for sensitive files like calendar data. -[View on Codeberg](https://codeberg.org/snonux/dotfiles) -[View on GitHub](https://github.com/snonux/dotfiles) - ---- - -### 5. conf.bak - -* 💻 Languages: YAML (68.9%), Shell (13.1%), Perl (9.0%), Python (2.0%), Config (1.6%), CSS (1.5%), TOML (1.4%), Ruby (1.2%), Docker (0.6%), Lua (0.3%), JSON (0.2%), HTML (0.1%) -* 📚 Documentation: Markdown (97.1%), Text (2.9%) -* 📊 Commits: 2306 -* 📈 Lines of Code: 21210 -* 📄 Lines of Documentation: 6495 -* 📅 Development Period: 2021-12-28 to 2026-02-07 -* 🏆 Score: 331.0 (combines code size and activity) -* ⚖️ License: No license found -* 🧪 Status: Experimental (no releases yet) - - -This is a personal infrastructure-as-code and configuration management repository. It centralizes the author's self-hosted service configurations across multiple machines and environments, using **Rex** (a Perl-based deployment tool) as the orchestration layer — the top-level `Rexfile` auto-loads sub-project Rexfiles from each directory. The repo is organized by target: **babylon5** contains Docker run scripts for self-hosted services (Vaultwarden, Nextcloud, Audiobookshelf, etc.), **f3s** holds a large collection of Kubernetes/Helm manifests for a k3s cluster (covering ~30 services including ArgoCD, Traefik, Prometheus, Loki, Immich, Jellyfin, and more), **frontends** manages frontend server configs (e.g., Apache/Nginx, system scripts), and **dotfiles** stores personal shell and editor configs (fish, zsh, Neovim, Helix, Sway, tmux, Ghostty, etc.). - -The repository is useful as a single source of truth for reproducing the author's entire homelab and workstation setup. By versioning everything in Git — from k8s manifests and Docker commands to dotfiles and code snippets — it enables consistent, repeatable deployments and easy recovery. The Rex-based structure allows deploying or updating any target system with a single command. - -[View on Codeberg](https://codeberg.org/snonux/conf.bak) -[View on GitHub](https://github.com/snonux/conf.bak) +[View on Codeberg](https://codeberg.org/snonux/dotfiles.bak) +[View on GitHub](https://github.com/snonux/dotfiles.bak) --- @@ -206,7 +207,7 @@ The repository is useful as a single source of truth for reproducing the author' * 📈 Lines of Code: 18702 * 📄 Lines of Documentation: 174 * 📅 Development Period: 2021-04-29 to 2026-02-07 -* 🏆 Score: 322.6 (combines code size and activity) +* 🏆 Score: 215.8 (combines code size and activity) * ⚖️ License: No license found * 🧪 Status: Experimental (no releases yet) @@ -226,7 +227,7 @@ foo.zone: source code repository. * 📈 Lines of Code: 1664 * 📄 Lines of Documentation: 853 * 📅 Development Period: 2026-01-25 to 2026-01-27 -* 🏆 Score: 154.0 (combines code size and activity) +* 🏆 Score: 117.3 (combines code size and activity) * ⚖️ License: No license found * 🧪 Status: Experimental (no releases yet) @@ -248,7 +249,7 @@ The architecture keeps content separate from presentation: book metadata lives i * 📈 Lines of Code: 774 * 📄 Lines of Documentation: 119 * 📅 Development Period: 2026-01-09 to 2026-01-09 -* 🏆 Score: 78.1 (combines code size and activity) +* 🏆 Score: 66.4 (combines code size and activity) * ⚖️ License: MIT * 🧪 Status: Experimental (no releases yet) @@ -270,7 +271,7 @@ The implementation uses a fat JAR built with Maven, requiring Java 17+. It's des * 📈 Lines of Code: 3875 * 📄 Lines of Documentation: 394 * 📅 Development Period: 2023-04-17 to 2026-02-08 -* 🏆 Score: 35.5 (combines code size and activity) +* 🏆 Score: 33.3 (combines code size and activity) * ⚖️ License: Custom License * 🏷️ Latest Release: v1.4.0 (2026-02-08) @@ -290,11 +291,11 @@ The architecture is straightforward: JSON configuration defines checks (plugin p * 💻 Languages: Go (66.1%), HTML (33.9%) * 📚 Documentation: Markdown (100.0%) -* 📊 Commits: 24 +* 📊 Commits: 14 * 📈 Lines of Code: 5921 * 📄 Lines of Documentation: 83 * 📅 Development Period: 2025-10-01 to 2026-01-28 -* 🏆 Score: 32.8 (combines code size and activity) +* 🏆 Score: 31.0 (combines code size and activity) * ⚖️ License: No license found * 🏷️ Latest Release: v0.4.0 (2026-01-28) @@ -318,7 +319,7 @@ The implementation follows clean Go architecture with domain logic organized und * 📈 Lines of Code: 452 * 📄 Lines of Documentation: 80 * 📅 Development Period: 2025-11-25 to 2025-11-25 -* 🏆 Score: 32.4 (combines code size and activity) +* 🏆 Score: 30.0 (combines code size and activity) * ⚖️ License: No license found * 🏷️ Latest Release: v0.1.0 (2025-11-25) @@ -340,7 +341,7 @@ The tool is built as a simple Go CLI application with a standard project layout * 📈 Lines of Code: 13129 * 📄 Lines of Documentation: 377 * 📅 Development Period: 2025-07-14 to 2026-01-21 -* 🏆 Score: 27.3 (combines code size and activity) +* 🏆 Score: 26.1 (combines code size and activity) * ⚖️ License: MIT * 🏷️ Latest Release: v0.8.0 (2026-01-21) @@ -358,7 +359,33 @@ The project offers both a keyboard-driven GUI for interactive use and a CLI for --- -### 13. gitsyncer +### 13. ior + +* 💻 Languages: Go (63.2%), C (36.0%), C/C++ (0.8%) +* 📚 Documentation: Markdown (79.3%), Text (20.7%) +* 📊 Commits: 344 +* 📈 Lines of Code: 15784 +* 📄 Lines of Documentation: 2313 +* 📅 Development Period: 2024-01-18 to 2026-02-21 +* 🏆 Score: 20.9 (combines code size and activity) +* ⚖️ License: No license found +* 🧪 Status: Experimental (no releases yet) + + +[](showcase/ior/image-1.png) + +I/O Riot NG is a Linux-only performance analysis tool that uses BPF (Berkeley Packet Filter) to trace synchronous I/O syscalls and measure their execution time. It captures stack traces during I/O operations and generates compressed output in a format compatible with Inferno FlameGraphs, allowing developers to visually identify performance bottlenecks caused by blocking I/O calls. This makes it particularly useful for diagnosing latency issues in applications where I/O operations are suspected of causing performance degradation. + +[](showcase/ior/image-2.svg) + +The tool is implemented in Go and C, leveraging libbpfgo for BPF interaction. It automatically generates BPF tracepoint handlers and Go type definitions from Linux kernel tracepoint data, attaches to syscall entry/exit points, and collects timing data with minimal overhead. The project is a modern successor to the original I/O Riot (which used SystemTap), offering better performance and easier deployment through BPF's built-in kernel support. + +[View on Codeberg](https://codeberg.org/snonux/ior) +[View on GitHub](https://github.com/snonux/ior) + +--- + +### 14. gitsyncer * 💻 Languages: Go (92.5%), Shell (7.1%), JSON (0.4%) * 📚 Documentation: Markdown (100.0%) @@ -366,7 +393,7 @@ The project offers both a keyboard-driven GUI for interactive use and a CLI for * 📈 Lines of Code: 10446 * 📄 Lines of Documentation: 2445 * 📅 Development Period: 2025-06-23 to 2026-02-07 -* 🏆 Score: 21.5 (combines code size and activity) +* 🏆 Score: 20.7 (combines code size and activity) * ⚖️ License: BSD-2-Clause * 🏷️ Latest Release: v0.12.0 (2026-02-07) @@ -380,28 +407,6 @@ The implementation uses a git remotes approach: it clones from one organization, --- -### 14. foostats - -* 💻 Languages: Perl (100.0%) -* 📚 Documentation: Markdown (54.6%), Text (45.4%) -* 📊 Commits: 98 -* 📈 Lines of Code: 1902 -* 📄 Lines of Documentation: 423 -* 📅 Development Period: 2023-01-02 to 2025-11-01 -* 🏆 Score: 18.5 (combines code size and activity) -* ⚖️ License: Custom License -* 🏷️ Latest Release: v0.2.0 (2025-10-21) - - -**foostats** is a privacy-respecting web analytics tool designed for OpenBSD that processes both traditional HTTP/HTTPS server logs and Gemini protocol logs to generate anonymous site statistics. It immediately hashes all IP addresses using SHA3-512 before storage, ensuring no personal information is retained while still providing meaningful traffic insights. The tool supports distributed deployments with node-to-node replication, filters out suspicious requests based on configurable patterns, and generates comprehensive daily and monthly reports in both Gemtext and HTML formats. It's particularly useful for privacy-conscious site operators who need traffic analytics without compromising visitor anonymity. - -The implementation uses a modular Perl architecture with specialized components: **Logreader** parses logs from httpd and Gemini servers (vger/relayd), **Filter** blocks suspicious patterns, **Aggregator** compiles statistics, **Replicator** synchronizes data between partner nodes, and **Reporter** generates human-readable reports. Statistics are stored as compressed JSON files, supporting both IPv4 and IPv6, with built-in feed analytics for tracking Atom/RSS and Gemfeed subscribers. The tool is designed specifically for the foo.zone ecosystem but can be adapted for any OpenBSD-based hosting environment requiring privacy-first analytics. - -[View on Codeberg](https://codeberg.org/snonux/foostats) -[View on GitHub](https://github.com/snonux/foostats) - ---- - ### 15. tasksamurai * 💻 Languages: Go (99.8%), YAML (0.2%) @@ -410,7 +415,7 @@ The implementation uses a modular Perl architecture with specialized components: * 📈 Lines of Code: 6544 * 📄 Lines of Documentation: 254 * 📅 Development Period: 2025-06-19 to 2026-02-04 -* 🏆 Score: 18.4 (combines code size and activity) +* 🏆 Score: 17.9 (combines code size and activity) * ⚖️ License: BSD-2-Clause * 🏷️ Latest Release: v0.11.0 (2026-02-04) @@ -428,29 +433,25 @@ Under the hood, Task Samurai acts as a front-end wrapper that invokes the native --- -### 16. 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%) -* 📊 Commits: 337 -* 📈 Lines of Code: 13072 -* 📄 Lines of Documentation: 680 -* 📅 Development Period: 2024-01-18 to 2025-10-09 -* 🏆 Score: 16.7 (combines code size and activity) -* ⚖️ License: No license found -* 🧪 Status: Experimental (no releases yet) - +### 16. foostats -[](showcase/ior/image-1.png) +* 💻 Languages: Perl (100.0%) +* 📚 Documentation: Markdown (54.6%), Text (45.4%) +* 📊 Commits: 98 +* 📈 Lines of Code: 1902 +* 📄 Lines of Documentation: 423 +* 📅 Development Period: 2023-01-02 to 2025-11-01 +* 🏆 Score: 17.8 (combines code size and activity) +* ⚖️ License: Custom License +* 🏷️ Latest Release: v0.2.0 (2025-10-21) -I/O Riot NG is a Linux-only performance analysis tool that uses BPF (Berkeley Packet Filter) to trace synchronous I/O syscalls and measure their execution time. It captures stack traces during I/O operations and generates compressed output in a format compatible with Inferno FlameGraphs, allowing developers to visually identify performance bottlenecks caused by blocking I/O calls. This makes it particularly useful for diagnosing latency issues in applications where I/O operations are suspected of causing performance degradation. -[](showcase/ior/image-2.svg) +**foostats** is a privacy-respecting web analytics tool designed for OpenBSD that processes both traditional HTTP/HTTPS server logs and Gemini protocol logs to generate anonymous site statistics. It immediately hashes all IP addresses using SHA3-512 before storage, ensuring no personal information is retained while still providing meaningful traffic insights. The tool supports distributed deployments with node-to-node replication, filters out suspicious requests based on configurable patterns, and generates comprehensive daily and monthly reports in both Gemtext and HTML formats. It's particularly useful for privacy-conscious site operators who need traffic analytics without compromising visitor anonymity. -The tool is implemented in Go and C, leveraging libbpfgo for BPF interaction. It automatically generates BPF tracepoint handlers and Go type definitions from Linux kernel tracepoint data, attaches to syscall entry/exit points, and collects timing data with minimal overhead. The project is a modern successor to the original I/O Riot (which used SystemTap), offering better performance and easier deployment through BPF's built-in kernel support. +The implementation uses a modular Perl architecture with specialized components: **Logreader** parses logs from httpd and Gemini servers (vger/relayd), **Filter** blocks suspicious patterns, **Aggregator** compiles statistics, **Replicator** synchronizes data between partner nodes, and **Reporter** generates human-readable reports. Statistics are stored as compressed JSON files, supporting both IPv4 and IPv6, with built-in feed analytics for tracking Atom/RSS and Gemfeed subscribers. The tool is designed specifically for the foo.zone ecosystem but can be adapted for any OpenBSD-based hosting environment requiring privacy-first analytics. -[View on Codeberg](https://codeberg.org/snonux/ior) -[View on GitHub](https://github.com/snonux/ior) +[View on Codeberg](https://codeberg.org/snonux/foostats) +[View on GitHub](https://github.com/snonux/foostats) --- @@ -462,7 +463,7 @@ The tool is implemented in Go and C, leveraging libbpfgo for BPF interaction. It * 📈 Lines of Code: 1538 * 📄 Lines of Documentation: 99 * 📅 Development Period: 2025-06-25 to 2026-01-02 -* 🏆 Score: 16.7 (combines code size and activity) +* 🏆 Score: 16.1 (combines code size and activity) * ⚖️ License: MIT * 🏷️ Latest Release: v0.3.0 (2026-01-02) @@ -484,7 +485,7 @@ The architecture is straightforward: it's a Go-based CLI application that persis * 📈 Lines of Code: 20091 * 📄 Lines of Documentation: 5674 * 📅 Development Period: 2020-01-09 to 2025-06-20 -* 🏆 Score: 15.7 (combines code size and activity) +* 🏆 Score: 15.4 (combines code size and activity) * ⚖️ License: Apache-2.0 * 🏷️ Latest Release: v4.3.3 (2024-08-23) @@ -510,7 +511,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: 15.0 (combines code size and activity) +* 🏆 Score: 14.6 (combines code size and activity) * ⚖️ License: Custom License * 🏷️ Latest Release: v1.2.3 (2026-01-31) @@ -536,7 +537,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: 14.4 (combines code size and activity) +* 🏆 Score: 14.1 (combines code size and activity) * ⚖️ License: Custom License * 🧪 Status: Experimental (no releases yet) @@ -560,7 +561,7 @@ The implementation follows a modular Java architecture with clear separation bet * 📈 Lines of Code: 563 * 📄 Lines of Documentation: 24 * 📅 Development Period: 2025-04-18 to 2026-01-20 -* 🏆 Score: 10.1 (combines code size and activity) +* 🏆 Score: 9.9 (combines code size and activity) * ⚖️ License: Custom License * 🏷️ Latest Release: v1.0.0 (2025-05-11) @@ -582,7 +583,7 @@ The tool reads host definitions from a YAML file specifying network interfaces ( * 📈 Lines of Code: 2288 * 📄 Lines of Documentation: 1180 * 📅 Development Period: 2021-05-21 to 2025-12-31 -* 🏆 Score: 9.9 (combines code size and activity) +* 🏆 Score: 9.7 (combines code size and activity) * ⚖️ License: GPL-3.0 * 🏷️ Latest Release: 3.0.0 (2024-10-01) @@ -604,7 +605,7 @@ The architecture leverages GNU utilities (sed, grep, date) and optional tools li * 📈 Lines of Code: 1377 * 📄 Lines of Documentation: 113 * 📅 Development Period: 2024-12-05 to 2025-11-26 -* 🏆 Score: 8.9 (combines code size and activity) +* 🏆 Score: 8.7 (combines code size and activity) * ⚖️ License: Custom License * 🧪 Status: Experimental (no releases yet) @@ -626,7 +627,7 @@ The implementation centers around a DSL module that provides keywords like `file * 📈 Lines of Code: 2851 * 📄 Lines of Documentation: 52 * 📅 Development Period: 2023-08-27 to 2025-08-08 -* 🏆 Score: 5.0 (combines code size and activity) +* 🏆 Score: 4.9 (combines code size and activity) * ⚖️ License: MIT * 🧪 Status: Experimental (no releases yet) @@ -648,7 +649,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: 4.9 (combines code size and activity) +* 🏆 Score: 4.8 (combines code size and activity) * ⚖️ License: MIT * 🏷️ Latest Release: v0.0.4 (2025-09-13) @@ -674,7 +675,7 @@ The implementation leverages Go's cross-compilation capabilities and Fyne's UI a * 📈 Lines of Code: 33 * 📄 Lines of Documentation: 3 * 📅 Development Period: 2025-04-03 to 2025-04-03 -* 🏆 Score: 4.8 (combines code size and activity) +* 🏆 Score: 4.7 (combines code size and activity) * ⚖️ License: No license found * 🧪 Status: Experimental (no releases yet) @@ -688,7 +689,29 @@ The implementation is intentionally straightforward, using Go's built-in testing --- -### 27. gorum +### 27. goprecords + +* 💻 Languages: Go (100.0%) +* 📚 Documentation: Markdown (100.0%) +* 📊 Commits: 104 +* 📈 Lines of Code: 2527 +* 📄 Lines of Documentation: 489 +* 📅 Development Period: 2013-03-22 to 2026-02-20 +* 🏆 Score: 4.5 (combines code size and activity) +* ⚖️ License: No license found +* 🏷️ Latest Release: v0.2.1 (2026-02-20) + + +**goprecords** is a Go CLI tool that generates global uptime reports by aggregating `uptimed` record files from multiple hosts. It ranks machines across metrics like total uptime, boot count, downtime, lifespan, and a combined score—organized by host, kernel version, kernel major version, or kernel name. Output is available in plaintext, Markdown, or Gemtext. It can either report directly from a stats directory or import records into SQLite for repeated querying. + +Under the hood, it parses `uptimed`'s simple `uptime:boottime:kernel` record format, groups entries by the chosen category, and computes aggregates. The architecture is straightforward: a `cmd/goprecords` entry point handles CLI flags and subcommands (`import`, `query`, or direct reporting), while `internal/goprecords` contains the core logic for parsing, aggregation, database operations, and report formatting. It uses `modernc.org/sqlite` (a pure-Go SQLite driver) and Mage for build automation. + +[View on Codeberg](https://codeberg.org/snonux/goprecords) +[View on GitHub](https://github.com/snonux/goprecords) + +--- + +### 28. gorum * 💻 Languages: Go (91.3%), JSON (6.4%), YAML (2.3%) * 📚 Documentation: Markdown (100.0%) @@ -696,7 +719,7 @@ The implementation is intentionally straightforward, using Go's built-in testing * 📈 Lines of Code: 1525 * 📄 Lines of Documentation: 15 * 📅 Development Period: 2023-04-17 to 2023-11-19 -* 🏆 Score: 3.5 (combines code size and activity) +* 🏆 Score: 3.4 (combines code size and activity) * ⚖️ License: Custom License * 🧪 Status: Experimental (no releases yet) @@ -711,7 +734,7 @@ The architecture consists of client/server components for inter-node communicati --- -### 28. guprecords +### 29. guprecords * 💻 Languages: Raku (100.0%) * 📚 Documentation: Markdown (100.0%) @@ -733,7 +756,7 @@ The implementation uses an object-oriented architecture with specialized classes --- -### 29. geheim +### 30. geheim * 💻 Languages: Ruby (86.7%), Shell (13.3%) * 📚 Documentation: Markdown (100.0%) @@ -755,7 +778,7 @@ The architecture leverages Git for storage and synchronization across multiple r --- -### 30. docker-radicale-server +### 31. docker-radicale-server * 💻 Languages: Make (57.5%), Docker (42.5%) * 📚 Documentation: Markdown (100.0%) @@ -777,7 +800,7 @@ The implementation uses Alpine Linux as the base image for a minimal footprint, --- -### 31. algorithms +### 32. algorithms * 💻 Languages: Go (99.2%), Make (0.8%) * 📚 Documentation: Markdown (100.0%) @@ -800,7 +823,7 @@ The project is implemented in Go 1.19+ with comprehensive unit tests and benchma --- -### 32. randomjournalpage +### 33. randomjournalpage * 💻 Languages: Shell (94.1%), Make (5.9%) * 📚 Documentation: Markdown (100.0%) @@ -823,7 +846,7 @@ The implementation is a straightforward bash script using `qpdf` for PDF extract --- -### 33. photoalbum +### 34. photoalbum * 💻 Languages: Shell (80.1%), Make (12.3%), Config (7.6%) * 📚 Documentation: Markdown (100.0%) @@ -846,7 +869,7 @@ The architecture is straightforward and Unix-philosophy driven: users configure --- -### 34. ioriot +### 35. ioriot * 💻 Languages: C (55.5%), C/C++ (24.0%), Config (19.6%), Make (1.0%) * 📚 Documentation: Markdown (100.0%) @@ -871,7 +894,7 @@ The key advantage over traditional benchmarking tools is that it reproduces actu --- -### 35. ipv6test +### 36. ipv6test * 💻 Languages: Perl (65.8%), Docker (34.2%) * 📚 Documentation: Markdown (100.0%) @@ -893,7 +916,7 @@ The implementation uses a simple CGI script ([index.pl](file:///home/paul/git/gi --- -### 36. sway-autorotate +### 37. sway-autorotate * 💻 Languages: Shell (100.0%) * 📚 Documentation: Markdown (100.0%) @@ -915,7 +938,7 @@ The implementation uses a bash script that continuously monitors the `monitor-se --- -### 37. mon +### 38. mon * 💻 Languages: Perl (96.5%), Shell (1.8%), Make (1.2%), Config (0.4%) * 📚 Documentation: Text (100.0%) @@ -938,7 +961,7 @@ Implemented in Perl, `mon` features automatic JSON backup before modifications ( --- -### 38. staticfarm-apache-handlers +### 39. staticfarm-apache-handlers * 💻 Languages: Perl (96.4%), Make (3.6%) * 📚 Documentation: Text (100.0%) @@ -961,7 +984,7 @@ Both handlers are implemented as Perl modules using Apache2's mod_perl API, conf --- -### 39. pingdomfetch +### 40. pingdomfetch * 💻 Languages: Perl (97.3%), Make (2.7%) * 📚 Documentation: Text (100.0%) @@ -984,7 +1007,29 @@ The tool is implemented around a hierarchical configuration system (`/etc/pingdo --- -### 40. xerl +### 41. fype + +* 💻 Languages: C (71.8%), C/C++ (20.0%), HTML (6.3%), Make (1.8%) +* 📚 Documentation: Text (65.1%), LaTeX (21.0%), Markdown (14.0%) +* 📊 Commits: 107 +* 📈 Lines of Code: 9363 +* 📄 Lines of Documentation: 2713 +* 📅 Development Period: 2008-05-15 to 2026-02-20 +* 🏆 Score: 0.9 (combines code size and activity) +* ⚖️ License: Custom License +* 🧪 Status: Experimental (no releases yet) + + +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. + +[View on Codeberg](https://codeberg.org/snonux/fype) +[View on GitHub](https://github.com/snonux/fype) + +--- + +### 42. xerl * 💻 Languages: Perl (98.3%), Config (1.2%), Make (0.5%) * 📊 Commits: 670 @@ -1005,7 +1050,7 @@ The implementation follows strict OO Perl conventions with explicit typing and p --- -### 41. ychat +### 43. ychat * 💻 Languages: C++ (49.9%), C/C++ (22.2%), Shell (20.6%), Perl (2.5%), HTML (1.9%), Config (1.8%), Make (0.9%), CSS (0.2%) * 📚 Documentation: Text (100.0%) @@ -1028,7 +1073,7 @@ The architecture emphasizes speed and scalability through several key design cho --- -### 42. fapi +### 44. fapi * 💻 Languages: Python (96.6%), Make (3.1%), Config (0.3%) * 📚 Documentation: Text (98.3%), Markdown (1.7%) @@ -1050,7 +1095,7 @@ The tool is implemented in Python and depends on the bigsuds library (F5's iCont --- -### 43. perl-c-fibonacci +### 45. perl-c-fibonacci * 💻 Languages: C (80.4%), Make (19.6%) * 📚 Documentation: Text (100.0%) @@ -1071,7 +1116,7 @@ perl-c-fibonacci: source code repository. --- -### 44. netcalendar +### 46. netcalendar * 💻 Languages: Java (83.0%), HTML (12.9%), XML (3.0%), CSS (0.8%), Make (0.2%) * 📚 Documentation: Text (89.7%), Markdown (10.3%) @@ -1098,7 +1143,7 @@ The key feature is its intelligent color-coded event visualization system that h --- -### 45. loadbars +### 47. loadbars * 💻 Languages: Perl (97.4%), Make (2.6%) * 📚 Documentation: Text (100.0%) @@ -1119,10 +1164,10 @@ loadbars: source code repository. --- -### 46. gotop +### 48. gotop * 💻 Languages: Go (98.0%), Make (2.0%) -* 📚 Documentation: Markdown (50.0%), Text (50.0%) +* 📚 Documentation: Text (50.0%), Markdown (50.0%) * 📊 Commits: 57 * 📈 Lines of Code: 499 * 📄 Lines of Documentation: 8 @@ -1142,30 +1187,7 @@ The implementation uses a concurrent architecture with goroutines for data colle --- -### 47. fype - -* 💻 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 -* 🧪 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. - -[View on Codeberg](https://codeberg.org/snonux/fype) -[View on GitHub](https://github.com/snonux/fype) - ---- - -### 48. rubyfy +### 49. rubyfy * 💻 Languages: Ruby (98.5%), JSON (1.5%) * 📚 Documentation: Markdown (100.0%) @@ -1188,7 +1210,7 @@ The tool is implemented as a lightweight Ruby script that prioritizes simplicity --- -### 49. pwgrep +### 50. pwgrep * 💻 Languages: Shell (85.0%), Make (15.0%) * 📚 Documentation: Text (80.8%), Markdown (19.2%) @@ -1211,7 +1233,7 @@ The architecture is lightweight and Unix-philosophy driven: password databases a --- -### 50. perldaemon +### 51. perldaemon * 💻 Languages: Perl (72.3%), Shell (23.8%), Config (3.9%) * 📊 Commits: 110 @@ -1232,7 +1254,7 @@ The implementation centers around an event loop with configurable intervals that --- -### 51. jsmstrade +### 52. jsmstrade * 💻 Languages: Java (76.0%), Shell (15.4%), XML (8.6%) * 📚 Documentation: Markdown (100.0%) @@ -1257,7 +1279,7 @@ The implementation is minimalistic, consisting of just three main Java classes ( --- -### 52. japi +### 53. japi * 💻 Languages: Perl (78.3%), Make (21.7%) * 📚 Documentation: Text (100.0%) @@ -1280,7 +1302,7 @@ Implemented in Perl using the JIRA::REST CPAN module, japi supports flexible con --- -### 53. perl-poetry +### 54. perl-poetry * 💻 Languages: Perl (100.0%) * 📚 Documentation: Markdown (100.0%) @@ -1303,7 +1325,7 @@ This project exemplifies creative coding where Perl keywords and constructs are --- -### 54. muttdelay +### 55. muttdelay * 💻 Languages: Make (47.1%), Shell (46.3%), Vim Script (5.9%), Config (0.7%) * 📚 Documentation: Text (100.0%) @@ -1326,7 +1348,7 @@ The architecture uses three components working together: a Vim plugin that provi --- -### 55. netdiff +### 56. netdiff * 💻 Languages: Shell (52.2%), Make (46.3%), Config (1.5%) * 📚 Documentation: Text (100.0%) @@ -1349,7 +1371,7 @@ The tool uses a clever client-server architecture where you run the identical co --- -### 56. debroid +### 57. debroid * 💻 Languages: Shell (92.0%), Make (8.0%) * 📚 Documentation: Markdown (100.0%) @@ -1374,7 +1396,7 @@ The implementation uses a two-stage debootstrap process: first creating a Debian --- -### 57. hsbot +### 58. hsbot * 💻 Languages: Haskell (98.5%), Make (1.5%) * 📊 Commits: 80 @@ -1395,7 +1417,7 @@ The implementation uses a modular design with core components separated into Bas --- -### 58. cpuinfo +### 59. cpuinfo * 💻 Languages: Shell (53.2%), Make (46.8%) * 📚 Documentation: Text (100.0%) @@ -1418,7 +1440,7 @@ The implementation is elegantly simple: a single shell script ([src/cpuinfo](fil --- -### 59. template +### 60. template * 💻 Languages: Make (89.2%), Shell (10.8%) * 📚 Documentation: Text (100.0%) @@ -1441,7 +1463,7 @@ The implementation uses a **Makefile-based build system** with targets for compi --- -### 60. awksite +### 61. awksite * 💻 Languages: AWK (72.1%), HTML (16.4%), Config (11.5%) * 📚 Documentation: Text (60.0%), Markdown (40.0%) @@ -1464,7 +1486,7 @@ The architecture is remarkably simple: a single AWK script ([index.cgi](file:/// --- -### 61. dyndns +### 62. dyndns * 💻 Languages: Shell (100.0%) * 📚 Documentation: Text (100.0%) @@ -1487,7 +1509,7 @@ The implementation uses a two-tier security architecture: SSH public key authent --- -### 62. vs-sim +### 63. vs-sim * 📚 Documentation: Markdown (100.0%) * 📊 Commits: 411 diff --git a/about/showcase/debroid/image-1.png b/about/showcase/debroid/image-1.png index 005e7136..0b85a152 100644 --- a/about/showcase/debroid/image-1.png +++ b/about/showcase/debroid/image-1.png @@ -32,7 +32,7 @@ <link rel="preload" href="https://github.githubassets.com/assets/mona-sans-14595085164a.woff2" as="font" type="font/woff2" crossorigin> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-f30be7a1f27bcb6b.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light_high_contrast-10373d2d112fc873.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-d9d99f8c9aa4fbfd.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark_high_contrast-f68e181a9067f808.css" /><link data-color-theme="light" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light-f30be7a1f27bcb6b.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-10373d2d112fc873.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-d0145171d79f94f6.css" /><link data-color-theme="light_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind_high_contrast-1d2d2c4ffae648c4.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-11d6568044aeceeb.css" /><link data-color-theme="light_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia_high_contrast-c38f22a98f01b293.css" /><link data-color-theme="dark" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark-d9d99f8c9aa4fbfd.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-f68e181a9067f808.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-c21a8c43bc3127eb.css" /><link data-color-theme="dark_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind_high_contrast-635d755c05590766.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-1abfbdc43c9465f6.css" /><link data-color-theme="dark_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia_high_contrast-5d5617ce453e2abb.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-9b6e5c8b7f02f5ae.css" /><link data-color-theme="dark_dimmed_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed_high_contrast-1f2aa99a70f49a4b.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-8f714f203754d3e3.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light_high_contrast-852c22d357937740.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-b5a0f9dbeed37e9c.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark_high_contrast-b1b5000c4cba6bc9.css" /><link data-color-theme="light" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light-8f714f203754d3e3.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-852c22d357937740.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-cd9e31fed96ffe09.css" /><link data-color-theme="light_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind_high_contrast-d8387aac10e96d7c.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-de5a42a9379cb835.css" /><link data-color-theme="light_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia_high_contrast-b80844282a9e6620.css" /><link data-color-theme="dark" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark-b5a0f9dbeed37e9c.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-b1b5000c4cba6bc9.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-85d7bc4072a238f0.css" /><link data-color-theme="dark_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind_high_contrast-f4838f9524519a33.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-23bce8ff4d024f04.css" /><link data-color-theme="dark_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia_high_contrast-e088d4bc2d56f7d6.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-6b102382a27a656f.css" /><link data-color-theme="dark_dimmed_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed_high_contrast-1d3e6d98532ab032.css" /> <style type="text/css"> :root { @@ -44,32 +44,33 @@ } </style> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-f9161d06200ae2dc.css" /> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-ee6184595cc59cb2.css" /> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-6326a07d26552848.css" /> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-c53b912064ef8de5.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-26e89bb5a0c37ae9.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-71a44d5be3f782c5.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-95af332f763e4560.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-8ecc5798f0584cac.css" /> - <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","batch_suggested_changes","code_view_canvas_text_measurement","codespaces_prebuild_region_target_update","coding_agent_model_selection","copilot_3p_agent_hovercards","copilot_agent_sessions_alive_updates","copilot_agent_task_list_v2","copilot_agent_task_submit_with_modifier","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_ask_mode_dropdown","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_repository_picker","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_features_sql_server_logo","copilot_features_zed_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_job_result_preview","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_org_policy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spaces_server_side_menu_actions","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_stable_conversation_view","copilot_swe_agent_use_subagents","copilot_unconfigured_is_inherited","custom_instructions_file_references","custom_properties_consolidate_default_value_input","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","disable_turbo_visit","dom_node_counts","enterprise_ai_controls","failbot_report_error_react_apps_on_page","file_finder_skip_debounce","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","initial_per_page_pagination_updates","issue_fields_compact_view","issue_fields_global_search","issue_fields_report_usage","issue_fields_timeline_events","issues_cca_assign_actor_with_agent","issues_dashboard_inp_optimization","issues_expanded_file_types","issues_index_semantic_search","issues_lazy_load_comment_box_suggestions","issues_react_auto_retry_on_error","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_low_quality_comment_warning","issues_react_prohibit_title_fallback","issues_react_safari_scroll_preservation","issues_react_use_turbo_for_cross_repo_navigation","landing_pages_ninetailed","lifecycle_label_name_updates","lightningcss","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","oauth_authorize_clickjacking_protection","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","react_quality_profiling","repos_allow_finder_filters_rollout","repos_finder_layout_route","ruleset_deletion_confirmation","sample_network_conn_type","session_logs_ungroup_reasoning_text","site_calculator_actions_2025","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","suppress_non_representative_vitals","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_image_version_event","actions_workflow_language_service","alternate_user_config_repo","api_insights_show_missing_data_banner","arianotify_comprehensive_migration","batch_suggested_changes","codespaces_prebuild_region_target_update","coding_agent_model_selection","coding_agent_model_selection_all_skus","copilot_3p_agent_hovercards","copilot_agent_sessions_alive_updates","copilot_agent_snippy","copilot_agent_task_list_v2","copilot_agent_task_submit_with_modifier","copilot_agent_tasks_btn_repo","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_repository_picker","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_sql_server_logo","copilot_features_zed_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_embedded","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_use_task_name","copilot_org_policy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_stable_conversation_view","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_use_subagents","copilot_unconfigured_is_inherited","custom_instructions_file_references","custom_properties_consolidate_default_value_input","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","enterprise_ai_controls","failbot_report_error_react_apps_on_page","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","initial_per_page_pagination_updates","issue_fields_global_search","issue_fields_report_usage","issue_fields_timeline_events","issues_cca_assign_actor_with_agent","issues_dashboard_inp_optimization","issues_expanded_file_types","issues_index_semantic_search","issues_lazy_load_comment_box_suggestions","issues_react_auto_retry_on_error","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_defer_hot_cache_preheating","issues_react_deferred_list_data","issues_react_hot_cache","issues_react_low_quality_comment_warning","issues_react_prohibit_title_fallback","issues_react_safari_scroll_preservation","issues_react_use_turbo_for_cross_repo_navigation","landing_pages_ninetailed","landing_pages_web_vitals_tracking","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","oauth_authorize_clickjacking_protection","open_agent_session_in_vscode_insiders","open_agent_session_in_vscode_stable","primer_brand_next","primer_react_css_has_selector_perf","projects_assignee_max_limit","prs_conversations_react","react_quality_profiling","repos_allow_finder_filters_rollout","repos_relevance_page","ruleset_deletion_confirmation","sample_network_conn_type","session_logs_ungroup_reasoning_text","site_calculator_actions_2025","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","suppress_non_representative_vitals","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-2c87d5c76bc5d1e0.js"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-6765a7fe41fd881b.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-826e1f078bede7e7.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/19762-203ba93c6a6f3066.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/49863-8861e351482cb073.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/64220-0830c437c12dfdb8.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/environment-2f7344d002077444.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/64220-5924ae3b3c473575.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/environment-2cd02065315011b3.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/runtime-helpers-7744803ecc19870c.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/2966-25cb8e34b31306a4.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/96232-fb82336d69225835.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/41013-ac21ea90ed8590af.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/51210-185739338ae8119b.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/41121-3fac73a44ee7ce11.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/15814-aaebff5a797afefb.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/24387-6b7f5e596897eded.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/81683-740d112caee5baa9.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/46740-84bdd4782a486b80.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/81751-750bd09cbdd426df.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-aeed21930df5cfbb.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-bd46e63431b7579e.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/react-core-e91dca6e7d57c22c.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-6065e846b60ac1a6.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-559588089abef811.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/react-core-ac5286c081aff97d.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-e74a1db7c21f7e74.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/7053-20b4a6914bbde21f.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/79039-9ce5da88e09eef89.js" defer="defer"></script> @@ -77,16 +78,17 @@ <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/2887-0e9a84f5dc250853.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/26533-6b8040883d16f6ae.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/62249-2895213a788d973c.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/16674-48fe19166d21f3ab.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/56093-fc82b6004a6fe178.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/2694-372ce035e93800e0.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/56093-7e45e1dafab59419.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/28360-dc31a60141b9384f.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/65316-c849c86dc66fef72.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/22960-70bee7ef9ff9f7b2.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/22960-fce2676ce9889137.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/51683-f6844a8acd415e3b.js" defer="defer"></script> <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/76545-cf3621a1f2f36d8d.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-a5ec6565fad22fcf.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/20475-e35ac743f34dd401.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-381343b9a90bbc8b.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-dfb8b6902db23a9e.js" defer="defer"></script> +<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-core.10393900597d030e.module.css" /> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/38302-277be92deeed3c63.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-d3e65f4852a526e6.js" defer="defer"></script> <title>Page not found · GitHub · GitHub</title> @@ -96,13 +98,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:6602e338-2aa2-81da-d71d-058a045f7166"> + <meta name="fetch-nonce" content="v2:4a3c577d-7bce-215c-29cc-06932ef0cfd5"> <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb"> - <meta name="request-id" content="B3CA:61594:D234D26:A34BBED:6990E16E" data-pjax-transient="true"/><meta name="html-safe-nonce" content="3c4427dd7442574805767edcfed08e666c545803d5754edeb31b39fd0fdc246d" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCM0NBOjYxNTk0OkQyMzREMjY6QTM0QkJFRDo2OTkwRTE2RSIsInZpc2l0b3JfaWQiOiI2NzY5NjU2NDA2Mzc3MjkyMTQyIiwicmVnaW9uX2VkZ2UiOiJmcmEiLCJyZWdpb25fcmVuZGVyIjoiZnJhIn0=" data-pjax-transient="true"/><meta name="visitor-hmac" content="c0d482d89cb8d55a64fd08539dcd2cd216e545367ca22827e462320b97ece7df" data-pjax-transient="true"/> + <meta name="request-id" content="BA94:1E5F37:A3EFF74:83B0E84:6999839C" data-pjax-transient="true"/><meta name="html-safe-nonce" content="13375c6e9739579ec839a82ca4cfcc93d514ee87ac0c1bdebcf3758a00e3bb78" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCQTk0OjFFNUYzNzpBM0VGRjc0OjgzQjBFODQ6Njk5OTgzOUMiLCJ2aXNpdG9yX2lkIjoiODA2NjYyMDE2MDY5MTA4NjM2IiwicmVnaW9uX2VkZ2UiOiJmcmEiLCJyZWdpb25fcmVuZGVyIjoiZnJhIn0=" data-pjax-transient="true"/><meta name="visitor-hmac" content="b725af58113ecb705891ed3202ee88d0524a44fc74642b4f926b73e59392c196" data-pjax-transient="true"/> @@ -182,15 +184,15 @@ <meta name="expected-hostname" content="github.com"> - <meta http-equiv="x-pjax-version" content="ec2df937f82fb1c82380b2c0e194254c3344f0b613588bf2fa2ca0fb7ccca9ef" data-turbo-track="reload"> + <meta http-equiv="x-pjax-version" content="f31462530b9ddd9eb0c1e93df962f2d196fe625a430103c8c698f6c0e0368c56" 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="9be2e999328d1bf92d6750a92492fdf41f54c473c0d539161fd1234111d4fdfe" data-turbo-track="reload"> - <meta http-equiv="x-pjax-js-version" content="42c603b9d642c4a9065a51770f75e5e27132fef0e858607f5c9cb7e422831a7b" data-turbo-track="reload"> + <meta http-equiv="x-pjax-css-version" content="20414e98442146cd7c7f78b5f030955d6ce4de6d09dfb1ec55df5bf7ece04854" data-turbo-track="reload"> + <meta http-equiv="x-pjax-js-version" content="8ea75b9480dd46be2854159b09221afdadf84a27a926d6b4931f617236ba17d9" 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-bd4db0be6122c1db.css" /> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/error-de563258a6cd526f.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/site-f0f3cf01d3270d68.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/error-5fcb903c2170e4d4.css" /> <meta name="is_logged_out_page" content="true"> @@ -208,7 +210,7 @@ <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors"> - <meta name="release" content="848bc6032dcc93a9a7301dcc3f379a72ba13b96e"> + <meta name="release" content="1e9ddf6952a4b738d6e480c258c7af9917702457"> <meta name="ui-target" content="full"> <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000"> @@ -235,8 +237,8 @@ <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.298ffe31d478a02c.module.css" /> -<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.6268703e736b56bb.module.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.257816c5781f334a.module.css" /> +<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.f9d579378b96cc1f.module.css" /> <react-partial partial-name="keyboard-shortcuts-dialog" @@ -259,8 +261,8 @@ <script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/46752-4c55523fe83d3457.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/93308-440dad7e3ef6ba85.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/sessions-a13121c053f403b9.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/93308-bf887482583069d7.js" defer="defer"></script> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/sessions-b0aaa2deb5ef1f3d.js" defer="defer"></script> <style> /* Override primer focus outline color for marketing header dropdown links for better contrast */ @@ -308,14 +310,14 @@ </a> <div class="AppHeader-appearanceSettings"> <react-partial-anchor> - <button data-target="react-partial-anchor.anchor" id="icon-button-ba9a2222-649f-4a92-a854-51ea1e53cd13" aria-labelledby="tooltip-a72c312e-9cf4-410a-8734-70e06a1ec7ed" 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-5888e2c3-2465-4dec-a02c-c2ace14b371f" aria-labelledby="tooltip-300a52a7-18dc-46eb-8527-2c01d2b0a9bc" 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-a72c312e-9cf4-410a-8734-70e06a1ec7ed" for="icon-button-ba9a2222-649f-4a92-a854-51ea1e53cd13" 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-300a52a7-18dc-46eb-8527-2c01d2b0a9bc" for="icon-button-5888e2c3-2465-4dec-a02c-c2ace14b371f" 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.298ffe31d478a02c.module.css" /> -<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/appearance-settings.d1797b65cfd73e57.module.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.257816c5781f334a.module.css" /> +<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/appearance-settings.4c324d4a83e5e7e0.module.css" /> <react-partial partial-name="appearance-settings" @@ -339,8 +341,8 @@ <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.298ffe31d478a02c.module.css" /> -<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/marketing-navigation.10677fe3e548506e.module.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.257816c5781f334a.module.css" /> +<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/marketing-navigation.11f6a23fa7bf1018.module.css" /> <react-partial partial-name="marketing-navigation" @@ -359,7 +361,7 @@ -<qbsearch-input class="search-input" data-scope="owner:buetow" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="1lF8cSWisIdh3tOargUkYgrpYOpIErow5wD05oYXQQf9UardECLAwd6uSBYf3zL0vATMCYbWS5O1e1g7FmILEg" 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="HCfq0_164kaRHcGA48Yz0uDsVOuZwqtUCPymMsXkRQ1rJgT5-qJjCUJLtQB0B9yIbr2qMXsQ_WER_6raTT0k_g" 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" @@ -423,7 +425,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-f20c78c0-f0a1-4c7b-ae4a-e7dd897faa91" 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-81bdbc98-4751-43d5-a8ef-0ce51f3390c9" data-target="query-builder.input" data-action=" input:query-builder#inputChange blur:query-builder#inputBlur keydown:query-builder#inputKeydown @@ -431,16 +433,18 @@ " data-view-component="true" class="FormControl-input QueryBuilder-Input FormControl-medium" /> </div> </div> - <span class="sr-only" id="query-builder-test-clear">Clear</span> - <button role="button" id="query-builder-test-clear-button" aria-labelledby="query-builder-test-clear query-builder-test-label" data-target="query-builder.clearButton" data-action=" - click:query-builder#clear - focus:query-builder#clearButtonFocus - blur:query-builder#clearButtonBlur - " variant="small" hidden="hidden" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium mr-1 px-2 py-0 d-flex flex-items-center rounded-1 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x-circle-fill Button-visual"> + <span data-target="query-builder.clearButton" hidden> + <span class="sr-only" id="query-builder-test-clear">Clear</span> + <button role="button" id="query-builder-test-clear-button" aria-labelledby="query-builder-test-clear query-builder-test-label" data-action=" + click:query-builder#clear + focus:query-builder#clearButtonFocus + blur:query-builder#clearButtonBlur + " variant="small" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium mr-1 px-2 py-0 d-flex flex-items-center rounded-1 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x-circle-fill Button-visual"> <path d="M2.343 13.657A8 8 0 1 1 13.658 2.343 8 8 0 0 1 2.343 13.657ZM6.03 4.97a.751.751 0 0 0-1.042.018.751.751 0 0 0-.018 1.042L6.94 8 4.97 9.97a.749.749 0 0 0 .326 1.275.749.749 0 0 0 .734-.215L8 9.06l1.97 1.97a.749.749 0 0 0 1.275-.326.749.749 0 0 0-.215-.734L9.06 8l1.97-1.97a.749.749 0 0 0-.326-1.275.749.749 0 0 0-.734.215L8 6.94Z"></path> </svg> </button> + </span> </div> <template id="search-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> @@ -662,7 +666,7 @@ ></ul> </div> - <div class="FormControl-inlineValidation" id="validation-f20c78c0-f0a1-4c7b-ae4a-e7dd897faa91" hidden="hidden"> + <div class="FormControl-inlineValidation" id="validation-81bdbc98-4751-43d5-a8ef-0ce51f3390c9" 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> @@ -703,7 +707,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="+Aeaf/1oGz5oc5BXeSIrA1TQUdXyqFxrsjmXtGBtOFThygmNVj2REmpmgS/O1BUoiUkc+RAwxnyC23NVleBdVA==" /> + <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="ICMY1tTMMwWQTBbYaSoFIil7QmNy9UkY+t08j9OqdoZ7m1CymxOu84ThP8uybeFooLaqTgktgjObchzbGPB8dA==" /> <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"> @@ -741,7 +745,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="BO7zqlxa2+bTERGDYL+n0KzBxXS9qYZURwRoDFs5IDtlG7AUWgEq2KjeWKixy/yHj4Gu5p8i6hrGcd5pL/W0sA==" /> + <!-- '"` --><!-- </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="OYy7JnFqJOWfdW9cR6752+uXFZw1nOf4rlKj3pRlslBB5FKteHRCD1jICsGpFQwwN4TwoUAOz4s9VA621QnfhA==" /> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField"> @@ -759,7 +763,7 @@ placeholder="github-ruby" required maxlength="50"> - <input type="hidden" data-csrf="true" value="vTBwgI6vOVYO04wJDVEUMK/05H99yRYpNjKlJjSbCpFH1ha9gJmaRCy7YhUY53445gS2eqmtkjWbLTJGpVixJg==" /> + <input type="hidden" data-csrf="true" value="5poeJIsCpqBTL+JriWY9pr4OoAmLntfjjvxSaEcj9/2SheGm7F1x4iG7txEsGT4HqcIu226ySTQvzzzas/1Z+g==" /> </auto-check> </div> @@ -814,7 +818,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="p/FKWRRRhRPWlLsUopIpn6S0MaaSJcYkW9F6tcXZ6SqeRz41bsu6j0oIYfGhmGN6JXDuEqLJi80ImiwwFvIXwA==" /> <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="5vIa83w6T2K9dvydGaiFKfjSswo71d8iCH+UQGsuJhqVk4j8GSxOtrqUt8o6ji5bY574SBTReojd/9v4QdyHig==" /> <input type="hidden" name="add_account" id="add_account" autocomplete="off" class="form-control" /> <label for="login_field"> Username or email address @@ -836,9 +840,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_61d7" hidden="hidden" /> -<input class="form-control" type="hidden" name="timestamp" value="1771102574611" /> -<input class="form-control" type="hidden" name="timestamp_secret" value="742f15e9ab5227399b61550ac53df07667198fb454401f8ddfc34de6828cfd3d" /> +<input class="form-control" type="text" name="required_field_eb65" hidden="hidden" /> +<input class="form-control" type="hidden" name="timestamp" value="1771668380596" /> +<input class="form-control" type="hidden" name="timestamp_secret" value="f27cd8ee30973ff2d8623b7b6a1f838af7a523cb89aa9bd6e1bc9866514e8748" /> <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" /> @@ -865,14 +869,14 @@ <div class="AppHeader-appearanceSettings"> <react-partial-anchor> - <button data-target="react-partial-anchor.anchor" id="icon-button-3b93af92-960a-4abc-8dc3-e842f47071c5" aria-labelledby="tooltip-8aacd3df-8b89-413b-871c-70aa2dcacea0" 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-849cabbe-eb6c-4a52-966c-0d487203e6f4" aria-labelledby="tooltip-132c571b-6283-43a5-84b2-fe6f0461556e" 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-8aacd3df-8b89-413b-871c-70aa2dcacea0" for="icon-button-3b93af92-960a-4abc-8dc3-e842f47071c5" 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-132c571b-6283-43a5-84b2-fe6f0461556e" for="icon-button-849cabbe-eb6c-4a52-966c-0d487203e6f4" 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.298ffe31d478a02c.module.css" /> -<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/appearance-settings.d1797b65cfd73e57.module.css" /> + <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.257816c5781f334a.module.css" /> +<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/appearance-settings.4c324d4a83e5e7e0.module.css" /> <react-partial partial-name="appearance-settings" @@ -906,10 +910,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-00e74343-cbe4-4e0b-8094-21702047a52c" aria-labelledby="tooltip-d3ec3d77-86b1-4223-a2cd-a42c3002a644" 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-bd5999c5-8333-4a7b-a10c-bd4bfa38c9e4" aria-labelledby="tooltip-1f050b5b-5c23-42b7-860c-c3dbdd6b6606" 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-d3ec3d77-86b1-4223-a2cd-a42c3002a644" for="icon-button-00e74343-cbe4-4e0b-8094-21702047a52c" 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-1f050b5b-5c23-42b7-860c-c3dbdd6b6606" for="icon-button-bd5999c5-8333-4a7b-a10c-bd4bfa38c9e4" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip> @@ -1028,7 +1032,7 @@ <h3 class="h5 mt-4 mb-0" id="subscribe-to-newsletter">Subscribe to our developer newsletter</h3> <p class="f5 color-fg-muted mb-3">Get tips, technical guides, and best practices. Twice a month.</p> - <a class="btn-mktg mb-4 btn-muted-mktg" data-analytics-event="{"category":"Subscribe","action":"click to Subscribe","label":"ref_cta:Subscribe;"}" href="https://github.com/newsletter"> + <a class="btn-mktg mb-4 btn-muted-mktg" data-analytics-event="{"category":"Subscribe","action":"click to Subscribe","label":"ref_cta:Subscribe;"}" href="https://github.com/newsletter"> Subscribe @@ -1070,7 +1074,7 @@ <a class="Link--secondary" data-analytics-event="{"location":"footer","action":"roadmap","context":"platform","tag":"link","label":"roadmap_link_platform_footer"}" href="https://github.com/github/roadmap">Roadmap</a> </li> <li class="lh-condensed mb-3"> - <a class="Link--secondary" data-analytics-event="{"location":"footer","action":"compare","context":"platform","tag":"link","label":"compare_link_platform_footer"}" href="https://resources.github.com/devops/tools/compare">Compare GitHub</a> + <a class="Link--secondary" data-analytics-event="{"location":"footer","action":"compare","context":"platform","tag":"link","label":"compare_link_platform_footer"}" href="/resources/articles/devops-tools-comparison">Compare GitHub</a> </li> </ul> </nav> |
