# tools
[](https://builds.sr.ht/~mtmn/tools)
Various tools I have been using throughout the years.
| tool | description |
|---|---|
| [bandeno](bandeno/) | Bandcamp RSS feed proxy |
| [diggah](diggah/) | find files modified within a time range, locally or over SSH |
| [dam](dam/) | line-file syncer with rsync and coloured diff |
| [hue](hue/) | Ruby library and CLI for Philips Hue |
| [lastfm_rs](lastfm_rs/) | Last.fm scrobble exporter to CSV |
| [lazymaster](lazymaster/) | 2-pass audio loudness normalization via ffmpeg |
| [mpd](mpd/) | MPD utility tools |
| [nts](nts/) | NTS show tracklist fetcher |
| [pmn](pmn/) | password selection utility for pass (Wayland, X11, macOS) |
| [pracomer](pracomer/) | Pomodoro timer |
| [shuffle](shuffle/) | random album picker for MPD |
| [speediness](speediness/) | network speed test |
| [tempfox](tempfox/) | Firefox user.js preference overrides |
| [wrd](wrd/) | full-text search and reader for an offline web archive |
| [plants](plants/) | bluetooth battery monitoring for linux |
| [reflink-snap](reflink-snap/) | reflink (copy-on-write) snapshot manager for XFS |
| [kundali](kundali/) | scans track metadata and builds a sequence around an anchor track |
| [sursum](sursum/) | backup helper for git, tarsnap, plakar and rclone |
## Toolchains
| language | version | pinned by |
|---|---|---|
| Rust | nightly | `rust-toolchain.toml` (rustup) |
| Zig | 0.16.0 | `build.zig.zon` (`minimum_zig_version`) |
| Python | 3.14 | system |
| Go | 1.26 | `go.mod` |
| Ruby | >= 3.0 | `hue.gemspec` (`required_ruby_version`). reflink-snap uses stdlib only |
| Janet | 1.41.2 | system |
## Building
Install [knit](https://github.com/zyedidia/knit)
and the native toolchains. Knit orchestrates `cargo`, `zig build`, `go build`,
`cc`, and a shared Python virtualenv. All common tasks are available via
`just`:
```sh
just all # build every tool into bin/
just build <target> # build a specific tool, e.g. just build lazymaster
just run <target> # build and run a tool
```
## Deploying
Knit builds and copies binaries to `$HOME/.local/bin`:
```sh
knit deploy/<target>
knit deploy/all # build and install every tool
```
The equivalent convenience wrapper is `just deploy <target>`.
`knit deploy/mpd` (or `just deploy mpd`) installs the configured `mpd_*`
binaries. Deployed Python tools
(diggah, lazymaster, nts, shuffle) are thin shims that run out of this
repository's `.venv`, and deployed Ruby tools (hue, reflink-snap) run
straight from the checkout. Both need the checkout to stay in place.
## Development
```sh
just test # run the Rust, Zig, Go, and MPD test suites
just clippy # run Clippy over the Cargo workspace
just rustfmt # format the Cargo workspace with rustfmt
```
rust-analyzer works out of the box against the Cargo workspace.
## Other
```sh
just cargo-lockfile # update Cargo.lock
just pip-update # update requirements.txt (Python lockfile)
just clean # remove build artifacts and caches
```