[HN Gopher] Show HN: ut - Rust based CLI utilities for devs and IT
       ___________________________________________________________________
        
       Show HN: ut - Rust based CLI utilities for devs and IT
        
       Hey HN,  I find myself reaching for tools like it-tools.tech or
       other random sites every now and then during development or
       debugging. So, I built a toolkit with a sane and simple CLI
       interface for most of those tools.  For the curious and lazy, at
       the moment, ut has tools for,  - Encoding: base64 (encode, decode),
       url (encode, decode)  - Hashing: md5, sha1, sha224, sha256, sha384,
       sha512  - Data Generation: uuid (v1, v3, v4, v5), token, lorem,
       random  - Text Processing: case (lower, upper, camel, title,
       constant, header, sentence, snake), pretty-print, diff  -
       Development Tools: calc, json (builder), regex, datetime  - Web &
       Network: http (status), serve, qr  - Color & Design: color
       (convert)  - Reference: unicode  For full disclosure, parts of the
       toolkit were built with Claude Code (I wanted to use this as an
       opportunity to play with it more). Feel free to open feature
       requests and/or contribute.
        
       Author : ksdme9
       Score  : 92 points
       Date   : 2025-10-05 17:36 UTC (5 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | nvader wrote:
       | Very neat.
       | 
       | Although philosophically I prefer the unix approach of "do one
       | thing and do it well", I really admire this tool. I think it
       | might be the fact that the one thing this does well is curating a
       | set of functions for a particular profile of developer. My story
       | is someone doing web focused full stack development?
       | 
       | It might be worth doing a survey of your users to see what they
       | use ut for and what areas you should focus on next.
        
       | guessmyname wrote:
       | Why is everything in the same binary? Why not multiple binaries,
       | one for each function? That way people can install only the ones
       | they need, a-la Unix tools: do only one thing and do it well.
       | 
       | I also have the exact same tools but written in Go. Rust would be
       | a nice upgrade (lower footprint) but to keep them all in the same
       | binary is a bit silly.
        
         | simonw wrote:
         | The single binary thing reminds me of BusyBox -
         | https://en.wikipedia.org/wiki/BusyBox
         | 
         | Sometimes it can be quite convenient to grab a single binary
         | that does a whole bunch of useful stuff in one package.
        
         | JasonSage wrote:
         | To me the biggest upside would be terminal completion and
         | discovery via help text. Sure you can always bounce to a search
         | engine and bounce back, but I can imagine cases where you want
         | a toolkit in front of you that you know how to use when your
         | focus is not on memorizing commands.
         | 
         | This could be great for students without sysadmins needing to
         | lodge complaints.
        
         | articulatepang wrote:
         | I don't think it's that silly. BusyBox packages a bunch of
         | utilities in a single binary. It amortizes fixed costs: a
         | single binary takes less space than 30 binaries that each do
         | one tiny thing.
         | 
         | These are small bits of code, and the functionality is
         | interrelated. The entire thing feels like a calculator, or awk,
         | and seems reasonable to put in one binary.
         | 
         | The Unix philosophy doesn't actually say anything about whether
         | different tools should live in the same binary. It's about
         | having orthogonal bits of functionality and using text as the
         | universal interface. BusyBox is just as Unix as having all the
         | tools be different binaries.
        
         | teiferer wrote:
         | Also, lots of the ut functions already exist as decades old
         | unix tools.
        
           | geraldcombs wrote:
           | Those tools either don't ship with, or exist in wildly
           | different forms on Windows. It's particularly bad for curl,
           | which might be the real curl.se curl or Microsoft's
           | confusingly-named Powershell alias.
           | 
           | I could definitely see using this in a cross-platform build
           | or installation environment.
        
             | rauli_ wrote:
             | Windows and *nix systems are often used for very different
             | things so I don't understand why there would be need for
             | some kind of universal superbinary. And thanks to WSL you
             | can already get GNU coretools running in Windows anyways.
        
               | geraldcombs wrote:
               | I lead a large-ish open source software project. We have
               | developers that need to build on Linux, macOS, and
               | Windows. It's useful to be able to get everyone
               | bootstrapped with as few steps as possible and with as
               | few dependencies as possible. For our uses CMake works
               | well as a universal superbinary, but I'm always on the
               | lookout for tools that can reduce developer friction.
        
         | dgacmu wrote:
         | Amusingly, if you look historically, it's also a traditional
         | approach to reduce total binary size - a bunch of small
         | utilities were all Sim links to a single binary, which
         | conditioned on argv[0] to figure out what to do.
        
           | zvr wrote:
           | In The Old Days, it was hard links, no symlinks.
        
         | thayne wrote:
         | Probably for the same reasons that uutils/coreutils uses a
         | single binary. Specifically:
         | 
         | - it reduces the total install size, since common code,
         | including the standard library, is only included once, rather
         | than copied for each executable
         | 
         | - it makes installation easier on some platforms, since you
         | just have to install a single executable, instead of a bunch of
         | executables
        
       | simonw wrote:
       | Slightly odd suggestion: package it up as both a Python and an
       | NPM module - both just thin wrappers around the combined binary -
       | and then people within those ecosystems will be able to run:
       | uvx ut md5 ...
       | 
       | Or:                 npx ut md5 ...
       | 
       | To execute it without having to figure out cargo or how to add a
       | Rust binary to their path.
       | 
       | I've seen a few tools do things like this recently, it's a pretty
       | interesting pattern. I believe there's tooling in the Python/Rust
       | world that makes compiling the different binary wheels relatively
       | easy using GitHub Actions.
        
         | mirashii wrote:
         | cargo-dist will get you the npm one for free. They've got pypi
         | support planned as well but don't have it yet, though they can
         | also generate standard curl | sh installers and all too.
        
           | ksdme9 wrote:
           | This looks cool, thanks!
        
         | larusso wrote:
         | Interesting perspective. I mean the issue exists with any
         | ecosystem. See nix who has to wrap down to the lib level
         | everything under the sun to make their package system usable
         | for all kinds of use cases. But they need to do this because of
         | the deterministic nature of the system. Brew on the other hand
         | discouraged packaging tools that are available from other
         | package managers. Don't know if this is still the case. I feel
         | a bit uncertain about this. It would mean that a tool should
         | not only strive to be included in all major repositories of
         | Linux distributions along with winget, brew and Mac ports etc
         | (which is a tough ask). Now they should also publish to npm,
         | pypy, ruby gems etc as well? I feel something is taking a wrong
         | turn here.
        
         | rsyring wrote:
         | If you know you will use it often, uv has `uv tool install
         | ...`. So, after the first `uv tool install ut` you can just run
         | `ut md5 ...` or whatever. Don't need to keep using uvx.
         | 
         | uv also has a couple commands I throw in a systemd unit[1] to
         | keep these tools updated:                 uv self update
         | uv tool upgrade --all
         | 
         | 1: https://github.com/level12/coppy/blob/main/systemd/mise-
         | uv-u...
        
       | rohan_ wrote:
       | is this stuff not pretty easy to do with python?
       | 
       | ``` python -c "import base64; print(base64.b64encode('$INPUT_STRI
       | NG'.encode('utf-8')).decode('utf-8'))" ```
        
         | landr0id wrote:
         | I love typing python commands that are 10x longer than a
         | shorthand.
         | 
         | Yes it's easy to set up an alias or shell command or whatever,
         | but that's besides the point :p
        
         | ksdme9 wrote:
         | You don't even have to go that far, `base64` is a coreutil (htt
         | ps://github.com/coreutils/coreutils/blob/ebfd80083b4fe4ae...).
         | 
         | The point of ut is not to replace or invent new tooling. It is
         | meant to be a set of tools that are simple, self exploratory
         | and work out of the box with sane defaults. So, essentially,
         | something that you don't have to remember syntax for or go
         | through help/man pages everytime you want to use it.
        
           | westurner wrote:
           | uutils/coreutils has a `base64` in Rust which just gained
           | better performance due to the base64-simd crate for SIMD:
           | https://github.com/uutils/coreutils/pull/8578
        
             | collinfunk wrote:
             | Note that uutils does not work if the file does not fit
             | into memory.
             | 
             | With GNU coreutils:                  $ base64 /dev/zero |
             | head -c 1 | wc -c        1
             | 
             | With uutils doing the same would exhaust your systems
             | memory until either it freezes or oomd kills the process.
        
         | baq wrote:
         | You can send a heredoc into as in a single line of shell, too.
        
       | lukevp wrote:
       | How about uuidv7? That's catching on, as it's got improved
       | sortability / clustering behavior in DBs
        
       | Narushia wrote:
       | Would be cool if this also had a `retry` sub-command, for running
       | any commands with an exponential backoff retry logic. Similar to
       | these Rust tools:
       | 
       | https://github.com/demoray/retry-cli
       | 
       | https://github.com/rye/eb
        
       | xpe wrote:
       | [delayed]
        
       ___________________________________________________________________
       (page generated 2025-10-05 23:00 UTC)