§ Stream
Oh, and the lean
packaged in Doom Emacs appears to be the Lean 3 Mode. So you can’t use that, and instead need to use the Doom Emacs section of lean4-mode.
Trying Lean
Day 2 of the Zurihac 2025, and I’m trying out Lean.
As regularly is the case, since I’m on NixOS, things don’t work directly out of the box.
This guide in particular doesn’t work anymore since the official Nix Flake got deprecated.
Luckily, there is a new one that just works™.
Up to some Functional Programming with it.
Currently at ZuriHac setting up a PureScipt development environment with Nix—and of course, it’s not issue-free.
nix shell nixpkgs#purescript nixpkgs#spagospago initspago build
errors. (Throws a pretty cryptic git error.) You need:
nix shell nixpkgs#purescript nixpkgs#nodejs_24npm install spago@nextnpx spago initnpx spago runnpx spago test
That works!
Local-first conf day #1
Aaand I’ve just had my first day at local-first conf!
What a great crowd.
My day started with talks about some pretty nice topics, followed by a lunch with an absolutely amazing range of topics.
We went from Clojure to Emacs to Semantic Zooming to Simon Willison to llm
to Bret Victor and Dynamicland (and a new talk of him being online!), to Stephen Wolfram‘s personal setup, all interleaved with local-first stuff.
And that was only until just after lunch.
<3
Local-first Unconf
I just came home from my first day of Local-first Conference—the less official Unconference part, and I had a pretty great day.
I’ve worked a bit more with jazz.tools, and had so many interesting conversations.
Today, I:
- read Project Cambria
- thought a lot about bidirectional lenses
- learned where the Software as Aircraft Carriers, not Bicycles quote is coming from
- got reminded of Darklang
- learned more properly about iroh
- and got reminded of how weird/hard Schema Migration and Identity actually are.
10/10.
Can recommend.
😁
Productivity
Over the last few weeks, I’ve grown more and more unocomfortable with the amount of different tasks I’ve been keeping in my head right now. I played around with a bunch of todo apps, and none of them has been really satisfactory.
All I want(ed) is a an app with:
- fast UI
- nice search with filtering
- nice search for scheduling
- I can use as my inbox for everything, also things to read. It should integrate with the sharing menu of my phone.
- I can use from anywhere I can access the internet
- I can use without Internet
- That never, ever produces any sync weirdness between devices.
Shouldn’t be that hard, right?
So far, it sounds like I probably could make Amazing Marvin do what I want.
But I’m definitely also using this as an example application to try out local-first software frameworks.
https://stopa.io
I’ve just reread some of Stepan Parunashvili’s articles, and damn, he’s good.
He talks about local-first software(here), Antifragility (here), and progress. Gotta love it.
nix-tree
I just learned about nix-tree
. What a nice tool!
It shows you a searchable dependency tree of your flake(s) + their sizes: Super nice to analyze what’s taking so long when you’re rebuilding your home environment, for example. (It was my humongous nvf config)
You can run it like this:
nix run nixpkgs#nix-tree
Roaming the Web
I’ve just had my latest hour-long Roaming the Web-spree. It started off with reading this great article on relationhips (How Relationships Actually Work), and went on with me reading half of her blog.
Then I found out she’s together with Eliezer, which made me go reading some nice LessWrong articles.
Specifically those two from Duncan Sabien:
It’s probably fair to say I’m in the general vicinity of an Information Monster.
Mastering 42
When first encountering this whole Writing Online idea, I really didn’t consider myself a writer in any capacity.
I even thought something among the lines of “Wow, that would be crazy”/“Wow, that would be so not you.”
Well, turns out when I thought that I forgot I had already been writing courses for the Hacker School and walkthroughs/guides for 42 School for quite some time already.
Brains are interesting.
Progress Bars
One of the pretty nice things about writing my own Digital Garden is how much I’m able to just implement everything I would’ve liked to have on other websites.
I’ve just implemented something I really would’ve liked to have on other websites:
A reading progress bar that indicates both the progress and the total reading time of the note by highlighting the part of the bar that you can currently see.
It’s a relatively minor thing, I know—but what can I say: I really like those small and simple solutions.
Cryptocurrencies
Aand he got me convinced to at least give Cryptocurrencies another chance:
Why Cryptocurrencies is on my reading list now.
Optimizing around
Lately, I had the impression that my workflows somehow stabilized.
I’ve been relatively happy with my window manager combined with gnome-magic-window, and haven’t been tweaking my keybinds for applications much lately.
I’ve been using Doom Emacs for quite some time now and spend less and less time customizing some behavior of it.
Compared to this, my keyboard layout feels almost completely stable with only minor changes in the whole of 2024, for example.
But lately, I’ve feel like I’ve hit a few ceilings at the same time—and now
- I can type
-
and_
faster -
vsplits
are more natural in Emacs - Moving around S-Expressions is cleaner
- And for the first time in ages, I now play around with pure, non-Home Row Mod Shift buttons on my keyboard.
Well, what can I say? I do like being in a state of Flow—and am definitely willing to pay the price for it.
CSS Weirdness
I just corrected my <CodeBlock />
component and it inexplicably blew out of its enclosing element.
Nothing ordinary helped until I found this comment.
CSS is, indeed, quite weird sometimes.
(The problem is that grid
s try to accomodate to the size of their elements. The solution is to apply min-w-0
to all of the elements.)
Oh, and it also doesn’t have a REPL nor a typeof function by default, as far as I can see.
May this help me for now:
type theType = TheType
let t = (thing: theType) => { thing }
t("hoho")t(5)t(5.)
Pedantic Typers
I’m currently and finally getting my feet wet with ReScript.
And I must say, I really do like what I see so far. The website is clear about what you get, the Docs look nice, and it’s got good and readable error messages.
But what on earth is this?
@react.componentlet make = () => { let (count, setCount) = React.useState(() => 0)
<div className="p-6"> <h1 className="text-3xl font-semibold"> {"What is this about?" -> React.string} </h1> <p> {React.string("This is a simple template for a Vite project using ReScript & Tailwind CSS.")} </p> <Button onClick={_ => setCount(count => count + 1)}> {React.string(`count is ${count->Int.toString}`)} </Button> </div>}
Yep, you see that right. One has to explicitly cast every string
to a React.string
.
(Sounds like it’s due to it not having the ability to form Union Types with Base Types. Hmm.)