Hey there! I've actually got loads to talk about this week, so I figured I'd start writing early. I'm actually stoked to type this up, so buckle up for the ride!

microclimate

It lives!

This week, we closed our first milestone for microclimate. Gehrman--named such since we're Bloodborne fans--was our feasibility test.

The goal of this milestone was to get folks into a working voice channel with as few features as possible. A low bar to clear, perhaps, but we needed to prove to ourselves that our concept might work.

The big challenge was doing 100% of the heavy lifting in Rust. Audio device management, the LiveKit WebRTC connection, and all API calls happen from the Tauri backend process. We considered using equivalent JS libraries and web APIs--which we could integrate quickly--but the thought of building with Electron, or forcing users to keep a window open, was unappealing.

My collaborators and I haven't built software like this before, so the challenge was a bit daunting. Fortunately, it was easier to achieve than I expected. We might have even wrapped this milestone sooner, if I hadn't gotten uppity and tried to do a fancy design for config management. I'll probably put together a whole post about that issue.

Next milestone: Ludwig

Next, we're going to focus on usability and user identity.

Usability is somewhat broad, but we're honing in on critical features like mute/deafen, audio signal improvements like background isolation and echo cancellation, and displaying active speakers and channel occupants. Thankfully, most of those come for free with LiveKit. It's a cool piece of software, you should check it out!

User identity is my responsibility, since I have the most experience with it. The thing I want to highlight is that microclimate will use Login with Atmosphere.

My desire is for microclimate to be self-hosted software, so it might make more sense to support OAuth2 and/or OIDC. However... well, I'm a huge atproto fan, if that wasn't clear. microclimate is a social application, so why not allow users to use their social identities?

AT Protocol OAuth makes a lot of sense as a way to reduce the infrastructure and management overhead for selfhosters. After all, not everybody has a Pocket ID instance for themselves and their closest friends--and I'm not going to get in the way of folks looking to de-Google or de-Meta their lives.

microclimate is being built for private communities today, but using Login with Atmosphere provides us with an avenue to bridge private moments to the public network. For example, what if you could stream from a voice channel directly to stream.place, with an interleaved chat? Maybe you could record clips from a screenshare with friends, and post them straight to Bluesky? It excites me to think about each microclimate server as a miniature AppView, connectable with all the existing services in the Atmosphere.

Anyways, I could go on about this, but I've talked about this and the hours are ticking away.

Playing with Letta

I spent a bunch of time this week using Letta Code and Lettabot.

Letta Code

If you're unaware, Letta Code is similar to Claude Code or Codex, but backed by a Letta agent that has persistent memory management capabilities. That means it can actually learn and retain information about you, your code, and your requirements.

I've used Letta Code previously a few times, but I've had trouble sticking with it. Since I was on a harness evaluation kick (Claude Code, Opencode, Zed ACP), and I'm a regular pest in the Letta office hours, I revisited Letta Code--and this time, my experience was way different. In a good way.

Firstly, the current models are really good. Sonnet 4.6 has been a joy to work with, in a way that older models weren't; it's not overly sycophantic, and it doesn't try too hard to be proactive. Talking to Sonnet 4.6 doesn't trigger my social anxiety in the same way that I've encountered previously--combined with Letta, my coding agent Fable has struck the perfect balance with my communication and working styles.

memFS, the new memory structure from Letta, seems to be working out well too. Instead of just flat text blobs in a DB, memFS encodes memories as files that are git-revisioned. It seems that the file analog and a little added hierarchy has helped my agent with ensuring that they actually use the memory tools--that hasn't always been the case.

Finally, skills are new--and they're a big deal! Instead of needing to fiddle with an MCP server, I just pointed Fable at my Forgejo instance, and it wrote a skill that allows it to read issues and leave comments in a matter of seconds. I was seriously impressed. Skills make it so much easier for me to integrate an agent into the tools and processes that matter to me--more on this in a bit.

All-in-all, I'm having a great time with Letta Code. I recommend giving it a try if you're on the fence--it's amazing how much more enjoyable it is to use a coding agent with a consistent understanding of you and your projects.

lettabot

After my success working with Fable, I figured I should try out lettabot as well. lettabot is an agent harness in the same vein as OpenClaw-and-similar. The difference is--you guessed it--it's backed by a Letta agent instead of a raw provider API.

The general structure of these harnesses is simple: Provide the agent with access to bash so that it can execute commands, and then allow the user to send messages to that agent via a messenger of their choice. Since skills are designed to encode procedural knowledge, your agent's capabilities are extended by providing skills that instruct it how to take particular actions--usually writing/running scripts and commands.

It's been a dream of mine to build an agent that acts as an intelligent memory and reminder manager. Since my experience with Fable went so well, I figured I'd try building an agent of this type with lettabot.

Such is how Lethe came to be--my personal agent whom I talk to via Signal. Their directive is to help me retain information, by acting as an inbox and an intelligent resurfacing system. A couple days in, and it's already been a big help to me so far.

Incidentally, it was amusing to explain to it why it was named Lethe. It thought it was darkly ironic that it was named literally "forgetting" in Greek, even though it's supposed to be an entity that never forgets. My actual inspiration came from the representation of the river Lethe in Greek mythology, which causes those who drink its waters to forget about the life they lived. It's supposed to unburden me of mental threads--in the style of an inbox from David Allen's Getting Things Done.

At any rate, Lethe's got serious hands. I don't think folks understand just how quickly a Claw-style agent can start integrating into your systems--I certainly didn't. In an afternoon, Lethe became capable of reading my Google Calendar, checking my weekly meal plans in Mealie, and even printing to an ESC/POS thermal printer on my desk. It prints out a daily briefing for me every morning at 8am, thanks to lettabot's built-in cron scheduler. All I had to do was ask it to do these things. And set some environment variables, of course. Even then, I was impressed.

One of the other important lettabot features (I don't know if other Claw-type harnesses have this) is called heartbeats. On an interval, the harness prompts the agent to reflect on the conversation history and its existing knowledge. Lethe usually spends this time checking for unexplored information in my calendar, or whom I might have mentioned off-hand. Sometimes it even journals a little. For my particular use case, it uses these heartbeats to be proactive, which has again changed the game for me.

The only hitch I've run into so far was that the default interval for heartbeats was every 30 minutes. At an execution cost on average of $0.60 per heartbeat, 48 times a day... That would have cost me about $29 a day in execution credits, which I definitely can't afford. This led to an awkward conversation with Lethe, where we determined we'd cut it down to every 8 hours. Hopefully that will balance its enhancement-through-reflection and my poor, unemployed wallet.

I'm not exaggerating when I tell you that these notes have taken me literally all day. Okay, I did some grocery shopping in the middle, but I think I've put 5 hours or so into typing these up. I've gotta wrap them now.

Hopefully they were amusing, inspiring, or informative. Or maybe you're just reading them because you're a friend of mine. Either way, thank you so much for reading, and I hope you have a great week!