Peter Steinberger on Shipping Code He Doesn't Read: From PSPDFKit to Clawdbot

Open on YouTube ↗
Overview

Peter Steinberger built PSPDFKit, a PDF framework that, by the host's account, runs on more than a billion devices. He then burned out, sold his shares, and stayed away from programming for about three years. When he returned in 2025, he started working almost entirely through AI coding agents. In this conversation he describes merging hundreds of commits in a day on Clawdbot (since renamed OpenClaw), his personal-assistant project, and says he no longer reads most of the code he ships. His argument is that this is not recklessness. He thinks the engineer's job has moved toward system design, taste, and building feedback loops that let agents check their own work.

28 min read

From rural Austria to a copy-protected DOS game

Steinberger grew up in rural Austria and describes himself as an introvert. His family regularly hosted summer guests, and one of them was a computer enthusiast. Around age 14, Steinberger begged his mother for a computer and started tinkering. The earliest project he remembers was taking an old DOS game from his school, writing a copy protection for the floppy disk, and selling it. The protection added about two minutes of loading time. He compares building software to playing games and says that right now it "feels better than Factorio."

He never met his father and grew up poor, so he paid for his own studies. A job in Vienna that was meant to last one month, bridging military service and university, turned into about five years. On his first day he was handed a thick book on Microsoft MFC. He quietly used .NET instead and only told the company months later, when it was too late to change course. He says he did this kind of silent modernization several times there.

An app born out of a lost message

At university a friend showed him an iPhone. He held it for about a minute and bought one. The moment that turned him into an iOS developer came later. He was on the subway, typing a long and somewhat emotional message in a gay dating site's web interface on iPhone OS 2. The train entered a tunnel, the site's JavaScript disabled the send button and showed an error, and he could not copy the text, take a screenshot, or even scroll. The message was lost.

He went home angry and downloaded Xcode. The site had no API, so he parsed its HTML with regular expressions, which he admits is "totally not something you should do." He built on a stack of beta technology: the iPhone OS 3 beta, Core Data in beta, and a hacked GCC that backported blocks. The company never answered his email about it, so he published the app himself at five dollars and made around $10,000 in the first month. Apple's payments went into his grandfather's bank account, and his grandfather eventually called to ask about a large, strange payment from Apple.

When he told his employer he wanted to pursue apps, his boss mocked him and called it a fad. Steinberger says this left him with a chip on his shoulder and a resolve to one day run a company worth more than theirs, which he says took eight years. The app ended abruptly. At 3 a.m. at a party, he got a call from someone at Apple saying users had reported pictures in the app, and the app was finished.

How a magazine viewer became PSPDFKit

After quitting, Steinberger did freelance work. At a San Francisco bar during WWDC he was introduced to someone as one of Austria's best iOS developers, which led to a US job offer. Around the same time, a company asked him to fix a crashing iPad magazine app built by a contractor in Eastern Europe. He calls it the worst code he had ever seen: a single Objective-C file of thousands of lines that used windows as tabs, "a house of cards" where touching one thing broke another. He offered to rewrite it in a month, a job he says the original developers had spent half a year on. It took him two.

He found real technical problems in the domain. A C call to render a PDF page might need 30 MB on a device with 64 MB total, so careless background work got the app killed by the OS. He also fixated on details such as how pages animated during rotation.

When a friend struggling with his own magazine app asked for code, Steinberger extracted the PDF component, made sure the original client was fine with it, and sold it to him. He then put up a site in an afternoon, built from a WordPress template hacked to run on GitHub Pages. Buyers got a Dropbox link to a zip of the source. Three people bought it in the first week for about $200 each, and about ten more wrote to complain about missing features. The complaints hooked him. Text selection sounded easy, and three months later he had learned that it is very hard in PDF. He says he knows more about PDF "than any sane human person ever should."

He kept raising prices as features grew. By the time he started a job at a San Francisco startup, the side project already earned more than his salary there. He worked both jobs, slept less, and after about three months his manager asked whether he was okay and gave him a choice: the job or the project. Because of his visa, he had one week to decide. He chose the project.

Polish, developer marketing, and writing as a strategy

Steinberger says money never drove him. What drove him was making things other people find amazing. His aim was to build the component "as if Apple would have built it," with care and small delights. Competitors had more features and had been around longer, but he believes his product won because developers tried the options and his felt best. In his view software is mostly about how it feels.

He returned to Vienna, went all in, and brought in freelancers, which he now thinks he did far too late. He spent about 13 years on the product and kept its awkward name, which he says he chose in about five minutes. In Objective-C it made sense as a namespace prefix.

His marketing targeted developers rather than executives. Management makes the purchasing decision, but he reasoned that developers inside a company would lobby for the product if they liked it. PSPDFKit did no cold outreach. It relied on good software, technical blog posts, and conference talks, on the theory that visibly competent, caring builders reflect well on a product. He also personally answered support tickets and replied to the newest tickets first. His reasoning was that a reply within five minutes feels magical, while waiting one day or two makes little difference.

The team was remote-first and later hybrid. It grew to about 70 people by the time he sold his shares and is now nearly 200, he says. He required everyone to spend one full day a month writing a blog post. Sometimes colleagues worried about giving away secret sauce, but he mostly ignored that. He enjoyed the attention and the chance to inspire people. He also says that writing forces deeper understanding and that the posts became company documentation he himself went back to a year later.

Hard problems, WebAssembly, and custom pricing

Asked what makes PDF hard, Steinberger gave one example. He had designed the link model assuming a document might contain a few hundred links. Then a well-paying customer reported four-minute load times. The file was a 50,000-page Bible from Canada with more than 100 links per page. His assumptions were off by a factor of about a thousand. With a mature public API, the internals had to become lazy without breaking anyone's code or exposing what was loaded eagerly versus lazily. He says he spent about two months redesigning it until load time was nearly instant.

The company later replaced Apple's renderer, which he calls "quite buggy," with a large C++ renderer used across all platforms. PSPDFKit was also one of the first PDF frameworks to run in WebAssembly. He describes publishing a benchmark early in WebAssembly's life that Google, Microsoft, and Apple adopted. As a result, those companies were effectively working to make his renderer faster.

On enterprise pricing, he explained why vendor sites often say "contact us." The same product delivers very different value to a freelancer and to a Fortune 500 company. A low price looks suspicious to large buyers, whose procurement won't start a process over $500, and a high price excludes small customers. As unfair as it looks, he calls custom pricing the fairest option for that kind of product. He sorts software along two axes, easy versus hard and interesting versus uninteresting. PSPDFKit sat in the hard, uninteresting quadrant, which he considers a good place to be. Developers would rather not build it themselves, and the problems never run out.

Burnout and three years away

The early years were the most fun for him. Growth brought red tape, "gardening" the product instead of wild hacks, and more people conflicts. He worked most weekends and describes the CEO role as being the "waste bin" for everything that others couldn't handle. It was lonely because he could not be openly negative. One example: his co-founder called at 5 a.m. one weekend to say a large airline's planes were grounded because PSPDFKit was crashing. Steinberger disassembled the airline's app and showed that they had modified PSPDFKit's source in a way that triggered a license-key fallback. He calls it an "if they sue, company's gone" moment.

He believes burnout comes less from hours than from working on something you no longer believe in, or from constant conflict. The management team fought a lot. He also thinks he made a mistake in trying to run the company too democratically.

After selling his shares he needed a long time to decompress. There were months when he didn't turn on his computer. Having so large an exit so early "messed with my mind quite a bit," and he calls those hard years.

Coming back: Claude Code as a slot machine

In April 2025 he returned to an old idea, a Twitter analytics tool he had once started in Swift and SwiftUI and now wanted to build for the web. Web development had always been his colleague Martin's area at PSPDFKit, so he didn't know React well enough to know what a "prop" was. He calls this a common trap: the better you are in one stack, the more it hurts to feel like an idiot in another.

So he tried the AI tools others were dismissing. He credits his three-year absence with sparing him the period when many developers tried early AI tools and concluded they were bad. His first real experiment was crude. He converted a messy repository into a 1.3 MB markdown file, had Gemini in Google's AI Studio write a roughly 400-line spec, fed the spec to Claude Code, and kept typing "continue." Eventually the agent declared the project 100% production-ready, and it crashed on startup. He then added a browser MCP so the agent could see what it had built. After a few more hours of looping he had a working Twitter login page. The result was not great, but it was his "mind-blowing moment." He could see where things were heading.

For months afterward he had trouble sleeping. He compares the pull to a casino: you prompt, and sometimes you get junk and sometimes something that blows your mind. He pulled friends in, naming Armin and Mario, who soon were also up at 5 a.m. He calls the group "the black eye club" and started a London meetup called Claude Code Anonymous.

"I ship code I don't read"

The host pushed back. PSPDFKit's polish seemed to come from obsessive care about code hygiene, so how does that fit with not reading code? Steinberger says he now regards much of his old bikeshedding over spacing and naming as pointless. The code still has to work and be fast and secure. But most apps, in his description, just massage data from one shape to another: API to parser to database to HTML and back. The genuinely hard part, he jokes, was solved by Postgres decades ago.

He still cares about structure. The day of the recording he wanted to land a 15,000-line PR that moved Clawdbot to a plugin architecture, and he was excited about that design. He did not read all of it, because much of it was "boring plumbing." For him, what matters is system architecture, not every line.

He also rejects the term "vibe coding." He calls what he does "agentic engineering," and jokes that vibe coding "starts at 3 a.m."

The workflow: Codex, conversation, and parallel agents

Steinberger went through Claude Code, a stint with Cursor, some Gemini 2.5, and Opus 4. He says the inflection point came in the summer, when models got good enough to build software without writing code by hand. What won him over was OpenAI's GPT 5.2 with Codex, which he calls underrated: "pretty much every prompt I type gives me the result I want." On Clawdbot he runs five to ten agents in parallel.

He respects Claude Code, which he calls a category-defining product and still uses almost daily, especially for general computer work. For coding in complex applications, though, he finds Codex much better. His reason is that Codex reads far more before acting. Claude, in his description, reads three files and confidently starts writing, so you must push it to look at more of the codebase. Codex may read silently for ten minutes. With a single terminal that would be unbearable, he concedes, but with many sessions it doesn't matter.

He says he rarely just issues orders. Each session starts with a model that knows nothing about the product, so he has a conversation with it. He asks what options exist, whether it considered some feature, and where documentation should go. He doesn't use plan mode. Models are "trigger hungry," but phrases like "let's discuss" or "give me options" keep them from building until he says "build." He describes himself as designing the system, with a mental picture of its shapes but not line-by-line knowledge, which Codex supplies. The host compared this to the old capital-A Architect role. Steinberger prefers the word "builder."

He feels friction when prompting, much as others say they feel it when writing code by hand. He watches the output scroll, notices how long a task takes, whether the agent pushes back, and whether the result looks messy. If something takes much longer than expected, he knows he framed it wrong.

The work is mentally more taxing than coding by hand, he says. He is managing five to ten "employees" instead of one. He plans a feature carefully, starts it on a task that might take Codex 40 minutes to an hour, and moves on to the next one while it runs. Usually there is one main project plus satellite projects that need five minutes of attention per half hour. He compares it to StarCraft, with a main base and side bases supplying resources. He hopes this degree of parallelism is a transitional problem that faster models will reduce. For now, he needs to parallelize heavily to stay in flow.

Closing the loop

Steinberger calls the core technique "closing the loop": the agent must be able to test and debug its own work. In his view this is why current models are strong at coding and often mediocre at creative writing. Code can be compiled, linted, executed, and checked.

He gave two examples. A Mac app couldn't find a remote gateway, while the same logic in TypeScript could. Debugging a Mac app by hand means building, launching, and inspecting it, which is slow. So he had Codex build a debug-only CLI that exercised the same code paths, and then let it iterate. It ran for about an hour and reported race conditions and a misconfiguration. The explanation sounded sensible, and he didn't need to look at the code. In the second case, Google's Antigravity handled tool calls in a quirky format that kept breaking his filtering. He eventually had Codex design live tests that start a Docker container, install the whole system, run the agent loop against real API keys from several providers, including Anthropic and GLM, and have the model create an image and then read it back. It took a long time, but the agent fixed the ordering and tool-calling inconsistencies itself.

He even structures web projects so the core runs from a CLI, because browser-based loops are too slow. He argues that agentic coding makes him a better engineer, because designing for verifiability pushes him toward better architecture. He says he never liked writing tests or documentation and often only pretended to. Now both are part of every feature. He explains the trade-offs and has the model write the docs, beginner-friendly first and technical detail later. He calls his latest project the best-documented one he has ever had, without writing a line of it himself.

Why experienced developers struggle

Steinberger sees two types of developers. Those who care most about the outcome and product feel tend to thrive with AI. Those who love solving hard algorithmic problems often struggle, reject AI, or become sad, because that is exactly the work AI now does. He says he learned more about software architecture this year than in the previous five, but that you have to know what to ask. In his Twitter tool, usage made things slow in a way that was hard to reproduce. The cause was a Postgres trigger in a single file with no obvious connection to the rest of the code, which the model couldn't trace. It was found only when he asked whether there were any side effects for a specific operation.

Management experience helped him. As a CEO he had learned he couldn't breathe down everyone's neck, and that imperfect code that moves toward the goal can be improved later. Working with Claude Code felt like managing imperfect, sometimes silly, sometimes brilliant engineers, "a lot like being the boss again."

He criticized a blog post by a developer he deeply respects. As he understood it, that developer sent a single prompt to several models through a web interface, including an open-weights model he considers too weak for coding, ran the output, saw it fail to compile, and concluded the technology wasn't good. Steinberger's response is that no human writes bug-free code on the first try either. Complaints about outdated APIs stemmed from not specifying a macOS version, and training data contains more old code than new. He compares a guitarist who tries the piano briefly and gives up. He himself screamed at Claude Code at 3 a.m. many times before learning "the language of the machine." Early on in Clawdbot, for instance, his agent would cherry-pick from PRs and close them, until he learned how it interpreted his wording.

Rebuilding PSPDFKit today, and why he distrusts spec-driven orchestration

Asked how PSPDFKit would look if built today, Steinberger said he could easily run it with 30% of the staff. The hard part would be finding very senior engineers who understand what they build and are comfortable delegating, knowing which parts matter and which can be vibed. He sees few such people and a lot of noise on social media.

He is skeptical of elaborate orchestration setups: the "Ralph Wiggum" loop, which he considers a workaround for Opus limitations that Codex doesn't need; ticketing systems where agents create and consume tickets and email each other; and approaches like Gas Town, where a spec is written up front and the system builds itself. He calls this the waterfall model, which the industry already learned doesn't work. He allows that it may suit some people or long lists of independent tasks. He asks, "How can you even know what you want to build before you built it?"

His own process is exploratory. He sometimes deliberately under-prompts so the agent produces something that sparks ideas. Maybe 80% is wrong, but a couple of ideas are new. He has to click on a feature and feel it, because models lack taste. He compares building to sculpting a statue out of marble and to climbing a mountain by circling around it. He still plans, but less than before, because trying things and throwing them away is now cheap. When Clawdbot moved from one agent to many, and from WhatsApp only to many providers, the change touched the whole application. He estimates it took Codex about three hours where it would have taken him about two weeks.

Clawdbot: from WhatsApp relay to personal assistant

Since spring he had wanted a hyper-personal assistant: not one that sends a morning task list, but one that asks how a meeting went, notices you haven't texted a friend who is in town, or asks why you always seem sad after seeing a certain person. He mentions the film Her and even registered a company whose name means "the loving machine." When he tried in the summer, models weren't quite ready. He assumes all the big companies are working on such assistants and that compute is the current bottleneck. His angle is an assistant that runs on your own computer, with data that stays yours. He notes that many friends already use chatbots as therapists, and he thinks that works well.

The project started small, as "WhatsApp Relay," a way to trigger things on his computer from WhatsApp. On a trip to Morocco for a friend's birthday, he used it all day. It guided him through the city, made jokes, and texted friends on his behalf. Its resourcefulness amazed him. He sent a voice message, a feature he had never built. About 30 seconds later it replied. It explained that it had inspected the file header, found Opus audio, converted it with FFmpeg, looked for Whisper locally, didn't find it, found his OpenAI key, and used curl to get a transcription. That was Opus 4.5.

He added a heartbeat, periodically prompting the model to do something proactive, which he admits is insane from a security standpoint. He used it as "probably the most expensive alarm clock ever." The agent ran on his Mac Studio in London and SSHed into his MacBook in Morocco to play music louder and louder when he didn't respond. The friends he showed it to were hooked, but his tweets about it got muted responses. He compares it to the iPhone: people had to use it to get it.

The name went from WhatsApp Relay to "Claudius" (a Doctor Who joke) to Clawdbot, which he felt explained the product better. On January 1 he did something he calls "absolutely insane": he put his agent, with full read/write access to his computer, into a public Discord. Visitors watched it check his cameras, run home automation, DJ, and look at his screen to tell him whether his coding agents were done. The project went from about 100 to 3,300 GitHub stars in a week, by his account, and he says he has merged 500 pull requests. He calls himself "a human merge button." He was about to merge a feature that lets the agent phone a business to make a reservation. He jokes that he built Anthropic's best marketing tool, since people bought additional $200 subscriptions to run it.

CLIs over MCP, and where the hard work actually is

To make the assistant useful, he built CLIs for everything: Google services, his bed, lights, music. He calls MCP a crutch whose best effect was pushing companies to open more APIs. His complaints: all tool definitions are loaded into context at session start, and responses can't be filtered. His example is a weather MCP returning 500 cities or dozens of fields when you only want to know whether it's raining. A CLI output can be piped through jq. MCP calls also can't be chained into a script. The host argued these are solvable problems. Steinberger said companies are working on discovery, but chaining remains an issue. He built MCPorter to convert MCPs into CLIs. Clawdbot has no native MCP support, but through that route it can load an MCP on demand, even from your phone.

He says nothing in Clawdbot is technically difficult. It is TypeScript "that shoves JSON around," moving text between LLMs, disk, and messaging platforms such as Teams, Slack, Discord, Signal, iMessage, and WhatsApp, with more coming. The difficulty is making it feel magical. The one-line installer checks for Node and Homebrew, handles older installs, and picks defaults so the user mostly presses Enter. The user is then asked whether to "hatch" their bot. A terminal UI opens, and a bootstrap file tells the model it is being born and should work out its identity with the user. It asks curious questions, then deletes the bootstrap file and writes user.md, soul.md with core values, and an identity file with a name, emoji, and inside jokes. It keeps maintaining these files over time. Then it messages you on WhatsApp. Users configure and even update the agent by asking it to.

For the first weeks of traction there was no real onboarding. Users were told to point their own coding agent at the repository and let it configure everything. He says this worked partly because the codebase was built by agents and follows the naming conventions agents expect.

Companies, prompt requests, and "I don't care about CI"

Steinberger expects large companies to struggle with AI because it requires refactoring the company, not just the codebase. He sees a need for people with product vision who can do everything, and fewer of them. He repeated the 30% figure and called the economic consequences frightening, with many people likely to struggle to find a place.

He now treats pull requests as "prompt requests." He thanks the contributor, then starts with his agent from the PR and redesigns the feature as he sees fit. The PR's code is rarely reused, but it tells the agent the goal and sometimes points to tricky bugs. He says the average quality of PRs has dropped because contributors vibe code without understanding the overall design. He asks contributors to include their prompts and reads those more than the code, because they show how the solution was reached and how much steering it took. He discourages small fix PRs, since reviewing them takes him ten times longer than typing "fix" into Codex.

He relies on local CI. The agent runs a "full gate" of linting, building, and tests, a term he picked up from the agents themselves. If it passes, he merges. Main occasionally slips, but not by much, and he doesn't want to wait ten more minutes for remote CI after already waiting on the agent. In his Discord, discussion is about architecture and style, not code. His example is the voice-calling PR. It touched many places, and he felt Clawdbot was "becoming bloatware." He had Codex compare the PR with an earlier unfinished project of his and with Mario's coding agent Pi, which loads TypeScript plugins. The result was the plugin architecture he built the night before the interview. Pointing agents at folders where he has already solved a problem is one of his main techniques, because it conveys his earlier thinking more precisely than re-explaining it.

Advice for hires and new graduates

If he hired, he would look for people active in open source who "love the game." He compares learning to use agents to learning an instrument or starting at the gym: painful at first, then rewarding. He says he once made 600 commits in a day and that an outside reviewer concluded the code was not slop. He has never worked harder, even at PSPDFKit, partly because it is addictive and partly because he wants to use the project's momentum.

For new graduates, he acknowledges that entering the market will be harder. His advice is to be "infinitely curious": read complex open-source code and ask a patient machine why it was built that way, in order to build system understanding. He doesn't think universities teach this well. Newcomers have one advantage, though. They aren't held back by experience and will use agents in ways veterans don't consider. He admits he still defaulted to opening Instruments to profile a slow menu-bar app until the agent did the whole performance analysis from the terminal.

In the rapid-fire round, his favorite gadget was a cheap Android photo frame that friends can email pictures to. It gives him more joy than the iPhone 17 he still hasn't unpacked. He recharges at the gym with a coach and his phone left in the locker, and sometimes walks without his phone.

In closing, the host highlighted prompts over pull requests, closing the loop, and Steinberger's report that juggling agents is more exhausting than writing code. The host added a caveat: Clawdbot is more of a "YOLO project" than most production apps, so these practices should be taken with a grain of salt. The host expects much of this to spread to production work, but with review and validation becoming more important steps.