DuskRead

The app, how it works, and the design system behind it

A reading list that keeps itself, ranked by what you actually read

An AI agent checks your inbox and other sources on a schedule and files what's worth keeping into a Notion database. Blogs you follow add their own posts the same way. Home ranks all of it by your reading habits, and most of it is already downloaded, so it opens with no connection.

Act one · Concept

One shape, one word, and the hour it is named for

What the app is called, and where the name comes from. What it does is the act below.

DuskRead

dev.mks.duskread

The name

Two halves that each do a job

Dusk is the hour the reading list is finally sorted and ready. Read means both senses: read it, or have it read to you.

What it does

True on every screen

Automated

An AI agent files what’s worth keeping from your inbox; the blogs you follow pull their own new posts.

Personalised

What rises to the top of Home is ranked against your own reading habit: the sources you return to, the topics you finish.

Offline-first

Every screen renders from local storage, and most articles were already fetched hours before you tapped them.

Monochrome

Ink by default, the hue drained to nothing. One terracotta accent, spent to mean just one thing: there is sound here.

Act two · Walkthrough

The screens, and why each one looks like that

An article being read, the screen that picked it for you, the blogs behind it, the reading list they end up in, and what you can change. The last one — connecting Notion — is the only screen here you can skip entirely and lose nothing. Drag the deck, or use the arrows.

4:19
A Tale of Two Flink Autoscalers
Netflix currently runs two different autoscalers for Apache Flink, and they are actively moving toward replacing the custom one with the open-source Kubernetes-native autoscaler.

The custom autoscaler predates the Kubernetes operator by several years. It was built when the platform ran Flink on its own scheduling layer, and it carries assumptions from that era — most visibly that scaling decisions are made from a single aggregated backlog metric rather than per-vertex.

Feature parity is the gating question. The open-source autoscaler reached rough equivalence on throughput-based scaling last year, but two things kept the custom one alive: its handling of sources with irregular partition counts, and the operational tooling built around it.

What follows is a comparison of how each one reacts to the same three production incidents, and what that implies for the migration order.
Summary
Netflix runs two Flink autoscalers today and is consolidating on the open-source, Kubernetes-native one — the custom version is being retired once feature parity closes the remaining gap.

01 / 06  ·  Reading

Read it, ask what's in it, or have it read to you

The reader strips the page down to its text. The summary button sends that text to Gemini Nano, on the phone. Nothing is uploaded.

The waveform button is new: the phone reads the article aloud itself, no separate sync step required. It keeps playing behind whatever screen you open next, in the same floating bar Readback already used.

01 / 06

Act three · How it works

The automation, the shell, and the design language

The full design reference is design-tokens.md.

Gmail
Claude Cowork
Notion
DuskRead
RSS feeds
DuskRead

Feeds are fetched by the app itself and never touch Notion. Following one writes it into Notion, too.

01 / 03  ·  Architecture

Curation happens before the app ever opens

Claude Cowork checks Gmail on a schedule and files what’s worth keeping into a Notion database. A blog with a working feed is fetched by the app directly and never touches Notion.

The phone only pulls saved links that were kept — everything else stays archived in Notion. Followed blogs are the one thing that now flows both ways: the app files a row when you follow one, Notion is where you edit it.

01 / 03