A Local-First Task Planner On ATProto

chalky.town is a local-first task planner on atproto. All your tasks are stored first in IndexedDB so everything stays with you, works offline, and is super fast 8). It uses atproto for identity and syncing tasks across devices.

We give the option of public or private data, task planning is often an inherently private thing, so trying the option here makes sense. The private data is stored in HappyView's permissioned spaces, which can move to PDS permissioned spaces when the proposal lands.

Local-first conf was a nerd-snipe moment

There was a notable presence of the familiar Atmosphere faces at local-first conf. Then loads of people on Bluesky have started talking about Iroh as a P2P building block to work into the stack alongside atproto. So after watching the talks online and having wanted to see more atmospheric local-first UI, I decided it was time to just make something.

I've long wanted a decent and minimal todo app... it's the sort of thing that everyone tries making, but none to my particular satisfaction. The idea started as something just like this:

Later, as I was looking for early feedback, @bmann.ca called out that HappyView supports permissioned spaces, so I happily picked that up, so the new diagram looks just like this:

it's very simple... that is what's nice about it.

How local-first is it though?

So this was a question I was unsure about after stitching the system together. Let's revisit the Ink & Switch essay and see:

No spinners: your work at your fingertips

Yep! By using IndexedDB as our primary store in the browser and running a background sync to HappyView we get instant feedback and updates on each of the changes we make, as we make them.

Your work is not trapped on one device

Yep! You can sync across devices with ease in this system.

The network is optional

Yep! chalky.town works offline. There's no reason for it to not. It's trivial to setup the service worker for offline support.

Seamless collaboration with your colleagues

Eventually! chalky.town is really just built as a thing I needed for myself to start. There aren't any technical limitations preventing collaboration, it's just something that needs figuring out and building.

The Long Now

Yep! There's the normal local-first exit plan here where we support offline and exporting the data, so if chalky.town were to be taken down, you can take your data with you. The longer now is adding atproto here though, so any other implementor of chalky.town's task lexicons could become your new app.

Security and privacy by default

Kind of. Privacy is a choice in this instance (either private or public). It's an explicit one made when you first log into chalky.town before any syncing occurs. Everything is stored on-device until that time.

When you choose public, the data in your PDS just like any other atproto app.

When private, we use the HappyView implementation of permissioned spaces. When the proposal lands, these spaces can move upstream into each user's PDS. Please read the proposal itself if you're curious about the details on permissioned spaces and how private data on atproto may work though.

Permissioned data proposal discussion

You retain ultimate ownership and control

Yep! The data is fully yours to edit and move around independent of chalky.town's interface.

local-first and atproto fit well together

With atproto being an approved internet standard for identity, it makes sense to use it as a mechanism for syncing across the internet. Who likes re-inventing auth and identity anyways?

As permissioned spaces are fast approaching, privacy by default and security are each knocking on the door. We can have private data today though too. HappyView is the first implementor I'm aware of, but data that is stored in private space, linked explicitly to your DID has been do-able for a long while now. Bluesky DMs for example are stored off-protocol (private), linked to your DID.

Hopefully, chalky.town is a helpful example in how these pieces can fit nicely together in a small way :)