Most active commenters
  • paradox460(7)
  • stavros(5)
  • nchmy(4)

←back to thread

Jujutsu for everyone

(jj-for-everyone.github.io)
434 points Bogdanp | 29 comments | | HN request time: 0.924s | source | bottom
1. paradox460 ◴[] No.45084388[source]
I've been enjoying JJ recently, after giving it another try. I'd tried it when it was new, and the sharp corners were still a bit too sharp for my liking.

JJ seems to be part of a new "era" of tooling that's just really good. I mused about this a bit in a blog post:

https://pdx.su/blog/2025-08-13-the-quiet-software-tooling-re...

replies(5): >>45084426 #>>45084764 #>>45085176 #>>45085669 #>>45101982 #
2. nchmy ◴[] No.45084426[source]
im glad to see you also use and love mise.

Mise, jj (and its phenomenal jjui TUI, which I see you mentioned there), and uv for python are nothing short of revolutionary, as far as I'm concerned. Just beautiful tools.

replies(2): >>45084516 #>>45088240 #
3. paradox460 ◴[] No.45084516[source]
I probably should mention things like atuin and fish, which bring, if not joy, absence of frustration when using my computer
replies(1): >>45085498 #
4. sunshowers ◴[] No.45084764[source]
Nice article! I do think standards for tooling have gone up a lot in the last few years. Rust is certainly a part of it.
5. nchmy ◴[] No.45085498{3}[source]
Atuin is great too! I recently switched to it from fzf.

zoxide is similar and beautiful as well. I use both all day.

replies(1): >>45085805 #
6. ItsHarper ◴[] No.45085669[source]
I'd definitely include nushell in this
replies(2): >>45089449 #>>45097772 #
7. paradox460 ◴[] No.45085805{4}[source]
I love zoxoxe, and even have it plugged into my Alfred, with minor tweaks
8. paradox460 ◴[] No.45085829[source]
While bun is extremely impressive, I'd not say it leads the movement more than anything else. For me then biggest sea change in developer QoL has to be Mise, followed by JJ. Everything else is more niche, but I use mise and JJ in every project.

Don't get me wrong, I really like bun. I run my blogs asset pipeline on bun, and run my home automation on it as well, but at the end of the day it's a js runtime, competing with the also excellent deno

replies(1): >>45086011 #
9. shepherdjerred ◴[] No.45085871[source]
Bun is great, but that's overselling it
10. 8n4vidtmkvmk ◴[] No.45086011{3}[source]
It's more than a runtime. It's a test runner, package manager and build tool and shell interpreter. The first 2 in particular are big for me. Build tool needs work.
11. stavros ◴[] No.45088240[source]
I never managed to get into mise. I tried, but I think its documentation wasn't good enough for me to be able to configure the things I wanted, and, with uv, I barely ever see a need to use it...

Does anyone have a use case where they use mise with Python? What do you use it for?

replies(2): >>45089209 #>>45090259 #
12. KingMob ◴[] No.45089209{3}[source]
uv is amazing, but mise is good if you need non-python tools too (e.g., bringing in prettier to format your HTML/Js/templates, adding Js tools, etc.)

It's also not either/or. mise can defer to uv for setting up all the python stuff.

The mise docs are pretty good these days, I think. Task dependencies are still a little rough, though.

replies(2): >>45090517 #>>45091672 #
13. GCUMstlyHarmls ◴[] No.45089449[source]
I used zsh for gosh, over 15 years probably now. I swapped to fish at the start of this year on a bit of a whim (new year, new computer, new ~~me~~ shell).

It's pretty good in a "gets out of the way" kind of way, and the `abbr` feature is preferred over aliases but it has some annoying quirks like no dictionary type, the inability to "background blocks of code", requiring spawning a subshell + string which has other issues and in a way it feels sort of stuck between being new and friendly but still carrying over enough baggage to be annoying in other ways.

I tried Nushell a week or so ago and after getting my head around it (and $it and $in, haha) I think it feels like the future. It's not quite there ergonomically in some ways eg: reedline can't edit the current command line, but it's quite close.

What really sold me on it was when I

- Had a flat text file of "url\nartist\ntitle"

- Had to download these urls and insert the artist & title into a database

and I realised I could do it all with Nu primitives,

    open new-landings.txt
    | lines
    | each { $in | str trim}
    | chunks 3
    | each {{title: $in.0, artist: $in.1, url: $in.2}}
    | enumerate
    | par-each {
      http get ($in.item.url | str replace large medium) | save $"landing-($in.index + 101).jpg"
      # also insert artist title into database
      run-app ... etc
    }
Now, could you do the same thing with zsh/bash/sh? Yep. Some kind of awk/sed thing with xargs I would guess. But I'd have to look it up. With Nu, after a few hours of playing with it I already "knew" how to do it. That felt really powerful.

For reference, I also tried Murex and Elvish. Elvish doesn't support ctrl-z, so its disqualified right there though I like the syntax. Murex seemed fine but Nu was bigger with wider support. I think I saw Nu had pattern matching and it immediately got a big desirability bump.

I remember seeing another comment, wishing we had STDIN, STDOUT, STDERR and STDDATA, maybe one day.

replies(2): >>45090913 #>>45097085 #
14. digianarchist ◴[] No.45090259{3}[source]
If you use asdf mise is worth a look. I use uv directly.
15. stavros ◴[] No.45090517{4}[source]
Ah interesting, I have needed node and it's been a bit of a pain, maybe mise can set it up. I'll try it again, thanks!
replies(1): >>45091684 #
16. hiq ◴[] No.45090913{3}[source]
> I'd have to look it up.

I suspect most of the current coding assistants would have been able to do that for you in most languages, including something more portable and easier to maintain like Python.

17. nchmy ◴[] No.45091672{4}[source]
Yeah mise and uv are completely complementary - there's no overlap, whatsoever, between them...

In fact, if uv is installed (which can be done via mise), mise uses it for python related stuff.

I use mise to install as much as I can now - different language runtimes, tools/utilities etc. I even discovered yesterday that you can use the ubi backend to install directly from Git repos that aren't yet supported by the other registries.

replies(1): >>45097462 #
18. nchmy ◴[] No.45091684{5}[source]
Should be as simple as mise use node.

Or mise use -g node@version (the -g installs it globally)

Same for anything else - deno, bun, golang tooling etc

replies(2): >>45091707 #>>45095316 #
19. stavros ◴[] No.45091707{6}[source]
Oh, this reminds me of a big problem I had: I never know the names of the packages, is there a registry somewhere? I never managed to find one.
replies(2): >>45095308 #>>45099216 #
20. paradox460 ◴[] No.45095308{7}[source]
mise search <package> will find matches across all the baked in registries, and if its not there you can use ubi, aqua, or any github, gitlab, or http path to get it
replies(1): >>45096114 #
21. paradox460 ◴[] No.45095316{6}[source]
Don't even need the @version anymore, mise use -g node will fetch the latest and install it
22. stavros ◴[] No.45096114{8}[source]
Thank you! I never knew this.
23. foobarqux ◴[] No.45097085{3}[source]
Mostly a note for myself: something like this would probably work (not tested):

<new-landings.txt parallel --pipe --recend '\n\n' --colsep '\n' --plus curl '{1/large/medium}' -o '{#} + 101'.jpg

Adding multiple commands should be in a script to avoid quoting issues.

replies(1): >>45108378 #
24. paradox460 ◴[] No.45097462{5}[source]
Mise recently gained support for arbitrary sources too. Things like GitHub, gitlab, or any http URL (with templating). It's got some overlap with ubi, but has a better time with packages that use multiple files, as ubi chokes on anything more than a single binary
25. yencabulator ◴[] No.45097772[source]
Nushell mishandles errors. Pressing control-C leads to impossible execution paths. It parses command-line arguments in extremely broken ways.

These bugs have been open for years with no progress.

Nushell had interesting ideas but frankly it's a dead project now. Something with such a core of incorrect behavior just isn't workable, and nobody's even trying to fix it. Don't build castles in swampland.

https://github.com/nushell/nushell/issues/6617

https://github.com/nushell/nushell/issues/8828

https://github.com/nushell/nushell/issues/9939

26. KingMob ◴[] No.45099216{7}[source]
Yes, you can browse them at https://mise.jdx.dev/registry.html

Also, it's possible, if trickier, to install from arbitrary git repos.

Finally, if you type `mise use` with no package name, it'll present a filterable list. Start typing what you think you want, and it'll quickly filter to only things match.

replies(1): >>45100263 #
27. stavros ◴[] No.45100263{8}[source]
Thank you!
28. syklemil ◴[] No.45101982[source]
re: `fd` I also find it a lot better to do something like `fd -e py -X ruff format` than `find -name '*.py' -exec ruff format {} +`.

Part of it is that `find` seems to come from before we standardized on `--foo --bar` having an equivalent in `-fb`, and the nagging about some flags being positional, but also just the general syntax of their `-exec`, which _requires_ the `{}` to be present, but it can only ever be in one position for the `+` variant.

My one nag about `fd` is that it has two optional positional arguments, so the way I use it I sometimes wind up with `fd -e $ext "" /path/to/search`. (`fd -e $ext --search-path /path/to/search` might be a clearer alternative I should habituate myself to.)

IME positional arguments are always less ergonomic than flags/options, _especially_ if there are more than one of them and they're not mandatory.

But they're still better than the `find` syntax.

29. foobarqux ◴[] No.45108378{4}[source]
This should use --delimiter and not (--recend --pipe). Tested to work.

<new-landings.txt parallel --delimiter '\n\n' --colsep '\n' --plus curl '{1/large/medium}' -o '{#} + 101'.jpg