LFFS update, June 2025| bytes.zone
Posts| bytes.zone
Around 97% of US households have internet access, but bandwidth and latency are likely worse than you expect.| bytes.zone
a dilemma, or is it a conundrum? Maybe it's a dilendrum!| bytes.zone
some time tracking results| bytes.zone
I'm writing a book about local-first software tentatively called Local-First From Scratch. This is a snippet from that book—an intro to why you should care about local-first software and what it gets you. I thought it ended up being a pretty good summary of what the whole project is about, so I wanted to share it as a blog post as well!| bytes.zone
Two may be too many.| bytes.zone
David Cain wrote in 2017 about a depth year:| bytes.zone
I've been using the TUI version of the book software for a couple days, and have some observations!| bytes.zone
LFFS: Simplicity vs Efficiency| bytes.zone
Since around Thanksgiving, I've been working on the draft of a book I'm tentatively calling "Local-First from Scratch." The idea is basically to write tinyping, but do it in book form.| bytes.zone
I'm working on a book about writing local-first software. Instead of doing a survey of all the libraries available, I'm taking a first principles approach. That means doing a lot of explaining CRDTs, syncing, and the like, but I'm having a ton of fun with it so far.| bytes.zone
and now for something completely different| bytes.zone
When I've been thinking about sync for tinyping, I've been using off-the-shelf CRDTs (mostly Automerge.) But thinking about it from very simple principles, I don't need all that. Tinyping can be broken down to:| bytes.zone
I've been working on tinyping for quite a while now, in various forms. Six or seven months, in fact. I feel frustrated that I don't have anything usable to show for it. When I stopped doing thing-a-month, I wrote:| bytes.zone
Despite not talking about it much, I'm continuing to work on tinyping. In the spirit of working with the garage door up, you can try an extremely early version at app.tinyping.net. It mostly works, though! Pings are scheduled and stored appropriately, and you can edit tags for them. It also follows the Automerge project's advice on how to best structure documents to avoid the main document growing and growing forever (it stores pings in journal documents, one per month.)| bytes.zone
In what is platform engineering?, I gave this definition:| bytes.zone
Today I'm starting my third1 platform engineering job. During the interview process, I had a few people ask me what exactly a platform engineer does, and I realized that…| bytes.zone
In early September, I'll be starting at PayNearMe as a platform engineer.| bytes.zone
delicious lettuce in the basement| bytes.zone
A couple people have asked me for my impressions of Nomad. I used it a little bit back before 1.0, but haven't touched it for ~8 years so I'm going in with relatively fresh eyes.| bytes.zone
Welp, I accidentally deleted my Kubernetes cluster. I was messing around with Hetzner Cloud and Nomad trying to figure out if they'd be a good fit for what I'm doing and ran a terraform delete thinking it would just affect my Hetzner machines. Turns out there's a good reason that the delete subcommand is disabled by default in Terraform Cloud.| bytes.zone
thing-a-month (awareness)| bytes.zone
tinyping's stack| bytes.zone
I spent this week doing two things:| bytes.zone
figure out how you're spending your life| bytes.zone
Just a quick note: I just made elm-duet public and released v0.1.0.| bytes.zone
I'm going to have to stop doing thing-a-month. I really love it as an idea, but it's not working out so well for me:| bytes.zone
type syncing between Elm and TypeScript| bytes.zone
elm-duet| bytes.zone
Let's talk about tinyping. The thing-a-month project is meant to be a thing a month, full stop. But sometimes life gets in the way: between illness and a long-scheduled and much-needed vacation, I didn't have the time I needed to do a good job on tinyping in March.| bytes.zone
Hello hello! Today is April Cools, which is like April Fools but for posting stuff outside what you normally write about instead of unfunny jokes. Hope you enjoy!| bytes.zone
making cool stuff in a time-constrained way| bytes.zone
I’ve been pretty heads down trying to get the first version of tinyping done this week. Here are the highlights:| bytes.zone
So, a little news to start: I decided on a name for this project and bought a domain. tinyping.net is now receiving traffic (but just linking back to bytes.zone for the moment.) But today I want to write about the ideal architecture!| bytes.zone
I got to thinking about how pings work in this system (last post and realized an optimization. Right now I'm treating them as though they're all the same size—that's safe because of the law of large numbers, remember—but they're not all the same size! Time varies between pings.| bytes.zone
messing around with statistics| bytes.zone
Well, it's March 4 already, so it's about time to wrap up the first month with a short post. What'd I get done this month? Well:| bytes.zone
I've been setting up a personal Kubernetes cluster recently.| bytes.zone
This week has been wild but I've got an update: I'm now That Person who has a static site blog running on a Kubernetes cluster. 😆| bytes.zone
I got Woodpecker working, but the first job I did (a nix build) totally froze up the whole cluster for like an hour and a half, and didn't even complete successfully. Pretty yikes. Looking at this realistically, I don't want to buy the size nodes that I would need to do this properly, so it probably makes sense for me to use a hosted service (probably just a free one!) If I had a bunch of money to throw at this problem, though, I'd probably use Woodpecker. It was pretty nice!| bytes.zone
which CI solution should I use?| bytes.zone
So this morning was shaving yaks. (I mean, what infrastructure project isn’t?) I got up thinking I’d spend a couple hours before work setting up Keycloak, but then I realized that it needs a Postgres database for a proper setup, so I comparison shopped Postgres operators. But in testing out my choice, I realized that the region I deployed the cluster into doesn’t have support for NVMe drives. No good for databases!| bytes.zone
Over the past few days I've been working on getting Kubernetes serving apps. As of this morning I have a sample web app (the Kubernetes guestbook example, minus Redis) running on my cluster, frontend by a load balancer, and with a certificate provisioned by Let's Encrypt to communicate with CloudFlare, who terminate SSL from the browser with their own cert.| bytes.zone
I talked to a few people yesterday—it sounds like Kubernetes is where it's at. I really enjoyed Nomad back in the day, but it looks like I'd have to do a lot of roll-your-own, which kind of negates the benefit of operational simplicity for me.| bytes.zone
The first thing on my "meta" list is to get my house in order with how I deploy things. Right now I have a single VM in DigitalOcean that runs my blog, git.bytes.zone, and a couple other smaller static sites. (See clown computing.)| bytes.zone
kicking off thing-a-month| bytes.zone
Hi out there to any folks subscribing via RSS! You probably got a bunch of posts in your feed reader just now that had to do with an exploration of starting a business I did in August of last year. And with the next post in your feed, you're going to start getting more like that.| bytes.zone
setting the stage for the rest of the project| bytes.zone
Time passes (almost a month this time) and I'm back. Enough time has passed that it might make sense to start over from the beginning, but this time I actually have an idea of the product that I want to make: I noticed that in almost every instance where formal methods come up online, there is at least a subtext of "but how do I actually get started in this?" I think I could help there!| bytes.zone
So I recently learned about Dafny. From my notes on it, I summarized it as:| bytes.zone
Ok, it's been about ten days since I last worked on this project. In the intervening time I've been working on some custom software to do time tracking in the way I want, so I haven't been focusing on this. But, you know what, it's Wednesday night and time to party! And by "party" I mean "search the web for people talking about property testing". SO GRAB YOUR CYBERDECK AND LET'S HACK ON.| bytes.zone
Before I just jump into finding communities around property testing, I wanted to try and do a cold answer of the launch FTW questions in lesson 4 (which I've been putting off since… June 26th? Shorter than I thought, actually.) Anyway, here they are, along with my answers (cleaned up slightly.)| bytes.zone
As promised, it's tomorrow and I'm brainstorming more audiences. In addition to including things where I have an advantage, this time I'm trying to be as specific as possible without limiting community size. I want to be able to read posts and interact with people regularly, so let's say an ideal size would be having a post per day or more.| bytes.zone
I'm currently in a "business hack and chat" meeting with some Recurse Center alumni! I'm gonna spend 45 minutes looking for people chatting about improving with formal methods (instead of just using the term colloquially or publishing papers about their use.) My hit list: look around on subreddits, then look in some tool-specific forums to see if there are newbies there. I'm thinking Alloy and TLA+ to start, but maybe I'll find more around the edges.| bytes.zone
After asking around, it turns out that people "in" the formal methods community aren't really that numerous and don't seem to hang out a lot online, or they hang out in tool-specific places. I get the feeling, though, that that's just where the experts hang out… what about the beginners? People struggling to get their heads around what they want to do? Where can they be found? Same question about people looking to hire or buy services—is that LinkedIn? Somewhere else?| bytes.zone
I've felt a little stuck for the past couple of days. There's a couple parts to this:| bytes.zone
Ten threads. Let's go.| bytes.zone
Lesson 4! This one asks things like "What's one thing that people need to know, but don't?" and—I'll be honest here—I don't know them for my chosen audience. I don't really interact with the Ruby/Sorbet crowd outside my coworkers. In fact, that might be a part of why I think it sounds nicer: I don't see any silly drama or encounter many jerks when I'm working in Ruby-land.| bytes.zone
Gooooood morning! Today I'm gonna try and calculate how many sales, subscribers, visitors, etc I need to hit my financial goal for this project. The roadmap PDF says that, for a mid-range product at $49, you end up needing 28 visits and 5.6 subscribers a day, and 17 sales per month to end up making $10k in a year. I know from launching other small products that sales tend to bunch up around the public launch(es) so it's realistically more like 10k visits and 2k subscribers in a short period l...| bytes.zone
Lesson 2 is fairly light, but has an important lesson. Big takeaway: learn what people need, want, and are willing to buy. (That was the first rule last time, as well.) I like the framing of "find misery and fix it." This is familiar to me from 30x500, but getting a compressed version like this helps me see the process at a high level!| bytes.zone
OK, doing lesson 1 this morning.| bytes.zone
I'm kicking off my microposts (less-edited, ephemeral, subject to disappear at any time) by saying that I'm about to try out launch ftw again. I tried this once before and bounced off of it because I didn't find an audience I felt I could commit to. I'm trying it again because I watched a video of the instructors, Amy Hoy and Alex Hillman, and they talked a lot about the first step not necessarily being permanent or needing to be the best thing ever, but rather to just try and see where it go...| bytes.zone
Messages on the network can be dropped or delivered out of order. How do we model that?| bytes.zone
what is the randomart image for?| bytes.zone
signing commits with SSH keys| bytes.zone
PAGNI, the opposite of YANGI| bytes.zone
chasing out edge cases in a schema| bytes.zone
Making models in Alloy is fun and useful!| bytes.zone
Distributing the Great Backyard Bird Count| bytes.zone
CSS! So full of fun!| bytes.zone
Checking my assumptions about syncable data structures| bytes.zone
making user experience more consistent| bytes.zone
tsort| bytes.zone
Trying and Failing to Implement Artificial Ignorance| bytes.zone
mk strs shrt, lik ths| bytes.zone
temporal properties in Alloy| bytes.zone
the dystopia I chose| bytes.zone
moving genrules to library rules| bytes.zone
A very crashy crash course on Buck 2| bytes.zone
Understanding Git better by using lightweight formal methods| bytes.zone
Understanding Git better by using lightweight formal methods| bytes.zone
Understanding Git better by using lightweight formal methods| bytes.zone
multiple cursors for the win!| bytes.zone
ensure an action always fires if it's able| bytes.zone
using Alloy's fucntions to clarify intent| bytes.zone
fields as sets| bytes.zone
spoiler: it's for testing Alloy itself.| bytes.zone
Analyzing my Obsidian vault to find the most connected notes.| bytes.zone
The Value of a Model is More Making than Having| bytes.zone
Observing growth in my notes without being overwhelmed.| bytes.zone
Making more accessible tables| bytes.zone
Projects| bytes.zone
a remote-first build system| bytes.zone
model all the things!| bytes.zone
stop throwing away plastic| bytes.zone
staff engineering at NoRedInk| bytes.zone
search by AST nodes instead of strings| bytes.zone
How to apply the rules, and an invitation to make your own.| bytes.zone
Stop guessing you'll need stuff later!| bytes.zone