On Tools for Computer
what i use with joy

Inspired by jyn’s tools and similar posts, I thought I might write a bit about what tools I use and enjoy using, for working with my computer. This is the first half of a pair of posts – I talk about what sorts of tools I wish existed (among other things) over in On Technology (to be completed).
There is something about tools I find appealing. I like ’em. The weight of a nice pocketknife, the feel of a smooth pen,1 the heft of a favourite wrench… tools connect us to our crafts. And what are we without our crafts?
And software consists of tools, too. There are some tools that I just enjoy using: whether because they’ve been lovingly crafted to perfection over the years by a solitary artisan, or they’re industrial-strength software bent on doing a thing and doing it well, or they fill a niche I happen to have, or – just because I find them neat. I like most of the software I use, and I want others to like their software, too. So I might as well collect and share this with others.
table of contents
- 1. navigating: the terminal, the command line, and tools around such
- 2. browsing: the browser and browser plugins
- 3. typing: the keyboard and unicode
- 4. editing: text/code editors and integrated development environments
- 5. writing: keeping track of and manipulating writing, of mine and others
- 6. debugging: @><@@!^%#><~#%!!!
- 7. devops: server administration
- 8. multimedia: this section’s pretty boring
- 9. languages: ways to talk with computers
- 10. what i’m eyeing: software i’m interested in
1. navigating
I use the terminal. The terminal is a wonderful tool – a direct line from my hands into the heart of my computer, to do whatever I so wish. It is a universal interface in a way that scarcely anything else is. Gosh, it’s hard to describe what exactly makes it so great.
I use kitty as my terminal emulator of choice. It’s the best: super fast, cross-platform, crazy good font support, is THE point of origin of all the modern widely-adopted terminal protocols (keyboard handling, graphics). I have Ctrl+Enter set up to spawn a new shell in ~ and Ctrl+Shift+Enter set up to spawn a new shell in the working directory of my current shell / text editor context. I can turn the scrollback into a searchable buffer, bounce up and down lines/commands with the arrow and page keys… it’s just nice. There’s a bunch of useful programs behind the kitten prefix, too, including a convenient kitten ssh wrapper to mush together connections and copy terminfo across SSH sessions.
I use the Fish shell, configured to behave like Bash. The autosuggestion preview are disabled.2 The prompt is set up to mirror my old Bash prompt, and some other visual changes are set for familiarity (no underlines on valid paths).
I’ve only been using Fish for a couple of days at the time of writing. I used to use Bash and had for years – while it was jank, to be sure, it was ubiquitous and never had all too much bad behavior.3 But I realized recently that given the terminal + shell are the single pair of programs I spend the most time in: it is absolutely worth sacrificing portability for a better user experience. I tried out a couple of other shells with this in mind: but the brittle nature of Nushell didn’t mesh with me,4 the shiny half-improvements of Zsh weren’t compelling to me, and I’m not enough of a Python-head to get into Xonsh. This left Fish, and luckily enough, I’ve found myself quite liking it – the Fish language is somehow more of a scripting language than Bash.5 Again, it’s just… nice.
my config.fish
# If not running interactively, don't do anything
if status is-interactive
# Disable the greeting prompt
set -g fish_greeting
# Disable autosuggestions
set -g fish_autosuggestion_enabled 0
# Disable underlines on valid paths
set -g fish_color_valid_path
# Consider prefixes when searching history with up/down to match verbatium
# i.e. don't fuzzy match
# These are bound to a modified up-or-search that replaces history-search-backwards
# with history-prefix-search-backwards (and the same for down).
bind \e\[A up-or-prefix-search
bind \e\[B down-or-prefix-search
# Some abbreviations. There's more.
abbr -a cp cp -i
abbr -a df df -h
abbr -a mv mv -i
abbr -a q exit
abbr -a l ls
abbr -a ll ls -lv
# These aliases I don't want to expand visually, so they're functions.
function ls --wraps=lsd; lsd $argv; end
function rm --wraps=trash-put; trash-put $argv; end
function fd; command fd --no-ignore-vcs $argv; end
function cs --wraps=cd; cd $argv; ls; end
function ping; prettyping --nolegend $argv; end;
function genpass; openssl rand -base64 $argv; end
# I also have some other functions bound in the separate functions directory.
function pdfify --description "Generate PDF files from text"
set -l arg $argv[1]
set -l name path basename --no-extension $arg
set -l ext path extension $arg
if test "$ext" = "md" # note: switch to w/ more files
pandoc --pdf-engine=typst $arg -o "$name.pdf" \
-f markdown+lists_without_preceding_blankline-blank_before_header-blank_before_blockquote
else
pandoc --pdf-engine=typst $arg -o "$name.pdf"
end
end
endlots of words about command line tools
I use several other foundationally important utilities. cd, ls (bound to l), cp (bound to cp -i), mv (bound to mv -i), rm (bound to trash-put), q (bound to exit), cat, less. man gives me documentation and tldr gives me runnable examples. rg searches file contents. fd searches file names. sad (and my wip fork sod) dynamically replace file text. difft diffs files structurally. open opens files in a new window + process. fzf fuzzy-finds whatever and can serve as a simple interactive interface. (I have pacquery bound to pacman -Qq | fzf --preview "pacman -Qil {}" to give me a fuzzy-searchable list of packages with information previews on the right – super useful. You can use fzf with anything.) curl and yt-dlp and gallery-dl interact with the web.
I do not currently use a terminal TUI file manager but do wish I did so. I like nnn, except its preview-mode is a total hack. I love the ux of ranger, but it is too slow. Both of these do not have typeahead by default though (instead having vim-like bindings). I want a 1) two-column file manager that 2) lets me zip around with the full power of my keyboard and 3) supports easily bulk renaming files. At some point I might adapt nnn into this. It seems like a very good starting point.
I use git very frequently. I’ve found that adding abbreviations6 to remove the git prefix on commands significantly lowers friction and makes git way easier to use. Alongside the standard commands (commit, stage, push, pull, status, log, branch, switch) I also have git-smash, git-absorb, git-revise, git-toolbelt, and git-branchless installed for additional subcommands – though the only one I really use is spinoff (copies the last few local commits to a new branch and resets main to origin, magit-style).
I have since converted to jujutsu, a local-first Git-compatible version control system. It is very good. I did not realize just what I was missing out on. My thoughts, and some work-in-progress notes, are available on my wiki.
I should probably also learn how to use a terminal multiplexer. I’ve heard both tmux and zellij are good. Haven’t used them, though. I just cope and seethe any time I need to do devops.
2. browsing
I use LibreWolf with a number of plugins.
I switched from Firefox to Librewolf when Firefox updated and put AI in my sidebar. (Though, it did also add a sidebar.) At that moment I decided I didn’t want Mozilla to be in control of my browser, and so I asked around about the robustness of Firefox forks (many have sprung forth, been bought out by advertisers, and died) and got recommendations saying the LibreWolf project was of similar professionalism to Ungoogled Chromium (which I previously used and enjoyed). So I switched to it, and with few minor hiccups (captive portals are broken, grr).
some thoughts on browsers themselves
I am sympathetic to arguments about there being no “good browsers”. I too consider much of the modern web worthless and bloated, designed to maximize Clicks and Engagements and other worthless metrics that make somebody’s bottom line go up, and I am also sympathetic to people who make browsers and protocols that refuse to engage with any of this, on principle.
But I am fundamentally, at my core, an optimist – I am appreciative of existing social structures. I am appreciative of existing media. I am appreciative of the modern web! There has never been such a massive wellspring of creativity in such a short period of time. And if we have to harbour a little protocol jank, a lot of media slop – so be it. That is the price to pay. I hone myself to ignore and look past what I don’t want to see, to appreciate what is there. Cyberspace is the endless rooms of Babel. If you don’t focus on what is important, you will be lost.
… Anyway. To this extent I’m a really big fan of the modern web, from protocols (<333 CSS esp) to hypermedia to yes, browsers. The entrenched triumvirate of browsers may be behemoths, but – I seriously appreciate the engineering that goes into these, both from a technical standpoint (each of Firefox/Chrome/Safari are seriously impressive in their own ways) to a UI/UX standpoint. (yes, things could be more how I prefer. but these are used by the whole world. it’s a minor miracle they’re as minimalist and usable as they are.)
I should also note that as of currently (2025) there are a number of independent browsers and engines developed. On the engine side, since that’s harder, there’s Blink/Gecko/WebKit, but also Servo, Ladybird, Netsurf… well, that’s it, but still – two competitive independent engines and a third less-competitive-but-still-cool one? Damn.
lots of words about browser plugins
The extensions I use deserve naming, because they are as much a part of the browser as anything else. I cannot use a web browser without uBlock Origin (shipped w/ Librewolf by default). I have the “advanced mode” turned on, which lets me block JavaScript scripts in a fairly fine-grained fashion globally or per-site, which I’ve found useful (news sites). Ad blockers are great. As we no longer can rely on good netiquette from websites, one must enforce it.
In a similar boat of necessity is Violentmonkey (c.f. Greasemonkey, Tampermonkey) – a userscript manager, which lets you run custom snippets of JavaScript on any website. This is indispensible. If you don’t have a userscript manager, you’re missing out. I’ve got userscripts for redirecting websites (Reddit to Old Reddit, mobile Wikipedia to desktop Wikipedia, Wikia to BreezeWiki, etc), injecting custom CSS (incl. a very pretty theme I wrote for Hacker News7), a script to dynamically replace the audio sources of a webcomic with higher-quality ones – the possibilites are endless.
I wish userscripts were more widely used. They’re wonderful. They let you shape your own web experience.
I use Fraidycat as an in-browser RSS reader. I cannot say enough good things about Fraidycat. Watch the video embedded on their homepage. Listen to how it makes you feel. Fraidycat is an RSS feed reader to pull back the piles of strewn-about litter throughout the modern web and reveal that, the old web is around as much as it always has been beneath.8
I have a Copy RSS Button extension installed, to add a visual indicator when on pages with an RSS feed. It uses global permission scope (but kinda has to), but I trust the current source code and have auto-updates turned off.
I use the Imagus extension to immediately expand images on hover. I stole this from a friend. It’s pretty configurable, I messed around with it a little bit before finding a configuration I liked. It’s an old and abandoned extension, yet was designed to last – you can find new filter lists on Russian BBS forums. This is another one I have auto-updates turned off on.
The Progressive Web Apps extension allows installing websites to your computer as standalone apps. It still uses Firefox under the hood, of course – but does so in a separate profile, in its own window frame, away from anything else. There are a couple of memory-intensive sites (webapps, really) that I visit regularly that I’d previously accidentally open several copies of. Installing them as PWAs helped cut down that loads and saved me some much-needed RAM.
The SponsorBlock extension I installed somewhat later on than I should have. Because, aren’t video sponsorships like, fine? They’re even little funny skits sometimes. No. Sponsorships are ads. You’re watching ads. If you’re blocking ads, you should be blocking sponsors. Support the creators you enjoy directly instead (if you can and want to).
Tab Session Manager I’ve only started using recently. It’s interesting. I need to use it more before developing thoughts on it, but it has the potential to change the way I use the browser.
There’s a couple of other extensions I use from time to time.
- Auto Tab Discard is an extension that is now outdated with recent Firefox versions but used to seriously save my RAM.
- Ruffle brings back Flash embeds in a safe, sandboxed fashion. I don’t actually get any use out of this, which saddens me.
- Zotero Connector integrates with the Zotero desktop app to let you save webpages as references. This in theory is very cool – yet, I’ve not gotten any use out of it in practice.
- Dark Reader is a nice extension that prescribes dark/light themes onto sites. I’ve not found myself wanting it as of late, and recently disabled it.
browser wishes
I find Librewolf/Firefox to be a pretty usable experience with my little addons. Of course, I wish some of them didn’t have to be addons – imagine if RSS was still known by the masses! – but this is ultimately a silly superficial/idealistic complaint and not worth moping about. Yet there are some things about the browser I wish were better. Some of these could probably be done by extensions. Some of them, probably not.
- I wish keyboard navigation was more comprehensive. And rebindable.
- I wish Ctrl+F had a regex search mode. I wish extensions were able to add this.
- I wish the browser devtools could intercept and mitm/proxy requests, Burp Suite style.
- I wish history was better. This is something I probably could fix. Right now, I think I lose history after X months, which I really don’t want to have happen… and I also dislike the behaviour of only storing the most recent visit to a site. While privacy around this sort of thing always concerns me, I do want to make the tradeoff
- I wish I could save a site offline at the click of a button.
I wish this was integrated into the normal UX of the browser, so I’d actually do it. - I wish bookmarks were totally overhauled. I wish when bookmarking a site, my browser would save it locally. I wish I could have full-text search throughout my bookmarks. I wish the bookmarks manager went all-in on tags (which are IMO a strictly better method of categorization than folders, for webpages here).
- I wish I could do all these things. Hack on the browser codebase, hack together some patches, easily maintain them with updates. It’s that “easily” that I’m concerned about. Maybe I should bite the bullet and try it, though.
- I wish the browser was an interactive development environment for the making of pages.
3. typing
My layout is pretty messed up. There are several things wrong with the way I use a keyboard.
crimes
First, I use QWERTY (broadly). I say broadly because while I use QWERTY, I use QWERTY with a number of custom keybindings. I’ve swapped the following keys, for various reasons:
- Escape and CapsLock are swapped. This is a straightforward improvement I think everyone should do. Even if you don’t use a modal editor (I don’t!) Escape is just used for so much more than you think… and CapsLock is used like, literally never. Why then, does it share a place + size of honour with the likes of Enter or Shift? It doesn’t deserve it. Not one bit. Mapping Escape here also just has nice symmetry with Enter.
:and;are swapped. This is a straightforward improvement for any Vim users out there (IMO) and is mostly an improvement for me because I type:for type signatures a whole lot more than I type;for line endings and comments. It also makes typing:=slightly easier.<and>are entered by pressing Shift+3 and Shift+4, using the left pinky and left middle/index finger. This is changed from their usual position where Shift is pressed with the left pinky and</>with the right thumb. I moved these here because I write a lot of Rust, and I write a lot of generic types, and unfortunately Rust followed C++ in using the ambiguous<...>brackets for generics instead of the aesthetic and unambiguous[...]of… originally Scala, I think?$is moved to the`position, entirely to make typing inline LaTeX easier. No Shift saves some time, especially when usually paired with a\immediately following.`is moved to the~position, mostly out of necessity. I do actually type`a lot, and this is the part of my layout I’m the least happy with, but there’s just not enough space. Behind Shift it must go.#takes the position of<, and~the position of>. Leftover scraps. Little-used keys.- I tried swapping
+and=once for aesthetic reasons (symmetry with-), but I couldn’t get the hang of it.+and=stay where they are as of today.
Anyway, this means nobody else can use my keyboard. Not a problem in practice. What is a problem is that I look like a damned fool any time I use somebody else’s keyboard.
Something that’s not wrong with my keyboard, though, is its first-class Unicode support. I have PrtSc (key right of right Alt) bound as my compose key – a key that when pressed, listens for a sequence of inputs and replaces those inputs with the appropriate Unicode character expressed by them. I achieve this with a massive .XCompose file containing about 4k+ mappings. It’s very useful, for both mathematics (can write Unicode as easy as LaTeX commands) and linguistics (can easily put diacritics on assortments of letters), and works everywhere – in my editor, in my browser, on both X11 and Wayland desktops, in any Qt or GTK or SDL application. I remap my keys above too primarily using XCompose (though CapsLock is done via builtin KDE support).
I highly recommend XCompose – and have written a post about just why you should use it that includes a little tool for generating your very own custom configuration.
4. editing
I regularly use Sublime Text, Helix, Emacs, and VS Code, in about that order.
some editor glazing and bashing
Sublime Text is pretty great. It’s a graphical text editor that has just the right amount of IDE support. It’s reliable to a fault, extremely lightweight, and pretty comprehensively customizable. It is a little jank in places. The extension API is good (except for the gaping hole that is the sidebar), but it’s not Emacs. The LSP extension is not built-in and the syntax highlighting format is bespoke. And the editor is closed-source nagware – though, this is not all that bad in practice. The free version is fully-featured and the cost of a license is expensive but not prohibitively so. And gosh, the core functionality is a serious feat of engineering – Sublime is the editor most seriously written for performance. Nothing else compares. Seriously, check out what they put in their release notes.
Helix is my go-to terminal editor for quick one-off tasks. I run a custom fork from hell that I cannot in good conscience recommend anyone use. (The main patch is for keeping it in insert mode. Yeah. Sorry.) This replaced my old Neovim configuration based around an extension seemingly exclusively used by myself and a British monk. I do this because I want a normal editor… I mostly navigate around with the mouse, and find it worrying that my editor could do a half-dozen unexpected things if I forget I’m in normal mode before I start typing. This kind of modal editing just… isn’t how I want to use a computer.9
Helix itself is a good editor, even if I don’t use it like such – the select-then-act visual paradigm seems nice, built-in LSP support is excellent, and integrated tree-sitter functionality is phenomenal. I do really appreciate that you don’t really need to configure it all that much – I can run helix on a remote box, and it’ll have all the bells and whistles (syntax highlighting and LSP, mostly).
I am, however, gradually transitioning away from Sublime + Helix into Emacs. Modern Emacs is very good. It includes an extensive amount of functionality out of the box, and has reasonable defaults. I’ve only installed a few external packages (discounting language modes):
- a keybinding compatibility layer for the terminal (kkp)
- a rainbow-parentheses mode
- the vertico+corfu+cape completion-at-point triad (also orderless)
- a tiny little package to support moving chunks of lines up and down (drag-stuff).
That’s it. I do plan on installing magit, multiple-cursors, proof-general, and either smartparens or combobulate, but those are future tasks – for now, my Emacs configuration is small (ish).
Anyway, Emacs is interesting because it’s now 1) reasonably fast w/ native code comp (though you still want to run it as a daemon), 2) has genuinely astoundingly good support for the terminal (the only incompatiblities are some minor style things – has full mouse support etc), 3) is extensible with which while what is a bad language, is a not terrible one, and a Lisp to boot, and 4) has two decades of history and community support. (Though point no. 4 has been shockingly, not all that helpful. I don’t think Emacs’s packages are notably better than VS Code or even Sublime and certainly not of higher quality. But to their credit, they can do more.)
I’d like to use Emacs more. What’s stopping me is a lack of familarity, and stability, and general trust – I’ve left unsaved buffers open in Sublime Text for over a year and they were perfectly fine. Safe and sound, even.10 It’ll be some time before I trust (and configure) Emacs to do that. I do, also, have some extensions I’d like to write – I’d like inline previews of rendered proof trees and syntax trees, similar to what I’ll (hopefully) have for Obsidian in the next month. This should actually maybe be easier in principle for Emacs… since you can actually run pdflatex instead of doing disgustingly cursed magic. I’d also like proper Markdown support in org-roam. But I digress.
VS Code is a behemoth of an editor. I genuinely avoid it because of this – I tend to have many, many projects open at once and VS Code runs the risk of OOMing my device if I have more than two open. Yet nothing is better for proof assistants – anything serious with Lean or Agda is done here. I wish it wasn’t so, but it is so.
Also, VS Code has by far the best editing experience of any editor. It’s snappy enough. It’s intuitive + pretty out of the box. Things Just Work. There’s some crazy extensions out there (Cursorless,11 Paperproof, Foam). There are also some extensions that aren’t too crazy but just aren’t any good in other editors – by this I’m mostly thinking of Todo Tree, which builds atop VS Code actually having a programmable sidebar (rip to Sublime and also Emacs here). Electron being a memory hog is genuinely the only reason I don’t use it more.
5. writing
Most of what I write is technical notes and journal entries, and sometimes blog posts.
I wouldn’t say I have a great workflow here. Writing is slightly too high friction for me: I spend a lot more time worrying about the format and presentation of my posts than I do the content, and this inevitably makes them worse / not exist at all. But I also want direct control over how they look and how they’re generated, so I can’t lean on something like Forester (nor am I lost in the LaTeX sauce enough for that). Nevertheless, I think I have reasonable tools lying abouts.
said tools
Obsidian is what I use for my private/public wiki, and what I use occasionally to write papers and blog posts. It operates on Markdown – my single favourite file format. The draw is that you can link files together, forming a mind map / Zettelkasten of your knowledge: but I use this part very little (should use it more) and mostly use it as a convenient and stateful (open tabs persist across restarts) editor for Markdown.
Speaking of Markdown – Markdown is wonderful. It’s plain, formatted text. The universally-supported conventions supplement plain prose wonderfully, and if you need anything more you can always fall back on embedded HTML. (Or, depending on your tooling, features from the various Markdown extensions out there.) I really like using the flavour of Markdown supported by Pandoc, specifically. It has everything I want, and more… and speaking of such…
Pandoc is the Swiss army knife of document conversion. It’s just so good. It can convert basically anything to almost anything else reasonable – and it’s extensible to boot. With filters, you can do arbitrary transforms on the internal document AST: for example, rendering LaTeX blocks to HTML as SVGs. Crazy stuff!
And Pandoc gets better when used with Hakyll. Hakyll is an HTML library / framework / DSL for using Pandoc as a static site generator. You write your logic in Haskell – a fully-fledged programming language – and can call into its native Pandoc library however and whenever you like. I learned Haskell for the sole purpose of writing a Hakyll SSG for my site. It powers things like gwern.net. Crazy good!
While not directly related to writing, I really like Zotero for collecting and organizing all the random computer science / linguistics papers previously scattered throughout my downloads folder. It’s good software. The annotations capabilities are also very nice. I first picked up Zotero for a more pragmatic reason, though: Firefox at the time (and probably still) cannot handle more than a couple of PDFs without ballooning in memory usage, and unlike ordinary webpages, PDFs are not automatically unloaded when under memory pressure. Zotero – despite being based on Firefox – handles large numbers of PDFs with no problem, dynamically unloading them on memory pressure and serializing enough state to make loading them back into memory quick and convenient, while keeping page positioning and the like.
6. debugging
I do not have nice tools for debugging. Help…
Okay, this is mostly because I write most my code in either tiny languages with no tooling, or extremely well-typed languages that catch nigh-all my errors on compilation. But it’s also because I’m lazy and will immediately just jump to standard print debugging, because it’s simple & works.
I should probably learn some debugging tooling, regardless.
7. devops
I do not like devops. I do not like administering servers. I do not like installing operating systems. I do not like orchestrating networks and services. I do not enjoy Nix, or Docker, or literally any other build system(-like), so I try to spend as little time with these sorts of tools as I can.
I nevertheless know far too much about server administration and networks and a little too much than I would like about build systems. In the course of my suffering, there are some tools that, shockingly, alleviated pain instead of adding to it.
briefly
Alpine Linux is a lightweight and straightforward Linux distribution. It’s aggressively minimalist, optimizing for security and lightweight image distributions, and as such is commonly used in containers. It’s kind of like OpenBSD in this regard. A bunch of weird stuff is shipped (musl / openrc) in place of more common stuff (glibc / systemd), which does mean running into papercuts when first learning how to use it. But this has its advantages: the core system is incredibly simple and coherent, despite being… Linux. Plus, in its quest for packaging good software, it supports ZFS in-tree. Pretty convenient! But mostly, it is the coherency that has appealed to me.
Tailscale is far and away the easiest way to get computers to talk to each other. You install it on one device, and you install it on another, and you auth them into the network with the provided proprietary server or your self-hosted Headscale instance, and. It. Just. Works. I can’t really get over just how incredible this is – Tailscale has solved one of the fundamental problems of computers, through sheer engineering effort.
Podman is a fully compatible drop-in replacement for Docker that is 1) permissionless and 2) daemonless. My biggest problems with Docker are that 1) it requires weird permissions and 2) the daemon hates me, personally. So I’ve switched to using Podman and things are slightly better now. There are a bunch of things around it I still need to learn (pods? containers? quadlets?), but I’ll get around to learning them sometime.
Guix is a purely functional build system / package manager in the vein of Nix, except it uses Guile Scheme as its configuration language of choice. As I find the Nix language to be unbearable and find Scheme implementations to be generally pretty good, I checked out Guix, and was pleasantly surprised to find it well-documented and polished. I need to use it more.
HAProxy is a pretty decent reverse proxy for TCP/HTTP and QUIC/HTTP3. (No UDP support.) It’s… not incredible. It’s written in C with all the memory safety and soundness issues that come with that.12 But it’s simple to configure, despite the bespoke .cfg format, and extremely well documented via the manual and worked examples on the corporate blog.
I do not have a de facto HTTP server. Maybe I should. I’d certainly want one with sendfile support.
I’d really want just HTTP/1.1, HTTP/2 and HTTP/3 are pits of unnecessary complexity, IMO.
8. multimedia
There are some interesting tools here but not many. I do not work with media all that much.
boring
Working with images, I usually use GIMP. At some point I went through every GIMP shortcut and rebound them to bindings I found more intuitive – this helped for both usability and discovering editor functionality. I use Inkscape for SVG editing sometimes but find it to be less than stable.
Working with 3D models, I exclusively use OpenSCAD. The language is dead simple and quite good, even if the official editor leaves much to be desired (can’t rebind shortcuts).
Working with audio, Audacity is butt-ugly but functional to the extreme. I might use Wavacity from now on though. Audacity popped up a subscription advertisement when I opened it just now.
Working with PDFs, I find myself using ScanTailor to post-process PDFs and document scans, cpdf to manipulate metadata, and Scribus to manually modify large object-ful PDFs.
I have heard good things about Krita but do not use it.
I have heard good things about Blender but do not use it.
9. languages
I think of programming languages as tools, which can be more or less fit for a given job.
language opinions
Rust is my go-to programming language for most things. This is mostly due to the excellent tooling. The borrow checker can be a pain sometimes – but my rule of thumb is to try to resolve lifetimes once, and if it doesn’t work immediately transition to spamming
.clone()everywhere. This has saved me much pain & suffering and lost me little in the way of performance (usually I fix it up later, and often performance doesn’t matter regardless).Despite its verbosity, I do really like writing Rust – it is type-directed in a way I appreciate, and its linearity meshes well with my mental model of dataflow.
Lean is a language I write slowly, but very much enjoy writing. It makes for incredibly aesthetic code. The syntax is perfect. If I were designing a modern ML, I wouldn’t do anything different. Also it has dependent types? And type classes? And typed macros? Very cool.
Racket is the modern incarnation of heavyweight Scheme, practically speaking. It is a language for building languages – and building languages is very much something I like to do. The standard library is somewhat of a junk drawer, and there is some spec-required / backwards-compatible cruft, and it could really use an editions system, but it’s pretty dang good all things considered. The community is lovely, too.
Guile Scheme is the only Scheme that supports compiling to WebAssembly – compiling to the web. And it’s a pretty good Scheme. Nice delimited continuation primitives, crazy efficient, portable and embeddable, the official extension language of the GNU project… once I’ve got the time, I would like to sit down and try writing some serious code for the web using it. Can I replace my JavaScript use (outside of Guile shims) altogether? Quite possibly…
WebAssembly is an idealized compilation target. It’s safe, small, expressive, and holds the twin promises of 1) interfacing with the DOM well enough to replace JavaScript some day and 2) its module system serving as a universal shared ABI for programming languages targeting the web. We are a long way from either of these being true, but what WebAssembly is currently isn’t too shabby, either.
Python is a language I do not know well enough. Yet I must learn. I must! It’s the language for whipping together quick scripts. And exploits – Python is the lingua franca of CTFs. There isn’t anything else used like it is.
Cubical Agda is a language I would like to learn. I do not know enough about proof assistants or higher mathematics / algebraic topology yet, unfortunately, but I will someday.
10. what i’m eyeing
There are some tools I would like to try / use.
- rr. Seems neat. I don’t write C/C++. Apparently works with Rust, though?
- clipper. My friend Jade wrote a tool to debug HTTPS traffic via
SSLKEYLOGFILE. It seems crazy cool, but I haven’t had a need to use it yet. - bubblewrap. I need to run sketchy binaries frequently. Usually I either cross my fingers or Dockerize them. This is probably an extraordinarily bad idea and I should probably use a proper sandboxing tool, like this one. (firejail might also be worth looking at?)
- bgrep. Robert has a nice binary grepping tool I have installed but should reach for more.
- ast-grep. A semantic grep seems real neat. But, usually I use grep.app instead for the sheer quantity of searchable code.
- watchexec. I use a shitty hand-rolled
inotifywaitwrapper that is probably a strictly worse version of this: a Bash functionrecompile()bound towhile inotifywait --quiet --event modify "$2"; do $1 "$2"; done. A proper tool with actual thought put into its features and API might be useful. - niri. While I like [KDE] (something I didn’t talk about!) I have idealized this scrolling-tiling compositor for a little while now. I should really check it out. I sympathize with the criticisms of stacking window managers, despite loving them so, and I should really try to go back to an alternative. This or river, maybe…
That’s that, for now. If there’s any tools I’ve not mentioned that you’d think I’d like, feel free to shoot me an email. If you’ve found your interest piqued by something here, great! Tools are great. And if you’re interested in my thoughts on what tools and technologies I would like to exist – and those I would like to not exist – check out this post’s (to be completed) follow-up, On Technology and the Future.
I did actually have a specific knife + pen in mind when writing this sentence. (No wrench, though.) I really like the Kershaw Oso Sweet – an assisted blade that feels soooo nice to hold and open. And I’m an absolute sucker for Pilot pens, the Pilot Precise v5 ballpoint specifically – lasts forever, writes smoothly on paper + arms, cheap as all hell.↩︎
I find these very jarring, especially since they pull from my history.↩︎
Okay, there’s some stuff that’s indefensible. I got egg on my face once by confidently asserting I knew how to iterate over a list of tuples. Turns out, practically an impossible task in Bash…↩︎
I really like the command line! I like dealing with plaintext and files and stdin/stdout/stderr, pipes and useful builtins, and the infinite number of seamlessly integrated external libraries all speaking the same language.↩︎
This is mostly evident in the increased reliance on builtin functions over syntax – local variables are declared with
set -l name args ...instead ofname=args..., for example.↩︎The
abbrabbreviations feature present in Fish is nice. When I type a git subcommand, it autoexpands to the full command. There’s no reason I should like this more than a standard non-expanding Bash alias but… I do.↩︎Which is probably a bad thing, actually. I recommend staying off that site.↩︎
At some point, I may see about hosting my Fraidycat feed publicly. I follow some pretty cool projects + individuals. But we’ll see about that. That’d be in the far future, probably only after Fraidycat itself breaks down into dust.↩︎
Though it’s possible it could be for lack of trying – I’ve only tried the Vim tutor once and the Helix tutor twice. That seems like a decent amount of attempts, though.↩︎
This is a bad joke and for nobody but myself, so I’ll explain – the unsaved buffers were my logic course notes. Soundness and completeness were our two important theorems. Groan.↩︎
Voice coding – not the other thing.↩︎
I would like to check out the river reverse proxy at some point. It’s built atop a memory-safe networking library from Cloudflare: pingora. (And possibly quiche? Unsure.)↩︎