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.

0.2.0 - 2026-06-02

Added

  • delimit/2 — thousands separator (1_234_567"1,234,567"), with :separator and :precision options. Integer-built, never scientific notation.
  • truncate/3 — string truncation with an ellipsis (:omission) and an optional word boundary (:break :char | :word). Grapheme-aware.
  • list_join/2 :max option — collapse long lists into a count (max: 2"Alice, Bob and 3 others"), with :other / :others nouns.

Changed

  • relative_time/2,3 now supports a :format option (:short"2d ago", "in 3h", "now") and extends past days to weeks, months and years. Months and years are coarse fixed-width approximations (30 / 365 days) for display only. Default (:long) output is unchanged for all previously supported ranges.

0.1.1 - 2026-05-31

Fixed

  • bytes/2 and number/2 now carry up to the next unit when rounding would otherwise produce a mantissa equal to the base (1000 for decimal/SI, 1024 for binary/IEC) — e.g. 999_950"1.0 MB" instead of "1000.0 KB", 999_999"1.0M" instead of "1000.0K". Binary units correctly keep mantissas in the 10001023 range (e.g. 1023 GiB stays GiB, since it is still under 1 TiB).

0.1.0 - 2026-05-31

Added

  • bytes/2 — human-readable file sizes with decimal (SI) and binary (IEC) units.
  • duration/2 — durations in seconds formatted as words (days down to seconds), with :units and :format options.
  • relative_time/2,3DateTime formatted relative to now or a reference time ("2 days ago", "in 3 hours", "just now").
  • number/2 — large numbers with K/M/B/T suffixes.
  • ordinal/1 — English ordinals, correctly handling the 11/12/13 exceptions.
  • list_join/2 — human-readable list enumeration with optional Oxford comma and custom conjunction.
  • English-only, zero-config, scientific-notation-free formatting throughout.