Christian Grøngaard
banner
hamburger.cloud
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.
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...
October 17, 2025 at 9:55 AM
Now that's what I call vacation
August 4, 2025 at 11:06 AM
Reposted by Christian Grøngaard
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.
www.sanity.io
May 8, 2025 at 4:43 PM
error TS6133: 'someVariable' is declared but its value is never read.

That's terrible. Better fail the whole build immediately.
April 27, 2025 at 5:13 PM
Partial solar eclipse, March 29, as seen from Denmark (through the right glasses)
March 30, 2025 at 3:40 PM
Found my Wolfenstein 3D floppy
March 16, 2025 at 9:01 AM
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
March 15, 2025 at 6:14 AM
It's so good.

And... psst... guess what's driving the behaviours in and around the code block: www.portabletext.org/concepts/beh...
March 14, 2025 at 7:26 PM
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...
www.last.fm
March 8, 2025 at 3:24 PM
My MacBook from 2007. Still boots. And I still hate computers.
February 23, 2025 at 9:24 AM
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.
February 8, 2025 at 4:19 PM
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!
February 4, 2025 at 1:31 PM
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 that restricts the editor to one block.
February 3, 2025 at 4:03 PM
Why is the first cup of coffee always an emergency?
January 23, 2025 at 7:20 AM
Trying to use Copilot for a simple, boring task
January 14, 2025 at 5:48 PM
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...
January 9, 2025 at 1:48 PM
Me releasing I've spent the past 10 years writing JavaScript full-time
January 5, 2025 at 7:23 PM
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?
January 2, 2025 at 6:44 AM
I keep toggling bold on and off again
diagonalize
January 1, 2025 at 12:21 PM
Reposted by Christian Grøngaard
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
December 19, 2024 at 1:22 PM
So proud of this and can't wait to take it even further.
sanity.io Sanity @sanity.io · Dec 18
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...
A block content editor that loves you back | Sanity
The Portable Text Editor is a powerful, customizable editor for authoring rich text and block content. It can now be used in any project.
www.sanity.io
December 18, 2024 at 9:15 PM
git: I'm dying

me: git checkout -b docs-fix-typo-2
December 17, 2024 at 11:32 AM
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
December 10, 2024 at 8:45 AM
Two-step username/password forms

Can we please stop with that
December 8, 2024 at 10:00 AM
React v19 *just* dropped and @codey.bsky.social already made sure our Portable Text Editor is up-to-date 💙

github.com/portabletext...
GitHub - portabletext/editor
Contribute to portabletext/editor development by creating an account on GitHub.
github.com
December 6, 2024 at 6:11 PM