{"id":51288497,"url":"https://github.com/galtzo-floss/yard-timekeeper","last_synced_at":"2026-06-30T08:30:39.478Z","repository":{"id":350642014,"uuid":"1207635973","full_name":"galtzo-floss/yard-timekeeper","owner":"galtzo-floss","description":"🕰️ Don't churn your yard like butter. Use yard-timekeeper to keep unchanged docs pristine.","archived":false,"fork":false,"pushed_at":"2026-05-30T21:10:51.000Z","size":416,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-30T23:10:38.979Z","etag":null,"topics":["documentation-generator","ruby","rubygem","yard","yard-plugin","yardoc"],"latest_commit_sha":null,"homepage":"https://yard-timekeeper.galtzo.com/","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/galtzo-floss.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"buy_me_a_coffee":"pboling","community_bridge":null,"github":["pboling"],"issuehunt":"pboling","ko_fi":"pboling","liberapay":"pboling","open_collective":"galtzo-floss","patreon":"galtzo","polar":"pboling","thanks_dev":"u/gh/pboling","tidelift":"rubygems/yard-timekeeper"}},"created_at":"2026-04-11T07:31:14.000Z","updated_at":"2026-05-30T21:10:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/galtzo-floss/yard-timekeeper","commit_stats":null,"previous_names":["pboling/yard-timekeeper"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/galtzo-floss/yard-timekeeper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galtzo-floss%2Fyard-timekeeper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galtzo-floss%2Fyard-timekeeper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galtzo-floss%2Fyard-timekeeper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galtzo-floss%2Fyard-timekeeper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/galtzo-floss","download_url":"https://codeload.github.com/galtzo-floss/yard-timekeeper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galtzo-floss%2Fyard-timekeeper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34959504,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-30T02:00:05.919Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["documentation-generator","ruby","rubygem","yard","yard-plugin","yardoc"],"created_at":"2026-06-30T08:30:38.543Z","updated_at":"2026-06-30T08:30:39.470Z","avatar_url":"https://github.com/galtzo-floss.png","language":"Ruby","funding_links":["https://buymeacoffee.com/pboling","https://github.com/sponsors/pboling","https://issuehunt.io/r/pboling","https://ko-fi.com/pboling","https://liberapay.com/pboling","https://opencollective.com/galtzo-floss","https://patreon.com/galtzo","https://polar.sh/pboling","https://thanks.dev/u/gh/pboling","https://tidelift.com/funding/github/rubygems/yard-timekeeper","https://tidelift.com/badges/package/rubygems/yard-timekeeper","https://tidelift.com/subscription/pkg/rubygems-yard-timekeeper?utm_source=rubygems-yard-timekeeper\u0026utm_medium=referral\u0026utm_campaign=readme","https://liberapay.com/pboling/donate","https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte\u0026emoji=\u0026slug=pboling\u0026button_colour=FFDD00\u0026font_colour=000000\u0026font_family=Cookie\u0026outline_colour=000000\u0026coffee_colour=ffffff","https://www.buymeacoffee.com/pboling","https://www.paypal.com/paypalme/peterboling","https://blog.tidelift.com/tidelift-joins-sonar"],"categories":[],"sub_categories":[],"readme":"\u003ca href=\"https://github.com/galtzo-floss/yard-timekeeper\"\u003e\u003cimg alt=\"yard-timekeeper Logo by Aboling0, CC BY-SA 4.0\" src=\"https://logos.galtzo.com/assets/images/galtzo-floss/yard-timekeeper/avatar-128px.svg\" width=\"14%\" align=\"right\"/\u003e\u003c/a\u003e\n\n# 🕰️ Yard::Timekeeper\n\n[![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]\n\n`if ci_badges.map(\u0026:color).detect { it != \"green\"}` ☝️ [let me know][✉️discord-invite], as I may have missed the [discord notification][✉️discord-invite].\n\n---\n\n`if ci_badges.map(\u0026:color).all? { it == \"green\"}` 👇️ send money so I can do more of this. FLOSS maintenance is now my full-time job.\n\n[![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate at ko-fi.com][🖇kofi-img]][🖇kofi]\n\n\u003cdetails markdown=\"1\"\u003e\n \u003csummary\u003e👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️\u003c/summary\u003e\n\nI've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).\n\n\u003c/details\u003e\n\n## 🌻 Synopsis \u003ca href=\"https://discord.gg/3qme4XHNKN\"\u003e\u003cimg alt=\"Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0\" src=\"https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px.svg\" width=\"8%\" align=\"right\"/\u003e\u003c/a\u003e \u003ca href=\"https://ruby-toolbox.com\"\u003e\u003cimg alt=\"ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5\" src=\"https://logos.galtzo.com/assets/images/ruby-lang/avatar-128px.svg\" width=\"8%\" align=\"right\"/\u003e\u003c/a\u003e\n\n`yard-timekeeper` keeps checked-in YARD HTML stable by restoring files whose\nonly changes are generated footer churn.\n\nJust the important bits:\n\n- It postprocesses generated `docs/**/*.html` files after YARD finishes.\n- It only restores files that are already tracked in git and only when the diff\n  is limited to generated footer metadata.\n- It treats YARD footer timestamp, YARD version, and Ruby version changes as\n  generated churn, because those do not represent documentation content changes.\n- Real content changes are preserved.\n- The supported workflow is `rake yard`; raw `yard` / `bin/yard` does not run\n  the explicit postprocess hook.\n\n## 💡 Info you can shake a stick at\n\n| Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |\n|-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Works with JRuby | [![JRuby 10.0 Compat][💎jruby-10.0i]][🚎jruby-10.0-wf] [![JRuby current Compat][💎jruby-c-i]][🚎10-j-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf]|\n| Works with Truffle Ruby | [![Truffle Ruby 24.2 Compat][💎truby-24.2i]][🚎truby-24.2-wf] [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎truby-25.0-wf] [![Truffle Ruby 33.0 Compat][💎truby-33.0i]][🚎truby-33.0-wf] [![Truffle Ruby current Compat][💎truby-c-i]][🚎9-t-wf] [![Truffle Ruby HEAD Compat][💎truby-headi]][🚎3-hd-wf]|\n| Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|\n| Works with MRI Ruby 3 | [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎ruby-3.2-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎ruby-3.3-wf] [![Ruby 3.4 Compat][💎ruby-3.4i]][🚎ruby-3.4-wf]|\n| Support \u0026 Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |\n| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] |\n| Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] |\n| Compliance | [![License: MIT][📄license-img]][📄license] [![Apache license compatibility: Category A][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |\n| Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] |\n| Maintainer 🎖️ | [![Follow Me on LinkedIn][💖🖇linkedin-img]][💖🖇linkedin] [![Follow Me on Ruby.Social][💖🐘ruby-mast-img]][💖🐘ruby-mast] [![Follow Me on Bluesky][💖🦋bluesky-img]][💖🦋bluesky] [![Contact Maintainer][🚂maint-contact-img]][🚂maint-contact] [![My technical writing][💖💁🏼‍♂️devto-img]][💖💁🏼‍♂️devto] |\n| `...` 💖 | [![Find Me on WellFound:][💖✌️wellfound-img]][💖✌️wellfound] [![Find Me on CrunchBase][💖💲crunchbase-img]][💖💲crunchbase] [![My LinkTree][💖🌳linktree-img]][💖🌳linktree] [![More About Me][💖💁🏼‍♂️aboutme-img]][💖💁🏼‍♂️aboutme] [🧊][💖🧊berg] [🐙][💖🐙hub] [🛖][💖🛖hut] [🧪][💖🧪lab] |\n\n### Compatibility\n\nCompatible with MRI Ruby 3.2.0+, and concordant releases of JRuby, and TruffleRuby.\nCI workflows and Appraisals are generated for MRI Ruby 3.2.0+.\nThis test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and\nmay be higher than the gem's runtime compatibility floor when legacy Rubies are\nnot practical for the current toolchain.\n\n\u003ca href=\"https://github.com/kettle-dev\"\u003e\u003cimg alt=\"kettle-dev Logo by Aboling0, CC BY-SA 4.0\" src=\"https://logos.galtzo.com/assets/images/kettle-dev/avatar-128px.svg\" width=\"14%\" align=\"right\"/\u003e\u003c/a\u003e\n\nThe _amazing_ test matrix is powered by the kettle-dev stack.\n\n\u003cdetails markdown=\"1\"\u003e\n\u003csummary\u003eHow kettle-dev manages complexity in tests\u003c/summary\u003e\n\n| Gem | Source | Role | Daily download rank |\n|-----|--------|------|---------------------|\n| [appraisal2](https://bestgems.org/gems/appraisal2) | [GitHub](https://github.com/appraisal-rb/appraisal2) | multi-dependency Appraisal matrix generation | [![Daily download rank for appraisal2](https://img.shields.io/gem/rd/appraisal2.svg?style=flat-square)](https://bestgems.org/gems/appraisal2) |\n| [appraisal2-rubocop](https://bestgems.org/gems/appraisal2-rubocop) | [GitHub](https://github.com/appraisal-rb/appraisal2-rubocop) | RuboCop Appraisal generator integration | [![Daily download rank for appraisal2-rubocop](https://img.shields.io/gem/rd/appraisal2-rubocop.svg?style=flat-square)](https://bestgems.org/gems/appraisal2-rubocop) |\n| [kettle-dev](https://bestgems.org/gems/kettle-dev) | [GitHub](https://github.com/kettle-dev/kettle-dev) | development, release, and CI workflow tooling | [![Daily download rank for kettle-dev](https://img.shields.io/gem/rd/kettle-dev.svg?style=flat-square)](https://bestgems.org/gems/kettle-dev) |\n| [kettle-jem](https://bestgems.org/gems/kettle-jem) | [GitHub](https://github.com/kettle-dev/kettle-jem) | Appraisals \u0026 CI workflow templates | [![Daily download rank for kettle-jem](https://img.shields.io/gem/rd/kettle-jem.svg?style=flat-square)](https://bestgems.org/gems/kettle-jem) |\n| [kettle-soup-cover](https://bestgems.org/gems/kettle-soup-cover) | [GitHub](https://github.com/kettle-dev/kettle-soup-cover) | SimpleCov coverage policy and reporting | [![Daily download rank for kettle-soup-cover](https://img.shields.io/gem/rd/kettle-soup-cover.svg?style=flat-square)](https://bestgems.org/gems/kettle-soup-cover) |\n| [kettle-test](https://bestgems.org/gems/kettle-test) | [GitHub](https://github.com/kettle-dev/kettle-test) | standard test runner and coverage harness | [![Daily download rank for kettle-test](https://img.shields.io/gem/rd/kettle-test.svg?style=flat-square)](https://bestgems.org/gems/kettle-test) |\n| [rubocop-lts](https://bestgems.org/gems/rubocop-lts) | [GitHub](https://github.com/rubocop-lts/rubocop-lts) | Ruby-version-aware linting | [![Daily download rank for rubocop-lts](https://img.shields.io/gem/rd/rubocop-lts.svg?style=flat-square)](https://bestgems.org/gems/rubocop-lts) |\n| [turbo_tests2](https://bestgems.org/gems/turbo_tests2) | [GitHub](https://github.com/galtzo-floss/turbo_tests2) | parallel test execution | [![Daily download rank for turbo_tests2](https://img.shields.io/gem/rd/turbo_tests2.svg?style=flat-square)](https://bestgems.org/gems/turbo_tests2) |\n\n\u003c/details\u003e\n\n### Federated DVCS\n\n\u003cdetails markdown=\"1\"\u003e\n \u003csummary\u003eFind this repo on federated forges (Coming soon!)\u003c/summary\u003e\n\n| Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |\n|-------------------------------------------------|-----------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|\n| 🧪 [galtzo-floss/yard-timekeeper on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |\n| 🧊 [galtzo-floss/yard-timekeeper on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |\n| 🐙 [galtzo-floss/yard-timekeeper on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |\n| 🎮️ [Discord Server][✉️discord-invite] | [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] | [Let's][✉️discord-invite] | [talk][✉️discord-invite] | [about][✉️discord-invite] | [this][✉️discord-invite] | [library!][✉️discord-invite] |\n\n\u003c/details\u003e\n\n[gh-discussions]: https://github.com/galtzo-floss/yard-timekeeper/discussions\n\n### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/yard-timekeeper)](https://tidelift.com/subscription/pkg/rubygems-yard-timekeeper?utm_source=rubygems-yard-timekeeper\u0026utm_medium=referral\u0026utm_campaign=readme)\n\nAvailable as part of the Tidelift Subscription.\n\n\u003cdetails markdown=\"1\"\u003e\n \u003csummary\u003eNeed enterprise-level guarantees?\u003c/summary\u003e\n\nThe maintainers of this and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.\n\n[![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]\n\n- 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies\n- 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]\n- 💡Tidelift pays maintainers to maintain the software you depend on!\u003cbr/\u003e📊`@`Pointy Haired Boss: An [enterprise support][🏙️entsup-tidelift] subscription is \"[never gonna let you down][🧮kloc]\", and *supports* open source maintainers\n\nAlternatively:\n\n- [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]\n- [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]\n- [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]\n\n\u003c/details\u003e\n\n## ✨ Installation\n\nInstall the gem and add to the application's Gemfile by executing:\n\n```console\nbundle add yard-timekeeper\n```\n\nIf bundler is not being used to manage dependencies, install the gem by executing:\n\n```console\ngem install yard-timekeeper\n```\n\n## ⚙️ Configuration\n\nNo `.yardopts` entry is required when you wire `yard-timekeeper` through the\nrake integration. In fact, `--plugin timekeeper` should be removed from\n`.yardopts` for this workflow:\n\n```ruby\nrequire \"yard/timekeeper\"\n\nYard::Timekeeper.install_rake_tasks!(:yard)\n```\n\n`yard-timekeeper` runs after YARD generates HTML and checks git diffs for tracked\nfiles under `docs/`. If a file's only changes are generated footer metadata:\n\n```text\nGenerated on ...\n0.9.44 (ruby-4.0.5).\n```\n\nthen the plugin restores that file from git so the docs site does not churn for\ntoolchain-only changes.\n\nThis protects against the common case where rebuilding docs changes only:\n\n- the generation timestamp\n- the YARD generator version\n- the Ruby version in the YARD footer\n\nThose values are useful when the page content changes, but they are not useful\nas standalone repository diffs.\n\nNotes:\n\n- It only affects files already tracked in git.\n- It is most useful for checked-in `docs/` sites.\n- Files with any real content changes keep their fresh timestamp.\n- Files with source, README, changelog, API, or rendered markup changes are not\n  restored just because their footer also changed.\n\nEnvironment toggles:\n\n- `YARD_TIMEKEEPER_DISABLE=true` — disable the post-process entirely\n\n## 🔧 Basic Usage\n\nGenerate docs through rake so the postprocess runs after YARD finishes:\n\n```console\nbin/rake yard\n```\n\nAfter generation, `yard-timekeeper` examines each changed tracked HTML file\nunder `docs/`. Footer-only churn is restored from git automatically. Pages with\nreal rendered content changes remain modified, including their fresh footer.\n\nIf your project also exposes `bin/yard`, do not rely on it for the full docs\nworkflow. It runs YARD, but it does not run\n`Yard::Timekeeper.install_rake_tasks!(:yard)`.\n\nFor checked-in docs, the recommended setup is:\n\n```text\n--plugin fence\n--plugin yaml\n```\n\n## 🦷 FLOSS Funding\n\nWhile galtzo-floss tools are free software and will always be, the project would benefit immensely from some funding.\nRaising a monthly budget of... \"dollars\" would make the project more sustainable.\n\nWe welcome both individual and corporate sponsors! We also offer a\nwide array of funding channels to account for your preferences.\nCurrently, [Open Collective][🖇osc] is our preferred funding platform.\n\n**If you're working in a company that's making significant use of galtzo-floss tools we'd\nappreciate it if you suggest to your company to become a galtzo-floss sponsor.**\n\nYou can support the development of galtzo-floss tools via\n[GitHub Sponsors][🖇sponsor],\n[Liberapay][⛳liberapay],\n[PayPal][🖇paypal],\n[Open Collective][🖇osc]\nand [Tidelift][🏙️entsup-tidelift].\n\n| 📍 NOTE |\n|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| If doing a sponsorship in the form of donation is problematic for your company \u003cbr/\u003e from an accounting standpoint, we'd recommend the use of Tidelift, \u003cbr/\u003e where you can get a support-like subscription instead. |\n\n### Open Collective for Individuals\n\nSupport us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/galtzo-floss#backer)]\n\nNOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.\n\n\u003c!-- OPENCOLLECTIVE-INDIVIDUALS:START --\u003e\nNo backers yet. Be the first!\n\u003c!-- OPENCOLLECTIVE-INDIVIDUALS:END --\u003e\n\n### Open Collective for Organizations\n\nBecome a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/galtzo-floss#sponsor)]\n\nNOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.\n\n\u003c!-- OPENCOLLECTIVE-ORGANIZATIONS:START --\u003e\nNo sponsors yet. Be the first!\n\u003c!-- OPENCOLLECTIVE-ORGANIZATIONS:END --\u003e\n\n[kettle-readme-backers]: https://github.com/galtzo-floss/yard-timekeeper/blob/main/bin/kettle-readme-backers\n\n### Another way to support open-source\n\nI’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈‍ cats).\n\nIf you work at a company that uses my work, please encourage them to support me as a corporate sponsor. My work on gems you use might show up in `bundle fund`.\n\nI’m developing a new library, [floss_funding][🖇floss-funding-gem], designed to empower open-source developers like myself to get paid for the work we do, in a sustainable way. Please give it a look.\n\n**[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**\n\n[![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi]\n\n## 🔐 Security\n\nSee [SECURITY.md][🔐security].\n\n## 🤝 Contributing\n\nIf you need some ideas of where to help, you could work on adding more code coverage,\nor if it is already 💯 (see [below](#code-coverage)) check [issues][🤝gh-issues] or [PRs][🤝gh-pulls],\nor use the gem and think about how it could be better.\n\nWe [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.\n\nSee [CONTRIBUTING.md][🤝contributing] for more detailed instructions.\n\n### 🚀 Release Instructions\n\nSee [CONTRIBUTING.md][🤝contributing].\n\n### Code Coverage\n\n\u003cdetails markdown=\"1\"\u003e\n\u003csummary\u003eCoverage service badges\u003c/summary\u003e\n\n[![Coverage Graph][🏀codecov-g]][🏀codecov]\n\n[![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]\n\n[![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]\n\n\u003c/details\u003e\n\n### 🪇 Code of Conduct\n\nEveryone interacting with this project's codebases, issue trackers,\nchat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].\n\n## 🌈 Contributors\n\n[![Contributors][🖐contributors-img]][🖐contributors]\n\nMade with [contributors-img][🖐contrib-rocks].\n\nAlso see GitLab Contributors: [https://gitlab.com/galtzo-floss/yard-timekeeper/-/graphs/main][🚎contributors-gl]\n\n\u003cdetails markdown=\"1\"\u003e\n \u003csummary\u003e⭐️ Star History\u003c/summary\u003e\n\n\u003ca href=\"https://star-history.com/galtzo-floss/yard-timekeeper\u0026Date\"\u003e\n \u003cpicture\u003e\n \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=galtzo-floss/yard-timekeeper\u0026type=Date\u0026theme=dark\" /\u003e\n \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=galtzo-floss/yard-timekeeper\u0026type=Date\" /\u003e\n \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=galtzo-floss/yard-timekeeper\u0026type=Date\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n\n\u003c/details\u003e\n\n## 📌 Versioning\n\nThis library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.\nFor most applications, prefer the [Pessimistic Version Constraint][📌pvc] with two digits of precision.\n\nFor example:\n\n```ruby\nspec.add_dependency(\"yard-timekeeper\", \"~\u003e 0.0\")\n```\n\n\u003cdetails markdown=\"1\"\u003e\n\u003csummary\u003e📌 Is \"Platform Support\" part of the public API? More details inside.\u003c/summary\u003e\n\nDropping support for a platform can be a breaking change for affected users.\nIf a release changes supported platforms, it should be called out clearly in the changelog and versioned with that impact in mind.\n\nTo get a better understanding of how SemVer is intended to work over a project's lifetime,\nread this article from the creator of SemVer:\n\n- [\"Major Version Numbers are Not Sacred\"][📌major-versions-not-sacred]\n\n\u003c/details\u003e\n\nSee [CHANGELOG.md][📌changelog] for a list of releases.\n\n## 📄 License\n\nThe gem is available as open source under the terms of\nthe [MIT](MIT.md) [![License: MIT][📄license-img]][📄license-ref].\n\n### © Copyright\n\nSee [LICENSE.md][📄license] for the official copyright notice.\n\n\u003cdetails markdown=\"1\"\u003e\n\u003csummary\u003eCopyright holders\u003c/summary\u003e\n\n- Copyright (c) 2026 Peter H. Boling\n\n\u003c/details\u003e\n\n## 🤑 A request for help\n\nMaintainers have teeth and need to pay their dentists.\nAfter getting laid off in an RIF in March, and encountering difficulty finding a new one,\nI began spending most of my time building open source tools.\nI'm hoping to be able to pay for my kids' health insurance this month,\nso if you value the work I am doing, I need your support.\nPlease consider sponsoring me or the project.\n\nTo join the community or get help 👇️ Join the Discord.\n\n[![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]\n\nTo say \"thanks!\" ☝️ Join the Discord or 👇️ send money.\n\n[![Sponsor galtzo-floss/yard-timekeeper on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]\n\n### Please give the project a star ⭐ ♥.\n\nMany parts of this project are actively managed by a [kettle-jem](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem) smart template utilizing [StructuredMerge.org](https://structuredmerge.org) merge contracts.\n\nThanks for RTFM. ☺️\n\n[⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay\u0026color=a51611\u0026style=flat\n[⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge\u0026logo=liberapay\u0026color=a51611\n[⛳liberapay]: https://liberapay.com/pboling/donate\n[🖇osc-all-img]: https://img.shields.io/opencollective/all/galtzo-floss\n[🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/galtzo-floss\n[🖇osc-backers-img]: https://img.shields.io/opencollective/backers/galtzo-floss\n[🖇osc-backers]: https://opencollective.com/galtzo-floss#backer\n[🖇osc-backers-i]: https://opencollective.com/galtzo-floss/backers/badge.svg?style=flat\n[🖇osc-sponsors]: https://opencollective.com/galtzo-floss#sponsor\n[🖇osc-sponsors-i]: https://opencollective.com/galtzo-floss/sponsors/badge.svg?style=flat\n[🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/galtzo-floss?style=for-the-badge\n[🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/galtzo-floss?style=for-the-badge\n[🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/galtzo-floss?style=for-the-badge\n[🖇osc]: https://opencollective.com/galtzo-floss\n[🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social\u0026logo=github\n[🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge\u0026logo=github\n[🖇sponsor]: https://github.com/sponsors/pboling\n[🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat\n[🖇kofi]: https://ko-fi.com/pboling\n[🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat\n[🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte\u0026emoji=\u0026slug=pboling\u0026button_colour=FFDD00\u0026font_colour=000000\u0026font_family=Cookie\u0026outline_colour=000000\u0026coffee_colour=ffffff\n[🖇buyme]: https://www.buymeacoffee.com/pboling\n[🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat\u0026logo=paypal\n[🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge\u0026logo=paypal\u0026color=0A0A0A\n[🖇paypal]: https://www.paypal.com/paypalme/peterboling\n[🖇floss-funding.dev]: https://floss-funding.dev\n[🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding\n[✉️discord-invite]: https://discord.gg/3qme4XHNKN\n[✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge\u0026logo=discord\n[✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge\u0026logo=dailydotdev\u0026logoColor=white\n[✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends\n\n[✇bundle-group-pattern]: https://gist.github.com/pboling/4564780\n[⛳️gem-namespace]: https://github.com/galtzo-floss/yard-timekeeper\n[⛳️namespace-img]: https://img.shields.io/badge/namespace-Yard::Timekeeper-3C2D2D.svg?style=square\u0026logo=ruby\u0026logoColor=white\n[⛳️gem-name]: https://bestgems.org/gems/yard-timekeeper\n[⛳️name-img]: https://img.shields.io/badge/name-yard--timekeeper-3C2D2D.svg?style=square\u0026logo=rubygems\u0026logoColor=red\n[⛳️tag-img]: https://img.shields.io/github/tag/galtzo-floss/yard-timekeeper.svg\n[⛳️tag]: https://github.com/galtzo-floss/yard-timekeeper/releases\n[🚂maint-blog]: http://www.railsbling.com/tags/yard-timekeeper\n[🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge\u0026logo=rubyonrails\u0026logoColor=orange\n[🚂maint-contact]: http://www.railsbling.com/contact\n[🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat\u0026logo=rubyonrails\u0026logoColor=red\n[💖🖇linkedin]: http://www.linkedin.com/in/peterboling\n[💖🖇linkedin-img]: https://img.shields.io/badge/LinkedIn-Profile-0B66C2?style=flat\u0026logo=newjapanprowrestling\n[💖✌️wellfound]: https://wellfound.com/u/peter-boling\n[💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat\u0026logo=wellfound\n[💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling\n[💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat\u0026logo=crunchbase\n[💖🐘ruby-mast]: https://ruby.social/@galtzo\n[💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social\u0026style=flat\u0026logo=mastodon\u0026label=Ruby%20@galtzo\n[💖🦋bluesky]: https://bsky.app/profile/galtzo.com\n[💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat\u0026logo=bluesky\u0026logoColor=white\n[💖🌳linktree]: https://linktr.ee/galtzo\n[💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat\u0026logo=linktree\n[💖💁🏼‍♂️devto]: https://dev.to/galtzo\n[💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat\u0026logo=devdotto\u0026logoColor=white\n[💖💁🏼‍♂️aboutme]: https://about.me/peter.boling\n[💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat\u0026logo=aboutme\u0026logoColor=white\n[💖🧊berg]: https://codeberg.org/pboling\n[💖🐙hub]: https://github.org/pboling\n[💖🛖hut]: https://sr.ht/~galtzo/\n[💖🧪lab]: https://gitlab.com/pboling\n[👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share\n[👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge\u0026logo=Upwork\u0026logoColor=white\n[👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github\u0026utm_medium=button\u0026utm_term=peterboling\u0026utm_campaign=github\n[👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge\u0026logo=CodeMentor\u0026logoColor=white\n[🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-yard-timekeeper?utm_source=rubygems-yard-timekeeper\u0026utm_medium=referral\u0026utm_campaign=readme\n[🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge\u0026logo=sonar\u0026logoColor=white\n[🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar\n[💁🏼‍♂️peterboling]: http://www.peterboling.com\n[🚂railsbling]: http://www.railsbling.com\n[📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge\u0026logo=Gitlab\u0026logoColor=orange\n[📜src-gl]: https://gitlab.com/galtzo-floss/yard-timekeeper\n[📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge\u0026logo=CodeBerg\u0026logoColor=blue\n[📜src-cb]: https://codeberg.org/galtzo-floss/yard-timekeeper\n[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge\u0026logo=Github\u0026logoColor=green\n[📜src-gh]: https://github.com/galtzo-floss/yard-timekeeper\n[📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge\u0026logo=readthedocs\u0026logoColor=white\n[📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge\u0026logo=readthedocs\u0026logoColor=white\n[📜gl-wiki]: https://gitlab.com/galtzo-floss/yard-timekeeper/-/wikis/home\n[📜gh-wiki]: https://github.com/galtzo-floss/yard-timekeeper/wiki\n[📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge\u0026logo=gitlab\u0026logoColor=white\n[📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge\u0026logo=github\u0026logoColor=white\n[👽dl-rank]: https://bestgems.org/gems/yard-timekeeper\n[👽dl-ranki]: https://img.shields.io/gem/rd/yard-timekeeper.svg\n[👽version]: https://bestgems.org/gems/yard-timekeeper\n[👽versioni]: https://img.shields.io/gem/v/yard-timekeeper.svg\n[🏀qlty-mnt]: https://qlty.sh/gh/galtzo-floss/projects/yard-timekeeper\n[🏀qlty-mnti]: https://qlty.sh/gh/galtzo-floss/projects/yard-timekeeper/maintainability.svg\n[🏀qlty-cov]: https://qlty.sh/gh/galtzo-floss/projects/yard-timekeeper/metrics/code?sort=coverageRating\n[🏀qlty-covi]: https://qlty.sh/gh/galtzo-floss/projects/yard-timekeeper/coverage.svg\n[🏀codecov]: https://codecov.io/gh/galtzo-floss/yard-timekeeper\n[🏀codecovi]: https://codecov.io/gh/galtzo-floss/yard-timekeeper/graph/badge.svg\n[🏀coveralls]: https://coveralls.io/github/galtzo-floss/yard-timekeeper?branch=main\n[🏀coveralls-img]: https://coveralls.io/repos/github/galtzo-floss/yard-timekeeper/badge.svg?branch=main\n[🚎ruby-3.2-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/ruby-3.2.yml\n[🚎ruby-3.3-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/ruby-3.3.yml\n[🚎ruby-3.4-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/ruby-3.4.yml\n[🚎jruby-10.0-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/jruby-10.0.yml\n[🚎truby-24.2-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/truffleruby-24.2.yml\n[🚎truby-25.0-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/truffleruby-25.0.yml\n[🚎truby-33.0-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/truffleruby-33.0.yml\n[🚎2-cov-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/coverage.yml\n[🚎2-cov-wfi]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/coverage.yml/badge.svg\n[🚎3-hd-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/heads.yml\n[🚎3-hd-wfi]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/heads.yml/badge.svg\n[🚎5-st-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/style.yml\n[🚎5-st-wfi]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/style.yml/badge.svg\n[🚎9-t-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/truffle.yml\n[🚎9-t-wfi]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/truffle.yml/badge.svg\n[🚎10-j-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/jruby.yml\n[🚎10-j-wfi]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/jruby.yml/badge.svg\n[🚎11-c-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/current.yml\n[🚎11-c-wfi]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/current.yml/badge.svg\n[🚎12-crh-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/dep-heads.yml\n[🚎12-crh-wfi]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/dep-heads.yml/badge.svg\n[🚎13-🔒️-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/locked_deps.yml\n[🚎13-🔒️-wfi]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/locked_deps.yml/badge.svg\n[🚎14-🔓️-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/unlocked_deps.yml\n[🚎14-🔓️-wfi]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/unlocked_deps.yml/badge.svg\n[🚎15-🪪-wf]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/license-eye.yml\n[🚎15-🪪-wfi]: https://github.com/galtzo-floss/yard-timekeeper/actions/workflows/license-eye.yml/badge.svg\n[💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=green\n[💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=blue\n[💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=pink\n[💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=pink\n[💎truby-33.0i]: https://img.shields.io/badge/Truffle_Ruby-33.0-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=pink\n[💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=green\n[💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=blue\n[💎jruby-10.0i]: https://img.shields.io/badge/JRuby-10.0-FBE742?style=for-the-badge\u0026logo=ruby\u0026logoColor=red\n[💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge\u0026logo=ruby\u0026logoColor=green\n[💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge\u0026logo=ruby\u0026logoColor=blue\n[🤝gh-issues]: https://github.com/galtzo-floss/yard-timekeeper/issues\n[🤝gh-pulls]: https://github.com/galtzo-floss/yard-timekeeper/pulls\n[🤝gl-issues]: https://gitlab.com/galtzo-floss/yard-timekeeper/-/issues\n[🤝gl-pulls]: https://gitlab.com/galtzo-floss/yard-timekeeper/-/merge_requests\n[🤝cb-issues]: https://codeberg.org/galtzo-floss/yard-timekeeper/issues\n[🤝cb-pulls]: https://codeberg.org/galtzo-floss/yard-timekeeper/pulls\n[🤝cb-donate]: https://donate.codeberg.org/\n[🤝contributing]: https://github.com/galtzo-floss/yard-timekeeper/blob/main/CONTRIBUTING.md\n[🏀codecov-g]: https://codecov.io/gh/galtzo-floss/yard-timekeeper/graph/badge.svg\n[🖐contrib-rocks]: https://contrib.rocks\n[🖐contributors]: https://github.com/galtzo-floss/yard-timekeeper/graphs/contributors\n[🖐contributors-img]: https://contrib.rocks/image?repo=galtzo-floss/yard-timekeeper\n[🚎contributors-gl]: https://gitlab.com/galtzo-floss/yard-timekeeper/-/graphs/main\n[🪇conduct]: https://github.com/galtzo-floss/yard-timekeeper/blob/main/CODE_OF_CONDUCT.md\n[🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg\n[📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint\n[📌semver]: https://semver.org/spec/v2.0.0.html\n[📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat\n[📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139\n[📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html\n[📌changelog]: https://github.com/galtzo-floss/yard-timekeeper/blob/main/CHANGELOG.md\n[📗keep-changelog]: https://keepachangelog.com/en/1.0.0/\n[📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat\n[📌gitmoji]: https://gitmoji.dev\n[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square\n[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ\n[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.084-FFDD67.svg?style=for-the-badge\u0026logo=YouTube\u0026logoColor=blue\n[🔐security]: https://github.com/galtzo-floss/yard-timekeeper/blob/main/SECURITY.md\n[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat\n[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year\n[📄license]: LICENSE.md\n[📄license-ref]: MIT.md\n[📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg\n[📄license-compat]: https://www.apache.org/legal/resolved.html#category-a\n[📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat\u0026logo=Apache\n\n[📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm\n[📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat\n[🚎yard-current]: http://rubydoc.info/gems/yard-timekeeper\n[🚎yard-head]: https://yard-timekeeper.galtzo.com\n[💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums\n[💎SHA_checksums]: https://gitlab.com/galtzo-floss/yard-timekeeper/-/tree/main/checksums\n[💎rlts]: https://github.com/rubocop-lts/rubocop-lts\n[💎rlts-img]: https://img.shields.io/badge/code_style_\u0026_linting-rubocop--lts-34495e.svg?plastic\u0026logo=ruby\u0026logoColor=white\n[💎appraisal2]: https://github.com/appraisal-rb/appraisal2\n[💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic\u0026logo=ruby\u0026logoColor=white\n[💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/\n\n\u003c!-- kettle-jem:metadata:start --\u003e\n| Field | Value |\n|---|---|\n| Package | yard-timekeeper |\n| Description | 🕰️ A YARD plugin that post-processes generated docs, detects timestamp-only diffs in tracked HTML files under docs/, and restores those files from git to prevent pointless churn while keeping the footer timestamp on genuinely changed pages. |\n| Homepage | https://github.com/galtzo-floss/yard-timekeeper |\n| Source | https://github.com/galtzo-floss/yard-timekeeper |\n| License | `MIT` |\n| Funding | https://github.com/sponsors/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/galtzo-floss, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/yard-timekeeper, https://www.buymeacoffee.com/pboling |\n\u003c!-- kettle-jem:metadata:end --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgaltzo-floss%2Fyard-timekeeper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgaltzo-floss%2Fyard-timekeeper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgaltzo-floss%2Fyard-timekeeper/lists"}