ppl
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:

ppl
.
The current feature-set is small:
- CRUD operations for peep
- Name search
- Some keyboard navigation
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
-
Saved change history
-
Getting a tiny LLM (TLM?) to handle import
-
More eye candy -- icons, polish, some animations
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