ArticleFlux mark

ArticleFlux

Signal, ranked for you.

shipping · self-hosted

A feed reader you host yourself, with the three-pane layout and keyboard shortcuts Google Reader taught everyone.

Google Reader died in 2013 and the replacements were a choice between somebody else's server holding your reading history and a self-hosted PHP app from 2011. This is the third option: one binary, one SQLite file, no runtime dependencies, and a client that behaves like an application instead of a page.

monstercameron/ArticleFlux — brand sheet
ArticleFlux brand poster — Signal, ranked for you.

Brand artwork for ArticleFlux. The product is real and the code is linked above; the poster is a design exercise, not a claim.

~/projects/articleflux · what it does

What you get.

The key map your hands already know

j, k, o, s, r and u do what you expect. The vocabulary was kept on purpose, so muscle memory transfers on day one.

Firehose scale without the stutter

The development instance runs 153 feeds and 7,303 articles in a 126 MiB SQLite file, through a virtualised list that does not care how long it gets.

Search, tags, notes and text-to-speech

Full-text search over SQLite FTS5, per-source hues, tagging, notes, and a reader that will read to you.

One poll per feed, no matter how many readers

Multi-tenant and deduplicated: a popular feed is fetched once for everybody subscribed to it.

~/projects/articleflux · built on

What it runs on.

Including the two libraries underneath it that are my own work — the framework the interface is written in, and the transport it talks over.

My Go→WASM framework. There is not one .css file and not one application .js file in the repository, and CI fails if either appears.
My gRPC-over-WebSocket tunnel. Sixty RPCs across five services, including the streaming ones that push a new article to the screen without a refresh.
The whole datastore, search index included, in one file you can copy.
proto/articleflux/v1 is the only contract; client and server are both generated from it, so they cannot disagree about a field name.
~/projects/articleflux · hard parts

What was actually difficult.

The problems worth describing, and what the measurement said. Not the technology list — that is above.

Real gRPC in a browser, with no proxy

A standard gRPC client cannot open a socket from a js/wasm build, and the usual surrender is a hand-rolled REST layer that drifts from the schema. GoGRPCBridge tunnels HTTP/2 gRPC frames over a WebSocket instead — all four RPC types, deadlines, metadata and interceptors intact — so the .proto stays the single source of truth on both sides.

A list that stays fast at firehose scale

Thousands of unread items is the normal case, not the stress test. The list is virtualised and the read state is designed around it, so marking all read with undo stays instant at 5,913 unread.

The cost of deleting the toolchain, stated out loud

Writing the client in Go means a 32.9 MB wasm bundle, roughly 7 MB gzipped, cached after first load. CI fails the build if it grows more than 5% without someone bumping the baseline on purpose. It is a real trade and the README argues it rather than hiding it.

~/projects/articleflux · evidence

Counted, not estimated.

Figures taken from the repository itself. No line-of-code count — it rewards duplication and every reader knows it.

153feeds in the dev instance
7,303articles indexed
60gRPC methods
0application .js files
0.css files
~/projects/articleflux · honest status

Where this really is.

ArticleFlux today:shipping · self-hosted

The most finished of the five: it runs live, it is used daily, and the public demo is the shipping client with only the transport swapped underneath — same components, same generated stubs. It is still a single-maintainer, spare-time project, and the demo cannot do anything that needs a server.

These are personal projects, built on nights and weekends with AI agents in the loop — that is how one person ships this much surface area at once. Most of them are early: alpha or prototype, with polish that varies a lot by area. What is not early is the architecture, the test suites, and the measurements — every number on this page is counted from the repository and every claim is one you can check against the code.