silverfish
Case study

flux

Send it to yourself. It's gone in 7 days, unless you keep it.

A frame from the flux film: the flux mark above the words Send it to yourself. Keep only what matters.
Why flux
Chapters9 · 1:00
  1. You send things to yourself. Links. Codes. Files for the other device. And there they stay. flux: Send it to yourself. Keep only what matters.

  2. Share it from your phone. It’s already on your laptop: 0.34 s median, phone to laptop.

  3. A private stream between your phone and your computer. Text, links, images and files arrive in under a second. Everything fades after seven days. Pin it, or #tag it, and it stays.

  4. Capture from anywhere: the share sheet, a Shortcut, a paste. Whatever you send lands on every device.

  5. Links get previews, codes get a copy button, commands get monospace.

  6. Built for the keyboard. One key per action: paste to send, pin it forever, search everything, let it go now.

  7. Android, iOS, Windows, macOS, Linux, any browser. Works where you already are.

  8. Self-hosted. Passkeys. One-file database. Open API.

  9. Stop messaging yourself. flux, in private beta.

Watch with sound?

This case study opens with a one-minute film. It’s made to be heard: music and small sounds for every tap.

I’ll remember your choice on this device.

Send it to yourself. It's gone in 7 days, unless you keep it.

At a glance

01The problem
I messaged myself on WhatsApp to move links between devices. It became a junk drawer.
02What I built
A private stream: send from one device, and it arrives on the other within a second.
03The result
In daily use since 26 Sep 2026. Things tidy themselves away after 7 days unless kept.
My part
Everything: product, design system, API, deploy
Users
Me and one family member, every day (invite-only)

Built with

Next.js · Hono · SQLite · Server-sent events · Passkeys · Litestream

1

The problem

Like a lot of people, I moved things between my phone and my laptop by messaging myself on WhatsApp: a link to read later, a code, a photo of a document. That chat became a junk drawer that never empties.

I wanted the opposite: send it, and it's on the other device in a second. Then it tidies itself away, unless I tell it to keep something.

2

Try it

Sign-in is invite-only. The site shows how it works.

Live See flux flux.silverfish.dev
3

What I built

One stream on every device. Text, links, one-time codes, images and files land on the others in under a second. Pin it or add a #tag and it stays; otherwise it expires.

The flux landing page on a laptop.
The flux landing page on a phone.
Liveflux installs as an app on Android and shows up in the phone's share menu, so sending something is two taps from anywhere.
4

How it works

  1. Send itType, paste, share or drop a file on any signed-in device.
  2. It arrivesEvery other device gets it in under a second, over a live connection.
  3. It tidies itselfAfter 7 days it goes to the trash, unless it's pinned or tagged.
5

Decisions I made

Decision Live

Passkeys instead of passwords

Why
Sign-in uses the phone's fingerprint or face unlock. New devices sign in by scanning a QR code, like WhatsApp Web, and confirming a matching number on the phone.
Cost
Passkeys are tied to the domain, so the domain can't change casually.
Decision Live

Ephemeral by default, permanent by intent

Why
Most things you send yourself are only useful for a day. Expiry keeps the stream clean without any effort, and a tag says 'keep this'.
Decision Live

Thumbnails made in the browser

Why
Image previews are drawn in the browser and uploaded, so the server needs no image library and ships without native dependencies.
Decision Live

Link previews that can't be abused

Why
Every link preview is fetched through a guarded fetcher that checks each resolved address, so a crafted link can't make the server reach into its own network.
Decision Live

Backups I've actually restored

Why
The database streams to cloud storage continuously, and a weekly job restores it into a scratch copy and compares it. A backup that's never been restored is only a hope.
For engineersTechnical
  • Hono on Node 24 with the built-in node:sqlite; FTS5 search that works in Bangla, with user input quoted so it can't inject search syntax.
  • Live sync over server-sent events: a 25 s server ping and a 40 s client watchdog that reconnects and catches up.
  • Optimistic writes that are swapped for the real item by the POST response or the SSE echo, whichever arrives first; failed sends wait in an outbox and retry with the same client ID, which the server de-duplicates.
6

The design system

flux is where my design language started: warm paper, ink, hairlines and one orange signal colour. "Notion, but sharper." This site uses the same system.

flux's living design system page, with colour tokens, type and components.
The living design system page: tokens, type and components in one place.
7

Results

< 1 stypical delivery to my other devicesMeasured on my own devices
57automated testsSource: the repo, Sep 2026
7days until anything untagged tidies itself awaySource: the product's rules
8

What I'd do next

Search by meaning, on the device. Small text embeddings, computed in the browser, would let me find "that article about sleep" without remembering a single word from it, and without sending my stream anywhere.

Project receipt · flux

Checked 30 Sep 2026against code and the live site
My part
Solo: product, design, front end, API, infrastructure
Built with
Next.js 16, Tailwind v4, Motion · Hono on Node 24, node:sqlite, FTS5 · Litestream to R2
Shipped
Live at flux.silverfish.dev, invite-only
Tests
57 automated tests (node:test)
Backups
Streamed to R2, with a weekly restore check
Sources
flux.silverfish.dev · the repo and its handover notes