Fathom: Trying a New Hard Thing.
Tags: webdev, devjournal, rust, microservices
Published: 2022-05-11 02:59:41

So named because I cannot fathom the fathomless depths of this rabbit trail to fathom the brilliant complexity of building web apps.

More seriously, hi 👋! Welcome to the first of what will hopefully be a series of posts about a new project I'm working on in order to learn a whole bunch of exciting web technology. This first post will discuss what the project is about, why it exists, and some rough ideas about how it's gonna go down. Subsequent posts will focus more on the actual project, with research notes and project updates on what is likely to be a once-a-week schedule.

So without further ado, let's begin!

## So what is Fathom going to be?

Fathom is going to be a multi-tenant file sync service that is quick to deploy and comes with desktop clients supporting file placeholders. That is to say, it:

- Works as a file sync service like OneDrive/Dropbox/etc.
- Can be deployed on a home server (or a Raspberry Pi).
- Supports multiple users with their own private directories.
- Allows certain directories to be shared between users.
- Provides sharing features so users can show off their prized Korean recipe collection from the comfort of their own home.
- Comes with a Windows desktop sync client that makes use of placeholder files, so you don't have to have all the files on your computer.
- Provides a web interface for convenient CRUD (Create, Read, Update, Delete) operations on the go, and for managing the app & users.
- Correctly detects merge conflicts and prompts users to deal with it.

All that seems like a lot of work, which begs the question:

## Why?

To learn! And maybe get a home cloud solution that does everything I want it to. To share this experience with others. I've spent most of my time working on projects that lived only on one computer, and I feel it's high time I get up to date on web, or at least have something useful to contribute to discussions about the web. Documenting the process in public will hopefully help others who want to embark upon a similar journey, and certainly allow for some amount of schadenfreude as I pull my hair out over some weird heisenbug.

With all that said, I'm targeting a few specific learning goals which will be the underpinning of this entire endeavour. They are to:

- learn how to use Docker & Kubernetes.
- learn how to create and work with microservices.
- learn how to create an application-specific web server with Rust's Tokio/Tower/Hyper libraries.
- learn how to create posts just like this one, only better.

... I don't know about you, but that second list seems like it could be accomplished with a lot less work. But! Fathom has features that I want in a way that I'm interested in working on, and when it comes to learning, what captures your attention will easier to actually sit down and work on (or so I've found). Granted, I might just find this project too big to chew on, but we'll cross that bridge if we get to it.

In any case, on to the 

## Now What?

Now I get to cracking figuring out just how this project is going to take shape. There will likely be a fair few 'research report' style posts, as well as status updates and design documents in the coming months as I work things out. Certainly, the feature list I mentioned at the start of the post sets out a list of features that are going to be necessary, such as account management and storage.

The next concrete step is going to be getting a basic HTTP server running in Rust, followed by a super basic file browser for drag-and-dropped directories that doesn't actually upload anything but file and directory names. I'll hopefully have a better idea about what kind of work needs to be done, and what components are going to be needed by that point.

This is intentionally a very, _very_ early place to start talking about a project, and many projects don't really make it past this phase. However, I think even that is important to document since I've definitely encountered feelings of shame or insufficiency when a project I was thinking about had to be put aside for something else. If this project succeeds, great! Documentation of the entire process (warts and all) will be available for public scrutiny. If it fails, also great! Fathom will join the countless other examples strewn across the internet of projects that never took off; living (or dead) proof that it's alright for these kinds of things to fail.

Irregardless, I'm off to work on this thing.

PS: If you want to keep track of my moment-to-moment progress, feel free to take a look at the [GitHub repository](https://github.com/Straivers/fathom) for the project.

PPS: How was the post? Too long, too short, too empty, too dense? Please do let me know!