diff options
| author | Paul Buetow <paul@buetow.org> | 2026-02-14 23:03:40 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-02-14 23:03:40 +0200 |
| commit | e048f1f7cedc543bab644ea224b93bd81cb2da42 (patch) | |
| tree | 113dc02683ba7bf90dc616a7c980471d7e0626e7 | |
| parent | 4a85614028b9bc99c2fbdb680f786e4baa619890 (diff) | |
Update content for html
| -rw-r--r-- | about/resources.html | 198 | ||||
| -rw-r--r-- | about/showcase.html | 624 | ||||
| -rw-r--r-- | about/showcase/debroid/image-1.png | 160 | ||||
| -rw-r--r-- | gemfeed/2026-02-15-loadbars-resurrected-from-perl-to-go.html | 4 | ||||
| -rw-r--r-- | gemfeed/atom.xml | 8 | ||||
| -rw-r--r-- | index.html | 2 | ||||
| -rw-r--r-- | uptime-stats.html | 2 |
7 files changed, 525 insertions, 473 deletions
diff --git a/about/resources.html b/about/resources.html index 25e9d15b..192ec57f 100644 --- a/about/resources.html +++ b/about/resources.html @@ -50,111 +50,111 @@ <span>In random order:</span><br /> <br /> <ul> -<li>21st Century C: C Tips from the New School; Ben Klemens; O'Reilly</li> -<li>Raku Fundamentals; Moritz Lenz; Apress</li> +<li>Concurrency in Go; Katherine Cox-Buday; O'Reilly</li> +<li>Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly</li> +<li>Seeking SRE: Conversations About Running Production Systems at Scale; David N. Blank-Edelman; eBook</li> +<li>Chaos Engineering - System Resiliency in Practice; Casey Rosenthal and Nora Jones; eBook</li> +<li>DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible</li> +<li>DNS and BIND; Cricket Liu; O'Reilly</li> +<li>Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press</li> +<li>The DevOps Handbook; Gene Kim, Jez Humble, Patrick Debois, John Willis; Audible</li> +<li>Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner</li> <li>Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O'Reilly</li> <li>Perl New Features; Joshua McAdams, brian d foy; Perl School</li> -<li>Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press</li> -<li>Seeking SRE: Conversations About Running Production Systems at Scale; David N. Blank-Edelman; eBook</li> -<li>100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications</li> -<li>Effective Java; Joshua Bloch; Addison-Wesley Professional</li> -<li>C++ Programming Language; Bjarne Stroustrup;</li> <li>Modern Perl; Chromatic ; Onyx Neon Press</li> +<li>Site Reliability Engineering; How Google runs production systems; O'Reilly</li> +<li>Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers</li> +<li>Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press</li> <li>The Pragmatic Programmer; David Thomas; Addison-Wesley</li> -<li>Java ist auch eine Insel; Christian Ullenboom; </li> -<li>Chaos Engineering - System Resiliency in Practice; Casey Rosenthal and Nora Jones; eBook</li> -<li>Effective awk programming; Arnold Robbins; O'Reilly</li> -<li>Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson</li> -<li>Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers </li> -<li>Leanring eBPF; Liz Rice; O'Reilly</li> -<li>Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications</li> +<li>Effective Java; Joshua Bloch; Addison-Wesley Professional</li> +<li>Data Science at the Command Line; Jeroen Janssens; O'Reilly</li> +<li>Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly</li> +<li>Pro Puppet; James Turnbull, Jeffrey McCune; Apress</li> +<li>The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional</li> <li>Developing Games in Java; David Brackeen and others...; New Riders</li> -<li>The Kubernetes Book; Nigel Poulton; Unabridged Audiobook</li> -<li>Systemprogrammierung in Go; Frank Müller; dpunkt</li> -<li>Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly</li> +<li>The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton</li> <li>Higher Order Perl; Mark Dominus; Morgan Kaufmann</li> +<li>Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers </li> +<li>The Docker Book; James Turnbull; Kindle</li> <li>Programming Ruby 3.3 (5th Edition); Noel Rappin, with Dave Thomas; The Pragmatic Bookshelf</li> -<li>97 things every SRE should know; Emil Stolarsky, Jaime Woo; O'Reilly</li> -<li>DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible</li> -<li>Polished Ruby Programming; Jeremy Evans; Packt Publishing</li> -<li>Ultimate Go Notebook; Bill Kennedy</li> +<li>21st Century C: C Tips from the New School; Ben Klemens; O'Reilly</li> +<li>Java ist auch eine Insel; Christian Ullenboom; </li> +<li>Raku Fundamentals; Moritz Lenz; Apress</li> +<li>Leanring eBPF; Liz Rice; O'Reilly</li> +<li>Clusterbau mit Linux-HA; Michael Schwartzkopff; O'Reilly</li> <li>Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt </li> -<li>The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton</li> +<li>Polished Ruby Programming; Jeremy Evans; Packt Publishing</li> +<li>100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications</li> +<li>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</li> +<li>Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O'Reilly</li> +<li>Effective awk programming; Arnold Robbins; O'Reilly</li> <li>Terraform Cookbook; Mikael Krief; Packt Publishing</li> -<li>Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers</li> -<li>Concurrency in Go; Katherine Cox-Buday; O'Reilly</li> +<li>Ultimate Go Notebook; Bill Kennedy</li> +<li>Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson</li> +<li>The Kubernetes Book; Nigel Poulton; Unabridged Audiobook</li> +<li>Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications</li> +<li>97 things every SRE should know; Emil Stolarsky, Jaime Woo; O'Reilly</li> <li>Raku Recipes; J.J. Merelo; Apress</li> -<li>Clusterbau mit Linux-HA; Michael Schwartzkopff; O'Reilly</li> <li>Funktionale Programmierung; Peter Pepper; Springer</li> -<li>Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly</li> -<li>Site Reliability Engineering; How Google runs production systems; O'Reilly</li> -<li>DNS and BIND; Cricket Liu; O'Reilly</li> -<li>Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner</li> -<li>Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press</li> -<li>Data Science at the Command Line; Jeroen Janssens; O'Reilly</li> -<li>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</li> -<li>The Docker Book; James Turnbull; Kindle</li> -<li>The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional</li> -<li>Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O'Reilly</li> -<li>Pro Puppet; James Turnbull, Jeffrey McCune; Apress</li> -<li>The DevOps Handbook; Gene Kim, Jez Humble, Patrick Debois, John Willis; Audible</li> +<li>Systemprogrammierung in Go; Frank Müller; dpunkt</li> +<li>C++ Programming Language; Bjarne Stroustrup;</li> </ul><br /> <h2 style='display: inline' id='technical-references'>Technical references</h2><br /> <br /> <span>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:</span><br /> <br /> <ul> -<li>Implementing Service Level Objectives; Alex Hidalgo; O'Reilly</li> -<li>Understanding the Linux Kernel; Daniel P. Bovet, Marco Cesati; O'Reilly</li> -<li>The Linux Programming Interface; Michael Kerrisk; No Starch Press </li> <li>Algorithms; Robert Sedgewick, Kevin Wayne; Addison Wesley</li> +<li>Implementing Service Level Objectives; Alex Hidalgo; O'Reilly</li> <li>Relayd and Httpd Mastery; Michael W Lucas</li> +<li>Go: Design Patterns for Real-World Projects; Mat Ryer; Packt</li> +<li>The Linux Programming Interface; Michael Kerrisk; No Starch Press </li> +<li>Understanding the Linux Kernel; Daniel P. Bovet, Marco Cesati; O'Reilly</li> <li>BPF Performance Tools - Linux System and Application Observability, Brendan Gregg; Addison Wesley</li> <li>Groovy Kurz & Gut; Joerg Staudemeier; O'Reilly</li> -<li>Go: Design Patterns for Real-World Projects; Mat Ryer; Packt</li> </ul><br /> <h2 style='display: inline' id='self-development-and-soft-skills-books'>Self-development and soft-skills books</h2><br /> <br /> <span>In random order:</span><br /> <br /> <ul> -<li>The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME)</li> -<li>Time Management for System Administrators; Thomas A. Limoncelli; O'Reilly</li> -<li>Digital Minimalism; Cal Newport; Portofolio Penguin</li> -<li>The Good Enough Job; Simone Stolzoff; Ebury Edge</li> -<li>Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook</li> -<li>Slow Productivity; Cal Newport; Penguin Random House</li> -<li>Staff Engineer: Leadership beyond the management track; Will Larson; Audiobook</li> -<li>The 7 Habits Of Highly Effective People; Stephen R. Covey; Simon & Schuster UK</li> -<li>Ultralearning; Scott Young; Thorsons</li> <li>Solve for Happy; Mo Gawdat (RE-READ 1ST TIME)</li> -<li>Getting Things Done; David Allen</li> -<li>Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing</li> +<li>The Power of Now; Eckhard Tolle; Yellow Kite</li> +<li>Eat That Frog!; Brian Tracy; Hodder Paperbacks</li> +<li>Meditation for Mortals, Oliver Burkeman, Audiobook</li> +<li>The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select</li> +<li>The Bullet Journal Method; Ryder Carroll; Fourth Estate</li> <li>So Good They Can't Ignore You; Cal Newport; Business Plus</li> +<li>Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press</li> +<li>Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion</li> +<li>Stop starting, start finishing; Arne Roock; Lean-Kanban University </li> +<li>The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books</li> <li>Ultralearning; Anna Laurent; Self-published via Amazon</li> <li>Influence without Authority; A. Cohen, D. Bradford; Wiley</li> <li>Psycho-Cybernetics; Maxwell Maltz; Perigee Books</li> +<li>The Good Enough Job; Simone Stolzoff; Ebury Edge</li> +<li>Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing</li> +<li>The Complete Software Developer's Career Guide; John Sonmez; Unabridged Audiobook</li> +<li>The Software Engineer's Guidebook: Navigating senior, tech lead, and staff engineer positions at tech companies and startups; Gergely Orosz; Audiobook </li> <li>97 Things Every Engineering Manager Should Know; Camille Fournier; Audiobook</li> -<li>Meditation for Mortals, Oliver Burkeman, Audiobook</li> -<li>The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select</li> -<li>The Courage to Be Disliked; Ichiro Kishimi and Fumitake Koga; Audiobook</li> -<li>Eat That Frog!; Brian Tracy; Hodder Paperbacks</li> -<li>The Power of Now; Eckhard Tolle; Yellow Kite</li> -<li>The Joy of Missing Out; Christina Crook; New Society Publishers</li> -<li>Soft Skills; John Sommez; Manning Publications</li> -<li>Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press</li> -<li>The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books</li> +<li>The 7 Habits Of Highly Effective People; Stephen R. Covey; Simon & Schuster UK</li> +<li>101 Essays that change the way you think; Brianna Wiest; Audiobook</li> +<li>Digital Minimalism; Cal Newport; Portofolio Penguin</li> <li>Atomic Habits; James Clear; Random House Business</li> -<li>Stop starting, start finishing; Arne Roock; Lean-Kanban University </li> <li>Deep Work; Cal Newport; Piatkus</li> +<li>Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook</li> +<li>The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME)</li> +<li>Slow Productivity; Cal Newport; Penguin Random House</li> +<li>Time Management for System Administrators; Thomas A. Limoncelli; O'Reilly</li> +<li>Soft Skills; John Sommez; Manning Publications</li> +<li>The Courage to Be Disliked; Ichiro Kishimi and Fumitake Koga; Audiobook</li> +<li>Getting Things Done; David Allen</li> +<li>Never Split the Difference; Chris Voss, Tahl Raz; Random House Business</li> <li>Eat That Frog; Brian Tracy</li> -<li>101 Essays that change the way you think; Brianna Wiest; Audiobook</li> +<li>Staff Engineer: Leadership beyond the management track; Will Larson; Audiobook</li> <li>The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd</li> -<li>Never Split the Difference; Chris Voss, Tahl Raz; Random House Business</li> -<li>Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion</li> -<li>The Complete Software Developer's Career Guide; John Sonmez; Unabridged Audiobook</li> -<li>The Software Engineer's Guidebook: Navigating senior, tech lead, and staff engineer positions at tech companies and startups; Gergely Orosz; Audiobook </li> -<li>The Bullet Journal Method; Ryder Carroll; Fourth Estate</li> +<li>Ultralearning; Scott Young; Thorsons</li> +<li>The Joy of Missing Out; Christina Crook; New Society Publishers</li> <li>Search Inside Yourself - The Unexpected path to Achieving Success, Happiness (and World Peace); Chade-Meng Tan, Daniel Goleman, Jon Kabat-Zinn; HarperOne</li> </ul><br /> <a class='textlink' href='../notes/index.html'>Here are notes of mine for some of the books</a><br /> @@ -164,30 +164,30 @@ <span>Some of these were in-person with exams; others were online learning lectures only. In random order:</span><br /> <br /> <ul> +<li>F5 Loadbalancers Training; 2-day on-site training; F5, Inc. </li> +<li>Scripting Vim; Damian Conway; O'Reilly Online</li> +<li>Structure and Interpretation of Computer Programs; Harold Abelson and more...; </li> +<li>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)</li> +<li>Ultimate Go Programming; Bill Kennedy; O'Reilly Online</li> +<li>Developing IaC with Terraform (with Live Lessons); O'Reilly Online</li> <li>The Ultimate Kubernetes Bootcamp; School of Devops; O'Reilly Online</li> -<li>AWS Immersion Day; Amazon; 1-day interactive online training </li> -<li>Functional programming lecture; Remote University of Hagen</li> <li>Cloud Operations on AWS - Learn how to configure, deploy, maintain, and troubleshoot your AWS environments; 3-day online live training with labs; Amazon</li> -<li>Structure and Interpretation of Computer Programs; Harold Abelson and more...; </li> +<li>Functional programming lecture; Remote University of Hagen</li> +<li>The Well-Grounded Rubyist Video Edition; David. A. Black; O'Reilly Online</li> <li>Protocol buffers; O'Reilly Online</li> -<li>Scripting Vim; Damian Conway; O'Reilly Online</li> -<li>F5 Loadbalancers Training; 2-day on-site training; F5, Inc. </li> -<li>Algorithms Video Lectures; Robert Sedgewick; O'Reilly Online</li> <li>Apache Tomcat Best Practises; 3-day on-site training</li> -<li>The Well-Grounded Rubyist Video Edition; David. A. Black; O'Reilly Online</li> -<li>Ultimate Go Programming; Bill Kennedy; O'Reilly Online</li> -<li>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)</li> <li>Linux Security and Isolation APIs Training; Michael Kerrisk; 3-day on-site training</li> -<li>Developing IaC with Terraform (with Live Lessons); O'Reilly Online</li> <li>MySQL Deep Dive Workshop; 2-day on-site training</li> +<li>Algorithms Video Lectures; Robert Sedgewick; O'Reilly Online</li> +<li>AWS Immersion Day; Amazon; 1-day interactive online training </li> </ul><br /> <h2 style='display: inline' id='technical-guides'>Technical guides</h2><br /> <br /> <span>These are not whole books, but guides (smaller or larger) which I found very useful. in random order:</span><br /> <br /> <ul> -<li>Advanced Bash-Scripting Guide </li> <li>How CPUs work at https://cpu.land</li> +<li>Advanced Bash-Scripting Guide </li> <li>Raku Guide at https://raku.guide </li> </ul><br /> <h2 style='display: inline' id='podcasts'>Podcasts</h2><br /> @@ -197,21 +197,21 @@ <span>In random order:</span><br /> <br /> <ul> -<li>The Pragmatic Engineer Podcast</li> -<li>The Changelog Podcast(s)</li> -<li>Wednesday Wisdom</li> -<li>Fallthrough [Golang]</li> -<li>Cup o' Go [Golang]</li> <li>Hidden Brain</li> -<li>Modern Mentor</li> -<li>Pratical AI</li> <li>The ProdCast (Google SRE Podcast)</li> -<li>Backend Banter</li> -<li>Maintainable</li> +<li>Cup o' Go [Golang]</li> +<li>Fork Around And Find Out</li> <li>BSD Now [BSD]</li> +<li>Backend Banter</li> +<li>The Pragmatic Engineer Podcast</li> <li>Dev Interrupted</li> -<li>Fork Around And Find Out</li> +<li>Pratical AI</li> +<li>Maintainable</li> <li>Deep Questions with Cal Newport</li> +<li>Modern Mentor</li> +<li>The Changelog Podcast(s)</li> +<li>Wednesday Wisdom</li> +<li>Fallthrough [Golang]</li> </ul><br /> <h3 style='display: inline' id='podcasts-i-liked'>Podcasts I liked</h3><br /> <br /> @@ -219,29 +219,29 @@ <br /> <ul> <li>Ship It (predecessor of Fork Around And Find Out)</li> -<li>CRE: Chaosradio Express [german]</li> -<li>Java Pub House</li> -<li>Modern Mentor</li> <li>FLOSS weekly</li> +<li>Java Pub House</li> <li>Go Time (predecessor of fallthrough)</li> +<li>Modern Mentor</li> +<li>CRE: Chaosradio Express [german]</li> </ul><br /> <h2 style='display: inline' id='newsletters-i-like'>Newsletters I like</h2><br /> <br /> <span>This is a mix of tech and non-tech newsletters I am subscribed to. In random order:</span><br /> <br /> <ul> +<li>The Valuable Dev</li> <li>The Pragmatic Engineer</li> +<li>VK Newsletter</li> +<li>Register Spill</li> <li>Applied Go Weekly Newsletter</li> +<li>byteSizeGo</li> +<li>Andreas Brandhorst Newsletter (Sci-Fi author)</li> <li>Golang Weekly</li> <li>The Imperfectionist</li> -<li>VK Newsletter</li> +<li>Monospace Mentor</li> <li>Ruby Weekly</li> <li>Changelog News</li> -<li>The Valuable Dev</li> -<li>Monospace Mentor</li> -<li>Register Spill</li> -<li>byteSizeGo</li> -<li>Andreas Brandhorst Newsletter (Sci-Fi author)</li> </ul><br /> <h2 style='display: inline' id='magazines-i-liked'>Magazines I like(d)</h2><br /> <br /> @@ -250,8 +250,8 @@ <ul> <li>Linux Magazine</li> <li>LWN (online only)</li> -<li>freeX (not published anymore)</li> <li>Linux User</li> +<li>freeX (not published anymore)</li> </ul><br /> <h1 style='display: inline' id='formal-education'>Formal education</h1><br /> <br /> diff --git a/about/showcase.html b/about/showcase.html index f020cb52..ef8dc8e2 100644 --- a/about/showcase.html +++ b/about/showcase.html @@ -13,7 +13,7 @@ </p> <h1 style='display: inline' id='project-showcase'>Project Showcase</h1><br /> <br /> -<span>Generated on: 2026-02-07</span><br /> +<span>Generated on: 2026-02-14</span><br /> <br /> <span>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.</span><br /> <br /> @@ -23,90 +23,117 @@ <li><a href='#project-showcase'>Project Showcase</a></li> <li>⇢ <a href='#overall-statistics'>Overall Statistics</a></li> <li>⇢ <a href='#projects'>Projects</a></li> -<li>⇢ ⇢ <a href='#1-epimetheus'>1. epimetheus</a></li> -<li>⇢ ⇢ <a href='#2-conf'>2. conf</a></li> -<li>⇢ ⇢ <a href='#3-foozone'>3. foo.zone</a></li> -<li>⇢ ⇢ <a href='#4-scifi'>4. scifi</a></li> -<li>⇢ ⇢ <a href='#5-log4jbench'>5. log4jbench</a></li> -<li>⇢ ⇢ <a href='#6-hexai'>6. hexai</a></li> -<li>⇢ ⇢ <a href='#7-perc'>7. perc</a></li> -<li>⇢ ⇢ <a href='#8-yoga'>8. yoga</a></li> -<li>⇢ ⇢ <a href='#9-totalrecall'>9. totalrecall</a></li> -<li>⇢ ⇢ <a href='#10-gogios'>10. gogios</a></li> -<li>⇢ ⇢ <a href='#11-gitsyncer'>11. gitsyncer</a></li> -<li>⇢ ⇢ <a href='#12-foostats'>12. foostats</a></li> -<li>⇢ ⇢ <a href='#13-tasksamurai'>13. tasksamurai</a></li> -<li>⇢ ⇢ <a href='#14-timr'>14. timr</a></li> -<li>⇢ ⇢ <a href='#15-ior'>15. ior</a></li> -<li>⇢ ⇢ <a href='#16-dtail'>16. dtail</a></li> -<li>⇢ ⇢ <a href='#17-gos'>17. gos</a></li> -<li>⇢ ⇢ <a href='#18-ds-sim'>18. ds-sim</a></li> -<li>⇢ ⇢ <a href='#19-gemtexter'>19. gemtexter</a></li> -<li>⇢ ⇢ <a href='#20-wireguardmeshgenerator'>20. wireguardmeshgenerator</a></li> -<li>⇢ ⇢ <a href='#21-rcm'>21. rcm</a></li> -<li>⇢ ⇢ <a href='#22-terraform'>22. terraform</a></li> -<li>⇢ ⇢ <a href='#23-quicklogger'>23. quicklogger</a></li> -<li>⇢ ⇢ <a href='#24-sillybench'>24. sillybench</a></li> -<li>⇢ ⇢ <a href='#25-gorum'>25. gorum</a></li> -<li>⇢ ⇢ <a href='#26-guprecords'>26. guprecords</a></li> -<li>⇢ ⇢ <a href='#27-docker-radicale-server'>27. docker-radicale-server</a></li> -<li>⇢ ⇢ <a href='#28-geheim'>28. geheim</a></li> -<li>⇢ ⇢ <a href='#29-algorithms'>29. algorithms</a></li> -<li>⇢ ⇢ <a href='#30-randomjournalpage'>30. randomjournalpage</a></li> -<li>⇢ ⇢ <a href='#31-photoalbum'>31. photoalbum</a></li> -<li>⇢ ⇢ <a href='#32-ioriot'>32. ioriot</a></li> -<li>⇢ ⇢ <a href='#33-ipv6test'>33. ipv6test</a></li> -<li>⇢ ⇢ <a href='#34-sway-autorotate'>34. sway-autorotate</a></li> -<li>⇢ ⇢ <a href='#35-mon'>35. mon</a></li> -<li>⇢ ⇢ <a href='#36-staticfarm-apache-handlers'>36. staticfarm-apache-handlers</a></li> -<li>⇢ ⇢ <a href='#37-pingdomfetch'>37. pingdomfetch</a></li> -<li>⇢ ⇢ <a href='#38-xerl'>38. xerl</a></li> -<li>⇢ ⇢ <a href='#39-ychat'>39. ychat</a></li> -<li>⇢ ⇢ <a href='#40-fapi'>40. fapi</a></li> -<li>⇢ ⇢ <a href='#41-perl-c-fibonacci'>41. perl-c-fibonacci</a></li> -<li>⇢ ⇢ <a href='#42-netcalendar'>42. netcalendar</a></li> -<li>⇢ ⇢ <a href='#43-loadbars'>43. loadbars</a></li> -<li>⇢ ⇢ <a href='#44-gotop'>44. gotop</a></li> -<li>⇢ ⇢ <a href='#45-fype'>45. fype</a></li> -<li>⇢ ⇢ <a href='#46-rubyfy'>46. rubyfy</a></li> -<li>⇢ ⇢ <a href='#47-pwgrep'>47. pwgrep</a></li> -<li>⇢ ⇢ <a href='#48-perldaemon'>48. perldaemon</a></li> -<li>⇢ ⇢ <a href='#49-jsmstrade'>49. jsmstrade</a></li> -<li>⇢ ⇢ <a href='#50-japi'>50. japi</a></li> -<li>⇢ ⇢ <a href='#51-perl-poetry'>51. perl-poetry</a></li> -<li>⇢ ⇢ <a href='#52-muttdelay'>52. muttdelay</a></li> -<li>⇢ ⇢ <a href='#53-netdiff'>53. netdiff</a></li> -<li>⇢ ⇢ <a href='#54-debroid'>54. debroid</a></li> -<li>⇢ ⇢ <a href='#55-hsbot'>55. hsbot</a></li> -<li>⇢ ⇢ <a href='#56-cpuinfo'>56. cpuinfo</a></li> -<li>⇢ ⇢ <a href='#57-template'>57. template</a></li> -<li>⇢ ⇢ <a href='#58-awksite'>58. awksite</a></li> -<li>⇢ ⇢ <a href='#59-dyndns'>59. dyndns</a></li> -<li>⇢ ⇢ <a href='#60-vs-sim'>60. vs-sim</a></li> +<li>⇢ ⇢ <a href='#1-hexai'>1. hexai</a></li> +<li>⇢ ⇢ <a href='#2-epimetheus'>2. epimetheus</a></li> +<li>⇢ ⇢ <a href='#3-conf'>3. conf</a></li> +<li>⇢ ⇢ <a href='#4-dotfiles'>4. dotfiles</a></li> +<li>⇢ ⇢ <a href='#5-confbak'>5. conf.bak</a></li> +<li>⇢ ⇢ <a href='#6-foozone'>6. foo.zone</a></li> +<li>⇢ ⇢ <a href='#7-scifi'>7. scifi</a></li> +<li>⇢ ⇢ <a href='#8-log4jbench'>8. log4jbench</a></li> +<li>⇢ ⇢ <a href='#9-gogios'>9. gogios</a></li> +<li>⇢ ⇢ <a href='#10-yoga'>10. yoga</a></li> +<li>⇢ ⇢ <a href='#11-perc'>11. perc</a></li> +<li>⇢ ⇢ <a href='#12-totalrecall'>12. totalrecall</a></li> +<li>⇢ ⇢ <a href='#13-gitsyncer'>13. gitsyncer</a></li> +<li>⇢ ⇢ <a href='#14-foostats'>14. foostats</a></li> +<li>⇢ ⇢ <a href='#15-tasksamurai'>15. tasksamurai</a></li> +<li>⇢ ⇢ <a href='#16-ior'>16. ior</a></li> +<li>⇢ ⇢ <a href='#17-timr'>17. timr</a></li> +<li>⇢ ⇢ <a href='#18-dtail'>18. dtail</a></li> +<li>⇢ ⇢ <a href='#19-gos'>19. gos</a></li> +<li>⇢ ⇢ <a href='#20-ds-sim'>20. ds-sim</a></li> +<li>⇢ ⇢ <a href='#21-wireguardmeshgenerator'>21. wireguardmeshgenerator</a></li> +<li>⇢ ⇢ <a href='#22-gemtexter'>22. gemtexter</a></li> +<li>⇢ ⇢ <a href='#23-rcm'>23. rcm</a></li> +<li>⇢ ⇢ <a href='#24-terraform'>24. terraform</a></li> +<li>⇢ ⇢ <a href='#25-quicklogger'>25. quicklogger</a></li> +<li>⇢ ⇢ <a href='#26-sillybench'>26. sillybench</a></li> +<li>⇢ ⇢ <a href='#27-gorum'>27. gorum</a></li> +<li>⇢ ⇢ <a href='#28-guprecords'>28. guprecords</a></li> +<li>⇢ ⇢ <a href='#29-geheim'>29. geheim</a></li> +<li>⇢ ⇢ <a href='#30-docker-radicale-server'>30. docker-radicale-server</a></li> +<li>⇢ ⇢ <a href='#31-algorithms'>31. algorithms</a></li> +<li>⇢ ⇢ <a href='#32-randomjournalpage'>32. randomjournalpage</a></li> +<li>⇢ ⇢ <a href='#33-photoalbum'>33. photoalbum</a></li> +<li>⇢ ⇢ <a href='#34-ioriot'>34. ioriot</a></li> +<li>⇢ ⇢ <a href='#35-ipv6test'>35. ipv6test</a></li> +<li>⇢ ⇢ <a href='#36-sway-autorotate'>36. sway-autorotate</a></li> +<li>⇢ ⇢ <a href='#37-mon'>37. mon</a></li> +<li>⇢ ⇢ <a href='#38-staticfarm-apache-handlers'>38. staticfarm-apache-handlers</a></li> +<li>⇢ ⇢ <a href='#39-pingdomfetch'>39. pingdomfetch</a></li> +<li>⇢ ⇢ <a href='#40-xerl'>40. xerl</a></li> +<li>⇢ ⇢ <a href='#41-ychat'>41. ychat</a></li> +<li>⇢ ⇢ <a href='#42-fapi'>42. fapi</a></li> +<li>⇢ ⇢ <a href='#43-perl-c-fibonacci'>43. perl-c-fibonacci</a></li> +<li>⇢ ⇢ <a href='#44-netcalendar'>44. netcalendar</a></li> +<li>⇢ ⇢ <a href='#45-loadbars'>45. loadbars</a></li> +<li>⇢ ⇢ <a href='#46-gotop'>46. gotop</a></li> +<li>⇢ ⇢ <a href='#47-fype'>47. fype</a></li> +<li>⇢ ⇢ <a href='#48-rubyfy'>48. rubyfy</a></li> +<li>⇢ ⇢ <a href='#49-pwgrep'>49. pwgrep</a></li> +<li>⇢ ⇢ <a href='#50-perldaemon'>50. perldaemon</a></li> +<li>⇢ ⇢ <a href='#51-jsmstrade'>51. jsmstrade</a></li> +<li>⇢ ⇢ <a href='#52-japi'>52. japi</a></li> +<li>⇢ ⇢ <a href='#53-perl-poetry'>53. perl-poetry</a></li> +<li>⇢ ⇢ <a href='#54-muttdelay'>54. muttdelay</a></li> +<li>⇢ ⇢ <a href='#55-netdiff'>55. netdiff</a></li> +<li>⇢ ⇢ <a href='#56-debroid'>56. debroid</a></li> +<li>⇢ ⇢ <a href='#57-hsbot'>57. hsbot</a></li> +<li>⇢ ⇢ <a href='#58-cpuinfo'>58. cpuinfo</a></li> +<li>⇢ ⇢ <a href='#59-template'>59. template</a></li> +<li>⇢ ⇢ <a href='#60-awksite'>60. awksite</a></li> +<li>⇢ ⇢ <a href='#61-dyndns'>61. dyndns</a></li> +<li>⇢ ⇢ <a href='#62-vs-sim'>62. vs-sim</a></li> </ul><br /> <h2 style='display: inline' id='overall-statistics'>Overall Statistics</h2><br /> <br /> <ul> -<li>📦 Total Projects: 60</li> -<li>📊 Total Commits: 13,066</li> -<li>📈 Total Lines of Code: 320,071</li> -<li>📄 Total Lines of Documentation: 31,896</li> -<li>💻 Languages: Go (29.6%), Java (12.8%), C++ (7.9%), C (6.0%), XML (6.0%), Shell (5.8%), CSS (5.6%), Perl (5.4%), C/C++ (5.1%), YAML (4.7%), HTML (3.3%), Python (2.2%), Config (1.3%), JSON (1.1%), Ruby (0.9%), HCL (0.9%), Make (0.6%), Raku (0.3%), Haskell (0.2%), JavaScript (0.2%)</li> -<li>📚 Documentation: Markdown (62.5%), Text (35.7%), LaTeX (1.8%)</li> -<li>🚀 Release Status: 38 released, 22 experimental (63.3% with releases, 36.7% experimental)</li> +<li>📦 Total Projects: 62</li> +<li>📊 Total Commits: 14,734</li> +<li>📈 Total Lines of Code: 326,878</li> +<li>📄 Total Lines of Documentation: 44,373</li> +<li>💻 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%)</li> +<li>📚 Documentation: Markdown (72.6%), Text (26.1%), LaTeX (1.3%)</li> +<li>🚀 Release Status: 38 released, 24 experimental (61.3% with releases, 38.7% experimental)</li> </ul><br /> <h2 style='display: inline' id='projects'>Projects</h2><br /> <br /> -<h3 style='display: inline' id='1-epimetheus'>1. epimetheus</h3><br /> +<h3 style='display: inline' id='1-hexai'>1. hexai</h3><br /> <br /> <ul> -<li>💻 Languages: Go (83.4%), Shell (16.6%)</li> +<li>💻 Languages: Go (100.0%)</li> <li>📚 Documentation: Markdown (100.0%)</li> -<li>📊 Commits: 1</li> -<li>📈 Lines of Code: 4844</li> -<li>📄 Lines of Documentation: 1064</li> -<li>📅 Development Period: 2026-02-07 to 2026-02-07</li> -<li>🏆 Score: 3019.2 (combines code size and activity)</li> +<li>📊 Commits: 342</li> +<li>📈 Lines of Code: 29895</li> +<li>📄 Lines of Documentation: 5502</li> +<li>📅 Development Period: 2025-08-01 to 2026-02-13</li> +<li>🏆 Score: 783.9 (combines code size and activity)</li> +<li>⚖️ License: No license found</li> +<li>🏷️ Latest Release: v0.21.0 (2026-02-12)</li> +</ul><br /> +<br /> +<a href='showcase/hexai/image-1.png'><img alt='hexai screenshot' title='hexai screenshot' src='showcase/hexai/image-1.png' /></a><br /> +<br /> +<span>Hexai is a Go-based AI integration tool designed primarily for the Helix editor that provides LSP (Language Server Protocol) powered AI features. It offers code auto-completion, AI-driven code actions, in-editor chat with LLMs, and a standalone CLI tool for direct LLM interaction. A standout feature is its ability to query multiple AI providers (OpenAI, OpenRouter, GitHub Copilot, Ollama) in parallel, allowing developers to compare responses side-by-side. It has enhanced capabilities for Go code understanding, such as generating unit tests from functions, while supporting other programming languages as well.</span><br /> +<br /> +<span>The project is implemented as an LSP server written in Go, with a TUI component built using Bubble Tea for the tmux-based code action runner (<span class='inlinecode'>hexai-tmux-action</span>). This architecture allows it to integrate seamlessly into LSP-compatible editors, with special focus on Helix + tmux workflows. The custom prompt feature lets developers use their preferred editor to craft prompts, making it flexible for various development workflows.</span><br /> +<br /> +<a class='textlink' href='https://codeberg.org/snonux/hexai'>View on Codeberg</a><br /> +<a class='textlink' href='https://github.com/snonux/hexai'>View on GitHub</a><br /> +<br /> +<span>---</span><br /> +<br /> +<h3 style='display: inline' id='2-epimetheus'>2. epimetheus</h3><br /> +<br /> +<ul> +<li>💻 Languages: Go (85.2%), Shell (14.8%)</li> +<li>📚 Documentation: Markdown (100.0%)</li> +<li>📊 Commits: 3</li> +<li>📈 Lines of Code: 5199</li> +<li>📄 Lines of Documentation: 1734</li> +<li>📅 Development Period: 2026-02-07 to 2026-02-14</li> +<li>🏆 Score: 703.4 (combines code size and activity)</li> <li>⚖️ License: No license found</li> <li>🧪 Status: Experimental (no releases yet)</li> </ul><br /> @@ -122,16 +149,16 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='2-conf'>2. conf</h3><br /> +<h3 style='display: inline' id='3-conf'>3. conf</h3><br /> <br /> <ul> -<li>💻 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%)</li> +<li>💻 Languages: YAML (80.7%), Perl (10.0%), Shell (6.1%), Python (2.3%), Docker (0.7%), Config (0.2%), HTML (0.1%)</li> <li>📚 Documentation: Markdown (97.1%), Text (2.9%)</li> -<li>📊 Commits: 2305</li> -<li>📈 Lines of Code: 21210</li> -<li>📄 Lines of Documentation: 6495</li> -<li>📅 Development Period: 2021-12-28 to 2026-02-06</li> -<li>🏆 Score: 698.1 (combines code size and activity)</li> +<li>📊 Commits: 785</li> +<li>📈 Lines of Code: 19079</li> +<li>📄 Lines of Documentation: 6585</li> +<li>📅 Development Period: 2021-12-28 to 2026-02-08</li> +<li>🏆 Score: 407.1 (combines code size and activity)</li> <li>⚖️ License: No license found</li> <li>🧪 Status: Experimental (no releases yet)</li> </ul><br /> @@ -145,7 +172,53 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='3-foozone'>3. foo.zone</h3><br /> +<h3 style='display: inline' id='4-dotfiles'>4. dotfiles</h3><br /> +<br /> +<ul> +<li>💻 Languages: Shell (59.2%), CSS (10.9%), Config (10.1%), TOML (10.0%), Ruby (8.4%), JSON (1.1%), INI (0.2%)</li> +<li>📚 Documentation: Markdown (100.0%)</li> +<li>📊 Commits: 762</li> +<li>📈 Lines of Code: 2988</li> +<li>📄 Lines of Documentation: 423</li> +<li>📅 Development Period: 2023-07-30 to 2026-02-14</li> +<li>🏆 Score: 390.7 (combines code size and activity)</li> +<li>⚖️ License: No license found</li> +<li>🧪 Status: Experimental (no releases yet)</li> +</ul><br /> +<br /> +<span>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 <span class='inlinecode'>Rexfile</span> 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 <span class='inlinecode'>home</span> task runs all <span class='inlinecode'>home_*</span> tasks at once for a full install.</span><br /> +<br /> +<span>The architecture is straightforward: config files live in subdirectories mirroring their purpose, and helper functions (<span class='inlinecode'>ensure_file</span>, <span class='inlinecode'>ensure_dir</span>) copy or symlink them into the appropriate <span class='inlinecode'>$HOME</span> 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.</span><br /> +<br /> +<a class='textlink' href='https://codeberg.org/snonux/dotfiles'>View on Codeberg</a><br /> +<a class='textlink' href='https://github.com/snonux/dotfiles'>View on GitHub</a><br /> +<br /> +<span>---</span><br /> +<br /> +<h3 style='display: inline' id='5-confbak'>5. conf.bak</h3><br /> +<br /> +<ul> +<li>💻 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%)</li> +<li>📚 Documentation: Markdown (97.1%), Text (2.9%)</li> +<li>📊 Commits: 2306</li> +<li>📈 Lines of Code: 21210</li> +<li>📄 Lines of Documentation: 6495</li> +<li>📅 Development Period: 2021-12-28 to 2026-02-07</li> +<li>🏆 Score: 331.0 (combines code size and activity)</li> +<li>⚖️ License: No license found</li> +<li>🧪 Status: Experimental (no releases yet)</li> +</ul><br /> +<br /> +<span>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 <span class='inlinecode'>Rexfile</span> 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.).</span><br /> +<br /> +<span>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.</span><br /> +<br /> +<a class='textlink' href='https://codeberg.org/snonux/conf.bak'>View on Codeberg</a><br /> +<a class='textlink' href='https://github.com/snonux/conf.bak'>View on GitHub</a><br /> +<br /> +<span>---</span><br /> +<br /> +<h3 style='display: inline' id='6-foozone'>6. foo.zone</h3><br /> <br /> <ul> <li>💻 Languages: XML (98.7%), Shell (1.0%), Go (0.3%)</li> @@ -154,7 +227,7 @@ <li>📈 Lines of Code: 18702</li> <li>📄 Lines of Documentation: 174</li> <li>📅 Development Period: 2021-04-29 to 2026-02-07</li> -<li>🏆 Score: 689.4 (combines code size and activity)</li> +<li>🏆 Score: 322.6 (combines code size and activity)</li> <li>⚖️ License: No license found</li> <li>🧪 Status: Experimental (no releases yet)</li> </ul><br /> @@ -166,7 +239,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='4-scifi'>4. scifi</h3><br /> +<h3 style='display: inline' id='7-scifi'>7. scifi</h3><br /> <br /> <ul> <li>💻 Languages: JSON (35.9%), CSS (30.6%), JavaScript (29.6%), HTML (3.8%)</li> @@ -175,7 +248,7 @@ <li>📈 Lines of Code: 1664</li> <li>📄 Lines of Documentation: 853</li> <li>📅 Development Period: 2026-01-25 to 2026-01-27</li> -<li>🏆 Score: 232.2 (combines code size and activity)</li> +<li>🏆 Score: 154.0 (combines code size and activity)</li> <li>⚖️ License: No license found</li> <li>🧪 Status: Experimental (no releases yet)</li> </ul><br /> @@ -189,7 +262,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='5-log4jbench'>5. log4jbench</h3><br /> +<h3 style='display: inline' id='8-log4jbench'>8. log4jbench</h3><br /> <br /> <ul> <li>💻 Languages: Java (78.9%), XML (21.1%)</li> @@ -198,7 +271,7 @@ <li>📈 Lines of Code: 774</li> <li>📄 Lines of Documentation: 119</li> <li>📅 Development Period: 2026-01-09 to 2026-01-09</li> -<li>🏆 Score: 96.5 (combines code size and activity)</li> +<li>🏆 Score: 78.1 (combines code size and activity)</li> <li>⚖️ License: MIT</li> <li>🧪 Status: Experimental (no releases yet)</li> </ul><br /> @@ -212,55 +285,32 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='6-hexai'>6. hexai</h3><br /> +<h3 style='display: inline' id='9-gogios'>9. gogios</h3><br /> <br /> <ul> -<li>💻 Languages: Go (100.0%)</li> -<li>📚 Documentation: Markdown (100.0%)</li> -<li>📊 Commits: 259</li> -<li>📈 Lines of Code: 18422</li> -<li>📄 Lines of Documentation: 616</li> -<li>📅 Development Period: 2025-08-01 to 2026-02-06</li> -<li>🏆 Score: 57.5 (combines code size and activity)</li> -<li>⚖️ License: No license found</li> -<li>🏷️ Latest Release: v0.17.0 (2026-02-06)</li> +<li>💻 Languages: Go (98.9%), JSON (0.6%), YAML (0.5%)</li> +<li>📚 Documentation: Markdown (94.9%), Text (5.1%)</li> +<li>📊 Commits: 108</li> +<li>📈 Lines of Code: 3875</li> +<li>📄 Lines of Documentation: 394</li> +<li>📅 Development Period: 2023-04-17 to 2026-02-08</li> +<li>🏆 Score: 35.5 (combines code size and activity)</li> +<li>⚖️ License: Custom License</li> +<li>🏷️ Latest Release: v1.4.0 (2026-02-08)</li> </ul><br /> <br /> -<a href='showcase/hexai/image-1.png'><img alt='hexai screenshot' title='hexai screenshot' src='showcase/hexai/image-1.png' /></a><br /> -<br /> -<span>Hexai is a Go-based AI integration tool designed primarily for the Helix editor that provides LSP (Language Server Protocol) powered AI features. It offers code auto-completion, AI-driven code actions, in-editor chat with LLMs, and a standalone CLI tool for direct LLM interaction. A standout feature is its ability to query multiple AI providers (OpenAI, OpenRouter, GitHub Copilot, Ollama) in parallel, allowing developers to compare responses side-by-side. It has enhanced capabilities for Go code understanding, such as generating unit tests from functions, while supporting other programming languages as well.</span><br /> -<br /> -<span>The project is implemented as an LSP server written in Go, with a TUI component built using Bubble Tea for the tmux-based code action runner (<span class='inlinecode'>hexai-tmux-action</span>). This architecture allows it to integrate seamlessly into LSP-compatible editors, with special focus on Helix + tmux workflows. The custom prompt feature lets developers use their preferred editor to craft prompts, making it flexible for various development workflows.</span><br /> -<br /> -<a class='textlink' href='https://codeberg.org/snonux/hexai'>View on Codeberg</a><br /> -<a class='textlink' href='https://github.com/snonux/hexai'>View on GitHub</a><br /> -<br /> -<span>---</span><br /> -<br /> -<h3 style='display: inline' id='7-perc'>7. perc</h3><br /> -<br /> -<ul> -<li>💻 Languages: Go (100.0%)</li> -<li>📚 Documentation: Markdown (100.0%)</li> -<li>📊 Commits: 7</li> -<li>📈 Lines of Code: 452</li> -<li>📄 Lines of Documentation: 80</li> -<li>📅 Development Period: 2025-11-25 to 2025-11-25</li> -<li>🏆 Score: 35.4 (combines code size and activity)</li> -<li>⚖️ License: No license found</li> -<li>🏷️ Latest Release: v0.1.0 (2025-11-25)</li> -</ul><br /> +<a href='showcase/gogios/image-1.png'><img alt='gogios screenshot' title='gogios screenshot' src='showcase/gogios/image-1.png' /></a><br /> <br /> -<span>**perc** is a command-line percentage calculator written in Go that handles the three common percentage calculation scenarios: finding X% of Y (e.g., "20% of 150"), determining what percentage one number is of another (e.g., "30 is what % of 150"), and finding the whole when given a part and percentage (e.g., "30 is 20% of what"). It accepts natural language-style input and shows step-by-step calculation breakdowns alongside results.</span><br /> +<span>Gogios is a minimalistic monitoring tool written in Go for small-scale infrastructure (e.g., personal servers and VMs). It executes standard Nagios/Icinga monitoring plugins via CRON jobs, tracks state changes in a JSON file, and sends email notifications through a local MTA only when check statuses change. Unlike full-featured monitoring solutions (Nagios, Icinga, Prometheus), Gogios deliberately avoids complexity—no databases, web UIs, clustering, or contact groups—making it ideal for simple, self-hosted environments with limited monitoring needs.</span><br /> <br /> -<span>The tool is built as a simple Go CLI application with a standard project layout (<span class='inlinecode'>cmd/perc</span> for the binary, <span class='inlinecode'>internal/</span> for implementation details) and uses Mage as its build system. It's installable via <span class='inlinecode'>go install</span> and designed for quick mental-math verification or scripting scenarios where percentage calculations are needed.</span><br /> +<span>The architecture is straightforward: JSON configuration defines checks (plugin paths, arguments, timeouts, dependencies, retries), a state directory persists check results between runs, and concurrent execution with configurable limits keeps things efficient. Key features include check dependencies (skip HTTP checks if ping fails), retry logic, stale alert detection, re-notification schedules, and support for remote checks via NRPE. A basic high-availability setup is achievable by running Gogios on two servers with staggered CRON intervals, though this results in duplicate notifications when both servers are operational—a deliberate trade-off for simplicity.</span><br /> <br /> -<a class='textlink' href='https://codeberg.org/snonux/perc'>View on Codeberg</a><br /> -<a class='textlink' href='https://github.com/snonux/perc'>View on GitHub</a><br /> +<a class='textlink' href='https://codeberg.org/snonux/gogios'>View on Codeberg</a><br /> +<a class='textlink' href='https://github.com/snonux/gogios'>View on GitHub</a><br /> <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='8-yoga'>8. yoga</h3><br /> +<h3 style='display: inline' id='10-yoga'>10. yoga</h3><br /> <br /> <ul> <li>💻 Languages: Go (66.1%), HTML (33.9%)</li> @@ -269,7 +319,7 @@ <li>📈 Lines of Code: 5921</li> <li>📄 Lines of Documentation: 83</li> <li>📅 Development Period: 2025-10-01 to 2026-01-28</li> -<li>🏆 Score: 34.9 (combines code size and activity)</li> +<li>🏆 Score: 32.8 (combines code size and activity)</li> <li>⚖️ License: No license found</li> <li>🏷️ Latest Release: v0.4.0 (2026-01-28)</li> </ul><br /> @@ -285,7 +335,30 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='9-totalrecall'>9. totalrecall</h3><br /> +<h3 style='display: inline' id='11-perc'>11. perc</h3><br /> +<br /> +<ul> +<li>💻 Languages: Go (100.0%)</li> +<li>📚 Documentation: Markdown (100.0%)</li> +<li>📊 Commits: 7</li> +<li>📈 Lines of Code: 452</li> +<li>📄 Lines of Documentation: 80</li> +<li>📅 Development Period: 2025-11-25 to 2025-11-25</li> +<li>🏆 Score: 32.4 (combines code size and activity)</li> +<li>⚖️ License: No license found</li> +<li>🏷️ Latest Release: v0.1.0 (2025-11-25)</li> +</ul><br /> +<br /> +<span>**perc** is a command-line percentage calculator written in Go that handles the three common percentage calculation scenarios: finding X% of Y (e.g., "20% of 150"), determining what percentage one number is of another (e.g., "30 is what % of 150"), and finding the whole when given a part and percentage (e.g., "30 is 20% of what"). It accepts natural language-style input and shows step-by-step calculation breakdowns alongside results.</span><br /> +<br /> +<span>The tool is built as a simple Go CLI application with a standard project layout (<span class='inlinecode'>cmd/perc</span> for the binary, <span class='inlinecode'>internal/</span> for implementation details) and uses Mage as its build system. It's installable via <span class='inlinecode'>go install</span> and designed for quick mental-math verification or scripting scenarios where percentage calculations are needed.</span><br /> +<br /> +<a class='textlink' href='https://codeberg.org/snonux/perc'>View on Codeberg</a><br /> +<a class='textlink' href='https://github.com/snonux/perc'>View on GitHub</a><br /> +<br /> +<span>---</span><br /> +<br /> +<h3 style='display: inline' id='12-totalrecall'>12. totalrecall</h3><br /> <br /> <ul> <li>💻 Languages: Go (99.0%), Shell (0.5%), YAML (0.4%)</li> @@ -294,7 +367,7 @@ <li>📈 Lines of Code: 13129</li> <li>📄 Lines of Documentation: 377</li> <li>📅 Development Period: 2025-07-14 to 2026-01-21</li> -<li>🏆 Score: 28.6 (combines code size and activity)</li> +<li>🏆 Score: 27.3 (combines code size and activity)</li> <li>⚖️ License: MIT</li> <li>🏷️ Latest Release: v0.8.0 (2026-01-21)</li> </ul><br /> @@ -312,43 +385,18 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='10-gogios'>10. gogios</h3><br /> -<br /> -<ul> -<li>💻 Languages: Go (98.7%), JSON (0.8%), YAML (0.5%)</li> -<li>📚 Documentation: Markdown (94.9%), Text (5.1%)</li> -<li>📊 Commits: 104</li> -<li>📈 Lines of Code: 3303</li> -<li>📄 Lines of Documentation: 394</li> -<li>📅 Development Period: 2023-04-17 to 2026-01-27</li> -<li>🏆 Score: 24.0 (combines code size and activity)</li> -<li>⚖️ License: Custom License</li> -<li>🏷️ Latest Release: v1.3.0 (2026-01-06)</li> -</ul><br /> -<br /> -<a href='showcase/gogios/image-1.png'><img alt='gogios screenshot' title='gogios screenshot' src='showcase/gogios/image-1.png' /></a><br /> -<br /> -<span>Gogios is a minimalistic monitoring tool written in Go for small-scale infrastructure (e.g., personal servers and VMs). It executes standard Nagios/Icinga monitoring plugins via CRON jobs, tracks state changes in a JSON file, and sends email notifications through a local MTA only when check statuses change. Unlike full-featured monitoring solutions (Nagios, Icinga, Prometheus), Gogios deliberately avoids complexity—no databases, web UIs, clustering, or contact groups—making it ideal for simple, self-hosted environments with limited monitoring needs.</span><br /> -<br /> -<span>The architecture is straightforward: JSON configuration defines checks (plugin paths, arguments, timeouts, dependencies, retries), a state directory persists check results between runs, and concurrent execution with configurable limits keeps things efficient. Key features include check dependencies (skip HTTP checks if ping fails), retry logic, stale alert detection, re-notification schedules, and support for remote checks via NRPE. A basic high-availability setup is achievable by running Gogios on two servers with staggered CRON intervals, though this results in duplicate notifications when both servers are operational—a deliberate trade-off for simplicity.</span><br /> -<br /> -<a class='textlink' href='https://codeberg.org/snonux/gogios'>View on Codeberg</a><br /> -<a class='textlink' href='https://github.com/snonux/gogios'>View on GitHub</a><br /> -<br /> -<span>---</span><br /> -<br /> -<h3 style='display: inline' id='11-gitsyncer'>11. gitsyncer</h3><br /> +<h3 style='display: inline' id='13-gitsyncer'>13. gitsyncer</h3><br /> <br /> <ul> -<li>💻 Languages: Go (92.2%), Shell (7.4%), JSON (0.4%)</li> +<li>💻 Languages: Go (92.5%), Shell (7.1%), JSON (0.4%)</li> <li>📚 Documentation: Markdown (100.0%)</li> -<li>📊 Commits: 116</li> -<li>📈 Lines of Code: 10075</li> -<li>📄 Lines of Documentation: 2432</li> -<li>📅 Development Period: 2025-06-23 to 2025-12-31</li> -<li>🏆 Score: 21.6 (combines code size and activity)</li> +<li>📊 Commits: 117</li> +<li>📈 Lines of Code: 10446</li> +<li>📄 Lines of Documentation: 2445</li> +<li>📅 Development Period: 2025-06-23 to 2026-02-07</li> +<li>🏆 Score: 21.5 (combines code size and activity)</li> <li>⚖️ License: BSD-2-Clause</li> -<li>🏷️ Latest Release: v0.11.0 (2025-12-31)</li> +<li>🏷️ Latest Release: v0.12.0 (2026-02-07)</li> </ul><br /> <br /> <span>GitSyncer is a Go-based CLI tool that automatically synchronizes git repositories across multiple hosting platforms (GitHub, Codeberg, SSH servers). It maintains all branches in sync bidirectionally, never deleting branches but automatically creating and updating them as needed. The tool excels at providing repository redundancy and backup, with special support for one-way SSH backups to private servers (like home NAS devices) that may be offline intermittently. It includes AI-powered features for generating release notes and project showcase documentation, plus automated weekly batch synchronization for hands-off maintenance.</span><br /> @@ -360,7 +408,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='12-foostats'>12. foostats</h3><br /> +<h3 style='display: inline' id='14-foostats'>14. foostats</h3><br /> <br /> <ul> <li>💻 Languages: Perl (100.0%)</li> @@ -369,7 +417,7 @@ <li>📈 Lines of Code: 1902</li> <li>📄 Lines of Documentation: 423</li> <li>📅 Development Period: 2023-01-02 to 2025-11-01</li> -<li>🏆 Score: 19.2 (combines code size and activity)</li> +<li>🏆 Score: 18.5 (combines code size and activity)</li> <li>⚖️ License: Custom License</li> <li>🏷️ Latest Release: v0.2.0 (2025-10-21)</li> </ul><br /> @@ -383,7 +431,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='13-tasksamurai'>13. tasksamurai</h3><br /> +<h3 style='display: inline' id='15-tasksamurai'>15. tasksamurai</h3><br /> <br /> <ul> <li>💻 Languages: Go (99.8%), YAML (0.2%)</li> @@ -392,7 +440,7 @@ <li>📈 Lines of Code: 6544</li> <li>📄 Lines of Documentation: 254</li> <li>📅 Development Period: 2025-06-19 to 2026-02-04</li> -<li>🏆 Score: 19.1 (combines code size and activity)</li> +<li>🏆 Score: 18.4 (combines code size and activity)</li> <li>⚖️ License: BSD-2-Clause</li> <li>🏷️ Latest Release: v0.11.0 (2026-02-04)</li> </ul><br /> @@ -410,30 +458,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='14-timr'>14. timr</h3><br /> -<br /> -<ul> -<li>💻 Languages: Go (96.0%), Shell (4.0%)</li> -<li>📚 Documentation: Markdown (100.0%)</li> -<li>📊 Commits: 32</li> -<li>📈 Lines of Code: 1538</li> -<li>📄 Lines of Documentation: 99</li> -<li>📅 Development Period: 2025-06-25 to 2026-01-02</li> -<li>🏆 Score: 17.3 (combines code size and activity)</li> -<li>⚖️ License: MIT</li> -<li>🏷️ Latest Release: v0.3.0 (2026-01-02)</li> -</ul><br /> -<br /> -<span><span class='inlinecode'>timr</span> is a minimalist command-line stopwatch timer written in Go that helps developers track time spent on tasks. It provides a persistent timer that saves state to disk, allowing you to start, stop, pause, and resume time tracking across terminal sessions. The tool supports multiple viewing modes including a standard status display (with formatted or raw output in seconds/minutes), a live full-screen view with keyboard controls, and specialized output for shell prompt integration.</span><br /> -<br /> -<span>The architecture is straightforward: it's a Go-based CLI application that persists timer state to the filesystem, enabling continuous tracking even when the program isn't actively running. Key features include basic timer controls (start/stop/continue/reset), flexible status reporting formats for automation, and fish shell integration that displays a color-coded timer icon and elapsed time directly in your prompt—making it effortless to keep track of how long you've been working without context switching.</span><br /> -<br /> -<a class='textlink' href='https://codeberg.org/snonux/timr'>View on Codeberg</a><br /> -<a class='textlink' href='https://github.com/snonux/timr'>View on GitHub</a><br /> -<br /> -<span>---</span><br /> -<br /> -<h3 style='display: inline' id='15-ior'>15. ior</h3><br /> +<h3 style='display: inline' id='16-ior'>16. ior</h3><br /> <br /> <ul> <li>💻 Languages: Go (50.4%), C (43.1%), Raku (4.5%), Make (1.1%), C/C++ (1.0%)</li> @@ -442,7 +467,7 @@ <li>📈 Lines of Code: 13072</li> <li>📄 Lines of Documentation: 680</li> <li>📅 Development Period: 2024-01-18 to 2025-10-09</li> -<li>🏆 Score: 17.2 (combines code size and activity)</li> +<li>🏆 Score: 16.7 (combines code size and activity)</li> <li>⚖️ License: No license found</li> <li>🧪 Status: Experimental (no releases yet)</li> </ul><br /> @@ -460,7 +485,30 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='16-dtail'>16. dtail</h3><br /> +<h3 style='display: inline' id='17-timr'>17. timr</h3><br /> +<br /> +<ul> +<li>💻 Languages: Go (96.0%), Shell (4.0%)</li> +<li>📚 Documentation: Markdown (100.0%)</li> +<li>📊 Commits: 32</li> +<li>📈 Lines of Code: 1538</li> +<li>📄 Lines of Documentation: 99</li> +<li>📅 Development Period: 2025-06-25 to 2026-01-02</li> +<li>🏆 Score: 16.7 (combines code size and activity)</li> +<li>⚖️ License: MIT</li> +<li>🏷️ Latest Release: v0.3.0 (2026-01-02)</li> +</ul><br /> +<br /> +<span><span class='inlinecode'>timr</span> is a minimalist command-line stopwatch timer written in Go that helps developers track time spent on tasks. It provides a persistent timer that saves state to disk, allowing you to start, stop, pause, and resume time tracking across terminal sessions. The tool supports multiple viewing modes including a standard status display (with formatted or raw output in seconds/minutes), a live full-screen view with keyboard controls, and specialized output for shell prompt integration.</span><br /> +<br /> +<span>The architecture is straightforward: it's a Go-based CLI application that persists timer state to the filesystem, enabling continuous tracking even when the program isn't actively running. Key features include basic timer controls (start/stop/continue/reset), flexible status reporting formats for automation, and fish shell integration that displays a color-coded timer icon and elapsed time directly in your prompt—making it effortless to keep track of how long you've been working without context switching.</span><br /> +<br /> +<a class='textlink' href='https://codeberg.org/snonux/timr'>View on Codeberg</a><br /> +<a class='textlink' href='https://github.com/snonux/timr'>View on GitHub</a><br /> +<br /> +<span>---</span><br /> +<br /> +<h3 style='display: inline' id='18-dtail'>18. dtail</h3><br /> <br /> <ul> <li>💻 Languages: Go (93.9%), JSON (2.8%), C (2.0%), Make (0.5%), C/C++ (0.3%), Config (0.2%), Shell (0.2%), Docker (0.1%)</li> @@ -469,7 +517,7 @@ <li>📈 Lines of Code: 20091</li> <li>📄 Lines of Documentation: 5674</li> <li>📅 Development Period: 2020-01-09 to 2025-06-20</li> -<li>🏆 Score: 16.1 (combines code size and activity)</li> +<li>🏆 Score: 15.7 (combines code size and activity)</li> <li>⚖️ License: Apache-2.0</li> <li>🏷️ Latest Release: v4.3.3 (2024-08-23)</li> </ul><br /> @@ -487,7 +535,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='17-gos'>17. gos</h3><br /> +<h3 style='display: inline' id='19-gos'>19. gos</h3><br /> <br /> <ul> <li>💻 Languages: Go (99.8%), JSON (0.2%)</li> @@ -496,7 +544,7 @@ <li>📈 Lines of Code: 4102</li> <li>📄 Lines of Documentation: 357</li> <li>📅 Development Period: 2024-05-04 to 2025-12-27</li> -<li>🏆 Score: 15.4 (combines code size and activity)</li> +<li>🏆 Score: 15.0 (combines code size and activity)</li> <li>⚖️ License: Custom License</li> <li>🏷️ Latest Release: v1.2.3 (2026-01-31)</li> </ul><br /> @@ -514,7 +562,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='18-ds-sim'>18. ds-sim</h3><br /> +<h3 style='display: inline' id='20-ds-sim'>20. ds-sim</h3><br /> <br /> <ul> <li>💻 Languages: Java (98.9%), Shell (0.6%), CSS (0.5%)</li> @@ -523,7 +571,7 @@ <li>📈 Lines of Code: 25762</li> <li>📄 Lines of Documentation: 3101</li> <li>📅 Development Period: 2008-05-15 to 2025-06-27</li> -<li>🏆 Score: 14.7 (combines code size and activity)</li> +<li>🏆 Score: 14.4 (combines code size and activity)</li> <li>⚖️ License: Custom License</li> <li>🧪 Status: Experimental (no releases yet)</li> </ul><br /> @@ -539,30 +587,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='19-gemtexter'>19. gemtexter</h3><br /> -<br /> -<ul> -<li>💻 Languages: CSS (55.3%), Python (16.1%), HTML (15.3%), JSON (6.6%), Shell (5.3%), Config (1.5%)</li> -<li>📚 Documentation: Text (70.2%), Markdown (29.8%)</li> -<li>📊 Commits: 472</li> -<li>📈 Lines of Code: 30319</li> -<li>📄 Lines of Documentation: 1280</li> -<li>📅 Development Period: 2021-05-21 to 2025-06-22</li> -<li>🏆 Score: 10.8 (combines code size and activity)</li> -<li>⚖️ License: GPL-3.0</li> -<li>🏷️ Latest Release: 3.0.0 (2024-10-01)</li> -</ul><br /> -<br /> -<span>Gemtexter is a static site generator and blog engine written in Bash that converts content from Gemini Gemtext format into multiple output formats (HTML, Markdown) simultaneously. It allows you to maintain a single source of truth in Gemtext and automatically generates XHTML Transitional 1.0, Markdown, and Atom feeds, enabling you to publish the same content across Gemini capsules, traditional websites, and platforms like GitHub/Codeberg Pages. The tool handles blog post management automatically—creating a new dated <span class='inlinecode'>.gmi</span> file triggers auto-indexing, feed generation, and cross-format conversion.</span><br /> -<br /> -<span>The architecture leverages GNU utilities (sed, grep, date) and optional tools like GNU Source Highlight for syntax highlighting. It includes a templating system that executes embedded Bash code in <span class='inlinecode'>.gmi.tpl</span> files, supports themes for HTML output, and integrates with Git for version control and publishing workflows. Despite being implemented as a complex Bash script, it remains maintainable and serves as an experiment in how far shell scripting can scale for content management tasks.</span><br /> -<br /> -<a class='textlink' href='https://codeberg.org/snonux/gemtexter'>View on Codeberg</a><br /> -<a class='textlink' href='https://github.com/snonux/gemtexter'>View on GitHub</a><br /> -<br /> -<span>---</span><br /> -<br /> -<h3 style='display: inline' id='20-wireguardmeshgenerator'>20. wireguardmeshgenerator</h3><br /> +<h3 style='display: inline' id='21-wireguardmeshgenerator'>21. wireguardmeshgenerator</h3><br /> <br /> <ul> <li>💻 Languages: Ruby (65.4%), YAML (34.6%)</li> @@ -571,7 +596,7 @@ <li>📈 Lines of Code: 563</li> <li>📄 Lines of Documentation: 24</li> <li>📅 Development Period: 2025-04-18 to 2026-01-20</li> -<li>🏆 Score: 10.4 (combines code size and activity)</li> +<li>🏆 Score: 10.1 (combines code size and activity)</li> <li>⚖️ License: Custom License</li> <li>🏷️ Latest Release: v1.0.0 (2025-05-11)</li> </ul><br /> @@ -585,7 +610,30 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='21-rcm'>21. rcm</h3><br /> +<h3 style='display: inline' id='22-gemtexter'>22. gemtexter</h3><br /> +<br /> +<ul> +<li>💻 Languages: Shell (68.2%), CSS (28.5%), Config (1.9%), HTML (1.3%)</li> +<li>📚 Documentation: Text (76.1%), Markdown (23.9%)</li> +<li>📊 Commits: 472</li> +<li>📈 Lines of Code: 2288</li> +<li>📄 Lines of Documentation: 1180</li> +<li>📅 Development Period: 2021-05-21 to 2025-12-31</li> +<li>🏆 Score: 9.9 (combines code size and activity)</li> +<li>⚖️ License: GPL-3.0</li> +<li>🏷️ Latest Release: 3.0.0 (2024-10-01)</li> +</ul><br /> +<br /> +<span>Gemtexter is a static site generator and blog engine written in Bash that converts content from Gemini Gemtext format into multiple output formats (HTML, Markdown) simultaneously. It allows you to maintain a single source of truth in Gemtext and automatically generates XHTML Transitional 1.0, Markdown, and Atom feeds, enabling you to publish the same content across Gemini capsules, traditional websites, and platforms like GitHub/Codeberg Pages. The tool handles blog post management automatically—creating a new dated <span class='inlinecode'>.gmi</span> file triggers auto-indexing, feed generation, and cross-format conversion.</span><br /> +<br /> +<span>The architecture leverages GNU utilities (sed, grep, date) and optional tools like GNU Source Highlight for syntax highlighting. It includes a templating system that executes embedded Bash code in <span class='inlinecode'>.gmi.tpl</span> files, supports themes for HTML output, and integrates with Git for version control and publishing workflows. Despite being implemented as a complex Bash script, it remains maintainable and serves as an experiment in how far shell scripting can scale for content management tasks.</span><br /> +<br /> +<a class='textlink' href='https://codeberg.org/snonux/gemtexter'>View on Codeberg</a><br /> +<a class='textlink' href='https://github.com/snonux/gemtexter'>View on GitHub</a><br /> +<br /> +<span>---</span><br /> +<br /> +<h3 style='display: inline' id='23-rcm'>23. rcm</h3><br /> <br /> <ul> <li>💻 Languages: Ruby (99.8%), TOML (0.2%)</li> @@ -594,7 +642,7 @@ <li>📈 Lines of Code: 1377</li> <li>📄 Lines of Documentation: 113</li> <li>📅 Development Period: 2024-12-05 to 2025-11-26</li> -<li>🏆 Score: 9.1 (combines code size and activity)</li> +<li>🏆 Score: 8.9 (combines code size and activity)</li> <li>⚖️ License: Custom License</li> <li>🧪 Status: Experimental (no releases yet)</li> </ul><br /> @@ -608,7 +656,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='22-terraform'>22. terraform</h3><br /> +<h3 style='display: inline' id='24-terraform'>24. terraform</h3><br /> <br /> <ul> <li>💻 Languages: HCL (96.6%), Make (1.9%), YAML (1.5%)</li> @@ -631,7 +679,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='23-quicklogger'>23. quicklogger</h3><br /> +<h3 style='display: inline' id='25-quicklogger'>25. quicklogger</h3><br /> <br /> <ul> <li>💻 Languages: Go (96.1%), XML (1.9%), Shell (1.2%), TOML (0.7%)</li> @@ -658,7 +706,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='24-sillybench'>24. sillybench</h3><br /> +<h3 style='display: inline' id='26-sillybench'>26. sillybench</h3><br /> <br /> <ul> <li>💻 Languages: Go (90.9%), Shell (9.1%)</li> @@ -667,7 +715,7 @@ <li>📈 Lines of Code: 33</li> <li>📄 Lines of Documentation: 3</li> <li>📅 Development Period: 2025-04-03 to 2025-04-03</li> -<li>🏆 Score: 4.9 (combines code size and activity)</li> +<li>🏆 Score: 4.8 (combines code size and activity)</li> <li>⚖️ License: No license found</li> <li>🧪 Status: Experimental (no releases yet)</li> </ul><br /> @@ -681,7 +729,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='25-gorum'>25. gorum</h3><br /> +<h3 style='display: inline' id='27-gorum'>27. gorum</h3><br /> <br /> <ul> <li>💻 Languages: Go (91.3%), JSON (6.4%), YAML (2.3%)</li> @@ -705,7 +753,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='26-guprecords'>26. guprecords</h3><br /> +<h3 style='display: inline' id='28-guprecords'>28. guprecords</h3><br /> <br /> <ul> <li>💻 Languages: Raku (100.0%)</li> @@ -728,53 +776,53 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='27-docker-radicale-server'>27. docker-radicale-server</h3><br /> +<h3 style='display: inline' id='29-geheim'>29. geheim</h3><br /> <br /> <ul> -<li>💻 Languages: Make (57.5%), Docker (42.5%)</li> +<li>💻 Languages: Ruby (86.7%), Shell (13.3%)</li> <li>📚 Documentation: Markdown (100.0%)</li> -<li>📊 Commits: 5</li> -<li>📈 Lines of Code: 40</li> -<li>📄 Lines of Documentation: 3</li> -<li>📅 Development Period: 2023-12-31 to 2025-08-11</li> -<li>🏆 Score: 2.5 (combines code size and activity)</li> +<li>📊 Commits: 74</li> +<li>📈 Lines of Code: 822</li> +<li>📄 Lines of Documentation: 106</li> +<li>📅 Development Period: 2018-05-26 to 2025-11-01</li> +<li>🏆 Score: 2.4 (combines code size and activity)</li> <li>⚖️ License: No license found</li> -<li>🧪 Status: Experimental (no releases yet)</li> +<li>🏷️ Latest Release: v0.3.1 (2025-11-01)</li> </ul><br /> <br /> -<span>This project is a Docker containerization of **Radicale**, a lightweight CalDAV and CardDAV server for calendar and contact synchronization. Radicale enables users to self-host their calendars and contacts, providing an open-source alternative to cloud services like Google Calendar or iCloud. The Dockerized version makes it easy to deploy and manage the server with minimal setup.</span><br /> +<span>**geheim.rb** is a Ruby-based encrypted document management system that stores text and binary files in a Git repository with end-to-end encryption. It uses AES-256-CBC encryption with a PIN-derived initialization vector, encrypting both file contents and filenames while maintaining them in encrypted indices. The tool is designed for managing smaller sensitive files like text documents and PDFs with the security of encryption combined with Git's version control and distribution capabilities.</span><br /> <br /> -<span>The implementation uses Alpine Linux as the base image for a minimal footprint, installs Radicale via pip, and configures it with htpasswd authentication and file-based storage. The container exposes port 8080 and runs as a non-root user for security. The architecture includes separate volumes for authentication credentials, calendar/contact collections, and configuration, making it straightforward to persist data and customize the server behavior.</span><br /> +<span>The architecture leverages Git for storage and synchronization across multiple remote repositories (enabling geo-redundancy), integrates with <span class='inlinecode'>fzf</span> for fuzzy searching through encrypted indices, and provides a practical workflow with features like NeoVim integration for text editing (with security precautions like disabled caching), clipboard support for MacOS and GNOME, an interactive shell interface, and batch import/export capabilities. It's cross-platform (MacOS, Linux, Android via Termux) and designed for personal use where you need encrypted, version-controlled, and geo-distributed document storage with convenient search and editing workflows.</span><br /> <br /> -<a class='textlink' href='https://codeberg.org/snonux/docker-radicale-server'>View on Codeberg</a><br /> -<a class='textlink' href='https://github.com/snonux/docker-radicale-server'>View on GitHub</a><br /> +<a class='textlink' href='https://codeberg.org/snonux/geheim'>View on Codeberg</a><br /> +<a class='textlink' href='https://github.com/snonux/geheim'>View on GitHub</a><br /> <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='28-geheim'>28. geheim</h3><br /> +<h3 style='display: inline' id='30-docker-radicale-server'>30. docker-radicale-server</h3><br /> <br /> <ul> -<li>💻 Languages: Ruby (86.7%), Shell (13.3%)</li> +<li>💻 Languages: Make (57.5%), Docker (42.5%)</li> <li>📚 Documentation: Markdown (100.0%)</li> -<li>📊 Commits: 74</li> -<li>📈 Lines of Code: 822</li> -<li>📄 Lines of Documentation: 106</li> -<li>📅 Development Period: 2018-05-26 to 2025-11-01</li> +<li>📊 Commits: 5</li> +<li>📈 Lines of Code: 40</li> +<li>📄 Lines of Documentation: 3</li> +<li>📅 Development Period: 2023-12-31 to 2025-08-11</li> <li>🏆 Score: 2.4 (combines code size and activity)</li> <li>⚖️ License: No license found</li> -<li>🏷️ Latest Release: v0.3.1 (2025-11-01)</li> +<li>🧪 Status: Experimental (no releases yet)</li> </ul><br /> <br /> -<span>**geheim.rb** is a Ruby-based encrypted document management system that stores text and binary files in a Git repository with end-to-end encryption. It uses AES-256-CBC encryption with a PIN-derived initialization vector, encrypting both file contents and filenames while maintaining them in encrypted indices. The tool is designed for managing smaller sensitive files like text documents and PDFs with the security of encryption combined with Git's version control and distribution capabilities.</span><br /> +<span>This project is a Docker containerization of **Radicale**, a lightweight CalDAV and CardDAV server for calendar and contact synchronization. Radicale enables users to self-host their calendars and contacts, providing an open-source alternative to cloud services like Google Calendar or iCloud. The Dockerized version makes it easy to deploy and manage the server with minimal setup.</span><br /> <br /> -<span>The architecture leverages Git for storage and synchronization across multiple remote repositories (enabling geo-redundancy), integrates with <span class='inlinecode'>fzf</span> for fuzzy searching through encrypted indices, and provides a practical workflow with features like NeoVim integration for text editing (with security precautions like disabled caching), clipboard support for MacOS and GNOME, an interactive shell interface, and batch import/export capabilities. It's cross-platform (MacOS, Linux, Android via Termux) and designed for personal use where you need encrypted, version-controlled, and geo-distributed document storage with convenient search and editing workflows.</span><br /> +<span>The implementation uses Alpine Linux as the base image for a minimal footprint, installs Radicale via pip, and configures it with htpasswd authentication and file-based storage. The container exposes port 8080 and runs as a non-root user for security. The architecture includes separate volumes for authentication credentials, calendar/contact collections, and configuration, making it straightforward to persist data and customize the server behavior.</span><br /> <br /> -<a class='textlink' href='https://codeberg.org/snonux/geheim'>View on Codeberg</a><br /> -<a class='textlink' href='https://github.com/snonux/geheim'>View on GitHub</a><br /> +<a class='textlink' href='https://codeberg.org/snonux/docker-radicale-server'>View on Codeberg</a><br /> +<a class='textlink' href='https://github.com/snonux/docker-radicale-server'>View on GitHub</a><br /> <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='29-algorithms'>29. algorithms</h3><br /> +<h3 style='display: inline' id='31-algorithms'>31. algorithms</h3><br /> <br /> <ul> <li>💻 Languages: Go (99.2%), Make (0.8%)</li> @@ -798,7 +846,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='30-randomjournalpage'>30. randomjournalpage</h3><br /> +<h3 style='display: inline' id='32-randomjournalpage'>32. randomjournalpage</h3><br /> <br /> <ul> <li>💻 Languages: Shell (94.1%), Make (5.9%)</li> @@ -822,7 +870,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='31-photoalbum'>31. photoalbum</h3><br /> +<h3 style='display: inline' id='33-photoalbum'>33. photoalbum</h3><br /> <br /> <ul> <li>💻 Languages: Shell (80.1%), Make (12.3%), Config (7.6%)</li> @@ -846,7 +894,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='32-ioriot'>32. ioriot</h3><br /> +<h3 style='display: inline' id='34-ioriot'>34. ioriot</h3><br /> <br /> <ul> <li>💻 Languages: C (55.5%), C/C++ (24.0%), Config (19.6%), Make (1.0%)</li> @@ -872,7 +920,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='33-ipv6test'>33. ipv6test</h3><br /> +<h3 style='display: inline' id='35-ipv6test'>35. ipv6test</h3><br /> <br /> <ul> <li>💻 Languages: Perl (65.8%), Docker (34.2%)</li> @@ -895,7 +943,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='34-sway-autorotate'>34. sway-autorotate</h3><br /> +<h3 style='display: inline' id='36-sway-autorotate'>36. sway-autorotate</h3><br /> <br /> <ul> <li>💻 Languages: Shell (100.0%)</li> @@ -918,7 +966,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='35-mon'>35. mon</h3><br /> +<h3 style='display: inline' id='37-mon'>37. mon</h3><br /> <br /> <ul> <li>💻 Languages: Perl (96.5%), Shell (1.8%), Make (1.2%), Config (0.4%)</li> @@ -942,7 +990,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='36-staticfarm-apache-handlers'>36. staticfarm-apache-handlers</h3><br /> +<h3 style='display: inline' id='38-staticfarm-apache-handlers'>38. staticfarm-apache-handlers</h3><br /> <br /> <ul> <li>💻 Languages: Perl (96.4%), Make (3.6%)</li> @@ -966,7 +1014,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='37-pingdomfetch'>37. pingdomfetch</h3><br /> +<h3 style='display: inline' id='39-pingdomfetch'>39. pingdomfetch</h3><br /> <br /> <ul> <li>💻 Languages: Perl (97.3%), Make (2.7%)</li> @@ -990,7 +1038,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='38-xerl'>38. xerl</h3><br /> +<h3 style='display: inline' id='40-xerl'>40. xerl</h3><br /> <br /> <ul> <li>💻 Languages: Perl (98.3%), Config (1.2%), Make (0.5%)</li> @@ -1012,7 +1060,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='39-ychat'>39. ychat</h3><br /> +<h3 style='display: inline' id='41-ychat'>41. ychat</h3><br /> <br /> <ul> <li>💻 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%)</li> @@ -1036,7 +1084,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='40-fapi'>40. fapi</h3><br /> +<h3 style='display: inline' id='42-fapi'>42. fapi</h3><br /> <br /> <ul> <li>💻 Languages: Python (96.6%), Make (3.1%), Config (0.3%)</li> @@ -1059,7 +1107,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='41-perl-c-fibonacci'>41. perl-c-fibonacci</h3><br /> +<h3 style='display: inline' id='43-perl-c-fibonacci'>43. perl-c-fibonacci</h3><br /> <br /> <ul> <li>💻 Languages: C (80.4%), Make (19.6%)</li> @@ -1081,7 +1129,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='42-netcalendar'>42. netcalendar</h3><br /> +<h3 style='display: inline' id='44-netcalendar'>44. netcalendar</h3><br /> <br /> <ul> <li>💻 Languages: Java (83.0%), HTML (12.9%), XML (3.0%), CSS (0.8%), Make (0.2%)</li> @@ -1109,18 +1157,18 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='43-loadbars'>43. loadbars</h3><br /> +<h3 style='display: inline' id='45-loadbars'>45. loadbars</h3><br /> <br /> <ul> <li>💻 Languages: Perl (97.4%), Make (2.6%)</li> <li>📚 Documentation: Text (100.0%)</li> -<li>📊 Commits: 527</li> +<li>📊 Commits: 557</li> <li>📈 Lines of Code: 1828</li> <li>📄 Lines of Documentation: 100</li> <li>📅 Development Period: 2010-11-05 to 2015-05-23</li> <li>🏆 Score: 0.7 (combines code size and activity)</li> <li>⚖️ License: No license found</li> -<li>🏷️ Latest Release: 0.7.5 (2014-06-22)</li> +<li>🏷️ Latest Release: v0.9.0 (2026-02-14)</li> </ul><br /> <span>⚠️ **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.</span><br /> <br /> @@ -1131,7 +1179,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='44-gotop'>44. gotop</h3><br /> +<h3 style='display: inline' id='46-gotop'>46. gotop</h3><br /> <br /> <ul> <li>💻 Languages: Go (98.0%), Make (2.0%)</li> @@ -1155,7 +1203,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='45-fype'>45. fype</h3><br /> +<h3 style='display: inline' id='47-fype'>47. fype</h3><br /> <br /> <ul> <li>💻 Languages: C (71.1%), C/C++ (20.7%), HTML (6.6%), Make (1.5%)</li> @@ -1179,7 +1227,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='46-rubyfy'>46. rubyfy</h3><br /> +<h3 style='display: inline' id='48-rubyfy'>48. rubyfy</h3><br /> <br /> <ul> <li>💻 Languages: Ruby (98.5%), JSON (1.5%)</li> @@ -1203,7 +1251,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='47-pwgrep'>47. pwgrep</h3><br /> +<h3 style='display: inline' id='49-pwgrep'>49. pwgrep</h3><br /> <br /> <ul> <li>💻 Languages: Shell (85.0%), Make (15.0%)</li> @@ -1227,7 +1275,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='48-perldaemon'>48. perldaemon</h3><br /> +<h3 style='display: inline' id='50-perldaemon'>50. perldaemon</h3><br /> <br /> <ul> <li>💻 Languages: Perl (72.3%), Shell (23.8%), Config (3.9%)</li> @@ -1249,7 +1297,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='49-jsmstrade'>49. jsmstrade</h3><br /> +<h3 style='display: inline' id='51-jsmstrade'>51. jsmstrade</h3><br /> <br /> <ul> <li>💻 Languages: Java (76.0%), Shell (15.4%), XML (8.6%)</li> @@ -1275,7 +1323,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='50-japi'>50. japi</h3><br /> +<h3 style='display: inline' id='52-japi'>52. japi</h3><br /> <br /> <ul> <li>💻 Languages: Perl (78.3%), Make (21.7%)</li> @@ -1299,7 +1347,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='51-perl-poetry'>51. perl-poetry</h3><br /> +<h3 style='display: inline' id='53-perl-poetry'>53. perl-poetry</h3><br /> <br /> <ul> <li>💻 Languages: Perl (100.0%)</li> @@ -1323,7 +1371,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='52-muttdelay'>52. muttdelay</h3><br /> +<h3 style='display: inline' id='54-muttdelay'>54. muttdelay</h3><br /> <br /> <ul> <li>💻 Languages: Make (47.1%), Shell (46.3%), Vim Script (5.9%), Config (0.7%)</li> @@ -1347,7 +1395,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='53-netdiff'>53. netdiff</h3><br /> +<h3 style='display: inline' id='55-netdiff'>55. netdiff</h3><br /> <br /> <ul> <li>💻 Languages: Shell (52.2%), Make (46.3%), Config (1.5%)</li> @@ -1371,7 +1419,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='54-debroid'>54. debroid</h3><br /> +<h3 style='display: inline' id='56-debroid'>56. debroid</h3><br /> <br /> <ul> <li>💻 Languages: Shell (92.0%), Make (8.0%)</li> @@ -1397,7 +1445,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='55-hsbot'>55. hsbot</h3><br /> +<h3 style='display: inline' id='57-hsbot'>57. hsbot</h3><br /> <br /> <ul> <li>💻 Languages: Haskell (98.5%), Make (1.5%)</li> @@ -1419,7 +1467,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='56-cpuinfo'>56. cpuinfo</h3><br /> +<h3 style='display: inline' id='58-cpuinfo'>58. cpuinfo</h3><br /> <br /> <ul> <li>💻 Languages: Shell (53.2%), Make (46.8%)</li> @@ -1443,7 +1491,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='57-template'>57. template</h3><br /> +<h3 style='display: inline' id='59-template'>59. template</h3><br /> <br /> <ul> <li>💻 Languages: Make (89.2%), Shell (10.8%)</li> @@ -1467,7 +1515,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='58-awksite'>58. awksite</h3><br /> +<h3 style='display: inline' id='60-awksite'>60. awksite</h3><br /> <br /> <ul> <li>💻 Languages: AWK (72.1%), HTML (16.4%), Config (11.5%)</li> @@ -1491,7 +1539,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='59-dyndns'>59. dyndns</h3><br /> +<h3 style='display: inline' id='61-dyndns'>61. dyndns</h3><br /> <br /> <ul> <li>💻 Languages: Shell (100.0%)</li> @@ -1515,7 +1563,7 @@ <br /> <span>---</span><br /> <br /> -<h3 style='display: inline' id='60-vs-sim'>60. vs-sim</h3><br /> +<h3 style='display: inline' id='62-vs-sim'>62. vs-sim</h3><br /> <br /> <ul> <li>📚 Documentation: Markdown (100.0%)</li> diff --git a/about/showcase/debroid/image-1.png b/about/showcase/debroid/image-1.png index 1a16cd4f..005e7136 100644 --- a/about/showcase/debroid/image-1.png +++ b/about/showcase/debroid/image-1.png @@ -27,12 +27,12 @@ <link rel="preconnect" href="https://github.githubassets.com" crossorigin> <link rel="preconnect" href="https://avatars.githubusercontent.com"> - <link crossorigin="anonymous" rel="preload" as="script" href="https://github.githubassets.com/assets/global-banner-disable-e20dfdd68b9b271b.js" /> + <link crossorigin="anonymous" rel="preload" as="script" href="https://github.githubassets.com/assets/global-banner-disable-8a300af6d815087d.js" /> <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-7a548c73f231168f.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light_high_contrast-6d5205ba83e64657.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-a037c5198a3956d3.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark_high_contrast-c4cd957551b6a79f.css" /><link data-color-theme="light" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light-7a548c73f231168f.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-6d5205ba83e64657.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-92d1f03520a71f42.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-df96da265a7bd744.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-6db3b080ed072628.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-90fe1d4276b4e140.css" /><link data-color-theme="dark" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark-a037c5198a3956d3.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-c4cd957551b6a79f.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-07a599f014ccb7af.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-c82f4bc8e6fa1496.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-c7f850982eb2d6ef.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-bb5b3e819015bc33.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-5371e55576aee699.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-4db2d2a5d2d86648.css" /> + <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" /> <style type="text/css"> :root { @@ -44,49 +44,49 @@ } </style> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-2c5f58bae956fa96.css" /> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-b97936554294d7a3.css" /> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-5d300701a37a830a.css" /> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-294399c8d5b652c5.css" /> + <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" /> - <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","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_security_alert_assignee_options","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_comment_pinning","issue_fields_compact_view","issue_fields_global_search","issue_fields_report_usage","issue_fields_timeline_events","issues_cca_assign_actor_with_agent","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","issues_report_sidebar_interactions","landing_pages_ninetailed","lifecycle_label_name_updates","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_display_button_config_menu","memex_grouped_by_edit_route","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","mission_control_retry_on_401","mission_control_use_body_html","open_agent_session_in_vscode_insiders","open_agent_session_in_vscode_stable","primer_react_css_has_selector_perf","projects_assignee_max_limit","prs_conversations_react","react_quality_profiling","repo_picker_client_caching","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","swe_agent_member_requests","viewscreen_sandbox","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"}</script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/high-contrast-cookie-b49c93c4a66923b1.js"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-a365739c073e005e.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/19762-81d8d5b6d1548747.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/49863-4976e709f3e70037.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/22060-65b6ab518146f610.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/environment-a51d75132b05ab62.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/2966-17a81e258d07c2f2.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/96232-b9d545f230321d7c.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/41013-a3ad6242e7f8e42a.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/51210-6b5503327f030bf0.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/41121-687180e90512ebb8.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/2302-893769a03771e2b9.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/46740-4a90f6808789c7e0.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/20425-e0dc13f26c8ee149.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-47afb2cc6f88f2ab.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-00d059a39bc367bc.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/react-core-9e65dba44886edf0.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-2f71bc80da1778d4.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/7053-ac767626dd950bdd.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/79039-9993689954cc2834.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/61110-4d1f28b4f7de000b.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/2887-e2ef3aca87cf3cff.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/26533-62506039554211c5.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/62249-3d8ecc3d46f0dc4a.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/16674-c6884f27fffb8eee.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/55821-8df7f70f24788ba2.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/84184-d5f38c738dddc6e7.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/91160-58ac38733522873c.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/68160-4d147b4adc4e3757.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/34391-4b927fa8f60ebdd2.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/64453-778588b08614a898.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-49e32172e06825b6.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/20475-125b055bc62d02e3.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-9526169739e19e0a.js" defer="defer"></script> + <script type="application/json" id="client-env">{"locale":"en","featureFlags":["a11y_status_checks_ruleset","action_yml_language_service","actions_custom_images_public_preview_visibility","actions_custom_images_storage_billing_ui_visibility","actions_enable_snapshot_keyword","actions_image_version_event","actions_workflow_language_service","alternate_user_config_repo","api_insights_show_missing_data_banner","arianotify_comprehensive_migration","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 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/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/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/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/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> +<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/61110-212553c409076913.js" defer="defer"></script> +<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/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/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> <title>Page not found · GitHub · GitHub</title> @@ -96,13 +96,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:9fb1ed0e-0b35-3ba9-9bed-e09f6b40fb86"> + <meta name="fetch-nonce" content="v2:6602e338-2aa2-81da-d71d-058a045f7166"> <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb"> - <meta name="request-id" content="AE90:1FD3FE:5672CFD:43F89D7:6987975E" data-pjax-transient="true"/><meta name="html-safe-nonce" content="54074bf7198eda2a78b3c31f01ca4f930b51243e23899a9dc581fe7cdc736652" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBRTkwOjFGRDNGRTo1NjcyQ0ZEOjQzRjg5RDc6Njk4Nzk3NUUiLCJ2aXNpdG9yX2lkIjoiODkyNjgzNjcyODIxMTY0NDYiLCJyZWdpb25fZWRnZSI6ImZyYSIsInJlZ2lvbl9yZW5kZXIiOiJmcmEifQ==" data-pjax-transient="true"/><meta name="visitor-hmac" content="f57c91049d4ed650d3d0dfc24f7ca840f517ad9e5ccd4b4499108a14245ebd75" data-pjax-transient="true"/> + <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"/> @@ -117,6 +117,10 @@ <meta name="octolytics-url" content="https://collector.github.com/github/collect" /> +<meta name="octolytics-page-type" content="marketing" /> + + + @@ -178,18 +182,16 @@ <meta name="expected-hostname" content="github.com"> - <meta http-equiv="x-pjax-version" content="8ceba48c6a92197c529f47d4f9d45b0b8bc17cf70fdee20196e8a93f9146e912" data-turbo-track="reload"> + <meta http-equiv="x-pjax-version" content="ec2df937f82fb1c82380b2c0e194254c3344f0b613588bf2fa2ca0fb7ccca9ef" 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="7bded8bde79b87d1ddc3c19f5a21b028d09775106bcb77cfabea9853ea14a4eb" data-turbo-track="reload"> - <meta http-equiv="x-pjax-js-version" content="38ec31e8cc99e2ff9dfdb8f1c79b44d05e5fce45b7e96adc4250ef0059f0eb28" 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 name="turbo-cache-control" content="no-preview" data-turbo-transient=""> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/site-64056219e1c2ee7f.css" /> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/error-139bacf9a95d2ff1.css" /> + <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" /> <meta name="is_logged_out_page" content="true"> - <meta name="octolytics-page-type" content="marketing"> - @@ -206,7 +208,7 @@ <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors"> - <meta name="release" content="734a13114c861aff04af5f466b448edfc21edcde"> + <meta name="release" content="848bc6032dcc93a9a7301dcc3f379a72ba13b96e"> <meta name="ui-target" content="full"> <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000"> @@ -233,8 +235,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.2b2a53c0ee686cca.module.css" /> -<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.de31c369308d4093.module.css" /> + <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" /> <react-partial partial-name="keyboard-shortcuts-dialog" @@ -256,9 +258,9 @@ -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/46752-4721914446890d73.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/93308-1738dd45a3935262.js" defer="defer"></script> -<script crossorigin="anonymous" type="application/javascript" src="https://github.githubassets.com/assets/sessions-6d94ca358dd59581.js" defer="defer"></script> +<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> <style> /* Override primer focus outline color for marketing header dropdown links for better contrast */ @@ -306,14 +308,14 @@ </a> <div class="AppHeader-appearanceSettings"> <react-partial-anchor> - <button data-target="react-partial-anchor.anchor" id="icon-button-7cc546ba-74f1-4b21-a248-c93a2b91cce3" aria-labelledby="tooltip-763b6ca8-89ae-40a2-b2a2-0eb740aad7ae" 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-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"> <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-763b6ca8-89ae-40a2-b2a2-0eb740aad7ae" for="icon-button-7cc546ba-74f1-4b21-a248-c93a2b91cce3" 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-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> <template data-target="react-partial-anchor.template"> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.2b2a53c0ee686cca.module.css" /> -<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/appearance-settings.571a5d0113aba4f4.module.css" /> + <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" /> <react-partial partial-name="appearance-settings" @@ -337,8 +339,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.2b2a53c0ee686cca.module.css" /> -<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/marketing-navigation.63140de28ff52306.module.css" /> + <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" /> <react-partial partial-name="marketing-navigation" @@ -348,7 +350,7 @@ > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"should_use_dotcom_links":true}}</script> - <div data-target="react-partial.reactRoot"><nav class="MarketingNavigation-module__nav__NPauXyD" aria-label="Global"><ul class="MarketingNavigation-module__list__nrluPkJ"><li><div class="NavDropdown-module__container__KUyZW75 js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__vgiCKGy js-details-target" aria-expanded="false">Platform<svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__yJlVW2F" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__JEKUkh2"><ul class="NavDropdown-module__list__eE8C8Eg"><li><div class="NavGroup-module__group__lq97WQQ"><span class="NavGroup-module__title__ost9jAm">AI CODE CREATION</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://github.com/features/copilot" data-analytics-event="{"action":"github_copilot","tag":"link","context":"platform","location":"navbar","label":"github_copilot_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path></svg><span class="NavLink-module__title__adAPJNV">GitHub Copilot</span><span class="NavLink-module__subtitle__rTluIts">Write better code with AI</span></div></a></li><li><a href="https://github.com/features/spark" data-analytics-event="{"action":"github_spark","tag":"link","context":"platform","location":"navbar","label":"github_spark_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-sparkle-fill NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M11.296 1.924c.24-.656 1.168-.656 1.408 0l.717 1.958a11.25 11.25 0 0 0 6.697 6.697l1.958.717c.657.24.657 1.168 0 1.408l-1.958.717a11.25 11.25 0 0 0-6.697 6.697l-.717 1.958c-.24.657-1.168.657-1.408 0l-.717-1.958a11.25 11.25 0 0 0-6.697-6.697l-1.958-.717c-.656-.24-.656-1.168 0-1.408l1.958-.717a11.25 11.25 0 0 0 6.697-6.697l.717-1.958Z"></path></svg><span class="NavLink-module__title__adAPJNV">GitHub Spark</span><span class="NavLink-module__subtitle__rTluIts">Build and deploy intelligent apps</span></div></a></li><li><a href="https://github.com/features/models" data-analytics-event="{"action":"github_models","tag":"link","context":"platform","location":"navbar","label":"github_models_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-ai-model NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M19.375 8.5a3.25 3.25 0 1 1-3.163 4h-3a3.252 3.252 0 0 1-4.443 2.509L7.214 17.76a3.25 3.25 0 1 1-1.342-.674l1.672-2.957A3.238 3.238 0 0 1 6.75 12c0-.907.371-1.727.97-2.316L6.117 6.846A3.253 3.253 0 0 1 1.875 3.75a3.25 3.25 0 1 1 5.526 2.32l1.603 2.836A3.25 3.25 0 0 1 13.093 11h3.119a3.252 3.252 0 0 1 3.163-2.5ZM10 10.25a1.75 1.75 0 1 0-.001 3.499A1.75 1.75 0 0 0 10 10.25ZM5.125 2a1.75 1.75 0 1 0 0 3.5 1.75 1.75 0 0 0 0-3.5Zm12.5 9.75a1.75 1.75 0 1 0 3.5 0 1.75 1.75 0 0 0-3.5 0Zm-14.25 8.5a1.75 1.75 0 1 0 3.501-.001 1.75 1.75 0 0 0-3.501.001Z"></path></svg><span class="NavLink-module__title__adAPJNV">GitHub Models</span><span class="NavLink-module__subtitle__rTluIts">Manage and compare prompts</span></div></a></li><li><a href="https://github.com/mcp" data-analytics-event="{"action":"mcp_registry","tag":"link","context":"platform","location":"navbar","label":"mcp_registry_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-mcp NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.795 1.694a4.287 4.287 0 0 1 6.061 0 4.28 4.28 0 0 1 1.181 3.819 4.282 4.282 0 0 1 3.819 1.181 4.287 4.287 0 0 1 0 6.061l-6.793 6.793a.249.249 0 0 0 0 .353l2.617 2.618a.75.75 0 1 1-1.061 1.061l-2.617-2.618a1.75 1.75 0 0 1 0-2.475l6.793-6.793a2.785 2.785 0 1 0-3.939-3.939l-5.9 5.9a.734.734 0 0 1-.249.165.749.749 0 0 1-.812-1.225l5.9-5.901a2.785 2.785 0 1 0-3.939-3.939L2.931 10.68A.75.75 0 1 1 1.87 9.619l7.925-7.925Z"></path><path d="M12.42 4.069a.752.752 0 0 1 1.061 0 .752.752 0 0 1 0 1.061L7.33 11.28a2.788 2.788 0 0 0 0 3.94 2.788 2.788 0 0 0 3.94 0l6.15-6.151a.752.752 0 0 1 1.061 0 .752.752 0 0 1 0 1.061l-6.151 6.15a4.285 4.285 0 1 1-6.06-6.06l6.15-6.151Z"></path></svg><span class="NavLink-module__title__adAPJNV">MCP Registry<sup class="NavLink-module__label__Tuq3Itf">New</sup></span><span class="NavLink-module__subtitle__rTluIts">Integrate external tools</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__lq97WQQ"><span class="NavGroup-module__title__ost9jAm">DEVELOPER WORKFLOWS</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://github.com/features/actions" data-analytics-event="{"action":"actions","tag":"link","context":"platform","location":"navbar","label":"actions_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-workflow NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 3a2 2 0 0 1 2-2h6.5a2 2 0 0 1 2 2v6.5a2 2 0 0 1-2 2H7v4.063C7 16.355 7.644 17 8.438 17H12.5v-2.5a2 2 0 0 1 2-2H21a2 2 0 0 1 2 2V21a2 2 0 0 1-2 2h-6.5a2 2 0 0 1-2-2v-2.5H8.437A2.939 2.939 0 0 1 5.5 15.562V11.5H3a2 2 0 0 1-2-2Zm2-.5a.5.5 0 0 0-.5.5v6.5a.5.5 0 0 0 .5.5h6.5a.5.5 0 0 0 .5-.5V3a.5.5 0 0 0-.5-.5ZM14.5 14a.5.5 0 0 0-.5.5V21a.5.5 0 0 0 .5.5H21a.5.5 0 0 0 .5-.5v-6.5a.5.5 0 0 0-.5-.5Z"></path></svg><span class="NavLink-module__title__adAPJNV">Actions</span><span class="NavLink-module__subtitle__rTluIts">Automate any workflow</span></div></a></li><li><a href="https://github.com/features/codespaces" data-analytics-event="{"action":"codespaces","tag":"link","context":"platform","location":"navbar","label":"codespaces_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-codespaces NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.5 3.75C3.5 2.784 4.284 2 5.25 2h13.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 18.75 13H5.25a1.75 1.75 0 0 1-1.75-1.75Zm-2 12c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v4a1.75 1.75 0 0 1-1.75 1.75H3.25a1.75 1.75 0 0 1-1.75-1.75ZM5.25 3.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h13.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Zm-2 12a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h17.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25Z"></path><path d="M10 17.75a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path></svg><span class="NavLink-module__title__adAPJNV">Codespaces</span><span class="NavLink-module__subtitle__rTluIts">Instant dev environments</span></div></a></li><li><a href="https://github.com/features/issues" data-analytics-event="{"action":"issues","tag":"link","context":"platform","location":"navbar","label":"issues_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-issue-opened NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1ZM2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5 9.5 9.5 0 0 0 2.5 12Zm9.5 2a2 2 0 1 1-.001-3.999A2 2 0 0 1 12 14Z"></path></svg><span class="NavLink-module__title__adAPJNV">Issues</span><span class="NavLink-module__subtitle__rTluIts">Plan and track work</span></div></a></li><li><a href="https://github.com/features/code-review" data-analytics-event="{"action":"code_review","tag":"link","context":"platform","location":"navbar","label":"code_review_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-code NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15.22 4.97a.75.75 0 0 1 1.06 0l6.5 6.5a.75.75 0 0 1 0 1.06l-6.5 6.5a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L21.19 12l-5.97-5.97a.75.75 0 0 1 0-1.06Zm-6.44 0a.75.75 0 0 1 0 1.06L2.81 12l5.97 5.97a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-6.5-6.5a.75.75 0 0 1 0-1.06l6.5-6.5a.75.75 0 0 1 1.06 0Z"></path></svg><span class="NavLink-module__title__adAPJNV">Code Review</span><span class="NavLink-module__subtitle__rTluIts">Manage code changes</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__lq97WQQ"><span class="NavGroup-module__title__ost9jAm">APPLICATION SECURITY</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://github.com/security/advanced-security" data-analytics-event="{"action":"github_advanced_security","tag":"link","context":"platform","location":"navbar","label":"github_advanced_security_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path></svg><span class="NavLink-module__title__adAPJNV">GitHub Advanced Security</span><span class="NavLink-module__subtitle__rTluIts">Find and fix vulnerabilities</span></div></a></li><li><a href="https://github.com/security/advanced-security/code-security" data-analytics-event="{"action":"code_security","tag":"link","context":"platform","location":"navbar","label":"code_security_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-code-square NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.3 8.24a.75.75 0 0 1-.04 1.06L7.352 12l2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M2 3.75C2 2.784 2.784 2 3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25Zm1.75-.25a.25.25 0 0 0-.25.25v16.5c0 .138.112.25.25.25h16.5a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path></svg><span class="NavLink-module__title__adAPJNV">Code security</span><span class="NavLink-module__subtitle__rTluIts">Secure your code as you build</span></div></a></li><li><a href="https://github.com/security/advanced-security/secret-protection" data-analytics-event="{"action":"secret_protection","tag":"link","context":"platform","location":"navbar","label":"secret_protection_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-lock NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6 9V7.25C6 3.845 8.503 1 12 1s6 2.845 6 6.25V9h.5a2.5 2.5 0 0 1 2.5 2.5v8a2.5 2.5 0 0 1-2.5 2.5h-13A2.5 2.5 0 0 1 3 19.5v-8A2.5 2.5 0 0 1 5.5 9Zm-1.5 2.5v8a1 1 0 0 0 1 1h13a1 1 0 0 0 1-1v-8a1 1 0 0 0-1-1h-13a1 1 0 0 0-1 1Zm3-4.25V9h9V7.25c0-2.67-1.922-4.75-4.5-4.75-2.578 0-4.5 2.08-4.5 4.75Z"></path></svg><span class="NavLink-module__title__adAPJNV">Secret protection</span><span class="NavLink-module__subtitle__rTluIts">Stop leaks before they start</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__lq97WQQ NavGroup-module__hasSeparator__Q3EjDs7"><span class="NavGroup-module__title__ost9jAm">EXPLORE</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://github.com/why-github" data-analytics-event="{"action":"why_github","tag":"link","context":"platform","location":"navbar","label":"why_github_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Why GitHub</span></a></li><li><a href="https://docs.github.com" data-analytics-event="{"action":"documentation","tag":"link","context":"platform","location":"navbar","label":"documentation_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD" target="_blank" rel="noreferrer"><span class="NavLink-module__title__adAPJNV">Documentation</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__fo1FVEg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.blog" data-analytics-event="{"action":"blog","tag":"link","context":"platform","location":"navbar","label":"blog_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD" target="_blank" rel="noreferrer"><span class="NavLink-module__title__adAPJNV">Blog</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__fo1FVEg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.blog/changelog" data-analytics-event="{"action":"changelog","tag":"link","context":"platform","location":"navbar","label":"changelog_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD" target="_blank" rel="noreferrer"><span class="NavLink-module__title__adAPJNV">Changelog</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__fo1FVEg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.com/marketplace" data-analytics-event="{"action":"marketplace","tag":"link","context":"platform","location":"navbar","label":"marketplace_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Marketplace</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__THmvvzU"><a href="https://github.com/features" data-analytics-event="{"action":"view_all_features","tag":"link","context":"platform","location":"navbar","label":"view_all_features_link_platform_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">View all features</span><svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__YN8DIiR" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__KUyZW75 js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__vgiCKGy js-details-target" aria-expanded="false">Solutions<svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__yJlVW2F" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__JEKUkh2"><ul class="NavDropdown-module__list__eE8C8Eg"><li><div class="NavGroup-module__group__lq97WQQ"><span class="NavGroup-module__title__ost9jAm">BY COMPANY SIZE</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://github.com/enterprise" data-analytics-event="{"action":"enterprises","tag":"link","context":"solutions","location":"navbar","label":"enterprises_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Enterprises</span></a></li><li><a href="https://github.com/team" data-analytics-event="{"action":"small_and_medium_teams","tag":"link","context":"solutions","location":"navbar","label":"small_and_medium_teams_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Small and medium teams</span></a></li><li><a href="https://github.com/enterprise/startups" data-analytics-event="{"action":"startups","tag":"link","context":"solutions","location":"navbar","label":"startups_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Startups</span></a></li><li><a href="https://github.com/solutions/industry/nonprofits" data-analytics-event="{"action":"nonprofits","tag":"link","context":"solutions","location":"navbar","label":"nonprofits_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Nonprofits</span></a></li></ul></div></li><li><div class="NavGroup-module__group__lq97WQQ"><span class="NavGroup-module__title__ost9jAm">BY USE CASE</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://github.com/solutions/use-case/app-modernization" data-analytics-event="{"action":"app_modernization","tag":"link","context":"solutions","location":"navbar","label":"app_modernization_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">App Modernization</span></a></li><li><a href="https://github.com/solutions/use-case/devsecops" data-analytics-event="{"action":"devsecops","tag":"link","context":"solutions","location":"navbar","label":"devsecops_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">DevSecOps</span></a></li><li><a href="https://github.com/solutions/use-case/devops" data-analytics-event="{"action":"devops","tag":"link","context":"solutions","location":"navbar","label":"devops_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">DevOps</span></a></li><li><a href="https://github.com/solutions/use-case/ci-cd" data-analytics-event="{"action":"ci/cd","tag":"link","context":"solutions","location":"navbar","label":"ci/cd_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">CI/CD</span></a></li><li><a href="https://github.com/solutions/use-case" data-analytics-event="{"action":"view_all_use_cases","tag":"link","context":"solutions","location":"navbar","label":"view_all_use_cases_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">View all use cases</span><svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__YN8DIiR" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__lq97WQQ"><span class="NavGroup-module__title__ost9jAm">BY INDUSTRY</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://github.com/solutions/industry/healthcare" data-analytics-event="{"action":"healthcare","tag":"link","context":"solutions","location":"navbar","label":"healthcare_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Healthcare</span></a></li><li><a href="https://github.com/solutions/industry/financial-services" data-analytics-event="{"action":"financial_services","tag":"link","context":"solutions","location":"navbar","label":"financial_services_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Financial services</span></a></li><li><a href="https://github.com/solutions/industry/manufacturing" data-analytics-event="{"action":"manufacturing","tag":"link","context":"solutions","location":"navbar","label":"manufacturing_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Manufacturing</span></a></li><li><a href="https://github.com/solutions/industry/government" data-analytics-event="{"action":"government","tag":"link","context":"solutions","location":"navbar","label":"government_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Government</span></a></li><li><a href="https://github.com/solutions/industry" data-analytics-event="{"action":"view_all_industries","tag":"link","context":"solutions","location":"navbar","label":"view_all_industries_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">View all industries</span><svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__YN8DIiR" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__THmvvzU"><a href="https://github.com/solutions" data-analytics-event="{"action":"view_all_solutions","tag":"link","context":"solutions","location":"navbar","label":"view_all_solutions_link_solutions_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">View all solutions</span><svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__YN8DIiR" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__KUyZW75 js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__vgiCKGy js-details-target" aria-expanded="false">Resources<svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__yJlVW2F" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__JEKUkh2"><ul class="NavDropdown-module__list__eE8C8Eg"><li><div class="NavGroup-module__group__lq97WQQ"><span class="NavGroup-module__title__ost9jAm">EXPLORE BY TOPIC</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://github.com/resources/articles?topic=ai" data-analytics-event="{"action":"ai","tag":"link","context":"resources","location":"navbar","label":"ai_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">AI</span></a></li><li><a href="https://github.com/resources/articles?topic=software-development" data-analytics-event="{"action":"software_development","tag":"link","context":"resources","location":"navbar","label":"software_development_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Software Development</span></a></li><li><a href="https://github.com/resources/articles?topic=devops" data-analytics-event="{"action":"devops","tag":"link","context":"resources","location":"navbar","label":"devops_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">DevOps</span></a></li><li><a href="https://github.com/resources/articles?topic=security" data-analytics-event="{"action":"security","tag":"link","context":"resources","location":"navbar","label":"security_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Security</span></a></li><li><a href="https://github.com/resources/articles" data-analytics-event="{"action":"view_all_topics","tag":"link","context":"resources","location":"navbar","label":"view_all_topics_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">View all topics</span><svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__YN8DIiR" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__lq97WQQ"><span class="NavGroup-module__title__ost9jAm">EXPLORE BY TYPE</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://github.com/customer-stories" data-analytics-event="{"action":"customer_stories","tag":"link","context":"resources","location":"navbar","label":"customer_stories_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Customer stories</span></a></li><li><a href="https://github.com/resources/events" data-analytics-event="{"action":"events__webinars","tag":"link","context":"resources","location":"navbar","label":"events__webinars_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Events & webinars</span></a></li><li><a href="https://github.com/resources/whitepapers" data-analytics-event="{"action":"ebooks__reports","tag":"link","context":"resources","location":"navbar","label":"ebooks__reports_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Ebooks & reports</span></a></li><li><a href="https://github.com/solutions/executive-insights" data-analytics-event="{"action":"business_insights","tag":"link","context":"resources","location":"navbar","label":"business_insights_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Business insights</span></a></li><li><a href="https://skills.github.com" data-analytics-event="{"action":"github_skills","tag":"link","context":"resources","location":"navbar","label":"github_skills_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD" target="_blank" rel="noreferrer"><span class="NavLink-module__title__adAPJNV">GitHub Skills</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__fo1FVEg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__lq97WQQ"><span class="NavGroup-module__title__ost9jAm">SUPPORT & SERVICES</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://docs.github.com" data-analytics-event="{"action":"documentation","tag":"link","context":"resources","location":"navbar","label":"documentation_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD" target="_blank" rel="noreferrer"><span class="NavLink-module__title__adAPJNV">Documentation</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__fo1FVEg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://support.github.com" data-analytics-event="{"action":"customer_support","tag":"link","context":"resources","location":"navbar","label":"customer_support_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD" target="_blank" rel="noreferrer"><span class="NavLink-module__title__adAPJNV">Customer support</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__fo1FVEg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.com/orgs/community/discussions" data-analytics-event="{"action":"community_forum","tag":"link","context":"resources","location":"navbar","label":"community_forum_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Community forum</span></a></li><li><a href="https://github.com/trust-center" data-analytics-event="{"action":"trust_center","tag":"link","context":"resources","location":"navbar","label":"trust_center_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Trust center</span></a></li><li><a href="https://github.com/partners" data-analytics-event="{"action":"partners","tag":"link","context":"resources","location":"navbar","label":"partners_link_resources_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Partners</span></a></li></ul></div></li></ul></div></div></li><li><div class="NavDropdown-module__container__KUyZW75 js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__vgiCKGy js-details-target" aria-expanded="false">Open Source<svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__yJlVW2F" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__JEKUkh2"><ul class="NavDropdown-module__list__eE8C8Eg"><li><div class="NavGroup-module__group__lq97WQQ"><span class="NavGroup-module__title__ost9jAm">COMMUNITY</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://github.com/sponsors" data-analytics-event="{"action":"github_sponsors","tag":"link","context":"open_source","location":"navbar","label":"github_sponsors_link_open_source_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-sponsor-tiers NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M16.004 1.25C18.311 1.25 20 3.128 20 5.75c0 2.292-1.23 4.464-3.295 6.485-.481.47-.98.909-1.482 1.31l.265 1.32 1.375 7.5a.75.75 0 0 1-.982.844l-3.512-1.207a.75.75 0 0 0-.488 0L8.37 23.209a.75.75 0 0 1-.982-.844l1.378-7.512.261-1.309c-.5-.4-1-.838-1.481-1.31C5.479 10.215 4.25 8.043 4.25 5.75c0-2.622 1.689-4.5 3.996-4.5 1.55 0 2.947.752 3.832 1.967l.047.067.047-.067a4.726 4.726 0 0 1 3.612-1.962l.22-.005ZM13.89 14.531c-.418.285-.828.542-1.218.77l-.18.103a.75.75 0 0 1-.734 0l-.071-.04-.46-.272c-.282-.173-.573-.36-.868-.562l-.121.605-1.145 6.239 2.3-.79a2.248 2.248 0 0 1 1.284-.054l.18.053 2.299.79-1.141-6.226-.125-.616ZM16.004 2.75c-1.464 0-2.731.983-3.159 2.459-.209.721-1.231.721-1.44 0-.428-1.476-1.695-2.459-3.16-2.459-1.44 0-2.495 1.173-2.495 3 0 1.811 1.039 3.647 2.844 5.412a19.624 19.624 0 0 0 3.734 2.84l-.019-.011-.184-.111.147-.088a19.81 19.81 0 0 0 3.015-2.278l.37-.352C17.46 9.397 18.5 7.561 18.5 5.75c0-1.827-1.055-3-2.496-3Z"></path></svg><span class="NavLink-module__title__adAPJNV">GitHub Sponsors</span><span class="NavLink-module__subtitle__rTluIts">Fund open source developers</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__lq97WQQ"><span class="NavGroup-module__title__ost9jAm">PROGRAMS</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://securitylab.github.com" data-analytics-event="{"action":"security_lab","tag":"link","context":"open_source","location":"navbar","label":"security_lab_link_open_source_navbar"}" class="NavLink-module__link__oSrJNoD" target="_blank" rel="noreferrer"><span class="NavLink-module__title__adAPJNV">Security Lab</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__fo1FVEg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://maintainers.github.com" data-analytics-event="{"action":"maintainer_community","tag":"link","context":"open_source","location":"navbar","label":"maintainer_community_link_open_source_navbar"}" class="NavLink-module__link__oSrJNoD" target="_blank" rel="noreferrer"><span class="NavLink-module__title__adAPJNV">Maintainer Community</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__fo1FVEg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.com/accelerator" data-analytics-event="{"action":"accelerator","tag":"link","context":"open_source","location":"navbar","label":"accelerator_link_open_source_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Accelerator</span></a></li><li><a href="https://archiveprogram.github.com" data-analytics-event="{"action":"archive_program","tag":"link","context":"open_source","location":"navbar","label":"archive_program_link_open_source_navbar"}" class="NavLink-module__link__oSrJNoD" target="_blank" rel="noreferrer"><span class="NavLink-module__title__adAPJNV">Archive Program</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__fo1FVEg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__lq97WQQ"><span class="NavGroup-module__title__ost9jAm">REPOSITORIES</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://github.com/topics" data-analytics-event="{"action":"topics","tag":"link","context":"open_source","location":"navbar","label":"topics_link_open_source_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Topics</span></a></li><li><a href="https://github.com/trending" data-analytics-event="{"action":"trending","tag":"link","context":"open_source","location":"navbar","label":"trending_link_open_source_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Trending</span></a></li><li><a href="https://github.com/collections" data-analytics-event="{"action":"collections","tag":"link","context":"open_source","location":"navbar","label":"collections_link_open_source_navbar"}" class="NavLink-module__link__oSrJNoD"><span class="NavLink-module__title__adAPJNV">Collections</span></a></li></ul></div></li></ul></div></div></li><li><div class="NavDropdown-module__container__KUyZW75 js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__vgiCKGy js-details-target" aria-expanded="false">Enterprise<svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__yJlVW2F" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__JEKUkh2"><ul class="NavDropdown-module__list__eE8C8Eg"><li><div class="NavGroup-module__group__lq97WQQ"><span class="NavGroup-module__title__ost9jAm">ENTERPRISE SOLUTIONS</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://github.com/enterprise" data-analytics-event="{"action":"enterprise_platform","tag":"link","context":"enterprise","location":"navbar","label":"enterprise_platform_link_enterprise_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-stack NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M11.063 1.456a1.749 1.749 0 0 1 1.874 0l8.383 5.316a1.751 1.751 0 0 1 0 2.956l-8.383 5.316a1.749 1.749 0 0 1-1.874 0L2.68 9.728a1.751 1.751 0 0 1 0-2.956Zm1.071 1.267a.25.25 0 0 0-.268 0L3.483 8.039a.25.25 0 0 0 0 .422l8.383 5.316a.25.25 0 0 0 .268 0l8.383-5.316a.25.25 0 0 0 0-.422Z"></path><path d="M1.867 12.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path><path d="M1.867 16.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path></svg><span class="NavLink-module__title__adAPJNV">Enterprise platform</span><span class="NavLink-module__subtitle__rTluIts">AI-powered developer platform</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__lq97WQQ"><span class="NavGroup-module__title__ost9jAm">AVAILABLE ADD-ONS</span><ul class="NavGroup-module__list__Ourc1lc"><li><a href="https://github.com/security/advanced-security" data-analytics-event="{"action":"github_advanced_security","tag":"link","context":"enterprise","location":"navbar","label":"github_advanced_security_link_enterprise_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path></svg><span class="NavLink-module__title__adAPJNV">GitHub Advanced Security</span><span class="NavLink-module__subtitle__rTluIts">Enterprise-grade security features</span></div></a></li><li><a href="https://github.com/features/copilot/copilot-business" data-analytics-event="{"action":"copilot_for_business","tag":"link","context":"enterprise","location":"navbar","label":"copilot_for_business_link_enterprise_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path></svg><span class="NavLink-module__title__adAPJNV">Copilot for Business</span><span class="NavLink-module__subtitle__rTluIts">Enterprise-grade AI features</span></div></a></li><li><a href="https://github.com/premium-support" data-analytics-event="{"action":"premium_support","tag":"link","context":"enterprise","location":"navbar","label":"premium_support_link_enterprise_navbar"}" class="NavLink-module__link__oSrJNoD"><div class="NavLink-module__text__AMkNnLf"><svg aria-hidden="true" focusable="false" class="octicon octicon-comment-discussion NavLink-module__icon__Km2csVk" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path></svg><span class="NavLink-module__title__adAPJNV">Premium Support</span><span class="NavLink-module__subtitle__rTluIts">Enterprise-grade 24/7 support</span></div></a></li></ul></div></li></ul></div></div></li><li><a href="https://github.com/pricing" data-analytics-event="{"action":"pricing","tag":"link","context":"pricing","location":"navbar","label":"pricing_link_pricing_navbar"}" class="NavLink-module__link__oSrJNoD MarketingNavigation-module__navLink__YMEM0th"><span class="NavLink-module__title__adAPJNV">Pricing</span></a></li></ul></nav><script type="application/json" id="__PRIMER_DATA__R_0___">{"resolvedServerColorMode":"day"}</script></div> + <div data-target="react-partial.reactRoot"><nav class="MarketingNavigation-module__nav__W0KYY" aria-label="Global"><ul class="MarketingNavigation-module__list__tFbMb"><li><div class="NavDropdown-module__container__l2YeI js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__PEHWX js-details-target" aria-expanded="false">Platform<svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2">AI CODE CREATION</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://github.com/features/copilot" data-analytics-event="{"action":"github_copilot","tag":"link","context":"platform","location":"navbar","label":"github_copilot_link_platform_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path></svg><span class="NavLink-module__title__Q7t0p">GitHub Copilot</span><span class="NavLink-module__subtitle__X4gkW">Write better code with AI</span></div></a></li><li><a href="https://github.com/features/spark" data-analytics-event="{"action":"github_spark","tag":"link","context":"platform","location":"navbar","label":"github_spark_link_platform_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-sparkle-fill NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M11.296 1.924c.24-.656 1.168-.656 1.408 0l.717 1.958a11.25 11.25 0 0 0 6.697 6.697l1.958.717c.657.24.657 1.168 0 1.408l-1.958.717a11.25 11.25 0 0 0-6.697 6.697l-.717 1.958c-.24.657-1.168.657-1.408 0l-.717-1.958a11.25 11.25 0 0 0-6.697-6.697l-1.958-.717c-.656-.24-.656-1.168 0-1.408l1.958-.717a11.25 11.25 0 0 0 6.697-6.697l.717-1.958Z"></path></svg><span class="NavLink-module__title__Q7t0p">GitHub Spark</span><span class="NavLink-module__subtitle__X4gkW">Build and deploy intelligent apps</span></div></a></li><li><a href="https://github.com/features/models" data-analytics-event="{"action":"github_models","tag":"link","context":"platform","location":"navbar","label":"github_models_link_platform_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-ai-model NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M19.375 8.5a3.25 3.25 0 1 1-3.163 4h-3a3.252 3.252 0 0 1-4.443 2.509L7.214 17.76a3.25 3.25 0 1 1-1.342-.674l1.672-2.957A3.238 3.238 0 0 1 6.75 12c0-.907.371-1.727.97-2.316L6.117 6.846A3.253 3.253 0 0 1 1.875 3.75a3.25 3.25 0 1 1 5.526 2.32l1.603 2.836A3.25 3.25 0 0 1 13.093 11h3.119a3.252 3.252 0 0 1 3.163-2.5ZM10 10.25a1.75 1.75 0 1 0-.001 3.499A1.75 1.75 0 0 0 10 10.25ZM5.125 2a1.75 1.75 0 1 0 0 3.5 1.75 1.75 0 0 0 0-3.5Zm12.5 9.75a1.75 1.75 0 1 0 3.5 0 1.75 1.75 0 0 0-3.5 0Zm-14.25 8.5a1.75 1.75 0 1 0 3.501-.001 1.75 1.75 0 0 0-3.501.001Z"></path></svg><span class="NavLink-module__title__Q7t0p">GitHub Models</span><span class="NavLink-module__subtitle__X4gkW">Manage and compare prompts</span></div></a></li><li><a href="https://github.com/mcp" data-analytics-event="{"action":"mcp_registry","tag":"link","context":"platform","location":"navbar","label":"mcp_registry_link_platform_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-mcp NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.795 1.694a4.287 4.287 0 0 1 6.061 0 4.28 4.28 0 0 1 1.181 3.819 4.282 4.282 0 0 1 3.819 1.181 4.287 4.287 0 0 1 0 6.061l-6.793 6.793a.249.249 0 0 0 0 .353l2.617 2.618a.75.75 0 1 1-1.061 1.061l-2.617-2.618a1.75 1.75 0 0 1 0-2.475l6.793-6.793a2.785 2.785 0 1 0-3.939-3.939l-5.9 5.9a.734.734 0 0 1-.249.165.749.749 0 0 1-.812-1.225l5.9-5.901a2.785 2.785 0 1 0-3.939-3.939L2.931 10.68A.75.75 0 1 1 1.87 9.619l7.925-7.925Z"></path><path d="M12.42 4.069a.752.752 0 0 1 1.061 0 .752.752 0 0 1 0 1.061L7.33 11.28a2.788 2.788 0 0 0 0 3.94 2.788 2.788 0 0 0 3.94 0l6.15-6.151a.752.752 0 0 1 1.061 0 .752.752 0 0 1 0 1.061l-6.151 6.15a4.285 4.285 0 1 1-6.06-6.06l6.15-6.151Z"></path></svg><span class="NavLink-module__title__Q7t0p">MCP Registry<sup class="NavLink-module__label__bil7n">New</sup></span><span class="NavLink-module__subtitle__X4gkW">Integrate external tools</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2">DEVELOPER WORKFLOWS</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://github.com/features/actions" data-analytics-event="{"action":"actions","tag":"link","context":"platform","location":"navbar","label":"actions_link_platform_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-workflow NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 3a2 2 0 0 1 2-2h6.5a2 2 0 0 1 2 2v6.5a2 2 0 0 1-2 2H7v4.063C7 16.355 7.644 17 8.438 17H12.5v-2.5a2 2 0 0 1 2-2H21a2 2 0 0 1 2 2V21a2 2 0 0 1-2 2h-6.5a2 2 0 0 1-2-2v-2.5H8.437A2.939 2.939 0 0 1 5.5 15.562V11.5H3a2 2 0 0 1-2-2Zm2-.5a.5.5 0 0 0-.5.5v6.5a.5.5 0 0 0 .5.5h6.5a.5.5 0 0 0 .5-.5V3a.5.5 0 0 0-.5-.5ZM14.5 14a.5.5 0 0 0-.5.5V21a.5.5 0 0 0 .5.5H21a.5.5 0 0 0 .5-.5v-6.5a.5.5 0 0 0-.5-.5Z"></path></svg><span class="NavLink-module__title__Q7t0p">Actions</span><span class="NavLink-module__subtitle__X4gkW">Automate any workflow</span></div></a></li><li><a href="https://github.com/features/codespaces" data-analytics-event="{"action":"codespaces","tag":"link","context":"platform","location":"navbar","label":"codespaces_link_platform_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-codespaces NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.5 3.75C3.5 2.784 4.284 2 5.25 2h13.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 18.75 13H5.25a1.75 1.75 0 0 1-1.75-1.75Zm-2 12c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v4a1.75 1.75 0 0 1-1.75 1.75H3.25a1.75 1.75 0 0 1-1.75-1.75ZM5.25 3.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h13.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Zm-2 12a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h17.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25Z"></path><path d="M10 17.75a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path></svg><span class="NavLink-module__title__Q7t0p">Codespaces</span><span class="NavLink-module__subtitle__X4gkW">Instant dev environments</span></div></a></li><li><a href="https://github.com/features/issues" data-analytics-event="{"action":"issues","tag":"link","context":"platform","location":"navbar","label":"issues_link_platform_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-issue-opened NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1ZM2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5 9.5 9.5 0 0 0 2.5 12Zm9.5 2a2 2 0 1 1-.001-3.999A2 2 0 0 1 12 14Z"></path></svg><span class="NavLink-module__title__Q7t0p">Issues</span><span class="NavLink-module__subtitle__X4gkW">Plan and track work</span></div></a></li><li><a href="https://github.com/features/code-review" data-analytics-event="{"action":"code_review","tag":"link","context":"platform","location":"navbar","label":"code_review_link_platform_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-code NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15.22 4.97a.75.75 0 0 1 1.06 0l6.5 6.5a.75.75 0 0 1 0 1.06l-6.5 6.5a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L21.19 12l-5.97-5.97a.75.75 0 0 1 0-1.06Zm-6.44 0a.75.75 0 0 1 0 1.06L2.81 12l5.97 5.97a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-6.5-6.5a.75.75 0 0 1 0-1.06l6.5-6.5a.75.75 0 0 1 1.06 0Z"></path></svg><span class="NavLink-module__title__Q7t0p">Code Review</span><span class="NavLink-module__subtitle__X4gkW">Manage code changes</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2">APPLICATION SECURITY</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://github.com/security/advanced-security" data-analytics-event="{"action":"github_advanced_security","tag":"link","context":"platform","location":"navbar","label":"github_advanced_security_link_platform_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path></svg><span class="NavLink-module__title__Q7t0p">GitHub Advanced Security</span><span class="NavLink-module__subtitle__X4gkW">Find and fix vulnerabilities</span></div></a></li><li><a href="https://github.com/security/advanced-security/code-security" data-analytics-event="{"action":"code_security","tag":"link","context":"platform","location":"navbar","label":"code_security_link_platform_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-code-square NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.3 8.24a.75.75 0 0 1-.04 1.06L7.352 12l2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M2 3.75C2 2.784 2.784 2 3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25Zm1.75-.25a.25.25 0 0 0-.25.25v16.5c0 .138.112.25.25.25h16.5a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path></svg><span class="NavLink-module__title__Q7t0p">Code security</span><span class="NavLink-module__subtitle__X4gkW">Secure your code as you build</span></div></a></li><li><a href="https://github.com/security/advanced-security/secret-protection" data-analytics-event="{"action":"secret_protection","tag":"link","context":"platform","location":"navbar","label":"secret_protection_link_platform_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-lock NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6 9V7.25C6 3.845 8.503 1 12 1s6 2.845 6 6.25V9h.5a2.5 2.5 0 0 1 2.5 2.5v8a2.5 2.5 0 0 1-2.5 2.5h-13A2.5 2.5 0 0 1 3 19.5v-8A2.5 2.5 0 0 1 5.5 9Zm-1.5 2.5v8a1 1 0 0 0 1 1h13a1 1 0 0 0 1-1v-8a1 1 0 0 0-1-1h-13a1 1 0 0 0-1 1Zm3-4.25V9h9V7.25c0-2.67-1.922-4.75-4.5-4.75-2.578 0-4.5 2.08-4.5 4.75Z"></path></svg><span class="NavLink-module__title__Q7t0p">Secret protection</span><span class="NavLink-module__subtitle__X4gkW">Stop leaks before they start</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ NavGroup-module__hasSeparator__FnMrN"><span class="NavGroup-module__title__Wzxz2">EXPLORE</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://github.com/why-github" data-analytics-event="{"action":"why_github","tag":"link","context":"platform","location":"navbar","label":"why_github_link_platform_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Why GitHub</span></a></li><li><a href="https://docs.github.com" data-analytics-event="{"action":"documentation","tag":"link","context":"platform","location":"navbar","label":"documentation_link_platform_navbar"}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Documentation</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.blog" data-analytics-event="{"action":"blog","tag":"link","context":"platform","location":"navbar","label":"blog_link_platform_navbar"}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Blog</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.blog/changelog" data-analytics-event="{"action":"changelog","tag":"link","context":"platform","location":"navbar","label":"changelog_link_platform_navbar"}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Changelog</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.com/marketplace" data-analytics-event="{"action":"marketplace","tag":"link","context":"platform","location":"navbar","label":"marketplace_link_platform_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Marketplace</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a href="https://github.com/features" data-analytics-event="{"action":"view_all_features","tag":"link","context":"platform","location":"navbar","label":"view_all_features_link_platform_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">View all features</span><svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__amekg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__PEHWX js-details-target" aria-expanded="false">Solutions<svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2">BY COMPANY SIZE</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://github.com/enterprise" data-analytics-event="{"action":"enterprises","tag":"link","context":"solutions","location":"navbar","label":"enterprises_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Enterprises</span></a></li><li><a href="https://github.com/team" data-analytics-event="{"action":"small_and_medium_teams","tag":"link","context":"solutions","location":"navbar","label":"small_and_medium_teams_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Small and medium teams</span></a></li><li><a href="https://github.com/enterprise/startups" data-analytics-event="{"action":"startups","tag":"link","context":"solutions","location":"navbar","label":"startups_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Startups</span></a></li><li><a href="https://github.com/solutions/industry/nonprofits" data-analytics-event="{"action":"nonprofits","tag":"link","context":"solutions","location":"navbar","label":"nonprofits_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Nonprofits</span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2">BY USE CASE</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://github.com/solutions/use-case/app-modernization" data-analytics-event="{"action":"app_modernization","tag":"link","context":"solutions","location":"navbar","label":"app_modernization_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">App Modernization</span></a></li><li><a href="https://github.com/solutions/use-case/devsecops" data-analytics-event="{"action":"devsecops","tag":"link","context":"solutions","location":"navbar","label":"devsecops_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">DevSecOps</span></a></li><li><a href="https://github.com/solutions/use-case/devops" data-analytics-event="{"action":"devops","tag":"link","context":"solutions","location":"navbar","label":"devops_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">DevOps</span></a></li><li><a href="https://github.com/solutions/use-case/ci-cd" data-analytics-event="{"action":"ci/cd","tag":"link","context":"solutions","location":"navbar","label":"ci/cd_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">CI/CD</span></a></li><li><a href="https://github.com/solutions/use-case" data-analytics-event="{"action":"view_all_use_cases","tag":"link","context":"solutions","location":"navbar","label":"view_all_use_cases_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">View all use cases</span><svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__amekg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2">BY INDUSTRY</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://github.com/solutions/industry/healthcare" data-analytics-event="{"action":"healthcare","tag":"link","context":"solutions","location":"navbar","label":"healthcare_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Healthcare</span></a></li><li><a href="https://github.com/solutions/industry/financial-services" data-analytics-event="{"action":"financial_services","tag":"link","context":"solutions","location":"navbar","label":"financial_services_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Financial services</span></a></li><li><a href="https://github.com/solutions/industry/manufacturing" data-analytics-event="{"action":"manufacturing","tag":"link","context":"solutions","location":"navbar","label":"manufacturing_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Manufacturing</span></a></li><li><a href="https://github.com/solutions/industry/government" data-analytics-event="{"action":"government","tag":"link","context":"solutions","location":"navbar","label":"government_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Government</span></a></li><li><a href="https://github.com/solutions/industry" data-analytics-event="{"action":"view_all_industries","tag":"link","context":"solutions","location":"navbar","label":"view_all_industries_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">View all industries</span><svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__amekg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a href="https://github.com/solutions" data-analytics-event="{"action":"view_all_solutions","tag":"link","context":"solutions","location":"navbar","label":"view_all_solutions_link_solutions_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">View all solutions</span><svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__amekg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__PEHWX js-details-target" aria-expanded="false">Resources<svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2">EXPLORE BY TOPIC</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://github.com/resources/articles?topic=ai" data-analytics-event="{"action":"ai","tag":"link","context":"resources","location":"navbar","label":"ai_link_resources_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">AI</span></a></li><li><a href="https://github.com/resources/articles?topic=software-development" data-analytics-event="{"action":"software_development","tag":"link","context":"resources","location":"navbar","label":"software_development_link_resources_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Software Development</span></a></li><li><a href="https://github.com/resources/articles?topic=devops" data-analytics-event="{"action":"devops","tag":"link","context":"resources","location":"navbar","label":"devops_link_resources_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">DevOps</span></a></li><li><a href="https://github.com/resources/articles?topic=security" data-analytics-event="{"action":"security","tag":"link","context":"resources","location":"navbar","label":"security_link_resources_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Security</span></a></li><li><a href="https://github.com/resources/articles" data-analytics-event="{"action":"view_all_topics","tag":"link","context":"resources","location":"navbar","label":"view_all_topics_link_resources_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">View all topics</span><svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavLink-module__arrowIcon__amekg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2">EXPLORE BY TYPE</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://github.com/customer-stories" data-analytics-event="{"action":"customer_stories","tag":"link","context":"resources","location":"navbar","label":"customer_stories_link_resources_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Customer stories</span></a></li><li><a href="https://github.com/resources/events" data-analytics-event="{"action":"events__webinars","tag":"link","context":"resources","location":"navbar","label":"events__webinars_link_resources_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Events & webinars</span></a></li><li><a href="https://github.com/resources/whitepapers" data-analytics-event="{"action":"ebooks__reports","tag":"link","context":"resources","location":"navbar","label":"ebooks__reports_link_resources_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Ebooks & reports</span></a></li><li><a href="https://github.com/solutions/executive-insights" data-analytics-event="{"action":"business_insights","tag":"link","context":"resources","location":"navbar","label":"business_insights_link_resources_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Business insights</span></a></li><li><a href="https://skills.github.com" data-analytics-event="{"action":"github_skills","tag":"link","context":"resources","location":"navbar","label":"github_skills_link_resources_navbar"}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">GitHub Skills</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2">SUPPORT & SERVICES</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://docs.github.com" data-analytics-event="{"action":"documentation","tag":"link","context":"resources","location":"navbar","label":"documentation_link_resources_navbar"}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Documentation</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://support.github.com" data-analytics-event="{"action":"customer_support","tag":"link","context":"resources","location":"navbar","label":"customer_support_link_resources_navbar"}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Customer support</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.com/orgs/community/discussions" data-analytics-event="{"action":"community_forum","tag":"link","context":"resources","location":"navbar","label":"community_forum_link_resources_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Community forum</span></a></li><li><a href="https://github.com/trust-center" data-analytics-event="{"action":"trust_center","tag":"link","context":"resources","location":"navbar","label":"trust_center_link_resources_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Trust center</span></a></li><li><a href="https://github.com/partners" data-analytics-event="{"action":"partners","tag":"link","context":"resources","location":"navbar","label":"partners_link_resources_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Partners</span></a></li></ul></div></li></ul></div></div></li><li><div class="NavDropdown-module__container__l2YeI js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__PEHWX js-details-target" aria-expanded="false">Open Source<svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2">COMMUNITY</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://github.com/sponsors" data-analytics-event="{"action":"github_sponsors","tag":"link","context":"open_source","location":"navbar","label":"github_sponsors_link_open_source_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-sponsor-tiers NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M16.004 1.25C18.311 1.25 20 3.128 20 5.75c0 2.292-1.23 4.464-3.295 6.485-.481.47-.98.909-1.482 1.31l.265 1.32 1.375 7.5a.75.75 0 0 1-.982.844l-3.512-1.207a.75.75 0 0 0-.488 0L8.37 23.209a.75.75 0 0 1-.982-.844l1.378-7.512.261-1.309c-.5-.4-1-.838-1.481-1.31C5.479 10.215 4.25 8.043 4.25 5.75c0-2.622 1.689-4.5 3.996-4.5 1.55 0 2.947.752 3.832 1.967l.047.067.047-.067a4.726 4.726 0 0 1 3.612-1.962l.22-.005ZM13.89 14.531c-.418.285-.828.542-1.218.77l-.18.103a.75.75 0 0 1-.734 0l-.071-.04-.46-.272c-.282-.173-.573-.36-.868-.562l-.121.605-1.145 6.239 2.3-.79a2.248 2.248 0 0 1 1.284-.054l.18.053 2.299.79-1.141-6.226-.125-.616ZM16.004 2.75c-1.464 0-2.731.983-3.159 2.459-.209.721-1.231.721-1.44 0-.428-1.476-1.695-2.459-3.16-2.459-1.44 0-2.495 1.173-2.495 3 0 1.811 1.039 3.647 2.844 5.412a19.624 19.624 0 0 0 3.734 2.84l-.019-.011-.184-.111.147-.088a19.81 19.81 0 0 0 3.015-2.278l.37-.352C17.46 9.397 18.5 7.561 18.5 5.75c0-1.827-1.055-3-2.496-3Z"></path></svg><span class="NavLink-module__title__Q7t0p">GitHub Sponsors</span><span class="NavLink-module__subtitle__X4gkW">Fund open source developers</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2">PROGRAMS</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://securitylab.github.com" data-analytics-event="{"action":"security_lab","tag":"link","context":"open_source","location":"navbar","label":"security_lab_link_open_source_navbar"}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Security Lab</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://maintainers.github.com" data-analytics-event="{"action":"maintainer_community","tag":"link","context":"open_source","location":"navbar","label":"maintainer_community_link_open_source_navbar"}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Maintainer Community</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a href="https://github.com/accelerator" data-analytics-event="{"action":"accelerator","tag":"link","context":"open_source","location":"navbar","label":"accelerator_link_open_source_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Accelerator</span></a></li><li><a href="https://archiveprogram.github.com" data-analytics-event="{"action":"archive_program","tag":"link","context":"open_source","location":"navbar","label":"archive_program_link_open_source_navbar"}" class="NavLink-module__link__EG3d4" target="_blank" rel="noreferrer"><span class="NavLink-module__title__Q7t0p">Archive Program</span><svg aria-hidden="true" focusable="false" class="octicon octicon-link-external NavLink-module__externalIcon__eWIry" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2">REPOSITORIES</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://github.com/topics" data-analytics-event="{"action":"topics","tag":"link","context":"open_source","location":"navbar","label":"topics_link_open_source_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Topics</span></a></li><li><a href="https://github.com/trending" data-analytics-event="{"action":"trending","tag":"link","context":"open_source","location":"navbar","label":"trending_link_open_source_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Trending</span></a></li><li><a href="https://github.com/collections" data-analytics-event="{"action":"collections","tag":"link","context":"open_source","location":"navbar","label":"collections_link_open_source_navbar"}" class="NavLink-module__link__EG3d4"><span class="NavLink-module__title__Q7t0p">Collections</span></a></li></ul></div></li></ul></div></div></li><li><div class="NavDropdown-module__container__l2YeI js-details-container js-header-menu-item"><button type="button" class="NavDropdown-module__button__PEHWX js-details-target" aria-expanded="false">Enterprise<svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path></svg></button><div class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2">ENTERPRISE SOLUTIONS</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://github.com/enterprise" data-analytics-event="{"action":"enterprise_platform","tag":"link","context":"enterprise","location":"navbar","label":"enterprise_platform_link_enterprise_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-stack NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M11.063 1.456a1.749 1.749 0 0 1 1.874 0l8.383 5.316a1.751 1.751 0 0 1 0 2.956l-8.383 5.316a1.749 1.749 0 0 1-1.874 0L2.68 9.728a1.751 1.751 0 0 1 0-2.956Zm1.071 1.267a.25.25 0 0 0-.268 0L3.483 8.039a.25.25 0 0 0 0 .422l8.383 5.316a.25.25 0 0 0 .268 0l8.383-5.316a.25.25 0 0 0 0-.422Z"></path><path d="M1.867 12.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path><path d="M1.867 16.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path></svg><span class="NavLink-module__title__Q7t0p">Enterprise platform</span><span class="NavLink-module__subtitle__X4gkW">AI-powered developer platform</span></div></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="NavGroup-module__title__Wzxz2">AVAILABLE ADD-ONS</span><ul class="NavGroup-module__list__UCOFy"><li><a href="https://github.com/security/advanced-security" data-analytics-event="{"action":"github_advanced_security","tag":"link","context":"enterprise","location":"navbar","label":"github_advanced_security_link_enterprise_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path></svg><span class="NavLink-module__title__Q7t0p">GitHub Advanced Security</span><span class="NavLink-module__subtitle__X4gkW">Enterprise-grade security features</span></div></a></li><li><a href="https://github.com/features/copilot/copilot-business" data-analytics-event="{"action":"copilot_for_business","tag":"link","context":"enterprise","location":"navbar","label":"copilot_for_business_link_enterprise_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path></svg><span class="NavLink-module__title__Q7t0p">Copilot for Business</span><span class="NavLink-module__subtitle__X4gkW">Enterprise-grade AI features</span></div></a></li><li><a href="https://github.com/premium-support" data-analytics-event="{"action":"premium_support","tag":"link","context":"enterprise","location":"navbar","label":"premium_support_link_enterprise_navbar"}" class="NavLink-module__link__EG3d4"><div class="NavLink-module__text__XvpLQ"><svg aria-hidden="true" focusable="false" class="octicon octicon-comment-discussion NavLink-module__icon__ltGNM" viewBox="0 0 24 24" width="24" height="24" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path></svg><span class="NavLink-module__title__Q7t0p">Premium Support</span><span class="NavLink-module__subtitle__X4gkW">Enterprise-grade 24/7 support</span></div></a></li></ul></div></li></ul></div></div></li><li><a href="https://github.com/pricing" data-analytics-event="{"action":"pricing","tag":"link","context":"pricing","location":"navbar","label":"pricing_link_pricing_navbar"}" class="NavLink-module__link__EG3d4 MarketingNavigation-module__navLink__hUomM"><span class="NavLink-module__title__Q7t0p">Pricing</span></a></li></ul></nav><script type="application/json" id="__PRIMER_DATA__R_0___">{"resolvedServerColorMode":"day"}</script></div> </react-partial> @@ -357,7 +359,7 @@ -<qbsearch-input class="search-input" data-scope="owner:buetow" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="l5xWjgAhHQybMJZ8WO-wsGa2b9c_VYXg_jFsg0MRyHge2RDGvAxTc8eje4TvYPHApoi6DkaI_5AFhdkc-6DBfw" 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="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"> <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" @@ -421,7 +423,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-9417c3f6-ef4e-4129-bc30-1def16d92464" 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-f20c78c0-f0a1-4c7b-ae4a-e7dd897faa91" data-target="query-builder.input" data-action=" input:query-builder#inputChange blur:query-builder#inputBlur keydown:query-builder#inputKeydown @@ -660,7 +662,7 @@ ></ul> </div> - <div class="FormControl-inlineValidation" id="validation-9417c3f6-ef4e-4129-bc30-1def16d92464" hidden="hidden"> + <div class="FormControl-inlineValidation" id="validation-f20c78c0-f0a1-4c7b-ae4a-e7dd897faa91" 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> @@ -701,7 +703,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="5oLtEI4H0ItPB/Try6PV4u9wC/ih6McXvOS3vMn/Lw0FrxlKGcX3saVE/69Rs+AUEjXO5sw4yw3c1o+sMqyrWQ==" /> + <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==" /> <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"> @@ -739,7 +741,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="T59FQW1eSTF7GFUUvjr5350l5HxyyA9VkyTgGx3pVfyDTw5knuuYfQJs93pdtT4lfmoL0qVeLpStIKtJ4j8oAQ==" /> + <!-- '"` --><!-- </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==" /> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField"> @@ -757,7 +759,7 @@ placeholder="github-ruby" required maxlength="50"> - <input type="hidden" data-csrf="true" value="h8ocZKbyGhHg97oGQFcX3x8xSyeCbJEpJ6hfGmilQWt019Sk50o9Nj6IKPieR/HvVx/y6WUjrjpZfVmJHLNncQ==" /> + <input type="hidden" data-csrf="true" value="vTBwgI6vOVYO04wJDVEUMK/05H99yRYpNjKlJjSbCpFH1ha9gJmaRCy7YhUY53445gS2eqmtkjWbLTJGpVixJg==" /> </auto-check> </div> @@ -812,7 +814,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="rOlM0J2+9VUxOelBih9xaJY22oqL139DwsSNeya3dT2V6LB9A8GzExa68LGN5toZmREXK+DqPqjmkm/PVtIDvA==" /> <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="p/FKWRRRhRPWlLsUopIpn6S0MaaSJcYkW9F6tcXZ6SqeRz41bsu6j0oIYfGhmGN6JXDuEqLJi80ImiwwFvIXwA==" /> <input type="hidden" name="add_account" id="add_account" autocomplete="off" class="form-control" /> <label for="login_field"> Username or email address @@ -834,9 +836,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_d317" hidden="hidden" /> -<input class="form-control" type="hidden" name="timestamp" value="1770493790472" /> -<input class="form-control" type="hidden" name="timestamp_secret" value="e15b1640379ab4727f51f9537b142791e60c16ea3991c247ace65a3df81ce081" /> +<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 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" /> @@ -863,14 +865,14 @@ <div class="AppHeader-appearanceSettings"> <react-partial-anchor> - <button data-target="react-partial-anchor.anchor" id="icon-button-5afa9014-607a-432d-b226-699832721ecc" aria-labelledby="tooltip-4ec0a7c5-46f1-4490-8bff-f3473b874dee" 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-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"> <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-4ec0a7c5-46f1-4490-8bff-f3473b874dee" for="icon-button-5afa9014-607a-432d-b226-699832721ecc" 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-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> <template data-target="react-partial-anchor.template"> - <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.2b2a53c0ee686cca.module.css" /> -<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/appearance-settings.571a5d0113aba4f4.module.css" /> + <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" /> <react-partial partial-name="appearance-settings" @@ -904,10 +906,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-66e66b36-58b6-4fb2-9ff8-1e051937a343" aria-labelledby="tooltip-1d57b415-9bfb-47ab-9722-aa75d1478518" 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-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"> <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-1d57b415-9bfb-47ab-9722-aa75d1478518" for="icon-button-66e66b36-58b6-4fb2-9ff8-1e051937a343" 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-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> diff --git a/gemfeed/2026-02-15-loadbars-resurrected-from-perl-to-go.html b/gemfeed/2026-02-15-loadbars-resurrected-from-perl-to-go.html index 0c530143..302e8730 100644 --- a/gemfeed/2026-02-15-loadbars-resurrected-from-perl-to-go.html +++ b/gemfeed/2026-02-15-loadbars-resurrected-from-perl-to-go.html @@ -67,11 +67,11 @@ <br /> <span>I actually tried to fix the Perl version first. I had Claude Code (CLI, running Opus 5.3) attempt to resolve the segfault involving Perl's multi-threading and SDL. It couldn't—the issue is deep in the XS bindings and not something you can fix from Perl-land (nor did I want to invest my own time in it either). So the more pragmatic thing to do was to let Claude Code rewrite the whole thing in Go instead. That worked without any major issues. The Go version is cleaner, faster to build, easier to deploy (single static binary), and now has proper unit tests.</span><br /> <br /> -<span>The important thing: for the user, nothing changes. The rewrite's usage, look, and feel are de-facto identical to the old Perl version. The same hotkeys, the same bar layout, the same colors, the same config file format. If you used Loadbars ten years ago, you can pick up the new version and everything works exactly as you remember. The only difference is under the hood.</span><br /> +<span>I could have redesigned the Perl version to make it work, but I think Go is the better choice in this case. The important thing: for the user, nothing changes. The rewrite's usage, look, and feel are de-facto identical to the old Perl version. The same hotkeys, the same bar layout, the same colors, the same config file format. If you used Loadbars ten years ago, you can pick up the new version and everything works exactly as you remember. The only difference is under the hood.</span><br /> <br /> <h2 style='display: inline' id='a-brief-history'>A brief history</h2><br /> <br /> -<span>The first commit is from November 5, 2010—over 13 years ago. Back then, it was called <span class='inlinecode'>cpuload</span> and was a quick Perl+SDL hack I wrote at work to keep an eye on a fleet of Linux servers. It grew into Loadbars over the following weeks, gaining memory and network monitoring, ClusterSSH integration, and a config file. The last meaningful Perl development was around 2013. Around that time, there were already a couple of colleagues who used Loadbars frequently. But then I changed my job role and later even jobs, and I stopped development of Loadbars.</span><br /> +<span>The first commit is from November 5, 2010—over 15 years ago. Back then, it was called <span class='inlinecode'>cpuload</span> and was a quick Perl+SDL hack I wrote at work to keep an eye on a fleet of Linux servers. It grew into Loadbars over the following weeks, gaining memory and network monitoring, ClusterSSH integration, and a config file. The last meaningful Perl development was around 2013. Around that time, there were already a couple of colleagues who used Loadbars frequently. But then I changed my job role and later even jobs, and I stopped development of Loadbars.</span><br /> <br /> <span>For the next decade, it sat dormant. I occasionally thought about reviving it, but Perl+SDL threading issues made it impractical. In February 2026, I finally sat down with Claude Code and let it rewrite the whole thing in Go in a single session.</span><br /> <br /> diff --git a/gemfeed/atom.xml b/gemfeed/atom.xml index ff77d61a..247ec434 100644 --- a/gemfeed/atom.xml +++ b/gemfeed/atom.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> - <updated>2026-02-14T22:43:28+02:00</updated> + <updated>2026-02-14T23:02:02+02:00</updated> <title>foo.zone feed</title> <subtitle>To be in the .zone!</subtitle> <link href="https://foo.zone/gemfeed/atom.xml" rel="self" /> @@ -20,6 +20,8 @@ <div xmlns="http://www.w3.org/1999/xhtml"> <h1 style='display: inline' id='loadbars-resurrected-from-perl-to-go-after-15-years'>Loadbars resurrected: From Perl to Go after 15 years</h1><br /> <br /> +<span class='quote'>Published at 2026-02-14T22:43:27+02:00</span><br /> +<br /> <span>Who remembers Loadbars? The small, humble server load monitoring tool I wrote back in November 2010 as a Perl+SDL project during my first job after graduating from university as a Linux Sysadmin. That was over 15 years ago. After being effectively dead for more than a decade, Loadbars is working again -- rewritten in Go from Perl with the help of AI (Claude Code), and it even works on macOS now (as a client).</span><br /> <br /> <a href='./loadbars-resurrected-from-perl-to-go/loadbars.gif'><img alt='Loadbars in action' title='Loadbars in action' src='./loadbars-resurrected-from-perl-to-go/loadbars.gif' /></a><br /> @@ -72,11 +74,11 @@ <br /> <span>I actually tried to fix the Perl version first. I had Claude Code (CLI, running Opus 5.3) attempt to resolve the segfault involving Perl's multi-threading and SDL. It couldn't—the issue is deep in the XS bindings and not something you can fix from Perl-land (nor did I want to invest my own time in it either). So the more pragmatic thing to do was to let Claude Code rewrite the whole thing in Go instead. That worked without any major issues. The Go version is cleaner, faster to build, easier to deploy (single static binary), and now has proper unit tests.</span><br /> <br /> -<span>The important thing: for the user, nothing changes. The rewrite's usage, look, and feel are de-facto identical to the old Perl version. The same hotkeys, the same bar layout, the same colors, the same config file format. If you used Loadbars ten years ago, you can pick up the new version and everything works exactly as you remember. The only difference is under the hood.</span><br /> +<span>I could have redesigned the Perl version to make it work, but I think Go is the better choice in this case. The important thing: for the user, nothing changes. The rewrite's usage, look, and feel are de-facto identical to the old Perl version. The same hotkeys, the same bar layout, the same colors, the same config file format. If you used Loadbars ten years ago, you can pick up the new version and everything works exactly as you remember. The only difference is under the hood.</span><br /> <br /> <h2 style='display: inline' id='a-brief-history'>A brief history</h2><br /> <br /> -<span>The first commit is from November 5, 2010—over 13 years ago. Back then, it was called <span class='inlinecode'>cpuload</span> and was a quick Perl+SDL hack I wrote at work to keep an eye on a fleet of Linux servers. It grew into Loadbars over the following weeks, gaining memory and network monitoring, ClusterSSH integration, and a config file. The last meaningful Perl development was around 2013. Around that time, there were already a couple of colleagues who used Loadbars frequently. But then I changed my job role and later even jobs, and I stopped development of Loadbars.</span><br /> +<span>The first commit is from November 5, 2010—over 15 years ago. Back then, it was called <span class='inlinecode'>cpuload</span> and was a quick Perl+SDL hack I wrote at work to keep an eye on a fleet of Linux servers. It grew into Loadbars over the following weeks, gaining memory and network monitoring, ClusterSSH integration, and a config file. The last meaningful Perl development was around 2013. Around that time, there were already a couple of colleagues who used Loadbars frequently. But then I changed my job role and later even jobs, and I stopped development of Loadbars.</span><br /> <br /> <span>For the next decade, it sat dormant. I occasionally thought about reviving it, but Perl+SDL threading issues made it impractical. In February 2026, I finally sat down with Claude Code and let it rewrite the whole thing in Go in a single session.</span><br /> <br /> @@ -13,7 +13,7 @@ </p> <h1 style='display: inline' id='hello'>Hello!</h1><br /> <br /> -<span class='quote'>This site was generated at 2026-02-14T22:43:28+02:00 by <span class='inlinecode'>Gemtexter</span></span><br /> +<span class='quote'>This site was generated at 2026-02-14T23:02:02+02:00 by <span class='inlinecode'>Gemtexter</span></span><br /> <br /> <span>Welcome to the foo.zone!</span><br /> <br /> diff --git a/uptime-stats.html b/uptime-stats.html index 3bf6eb81..fb656879 100644 --- a/uptime-stats.html +++ b/uptime-stats.html @@ -13,7 +13,7 @@ </p> <h1 style='display: inline' id='my-machine-uptime-stats'>My machine uptime stats</h1><br /> <br /> -<span class='quote'>This site was last updated at 2026-02-14T22:43:28+02:00</span><br /> +<span class='quote'>This site was last updated at 2026-02-14T23:02:02+02:00</span><br /> <br /> <span>The following stats were collected via <span class='inlinecode'>uptimed</span> on all of my personal computers over many years and the output was generated by <span class='inlinecode'>guprecords</span>, the global uptime records stats analyser of mine.</span><br /> <br /> |
