
bttf (BurntSushi/bttf, Rust, MIT, v0.1.4) is a datetime Swiss army knife for the terminal by the author of ripgrep and fd. Its tag/untag mechanic rewrites timestamps in arbitrary log streams in-place — a pipeline capability absent from date, dateutils, and similar tools. Landed on HN with 175 points and 98 comments on May 28.
awk or paste the thing into Python, pull your hair out over DST edge cases, and accept that 2024-03-10T02:30:00Z will quietly become something wrong after the clocks change.bttf was built for — and the solution it provides is more composable than anything date, dateutils, or a quick python -c can give you.biff is already a classic Unix mail-notification command dating back to the 1980s.# Option 1: compile from crates.io
cargo install bttf
# Option 2: prebuilt binary (macOS, Linux, Windows)
# Download from https://github.com/BurntSushi/bttf/releases
# v0.1.4 ships 28 binary assets across architectures
# Option 3: Arch Linux AUR
yay -S bttfchmod +x, put it in your PATH.cargo install bttf (no flags), natural language month names won't render — you'll see M05 instead of May. 5 The prebuilt binaries include locale support by default. If compiling, add --features locale and set BTTF_LOCALE in your shell:cargo install bttf --features locale
export BTTF_LOCALE=en-US # or your locale| Subcommand | What it does |
|---|---|
bttf time fmt | Format timestamps (strftime, RFC 3339, RFC 9557, and more) |
bttf time in | Convert timestamps between timezones (full IANA database) |
bttf time add / sub | Calendar and absolute duration arithmetic |
bttf time seq | Generate date/time sequences (RFC 5545 recurrence rules) |
bttf time sort | Sort a stream of timestamps |
bttf tag / untag | Wrap/unwrap datetime strings in arbitrary text as JSON lines |
bttf dur | Parse and round durations |
time seq command already has a fan. One HN commenter noted that bttf time seq monthly -w 2-tue would have replaced roughly 40 lines of bash they'd written for a newsletter scheduling script. 7bttf tag and bttf untag are the feature that sets bttf apart from date and dateutils. Here's the problem they solve:bttf tag lines access.log \
| bttf time in system \
| bttf time fmt -f '%c' \
| bttf untag -sbttf tag scans each line, wraps every datetime string it recognizes as a JSON object, and passes the stream forward. bttf time in system converts each wrapped timestamp to the local timezone. bttf time fmt reformats it. bttf untag stitches the converted timestamps back into the original lines and prints clean text. The file's structure is preserved; only the timestamps change.dateutils nor GNU date has an equivalent in their comparison docs. 8tag/untag mechanic in particular doesn't have an obvious LLM equivalent that keeps your log lines intact.brew install to just work. Watch the repo for a community-submitted formula.cargo install bttf without --features locale, natural language output will be ugly. The prebuilt binaries sidestep this, but it's a sharp edge for source builds.cargo install today. The tag/untag pipeline fills a gap that dateutils and GNU date explicitly don't cover — per the project's own comparison docs. The time seq recurrence engine replaces a category of one-off bash scripts. The type-correct DST handling is the kind of thing you appreciate only after it saves you from a subtle bug at 2 AM.bttf time now → current timestamp in RFC 3339. bttf time in America/New_York → pipe a timestamp and get it in NYC time. Start there.github.com
news.ycombinator.com
github.com
hacker-news.firebaseio.com
hacker-news.firebaseio.com
hacker-news.firebaseio.com
hacker-news.firebaseio.com
github.com
hacker-news.firebaseio.com
hacker-news.firebaseio.com
hacker-news.firebaseio.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.