Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Section titled “[Unreleased]”[0.0.11] - 2026-11-01
Section titled “[0.0.11] - 2026-11-01”🚀 Features
Section titled “🚀 Features”- font: read any font of a collection and hand back the decoded sfnt
🐛 Bug Fixes
Section titled “🐛 Bug Fixes”- font: add FontError::IndexOutOfRange last so the other variants keep their value
📝 Documentation
Section titled “📝 Documentation”- string: list how parse_pattern differs from parsePatternOrRegExp
- stop linking to items only built with random-entropy
✅ Tests
Section titled “✅ Tests”- font: kill the surviving mutants of the sfnt rebuild
📦 Build
Section titled “📦 Build”- deps: Bump the actions group across 1 directory with 2 updates
👷 CI/CD
Section titled “👷 CI/CD”- release: pin helpers4/action-release by commit SHA
- release: release with helpers4/action-release
0.0.10 - 2026-10-30
Section titled “0.0.10 - 2026-10-30”🚀 Features
Section titled “🚀 Features”- bytes: add media_type_of and media_type_of_path
- color: add blend, premultiply, Hsb and unit channels
- font: add CSS font matching and font file reading
- geometry: add SVG path helpers and Matrix::rect_to_rect
- kiwi: add a Kiwi schema and message decoder
- string: add match_glob_ignore_case and parse_pattern
♻️ Refactoring
Section titled “♻️ Refactoring”- geometry: write the path scanners without index loops
📝 Documentation
Section titled “📝 Documentation”- agents: document the MSRV policy and the no_std status
- agents: document the free-functions naming policy
✅ Tests
Section titled “✅ Tests”- font: avoid words the spell checker flags
- security: fuzz ByteReader
- kill the surviving mutants of the new modules
📦 Build
Section titled “📦 Build”- deps: Bump unicode-normalization
0.0.9 - 2026-10-24
Section titled “0.0.9 - 2026-10-24”🚀 Features
Section titled “🚀 Features”- animation: add the animation module
- array: add toggle, toggle_by and replace_or_append
- color: add Rgba, and CSS output for Rgb and Hsl
- geometry: add Size, matrix constructors, Rect operations, fit and simplify_polyline
- id: add the id module
- random: add the random module and the random-entropy feature
- string: add compare_natural and GlobSet
📝 Documentation
Section titled “📝 Documentation”- bytes: mention the ByteReader in the README module table
✅ Tests
Section titled “✅ Tests”- security: fuzz the new parsers
👷 CI/CD
Section titled “👷 CI/CD”- CI-CD: document the equivalent and hanging mutants of the new modules
- CI-CD: make Release stop early when a tagged version has unreleased changes
- CI-CD: run the full mutation run in 12 shards
- security: run cargo-deny on all features
- security: run the fuzzers through ClusterFuzzLite
- security: add zizmor, dependency review, OSV-Scanner and a daily audit
- security: fix the zizmor findings in the workflows
0.0.8 - 2026-10-24
Section titled “0.0.8 - 2026-10-24”🚀 Features
Section titled “🚀 Features”- bytes: add ByteReader, zigzag_encode and zigzag_decode
- geometry: add Matrix, Point and Rect
- string: add match_glob
🔧 Miscellaneous
Section titled “🔧 Miscellaneous”- add the geometry commit scope
📦 Build
Section titled “📦 Build”- deps: Bump the actions group with 5 updates
- deps: Bump the actions group with 4 updates
0.0.7 - 2026-10-11
Section titled “0.0.7 - 2026-10-11”🚀 Features
Section titled “🚀 Features”- cache: add a bounded LRU cache
- env: add typed getters — bool, int, list, duration
- hex: add base64 and base32 encoding and decoding
- release: compute api-since.json and gate PRs on cargo-semver-checks
- string: add words, excerpt, escape_regex, levenshtein_distance/similarity, remove_diacritics
🐛 Bug Fixes
Section titled “🐛 Bug Fixes”- release: give cargo-cyclonedx’s override filename its own .cdx suffix
📝 Documentation
Section titled “📝 Documentation”- agents: add the replace-with-helpers4 skill for Rust
- agents: add the add-helper skill and native-alternatives.json for std
- scorecard: add the OpenSSF Best Practices badge
- security: list the supported releases as 0.0.x
- expand CONTRIBUTING.md to the level of the TypeScript one
✅ Tests
Section titled “✅ Tests”- add cargo-fuzz targets for the six untrusted-input parsers
- add benchmarks for the string, array and number additions
- use assert_eq! for the emptiness checks clippy 1.99 now rejects
📦 Build
Section titled “📦 Build”- deps: Bump the actions group with 3 updates
👷 CI/CD
Section titled “👷 CI/CD”- coherency: add a coherency script for module wiring and rustdoc
- deps: group major updates and attach a CycloneDX SBOM to releases
- release: run mutation testing and coverage on the exact tagged release
- release: attach the Sigstore bundle to the release next to the crate
- add one aggregating status check for the branch ruleset
0.0.6 - 2026-09-23
Section titled “0.0.6 - 2026-09-23”🚀 Features
Section titled “🚀 Features”- ansi: add the ansi module: strip, contains, visible_len, Style, Color
- bytes: add the bytes module: read_u16/32/64, find, xor, constant_time_eq, format_size, parse_size
- ci: add the ci module: Provider, detect, is_ci, is_pull_request, Status, overall, render_report
- color: add the color module: Rgb, Hsl, ParseColorError, mix, contrast_ratio, best_text_color
- commit: add the commit module: Commit, Bump, ParseCommitError, bump_for, is_valid, emoji_for
- date: add the date module: Date, Weekday, DateError, is_leap_year, days_in_month
- fs: add the fs module: write_atomic, read_to_string_opt, walk, normalize, is_within
- function: add the function module: compose, pipe, Memoize, retry, backoff, TokenBucket
- future: add the future module: block_on, now_or_never, yield_now, join, join_all
- license: add the license module: lookup, normalize, Expression, Category, LicenseInfo, header
- markdown: add the markdown module: escape, link, inline_code, code_block, blockquote, table, heading_slug
- secret: add the secret module: Secret, redact, mask, detect, scan, TokenKind
- set: add the set module: union_all, intersection_all, toggle, to_sorted_vec, jaccard, subsets
- url: add the url module: Url, percent_encode/decode, parse_query, build_query, join_path
- version: add the version module: Version, VersionReq, ParseVersionError, compare, satisfies
🔧 Miscellaneous
Section titled “🔧 Miscellaneous”- coherency: exclude two mutants no test can catch
- coherency: tell typos about the test data that looks like typos
♻️ Refactoring
Section titled “♻️ Refactoring”- bytes: replace hand-rolled index loops so mutants cannot hang
📝 Documentation
Section titled “📝 Documentation”- agents: list the new modules in llms.txt
- list the new modules in the README
✅ Tests
Section titled “✅ Tests”- bytes: cover multi-digit fractions and drop the redundant unit guards
- commit: cover type characters, ordinary footers and 400-year cycles
- secret: fix a property that did not hold
👷 CI/CD
Section titled “👷 CI/CD”- skip the PR mutation run when the diff is too big for the job
- cap the weekly feature powerset at depth 3
- stop the feature powerset check from growing unbounded on every PR
0.0.5 - 2026-09-22
Section titled “0.0.5 - 2026-09-22”🚀 Features
Section titled “🚀 Features”- iter: add the iter module: chunk, min_max and first_duplicate
- validate: add the validate module: is_valid_email, is_uuid and is_slug
🐛 Bug Fixes
Section titled “🐛 Bug Fixes”- validate: gate the whole spec file, not just the proptest block
- validate: don’t require string to compile validate alone
📝 Documentation
Section titled “📝 Documentation”- agents: list the iter and validate modules in llms.txt
- add the Scorecard badge and the iter/validate modules to the README
- add # Arguments and # Returns to every helper’s rustdoc
✅ Tests
Section titled “✅ Tests”- iter: exclude two equivalent mutants in min_max
0.0.4 - 2026-09-21
Section titled “0.0.4 - 2026-09-21”🚀 Features
Section titled “🚀 Features”- duration: add the duration module: parse, format and ParseDurationError
- map: add the map module: pick, omit and map_values
📝 Documentation
Section titled “📝 Documentation”- agents: list the duration and map modules in llms.txt
✅ Tests
Section titled “✅ Tests”- map: bind the expected value so the test compiles on Rust 1.85
0.0.3 - 2026-09-21
Section titled “0.0.3 - 2026-09-21”🚀 Features
Section titled “🚀 Features”- array: add key_by, duplicates and interleave
- number: add the number module: lerp, round_to, mean, median, percentage, gcd, lcm
- string: add title_case, constant_case, squish, indent and unescape_html
📝 Documentation
Section titled “📝 Documentation”- agents: list the new helpers in llms.txt
- add the Codecov badge to the README
- rewrite the README and point the homepage to helpers4.dev/rust
- add the pre-1.0 notice to the README and fix its install section
✅ Tests
Section titled “✅ Tests”- number: exclude the mutants that only hang
- number: cover lcm(0, 0)
👷 CI/CD
Section titled “👷 CI/CD”- add the OpenSSF Scorecard workflow
- notify the website when a release is published
0.0.2 - 2026-09-20
Section titled “0.0.2 - 2026-09-20”🚀 Features
Section titled “🚀 Features”- cache: add ExpiringMap
- http: add bearer_token
- net: add is_valid_hostname and HostnameError
- net: add is_public_ip
- time: add unix_now_millis
- time: add unix_now and ClockError
🐛 Bug Fixes
Section titled “🐛 Bug Fixes”- net: reject hostnames whose last label is a number
🔧 Miscellaneous
Section titled “🔧 Miscellaneous”- ignore the VS Code local history
♻️ Refactoring
Section titled “♻️ Refactoring”- hex: name the hex parameter
hexinstead ofs - net: make the CIDR prefix precondition explicit
📝 Documentation
Section titled “📝 Documentation”- net: spell out what is_public_ip guarantees and what it cannot know
- document the ExpiringMap capacity bound and the unix_now_millis saturation
✅ Tests
Section titled “✅ Tests”- cache: check that a non-empty map is not empty
- benchmark is_public_ip and ExpiringMap
👷 CI/CD
Section titled “👷 CI/CD”- exclude the equivalent ExpiringMap sweep-guard mutant
- publish with trusted publishing only
[0.0.1] - 2026-09-19
Section titled “[0.0.1] - 2026-09-19”🚀 Features
Section titled “🚀 Features”- array: add cartesian_product
- array: add group_by
- array: add count_by
- array: add equals_unordered
- array: add intersects
- array: add symmetric_difference
- array: add intersection
- array: add difference
- array: add unique_by
- array: add unique
- env: add remove
- env: add set and InvalidKeyError
- env: add get
- env: add parse
- hex: add decode_array
- hex: add decode_to_slice
- hex: add decode and DecodeError
- hex: add encode_upper
- hex: add encode
- string: add escape_html
- string: add dedent
- string: add truncate
- string: add slugify
- string: add kebab_case
- string: add snake_case
- string: add pascal_case
- string: add camel_case
- scaffold crate with string::capitalize
🔧 Miscellaneous
Section titled “🔧 Miscellaneous”- drop the redundant helpers4 scope
♻️ Refactoring
Section titled “♻️ Refactoring”- string: colocate tests, property tests and benches with each helper
- adopt a strict lint table
📝 Documentation
Section titled “📝 Documentation”- agents: describe the CI checks and the reusable workflows
- agents: note that coverage counts each generic instantiation
- release: accept an org-level token and make the environment optional
- string: drop the Since marker in favor of a computed api-since.json
- string: list the string helpers in llms.txt
✅ Tests
Section titled “✅ Tests”- array: benchmark unique, difference, group_by and equals_unordered
- hex: benchmark encode and decode
- string: benchmark the case, slug, escape and dedent helpers
📦 Build
Section titled “📦 Build”- anchor the published file patterns to the crate root
- publish only sources, benchmarks and entry-point docs
👷 CI/CD
Section titled “👷 CI/CD”- simplify the release inputs
- drop the website notification from the release workflow
- add the crates.io release workflow
- confirm suspected benchmark regressions before reporting them
- say so when a diff generates no mutant
- raise the benchmark noise threshold to avoid false regressions
- add benchmark and mutation-testing jobs
- configure cargo-mutants
- run the minimal-versions job on nightly despite rust-toolchain.toml
- split CI into reusable jobs with PR and main validation
