Paul Butler

Paul Butler

@paulbutler.org

I build jamsocket.com and write digest.browsertech.com

3.6K followers686 following266 posts

Paul Butler reposted

A #Genuary design becomes a Xmas card. These cards are now on the way to participants of #ptpx25! Thank you @paulbutler.org for organising it! Happy New Year! #ptpx #creativecoding #p5js

Anya Prosvetova@anyalitica.dev

Genuary 25: One line that may or may not intersect itself #genuary25 #genuary #genuary2025 #processing #p5js #genartclub #generativeart

6th annual #ptpx by country ๐Ÿ‡บ๐Ÿ‡ธ USA โ€” 34 ๐Ÿ‡ฉ๐Ÿ‡ช Germany โ€” 16 ๐Ÿ‡ซ๐Ÿ‡ท France โ€” 13 ๐Ÿ‡จ๐Ÿ‡ฆ Canada โ€” 5 ๐Ÿ‡ณ๐Ÿ‡ฑ Netherlands โ€” 5 ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom โ€” 3 ๐Ÿ‡จ๐Ÿ‡ญ Switzerland โ€” 3 ๐Ÿ‡ฎ๐Ÿ‡น Italy โ€” 3 ๐Ÿ‡ต๐Ÿ‡น Portugal โ€” 2 ๐Ÿ‡ช๐Ÿ‡ธ Spain โ€” 2 ๐Ÿ‡ฆ๐Ÿ‡น Austria โ€” 1 ๐Ÿ‡ซ๐Ÿ‡ฎ Finland โ€” 1 ๐Ÿ‡ง๐Ÿ‡ช Belgium โ€” 1 ๐Ÿ‡น๐Ÿ‡ญ Thailand โ€” 1 ๐Ÿ‡ฎ๐Ÿ‡ช Ireland โ€” 1 ๐Ÿ‡ณ๐Ÿ‡ฟ New Zealand โ€” 1 ๐Ÿ‡ธ๐Ÿ‡ช Sweden โ€” 1 ๐Ÿ‡ธ๐Ÿ‡ฎ Slovenia โ€” 1

This post is unavailable.

When I was getting my BMath people would ask โ€œoh, what will you do with that, teach?โ€ and Iโ€™m jealous of people taking math now who can come back with โ€œyeah that or popeโ€.

Claude Code now supports resuming sessions, which means that session logs (including tool/llm calls) are stored locally. My curiosity got to me, I figured out the format and wrote a CLI tool to dump specific conversations github.com/paulgb/claud...

github.comGitHub - paulgb/claude-viewer: A tiny Rust CLI app to dump the full tool call history of a Claude Code session.A tiny Rust CLI app to dump the full tool call history of a Claude Code session. - paulgb/claude-viewer

Now that it's so easy to create software for personal use, I want a way to have a bunch of personal mini apps in a monorepo and automatically deploys all of them behind basic password auth. Before I build it, does this exist? Ideally something I can self-host on a VPS.

This is a talk I've wanted to give for a while, and I can't think of a better place to give it!

Local-First Conf@localfirstconf.com

Weโ€™re excited to announce that @paulbutler.org co-founder of Jamsocket, will be speaking at Local-First Conf 2025! Paul will explore how CRDTs can act as temporal data structures, enabling features like revision history by delta-encoding changes over time.

Very speculative question for people smarter than me: if we ran 100 replays of humanity from 1955 or so, in many is there a manned moon landing before y2k? Thinking about failure scenarios like a series of failures dampening political support, or global events destroying the necessary conditions.

This was fun to host! Weโ€™re doing it again in NYC next week, itโ€™s full but Iโ€™ve saved a few spots for people building things on MCP ;) lu.ma/mcp-nyc

lu.maMCP Lightning Talks NYC ยท LumaAnthropic's Model Context Protocol is bridging the gap between agents and applications. Join us for technical talks and hear what people are building withโ€ฆ
Jamsocket@handle.invalid

Had a blast hosting MCP Lightning talks SF with Cloudflare! Thanks to everyone who spoke. Doing it again next week in NYC.

Paul Butler reposted

SlateDB 0.5.0 is out! Features: - Checkpoints - Clones - Read only client - Split/merge database foundation - TTL filtering on reads - Last version with breaking byte format changes By the numbers: - 62 commits - 2 new contributors - 10 total contributors github.com/slatedb/slat...

github.comRelease v0.5.0 ยท slatedb/slatedbWhat's Changed Refactor Block Tests to Use Table-Driven Test Cases by @samsond in #410 Update await calls in README.md by @criccomini in #425 chore: Apply table driven test for sst.rs by @jeffreyl...

People who primarily don't use Windows, how do you test things on Windows? Thinking of getting a cheap Windows machine, but wondering if there's a cloudy way.

It seemed impossible to me that Gemini was able to decode a hidden message this fast. I finally had a chance to reconstruct the chain of thought and tool calls from logs and figure out how it did it.

Paul Butler@paulbutler.org

After my post on smuggling arbitrary messages through unicode, some people asked me if AI could decode it. Gemini Flash is pretty fast at it! Have had good luck with Claude too. So far no dice with OpenAI models. This uses block.github.io/goose/ and forevervm.com

View full thread

The encoding works by mapping ASCII characters to Unicode codepoints. By subtracting 917776 (space), it's really getting the ASCII offset from the space character. E.g. the first character 'f' is 917846. Minus 917776 is 70. ASCII character 70 is... 'F'!

This explains why it mysteriously uppercased the message, and also where the spaces went. It didn't delete them, they just became the NUL character (since 917776 - 917776 = 0 = NUL), which isn't displayed. So, sort of a lucky guess by Gemini, and sort of a neat symmetry in ASCII's layout.

It seemed impossible to me that Gemini was able to decode a hidden message this fast. I finally had a chance to reconstruct the chain of thought and tool calls from logs and figure out how it did it.

Paul Butler@paulbutler.org

After my post on smuggling arbitrary messages through unicode, some people asked me if AI could decode it. Gemini Flash is pretty fast at it! Have had good luck with Claude too. So far no dice with OpenAI models. This uses block.github.io/goose/ and forevervm.com

It immediately detects some unusual tokens, but can't process them directly. It starts by creating a REPL using a tool I gave it (shameless plug: forevervm.com), and prints the ordinal value of the characters. I've annotated the output it actually saw with the hidden message, "fun in the sun"

Then, it observes that there are multiple instances of 917776, so subtracts that from everything. The result effectively decodes the message enough to interpret it (FUNINTHESUN vs. "fun in the sun"). That's not supposed to work, but it does!

One take-away from AI Engineering Summit: people are pretty excited about Model Context Protocol. A two-hour MCP talk got moved to a 2x sized room to meet demand and still filled up.

Go ahead, include anything I write in your AI training set. I prefer if you do. I donโ€™t want to have to use an LLM that isnโ€™t familiar with my canon.

ForeverVM is open for business! (well, free for now, but you can sign up and try it out)

Jamsocket@handle.invalid

Signups for ForeverVM are now open! If you have node.js or uv, you can sign up from your terminal with a one-liner. npx forevervm signup Or read our new docs for more: https://forevervm.com/docs

Paul Butler reposted

This is really clever and fun! @paulbutler.org found a way to hide text 'in' an emoji by hacking the way unicode works. paulbutler.org/2025/smuggli... He also build a tool to encode en decode your own messages. ๐Ÿ˜Ž๓ …‡๓ …Ÿ๓ …ง๓ „‘๓ „๓ …ƒ๓ …Ÿ๓ „๓ …ฉ๓ …Ÿ๓ …ฅ๓ „๓ …‘๓ …ข๓ …•๓ „๓ …ค๓ …˜๓ …•๓ „๓ …“๓ …œ๓ …•๓ …ฆ๓ …•๓ …ข๓ „๓ …Ÿ๓ …ž๓ …•๓ „๓ …ค๓ …˜๓ …‘๓ …ค๓ „๓ …–๓ …™๓ …—๓ …ฅ๓ …ข๓ …•๓ …”๓ „๓ „น๓ „๓ …˜๓ …™๓ …”๓ „๓ …‘๓ „๓ …๓ …•๓ …ฃ๓ …ฃ๓ …‘๓ …—๓ …•๓ „๓ …™๓ …ž๓ „๓ …๓ …ฉ๓ „๓ „ฒ๓ …œ๓ …ฅ๓ …•๓ …ฃ๓ …›๓ …ฉ๓ „๓ … ๓ …Ÿ๓ …ฃ๓ …ค๓ „ฏ๓ „๓ „ป๓ …ฅ๓ …”๓ …Ÿ๓ „—๓ …ฃ๓ „๓ …ค๓ …Ÿ๓ „๓ …ฉ๓ …Ÿ๓ …ฅ๓ „‘ emoji-encoder.vercel.app?mode=decode

I finally get to share what we've been up to at @jamsocket.com! We built the code execution abstraction I've always wanted: a REPL that โ€œruns foreverโ€, using memory snapshots to hibernate behind the scenes so that it costs almost nothing to preserve state while idle.

Jamsocket@handle.invalid

Giving an LLM a code sandbox massively increases its capabilities, but managing VM lifecycles is a pain. Introducing foreverVM, a Python REPL-as-a-service. Under the hood, we swap between memory and durable storage. To you (and your agent) it acts like an always-on REPL. See more at forevervm.com

Paul Butler reposted

we've been cooking

Jamsocket@handle.invalid

Giving an LLM a code sandbox massively increases its capabilities, but managing VM lifecycles is a pain. Introducing foreverVM, a Python REPL-as-a-service. Under the hood, we swap between memory and durable storage. To you (and your agent) it acts like an always-on REPL. See more at forevervm.com