mht.wtf

Computer science, programming, and whatnot.

ppl

March 11, 2025 back to posts

ppl is a small webapp for storing contacts. It is the first result of me wanting to produce more and consume less. It is a docker image for which you mount a sqlite database, and it runs a single-user password protected web server that you interact with in a browser. I don't know if I'll release it for others to use; I built it for myself, like a home-cooked meal.

This is how it looks with dummy data:

Front page of ppl.
Detail view of one peep.

The current feature-set is small:

That's it! In the near future I want to include a upcoming birthday calendar, better keyboard controls, and some import/export features, and maybe, just maybe, multi-user support so that I can share it with my closest family.

Other potential features include

Why

I built ppl because I wanted to make something that I knew I could finish. This year I've already started on a live-collab-quiz-style game (think Drawful but different) and some kind of frequency analysis for guitar playing, with the goal of automatically transcribing my own playing. Both projects were too big to complete in any sense of the word.

Another reason was that I've never had "contacts software" that I like. Building good things is hard, but since the scope of a contacts app is necessarily very small, I have time, patience, and attention to build it and to do it well.

It's a webapp; I'm not crazy about the entire web-stack, and I get my fair share of it at work. However, I needed this to be accessible from all of my devices. It seems that the web is the only viable choice for this.

How

This is my current go-to stack for anything web-related, and it works well for my use-case.

ppl is a single-executable Rust binary running an axum web-server serving HTMX templated with maud. It reads and writes to an sqlite database with sqlx. I wrote the css from scratch, and use a tiny bit of js, mainly for input handling for the search bar (arrow keys for navigation, for instance), and some in my bespoke hot-reloading system so that I can edit static files and have them update live in the browser (which is compiled out in --release mode). Useful for pushing pixels!

It's built in a Docker container with cargo-chef for dependency caching (of which this stack has its fair amount!). The image is pushed to a Hetzner server, and the container is manually restarted. The two operations is concatenated in the deploy rule of my justfile, so for me it's one command to build and deploy.

Getting from git init to a minimal version deployed on the internet took around two evenings of hacking.

It's been fun hacking on a small tool that I find useful and that's mine. I hope to do more of it!

Thanks for reading.

This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License