🏡 Home | 📝 Writing | 💽 Work
What Build if Free?
2026-03-29
What would I build if I were free from the constraints of capital?

Preface

Before starting, I want to lay out my intent with this blog post.

Intro

Unfortunately I have to eat 😔, which means that I cannot build whatever I want. Unfortunately "wouldn't this be cool" is not a good monetization strategy. In fact for me "wouldn't it be cool" often sits in direct opposition to monetization. The software I find most exciting removes centralized control, provides data ownership, and gives interoperability.

So, say money were not an issue. Maybe I become unimaginably rich. Maybe a nice VC who wants to throw away some money. What would I build?

Themes

First, a grab bag:

  • Homelab
  • Offline first
  • Peer-to-peer
  • Self-hostable
  • Live multiplayer
  • CRDTs
  • Task management
  • Planning
  • Budgeting

These are split into two groups:

  1. Technical requirements which support digital liberty.
  2. Problems I happen to want to solve.

First I would make solving these problems easy (make a library), and then easily solve these problems (make some apps).

Plan

All of the problems I want to solve can be structured as block storage with transactions and peer-to-peer sync.

Building blocks

Define a Block to be composed of:

Define a Machine as a unique identifier which is stable for a given user-machine-app triplet.

Layers

The library would be built out of layers:

Storage

At rest a Block is stored in the storage layer. The storage layer needs to be able to do two things:

You can imagine implementing this in any number of ways: A SQL database, a filesystem, cloud object storage.

This structure must give O(1) access to a given block based on its ID. Using this and transactional writes, you can support other more interesting kinds of lookups. You could create a Block which is an index. Or you could store a number of other blocks' keys.

Peer discovery and auth

To start this would be very simple. Each Machine would catalog a set of peers it wanted to connect to, and a mechanism to trust that peer. Imagine a manifest which described IP addresses to connect to and that peer's base64 encoded public key. You can imagine implementing auth on this based on a ed25519 challenge-response.

Later I would like to enable end-to-end encryption, so that one could share their data over an untrusted relay knowing that only their nodes can access their data. I know that this is possible, but I don't know how to do it, so I'm ignoring it for now.

Connecting to peers

I would want to make this system support multiple transport mechanisms. It should work on any transport mechanism that can send a logical stream of bytes. To I would target good old fashioned TCP (for most nodes) and websockets (for the web). It should be easy to support a new transport protocol.

Sync algorithm

The sync algorithm would allow two peers to symmetrically exchange data, with either end initiating a connection. The sync algorithm would choose the minimum number of Blocks to send over.

At a high level the sync algorithm would look like:

I am a bit afraid of sync algorithms, because I know the cost of under-selecting Blocks to share. I'm sure the final version of this would be better thought through. Perhaps this would be a good place to use deterministic testing like Antithesis.

Merging data

This is the part where you expect me to say "everything is a CRDT," but I actually don't think that's the right approach!

Merging data should be an application-level concern. The core library only understands Blocks as containing an opaque series of bytes. The only conflict free algorithm we could implement is "last-write-wins," which is not suitable for many applications.

Instead, I want to let each application define a set of merging algorithms. Each one would apply to one or more types of Block. If the application contains such a merging algorith, it is applied. If it does not contain a merging algorithm, we use last-write-wins.

Admonition

I know this isn't perfect! There are a couple of things I'm thinking about, even right after this stream of consciousness blog post.

If you have more questions or critiques, please share them! I want this idea to be as good as it can be :)

Apps

What could I build with this?