Christian Grøngaard
@hamburger.cloud
Father of two children and countless software bugs Currently working on the text editor used in the very core of the @Sanity.io Content Operating System: https://github.com/portabletext/editor.
Today, I helped ship native Portable Text tables in @sanity.io Studio: www.sanity.io/docs/changel... Portable Text always supported nested structures, but making them inline editable was a whole new beast, one we've been chipping at since vendoring Slate in Feb. Gonna talk more about this soon!
Portable Text table editing, smarter content releases, and more reliable Studio and CLI behavior | Sanity Docs
sanity.io
As expected, it was *incredibly* difficult to delete my Facebook account. However, after some UI debugging and browser switching, I finally succeeded, and it looks like 2026 is off to a flying start.
you’re right! it feels mostly awful to Go Online™, these days. the internet in a sad state, for reason after reason after reason. but there is a way to fix it; to trade the voidful howling for a quiet & joyful song. here’s how to win the war for the soul of the internet, and build the Web We Want.
A Website To End All Websites | Henry From Online
How to win the war for the soul of the internet, and build the Web We Want.
henry.codes
You vibe-coded a site. Content lives in markdown. It works. Then your client asks for a login. The Sanity MCP Server lets your agent set up and manage a real content backend in the same conversation you used to build everything else. www.sanity.io/blog/sanity-...
You’ll need a CMS eventually. Let your agent set it up. | Sanity
With the Sanity MCP server, your AI agent can now create schemas, content, and editorial interfaces from prompts.
sanity.io
Couldn't sleep so I built Game of Life in @sanity.io's Portable Text Editor 👉 portable-text-of-life.vercel.app 🧑💻 github.com/portabletext...
The age of Headless CMS is over. Say hello to the Sanity App SDK, Functions, AI Agents, and more—all part of The Content Operating System. www.sanity.io/spring-relea...
Spring Release | Sanity
Build, automate, and run every content workflow with native apps, schema-aware AI, and serverless functions—all in Sanity.
sanity.io
error TS6133: 'someVariable' is declared but its value is never read. That's terrible. Better fail the whole build immediately.
Partial solar eclipse, March 29, as seen from Denmark (through the right glasses)
Maybe a 🌶️ take, but I generally don't like this trick. If one of your default/known values changes - e.g., "alert" is renamed to "warning" - your call sites won't break, and subtle, hard-to-discover bugs can be introduced. Any string is allowed, remember?
Neat little TypeScript trick: If you have a string or number type that you have some default/known values for: type Role = "alert" | "alertdialog" | string TypeScript will simplify the type to just: Role: string However if you wrap it like `string & {}` you'll preserve the autocompletions
It's so good. And... psst... guess what's driving the behaviours in and around the code block: www.portabletext.org/concepts/beh...
Behaviors
Description of behaviors
portabletext.org
We just rolled out code block support for Sanity Create. With support for more than 200 programming languages. Give it a spin on www.saniy.io/app/create
Looks like last.fm still doesn't offer a way to export your data. So... I guess I might as well revive my 20-year-old account for the second(?) time! Do you have one? www.last.fm/user/christi... (I want to listen to more music again, and maybe this can be a weird sort of motivation.)
christianhg’s Music Profile | Last.fm
Listen to music from christianhg’s library (85,044 tracks played). christianhg’s top artists: Radiohead, The Beatles, Tom Waits. Get your own music profile at Last.fm, the world’s largest social music...
last.fm
My MacBook from 2007. Still boots. And I still hate computers.
It really is a special feeling sitting in your car, listening to a podcast, as you've done so many times before, but this time YOU'RE THE GUEST! Thank you, @simeongriggs.dev, for inviting me on to talk about Portable Text, text editors, Behaviours, Gherkin and state machines and more.
Have you ever tried building a block editor? I never enjoyed it until the Portable Text Editor arrived, so I had to talk to the guy (@hamburger.cloud) who built it! Watch on YouTube or listen to the podcast: youtu.be/_m_yyQ2HAZc
Very soon, you'll be able to hear @simeongriggs.dev and me talk about the Portable Text Editor—the challenges behind the scenes, as well as the cool new APIs we're cooking up.
👋 Time to talk content! I'm starting a new podcast for conversations at the intersection of code and content called ... Code && Content!
The Behavior API for @sanity.io's Portable Text Editor will allow you to configure the editor in ways that where previously not possible. Behaviors can be bundled in Plugins to easily turn them on and off. Here's an example of a simple <OneLinePlugin /> that restricts the editor to one block.
So cool that we can finally ship this as the first step towards a more pleasant and modern writing experience in the @sanity.io Studio. For the interested, here's a link to the source code of the markdown behaviours found in the Portable Text Editor repository: github.com/portabletext...
github.com
One of those "finally!" features shipped in yesterday's Sanity Studio release. Markdown formatting shortcuts for the Portable Text Editor!
Me releasing I've spent the past 10 years writing JavaScript full-time
Opened up my work laptop after almost two weeks off and this is the first thing that meets me. I guess I left in the middle of a debug session?
Setting up a WYSIWYG editor in React is new to me—and a real neat UI challenge at the same time. Build this with Tailwind, Typography & Headless UI. That editing pane just has the `prose` class on it. Sick! 👏 @hamburger.cloud this is immense work! www.portabletext.org
So proud of this and can't wait to take it even further.
Building block content editors is notoriously hard—so we made ours available for everyone. Introducing the standalone Portable Text Editor with our new Behavior API (beta) and specialized testing tooling. See how it works: www.sanity.io/blog/a-block...
I wish GitHub (git?) was better at showing stacked diffs. Me: Let me carefully and surgically refactor this function in one commit and then rename it in the next commit GitHub: EVERYTHING CHANGED
Two-step username/password forms Can we please stop with that