Amos Wenger

  1. Introducing facet: Reflection for Rust

    I have long been at war against Rust compile times. Part of the solution for me was to buy my way into Apple Silicon dreamland, where builds are, like… faster. I remember every time I SSH into an x86_64 server, even the nice 64-core ones. And another part was, of course, to get dirty with Rust itself…

    Published

  2. The virtue of unsynn

    Addressing the rumors There have been rumors going around, in the Reddit thread for facet, my take on reflection in Rust, which happened a bit too early, but here we are, cat’s out of the bag, let’s talk about it! Rumors that I, podcaster/youtuber fasterthanlime, want to kill serde, serialization / deserialization…

    Published

  3. Open sourcing the home CMS

    I’ve been bragging about my website software for years! For… whew, it’s been 5 years! I didn't want to make a CMS! I did it out of spite! I’ve been teasing folks about the cool things I did from the beginning — here’s all the articles and series I’ve written that mention it: 2020: A new website 2021…

    Published

  4. The promise of Rust

    The part that makes Rust scary is the part that makes it unique. And it’s also what I miss in other programming languages — let me explain! Rust syntax starts simple. This function prints a number: fn show(n: i64) { println!("n = {n}"); } And this program calls that function — it looks like any C-family…

    Published

  5. That health is mental

    Disclaimer: Trigger warning: depression, talk of suicide. It’s been a while since I wrote a mental health piece — but I think it’s important to occasionally stop, take a breather, and think about how we feel. So. deep breath I’m okay, I think? Just a little restless. A bit of personal context For those…

    Published

  6. More devops than I bargained for

    Background I recently had a bit of impromptu disaster recovery, and it gave me a hunger for more! More downtime! More kubernetes manifest! More DNS! Ahhhh! The plan was really simple. I love dedicated Hetzner servers with all my heart but they are not very fungible. You have to wait entire minutes for…

    Published

  7. Impromptu disaster recovery

    Background im-promp-tu (im-ˈpräm(p)-(ˌ)tü) made, done, or formed on or as if on the spur of the moment: improvised composed or uttered without previous preparation: extemporaneous Merriam-Webster On March 18th, 2025, I thought I would look into self-hosted project management solutions — something kanban…

    Published

  8. The case for sans-io

    The most popular option to decompress ZIP files from the Rust programming language is a crate simply named zip — At the time of this writing, it has 48 million downloads. It’s fully-featured, supporting various compression methods, encryption, and even supports writing zip files. However, that’s not…

    Published

  9. Catching up with async Rust

    In December 2023, a minor miracle happened: async fn in traits shipped. As of Rust 1.39, we already had free-standing async functions: pub async fn read_hosts() -> eyre::ResultVecu8>> { // etc. } …and async functions in impl blocks: impl HostReader { pub async fn read_hosts(&self) -> eyre::ResultVecu8…

    Published

  10. Highlighted code in slides

    I have obsessed about this long enough, I think it’s only fair I (and you!) get some content out of it. When I started writing this article, I was working on my P99 CONF slides. Those slides happen to include some bits of code. And because I’m a perfectionist, I would like this code to be syntax highlighted…

    Published

  11. ktls now under the rustls org

    What’s a ktls I started work on ktls and ktls-sys, a pair of crates exposing Kernel TLS offload to Rust, about two years ago. kTLS lets the kernel (and, in turn, any network interface that supports it) take care of encryption, framing, etc., for the entire duration of a TLS connection… as soon as you…

    Published

  12. State of the fasterthanlime 2024

    It’s time for some personal and professional news! TL;DR: I started a podcast with James, I’m stable on antidepressants, I’m giving a P99 CONF about my Rust/io_uring/HTTP work, I’m trying on “they/them” as pronouns, I’m open-sourcing merde_json, rubicon and others, I got a divorce in 2023, I found a…

    Published

  13. Face cams: the missing guide

    I try to avoid doing “meta” / “behind the scenes” stuff, because I usually feel like it has to be “earned”. How many YouTube channels are channels about making YouTube videos? Too many. Regardless, because I’ve had the opportunity to make my own mistakes now for a few years (I started doing the video…

    Published

  14. Just paying Figma $15/month because nothing else fucking works

    My family wasn’t poor by any stretch of the imagination, but I was raised to avoid spending money whenever possible. I was also taught “it’s a poor craftsman that blames their tools”, which apparently means “take responsibility for your fuckups”, but, to young-me, definitely sounded more like “you don’t…

    Published

  15. Cracking Electron apps open

    I use the draw.io desktop app to make diagrams for my website. I run it on an actual desktop, like Windows or macOS, but the asset pipeline that converts .drawio files, to .pdf, to .svg, and then to .svg again (but smaller) runs on Linux. So I have a Rust program somewhere that opens headless chromium…

    Published

  16. Extra credit

    We’ve achieved our goals already with this series: we have a web service written in Rust, built into a Docker image with nix, with a nice dev shell, that we can deploy to fly.io. But there’s always room for improvement, and so I wanted to talk about a few things we didn’t bother doing in the previous…

    Published

  17. Generating a docker image with nix

    There it is. The final installment. Over the course of this series, we’ve built a very useful Rust web service that shows us colored ASCII art cats, and we’ve packaged it with docker, and deployed it to https://fly.io. We did all that without using nix at all, and then in the last few chapters, we’ve…

    Published

  18. Making a dev shell with nix flakes

    In the previous chapter, we’ve made a nix “dev shell” that contained the fly.io command-line utility, “flyctl”. That said, that’s not how I want us to define a dev shell. Our current solution has issues. I don’t like that it has import . Which version of nixpkgs is that? The one you’re on? Who knows…

    Published

  19. Learning Nix from the bottom up

    Remember the snapshot we made allll the way back in Part 1? Now’s the time to use it. Well, make sure you’ve committed and pushed all your changes, but when you’re ready, let’s go back in time to before we installed anything catscii-specific in our VM. This should emulate the experience of a colleague…

    Published

  20. Doing geo-location and keeping analytics

    I sold you on some additional functionality for catscii last chapter, and we got caught up in private registry / docker shenanigans, so, now, let’s resume web development as promised. Adding geolocation We kinda left the locat crate stubby, it doesn’t actually do any IP to location lookups. It doesn’t…

    Published

  21. Using the Shipyard private crate registry with Docker

    Wait wait wait, so we’re not talking about nix yet? Well, no! The service we have is pretty simple, and I want to complicate things a bit, to show how things would work in both the Dockerfile and the nix scenario. And because I don’t like contrived examples, we’re going to do something somewhat real…

    Published

  22. Deploying catscii to fly.io

    Disclaimer: Because I used to work for fly.io, I still benefit from an employee discount at the time of this writing: I don’t have to pay for anything deployed there for now. fly.io is still sponsoring me for developing hring, but this isn’t a sponsored post. It’s just a good fit for what we’re doing…

    Published

  23. Writing a Dockerfile for catscii

    Now that our service is production-ready, it’s time to deploy it somewhere. There’s a lot of ways to approach this: what we are going to do, though, is build a docker image. Or, I should say, an OCI image. This is still a series about Nix, but again: because the best way to see the benefits of Nix is…

    Published

  24. Serving ASCII cats over HTTP

    Our catscii program does everything we want it to do, except that it’s a command-line application rather than a web server. Let’s fix that. Enter axum The documentation for the axum crate tells us how to make a basic web server, and we honestly don’t need much more than that. So let’s add axum: amos…

    Published

  25. Printing ASCII cats to the terminal

    Now that our development environment is all set up, let’s make something useful! Creating the catscii crate From a VS Code window connected to our VM (as we just set up), let’s make a new Rust project: amos@miles:~$ cargo new catscii Created binary (application) `catscii` package And open it in a new…

    Published