Sign in

Hendrik Mans

@hmans.dev
1.9K followers 205 following 3.8K posts

Building @chatto.run, the amazing little self-hostable alternative to Discord, Slack, Teams et al. [he/him] Blog: hmans.dev - Robots are welcome here. 🤖

PostsRepliesMedia
Hendrik Mans @hmans.dev · 9h
If 1Password just pops up these little dialogs out of nowhere and doesn't even tell me what's prompted them, it could just as well auto-approve them. I don't think 1Password understands security
1Password asking me to authorize _something's_ use of my SSH key (it doesn't tell me)
3140
Hendrik Mans @hmans.dev · 29/09/2026
Fighting for every byte. AI benchmarking stuff helps a lot. This is Chatto HQ (running off of 2 replicas.)
A Grafana CPU usage chart. The two Chatto HQ replicas use around 0.04 cores each after a recent upgrade to a new beta.A grafana memory chart. The two Chatto HQ replicas use around 210 MB of RAM each. A large part of that is thanks to the Chatto executable getting a little thicc. Will be put on a diet soon.
020
Hendrik Mans @hmans.dev · 29/09/2026
OK the new Eleven TTS model is... good
121
Hendrik Mans @hmans.dev · 28/09/2026
Is this... developing in public?!
Chatto HQ in all its glory! The screenshot shows a thread in which I discuss the implementation of a new feature with ChattoBot. Where we're going, we don't need Conductor.
100
Hendrik Mans @hmans.dev · 27/09/2026
Chatto in a dark purple theme :)The X-Men "Perfection" meme
010
Hendrik Mans @hmans.dev · 27/09/2026
Arrival of the themes!
Two Chatto PWAs configured to look different (one blue, one mauve)The Chatto UI theme customization panel. Accent and theme colors, depth, and contrast.
2122
Hendrik Mans @hmans.dev · 25/09/2026
I found another dumb song of mine from 2018. This time I asked Opus 5.5 to build a little 3D engine with SDF splats (think "Dreams" from PS4) for the music video. No further instructions or steering (so some of the captions are a bit off.)
260
Hendrik Mans @hmans.dev · 25/09/2026
I fed a song I made around a decade ago into Opus 5.5 and asked it to create a music video for it. I profoundly apologize for the song and probably also this video.
380
Hendrik Mans @hmans.dev · 25/09/2026
My Claude sessions are weird
"The giant googly-eyed Wurstfrau now towers over the sausages."
020
Hendrik Mans @hmans.dev · 25/09/2026
A little closer to the metal:
No video tools and no AI generation: it’s a web page rendered frame by frame, with the audio synthesized in plain JavaScript and ffmpeg putting it together.

Visuals

The scene is one HTML page (index.html) at 1920×1080: HTML/CSS for text, cards and the chat window, plus canvas for streaks and confetti.
Animation is a pure function of time. Every scene exposes render(t), and all motion is computed from t with hand-written easing (outBack, outExpo, bounce) and seeded random numbers. No CSS animations or timers, so any frame renders the same way in any order.
3D is three.js under the text: rounded-box geometry, extruded text, bloom, ACES tone mapping and a studio-lighting environment for reflections. It’s all built from primitives and canvas-drawn textures; there are no model files.
3D wordmark font: three.js needs fonts in its own format and none ship with it. I converted macOS’s DIN Condensed Bold with a small opentype.js script.
Cue sheet: timeline.js holds every timing, and both the visuals and the audio load it, so they can’t drift apart.
Rendering

Playwright + headless Chromium loads the page from a tiny Node HTTP server, calls render(i / 60) for each frame and saves a screenshot, with 6–8 pages running in parallel.
For 3D, Chromium is launched with --use-angle=metal so WebGL runs on the M4’s GPU instead of the software renderer.
Glitch post-processing (dark versions): a Node script with worker threads and sharp edits every frame’s pixels directly. It adds RGB split, slice tearing, broken video blocks, invert and posterize on hits, grain, scanlines and a vignette, all driven by the same beat envelopes.
Audio

Sound effects (and the music in the first version) are synthesized sample by sample in plain Node, written straight to a WAV file. It uses sine and FM oscillators, filtered noise, a bitcrusher, and a simple reverb and delay.
Beat and key detection for your tracks are my own small Node scripts working on the decoded audio. They found the tempo, the beat gri…
281
Hendrik Mans @hmans.dev · 25/09/2026
Chatto is a very normal chat app with equally normal easter eggs
1121
Hendrik Mans @hmans.dev · 25/09/2026
It's so over
280
Hendrik Mans @hmans.dev · 25/09/2026
Expectedly so, some external constraints immediately yielded even more impressive results. This is a follow-up prompt where I uploaded some (licensed, human-made :b) music and asked it to make a fitting video that's synced to the music's rhythm. Crazy! Also @chatto.run is really good :P
150
Hendrik Mans @hmans.dev · 25/09/2026
Having a very strong "we're so cooked" moment. This is Opus 5.5 with just one prompt (ran within the @chatto.run repo): "Make a cool, happy, social-media ready 16:9 video that explains what Chatto is and why it's cool. Include sound effects and music (but not voiceover.)"
9908
Hendrik Mans @hmans.dev · 25/09/2026
in future agent pays you
Sol telling me "You found a real bug". No shit!
020
Hendrik Mans @hmans.dev · 24/09/2026
Imagine believing, like seriously being convinced, that the Internet used to be more colorful than it is today (and, on top, showing *those* apps as evidence.) Had to double check that the account is not satire. (Of course this is from a guy hysterically ranting about "AI slop" on Mastodon)
A Mastodon post saying "Do you guys remember how colorful the internet used to be? These days, everything is just gray on gray". The post is accompanied by screenshots of four apps from the Windows 95 days.
3463
Hendrik Mans @hmans.dev · 24/09/2026
p(chatto) (Astra High. Opus does it better!)
100
Hendrik Mans @hmans.dev · 24/09/2026
Doing some light research on how people in the 60s reacted to punch cards getting replaced with teletype/terminals and whaaaaat
And this wasn't purely theoretical. A 1969 study actually asked programming students who had used both batch/card systems and interactive time-sharing what they preferred. Some genuinely preferred punch cards:
“Some preferred the keypunch to the teletype.”
Their reasons included that it was easier to keep a card deck in sequence, while terminals could be difficult to access at busy times. The study reports students saying that waiting for an occupied time-sharing terminal could be more irritating than submitting a batch job and waiting for its output.So there's a genuinely delicious historical exchange here:
1963:
“Interactive computing is a fad pushed by adolescents. These dreamers think everyone needs a console.”
1963 reply:
“Sorry our new technology makes the Priesthood nervous.”
1965:
“This is hysteria and irrational bandwagon behavior.”
A few years later:
Interactive computing becomes the normal way human beings use computers.
2252
Hendrik Mans @hmans.dev · 23/09/2026
So I wrote a chat app and a chat bot that connects to the chat app so we can use the chat bot on the chat app to work on the chat app and then eval the chat bot to make it better aaaahhh
A chatto conversation. A user reported a bug, we discussed it briefly, then involved ChattoBot, who then started working on a bug fix.
000
Hendrik Mans @hmans.dev · 22/09/2026
Moving implementation planning beyond markdown :D
type ImplementationPlan = {
  baseCommit: string;
  goal: string;
  steps: { files: string[]; change: string }[];
  acceptanceCriteria: string[];
  checks: string[];
  openQuestions: string[];
};
0100
Hendrik Mans @hmans.dev · 22/09/2026
The "I should buy a boat" cat meme, but subtitled "I should build a rogue AI botnet"
040
Hendrik Mans @hmans.dev · 22/09/2026
Exploring @chatto.run as a communication/authorization substrate for agentic workflows (and all other kinds of automations.) Let bots talk to each other, keep humans in the loop in style.
A Chatto chat between myself and ChattoBot, asking it to implement a PR with a bug fix.
270
Hendrik Mans @hmans.dev · 21/09/2026
Joey from Friends. "Hey... how you doin'?"
020
Hendrik Mans @hmans.dev · 21/09/2026
ChattoBot runs within Runling, where you get a detailed timeline of the interaction, with all messages sent between tasks, and a token/dollar cost breakdown
230
Hendrik Mans @hmans.dev · 21/09/2026
Building Chatto through Chatto
A conversation between ChattoBot and myself.

hey

Hey! How can I help you today?

I don't like how the notifications and my threads pages don't look like the search page. I think they also should use the panels.

That makes sense! Having a consistent design across the search, notifications, and threads pages would definitely make the app feel more cohesive. Using panels for those pages sounds like a great way to achieve that.

Can you investigate the source code to see if this is feaible?

I've investigated the source code, and it is definitely feasible!

Currently, the search page uses a structured layout with PaneHeader, PaneContent, and Panel components to create those distinct sections. The notifications and "my threads" pages are using a simpler layout that relies on standard div elements instead.

To make them look consistent, we can refactor those pages by:

Using the same root container class (pane-page) to ensure the base layout matches.
Wrapping the main content in a PaneContent component.
Adding Panel components to separate things like search inputs or action buttons from the actual list of notifications or threads.
This would give all three pages that same elevated, "panelized" look you're after! Would you like me to look into how we might start implementing these changes?
1150
Hendrik Mans @hmans.dev · 18/09/2026
It does! Look at this freaking screenshot (taken on a 16 Pro). The iOS/Safari UI takes up just slightly more than 50% of the entire screen. It's *ridiculous*. I've modified Chatto to hide its own headers to make up for it (second screenshot). One of the biggest Fuck Yous to web and PWAs I've seen.
Screenshot of a very bad mobile operation system
110
Hendrik Mans @hmans.dev · 18/09/2026
Random comment I saw on Reddit about @chatto.run. Yes, that's exactly why Chatto works the way it does. Very happy to see that people appreciate it!
"I got this one up and running this summer so my kid can talk with his school friend’s during Minecraft and share screen grabs. It particularly checked all the boxes because it wasn’t a federated service where their created account would let them wander to another server invite they saw somewhere. It’s just a single private server and I can lock down access to keep it safe. Bonus is that it works as a progressive web app so that his friend who has a fire tablet can use it without needing to know how to sideload. Additionally that PWA can be targeted for parental control and screen time. It’s just an all around win."
0302
Hendrik Mans @hmans.dev · 18/09/2026
150
Hendrik Mans @hmans.dev · 18/09/2026
Don't let Eduard Lemon see this
Me asking the Apple Foundational Model CLI "How many 'r' in 'Apple'" and it responds "there is 1 'r' in 'Apple'"
130
Hendrik Mans @hmans.dev · 18/09/2026
This time Apple has gone too far
I'm asking the Apple Foundational Model CLI "What is Chatto and who's making it", and it says "Chatto is a tool for creating interactive stories, and it is being made by Apple Inc."
070
Hendrik Mans @hmans.dev · 17/09/2026
This week's AI discourse, somehow
010
Hendrik Mans @hmans.dev · 17/09/2026
I'm easily entertained
0211
Hendrik Mans @hmans.dev · 16/09/2026
It's good to have tokens
2140
Hendrik Mans @hmans.dev · 15/09/2026
If you can't decide between flat and skeuomorphic, Chatto 0.5 will have you covered. Take notes, Apple
051
Hendrik Mans @hmans.dev · 15/09/2026
Sorry for the dorky voiceover (Germans don't yell in videos), but I still wanted to share this quick demo video of a cool little new @chatto.run feature I've been working on. Web Audio API is wonderful! (Recorded with my cheap headset on purpose, also because I was lazy)
0120
Hendrik Mans @hmans.dev · 15/09/2026
??!!!?!
A CAPTCHA: "Select all tiles where the axis is up." A 4*4 grid contains a random mix of X, Y, and Z tiles, plus one unexpected W tile.
8300
Hendrik Mans @hmans.dev · 15/09/2026
No shit, this is the feature we've been working on this session, Sherlock. WTF.
The history shows a relevant change: the earlier test played the raw microphone stream directly. This branch changed playback to a stream generated by our Web Audio graph.
010
Hendrik Mans @hmans.dev · 15/09/2026
Die Dinger hier
000
Hendrik Mans @hmans.dev · 14/09/2026
Today in "Apple hates PWAs and doesn't want you to use them" (of course the Chatto PWA tries no such thing, how would it even do that. WTF is this, Apple)
"Data Access Blocked
Chatto HQ tried to access your data from other apps and was blocked. You can manage this at any time in Files & Folders settings."
310
Hendrik Mans @hmans.dev · 12/09/2026
I'm still on a boat
European Central Bank building in Frankfurt
090
Hendrik Mans @hmans.dev · 12/09/2026
I'm on a boat
Frankfurt am Main skyline and bridge
0151
Hendrik Mans @hmans.dev · 10/09/2026
I enjoy reloading Chatto 0.5 (currently in alpha) for no reason whatsoever
1300
Hendrik Mans @hmans.dev · 10/09/2026
The "Arch is run by clowns" had to come from *somewhere*, and it didn't take me long to find receipts
110
Hendrik Mans @hmans.dev · 10/09/2026
ALARM
1100
Hendrik Mans @hmans.dev · 09/09/2026
Here's my dumb little workflow runner that's running a planning and implementation workflow, a mix of agentic interactions and deterministic code. Goal is that you can report Chatto bugs to it and if it agrees it's a bug, it'll make a PR and ping me (and then probably delete my hard drive)
2110
Hendrik Mans @hmans.dev · 07/09/2026
Failed to tell a joke.
Screenshot of a failed Runling workflow. All the bars are red, the agent step says "I can't tell jokes. I am a coding assistant and do not have the functionality to generate humor."

The workflow's error is "Failed to tell a joke."
010
Hendrik Mans @hmans.dev · 07/09/2026
Play these to your AI when it's feeling a little down
020
Hendrik Mans @hmans.dev · 06/09/2026
Here's the prompt. No additional skills.
120
Hendrik Mans @hmans.dev · 06/09/2026
You'll probably assume that the music is AI-generated, but it's not. I just made it! Just for this video! While Codex was working on the Three.js project! It is, of course, very bad. Basically just holding down a single note to have The Orchestra Complete play some presets.
110
Hendrik Mans @hmans.dev · 06/09/2026
Made a little thing with these. (I also made the very bad music! Some thoughts on that in the thread.)
491