events
Events is an observability and metrics stack built around ClickHouse. An OTel collector
ingests OpenTelemetry tracing data from multiple services and writes them to ClickHouse in
batches. A Grafana instance is deployed to extract and visualize metrics from these traces.
In parallel, a custom Rust server exposes an API that allows IoT data, GPS location
information, and other data of interest to be ingested into the observability stack.
Technologies: ClickHouse, OpenTelemetry, Tracing, Grafana, Rust, Docker
Reflective is a personal photo gallery application to view and tag photos. Born from a
desire to have an elegant, portfolio-like view of my pictures, Reflective is designed to be
minimalistic and fast. Image metadata is stored in a Postgres database, the full images as
well as downsized versions are stored on disk on the VPS serving the application.
Technologies: Rust, PostgreSQL, SolidJS, Caddy, Docker
aware
Aware is a small set of scripts that have macOS take screenshots of my monitor and record
the focused window title at predetermined intervals. Once this process has been collecting
data for a while, the goal will be to analyze it and infer my digital behavioral patterns.
For privacy reasons, the data is stored locally and not ingested into any remote storage
service.
Technologies: Bash, macOS
observatory
Observatory stores and visualizes metrics from various data sources, including IoT devices
and GPS trackers. The application is designed to be light weight to deploy and operate. The
backend is implemented in Rust and uses DuckDB for data storage. The frontend uses SolidJS
and Plot.
Technologies: Rust, DuckDB, SolidJS, Plot
Ledger is a small transaction analysis tool. The user can import bank transaction dumps in
csv format from Neon. A small query language
allows quickly searching for transactions and getting aggregations at a glance. Automated
filters categorize transactions for analysis. Charts give insight into spending or income by
category and over time. As with other applications in this series, ledger runs locally in
the browser and offers the ability for sync and backup via S3 credentials.
Technologies: Typescript, SolidJS, S3, Caddy
The latest app implementing the local-first concepts originally developed for
rest.quest: Jour is a minimalistic journaling app that
stores data locally in the browser, optionally synchronizing it to an S3-compatible bucket.
Originally intended as a lab journal to keep track of thought processes at work, jour is now
in use as a general purpose journal that invites the user to use it with its low friction of
entry.
Technologies: Typescript, SolidJS, S3, Caddy
A very minimalistic snippet management web app. This app is another iteration on the
concepts developed for rest.quest and
go: State is kept on the local device, but can be
synchronized optionally using an object storage bucket. The single page app relies heavily
on shortcuts.
Technologies: Typescript, SolidJS, S3, Caddy
A tiny and opinionated bookmark management web application. This app is leaning strongly on
concepts developed for rest.quest: State is kept on the
local device, but can be synchronized optionally using an object storage bucket. The single
page app relies almost solely on shortcuts and can be used as a lightning fast redirect tool
using the browser keyword search.
Technologies: Typescript, SolidJS, S3, Caddy
My personal website. Custom designed and built with SolidJS and Astro. It's deployed on a
small VPS using Caddy as a web server.
Technologies: Typescript, SolidJS, Astro, Caddy
A minimal and opinionated todo web application. The user interface is designed to remove
friction when adding projects or tasks. The state is primarily stored locally in the
browser. Optionally, the user can supply object storage credentials to synchronize the state
across multiple browsers. The application is implemented using SolidJS to keep the bundle
size small.
Technologies: Typescript, SolidJS, S3, Caddy
An end-to-end encrypted note taking application. The web application features a
wysiwyg markdown editor and advanced formatting including tables. Content is encrypted
using a private key that is only stored in the browser. By encoding the decryption key in the
hash of the URL, it's possible to share notes without the server ever seeing the data in plain
text. The backend stores encrypted content in PostgreSQL.
Technologies: Rust, Typescript, React, Jotai, PostgreSQL, Web Crypto API, AES, Caddy, Docker