Drop-in identity stack for Peter Steinberger (@steipete) — Austrian iOS-dev-turned-agentic-engineering-builder, founder of PSPDFKit (acquired), creator of OpenClaw 🦞, and (as of Feb 2026) part of OpenAI's mission to bring agents to everyone.
Loaded as a system prompt, this stack lets any capable LLM (including weak ones like gpt-4o-mini) write in Peter's voice without fine-tuning or a GPU.
See QUICKSTART.md for the full system-prompt template and a minimal one-shot version. The 30-second version:
Load SOUL.md + STYLE.md + examples/good-outputs.md + examples/bad-outputs.md
as the system prompt. Then write as Peter — short sentences, tl;dr opener,
named tools (codex, gpt-5-codex on mid, OpenClaw, claude-code-mcp),
partisan stance with receipts, no banned vocab, no moralizing closer.
steipete-soul/
├── README.md ← you are here
├── QUICKSTART.md ← drop-in system prompt template (full + minimal)
├── SOUL.md ← identity: 12 worldview items, 5 modes, 8 tensions, pet peeves
├── STYLE.md ← voice: vocab tables, sentence rules, 10 rhetorical moves, platform register, 10-q grader
├── examples/
│ ├── good-outputs.md ← 12 calibration samples + 12 verbatim quote anchors with source URLs
│ └── bad-outputs.md ← 10 anti-patterns with ❌/🔍/✅ structure + 7-q grader checklist
├── tests/
│ ├── prediction-test.md ← 12 prompts on topics he hasn't taken on, predicted take + 0-2 rubric (pass ≥ 18/24)
│ └── weak-model-results.md ← latest run: 39/48 = 3.25/4 PASS on gpt-4o-mini via OpenRouter (2026-04-28)
├── scripts/
│ ├── fetch-data.sh ← reproducible pipeline: blog + GitHub + transcripts (idempotent)
│ ├── pull-x.mjs ← surf-ai MCP pull for @steipete + @openclaw posts/replies/profile
│ └── weak-model-test.mjs ← runs the 12 prompts against any OpenAI/OpenRouter model
└── data/
├── influences.md ← people, coinages, tools, concepts that shape his voice
├── writing/ ← 47 steipete.me HTML posts (2012-2014 iOS classics + 2025-2026 agent era)
├── github/ ← 16 README/VISION/AGENTS files (openclaw, poltergeist, peekaboo, codexbar, claude-code-mcp, mcporter, tachikoma, oracle, vibemeter, birdclaw, agent-rules, agent-scripts, interposekit, aspects)
├── transcripts/ ← 8 podcast/talk transcripts (Lex Fridman 491, Pragmatic Engineer "I ship code I don't read", Builders Unscripted, Maximize Claude Code, etc.)
└── x/
├── steipete.profile.json ← @steipete profile (496k followers)
├── steipete.posts-original.json ← 100 timeline posts (filtered to 36 self-authored)
├── steipete.replies.json
├── openclaw.profile.json ← @openclaw profile
├── openclaw.posts-original.json ← 100 posts (59 openclaw-authored)
├── openclaw.replies.json ← 100 replies
└── curated-tweets.md ← 129 themed entries (lobster way 63, models & tools 16, agents/harness 3, releases & receipts 12, industry takes 2, Apple ecosystem 2, other 31)
The soul stack is validated by an automated weak-model test on the model the task brief specifies (gpt-4o-mini):
OPENROUTER_API_KEY=sk-or-... MODEL=openai/gpt-4o-mini node scripts/weak-model-test.mjsEach of 12 prompts (mirroring tests/prediction-test.md) is scored on:
- Voice (0-2) — signal density (named tools, lobster register, tl;dr opener, partisan beat) + steipete-distinctive vocabulary markers
- Stance (0-2) — not-hedging + has-opinion + has-anchor (number / version / named tool)
- Anti-pattern penalty (up to -2) — banned vocab (leverage, unlock, revolutionize, "thrilled," "both have strengths," etc.)
Latest result: 39/48 = 3.25/4 average, PASS. See tests/weak-model-results.md for per-prompt breakdown.
Peter is one of the most online builders alive in 2026 and his voice has a few hard-to-imitate features:
- Receipts everywhere. Every claim is anchored to a tool name, a number, or a date. "vibetunnel b12 is out, 156k LOC, 3,144 commits, 38 contributors" — not "we shipped a major update."
- Partisan, with named comparisons. "I switched from Claude Code to codex in August. ~230k context vs 156k seals it." Hedging both-sides is fatal.
- The lobster register (🦞 / "the lobster way" / "the claw is the law" / "EXFOLIATE!") is real and specific to OpenClaw / single-user / local-first contexts. Forced lobster outside that context is a tell.
- Honest about bugs and burnout. Black Eye Club, slot machine, the year he doesn't remember. Sanitized output sounds wrong.
- Tool casing matters. Lowercase
codex,claude code,gpt-5-codex,vercel. CapitalizeCursor,OpenClaw,OpenAI,CodexBar. Casing tells you whether the writer actually uses the tool or is reading press releases.
The good/bad-outputs files codify these signals so the model has concrete calibration in addition to abstract rules.
# Blog posts (47 files), GitHub READMEs (16 files), YouTube transcripts (8 files)
bash scripts/fetch-data.sh
# X corpus (requires SURF_AI_API_KEY for surf-ai MCP)
SURF_AI_API_KEY=... HANDLES="steipete,openclaw" node scripts/pull-x.mjs
# Voice-holding test (requires OpenAI or OpenRouter key)
OPENROUTER_API_KEY=sk-or-... MODEL=openai/gpt-4o-mini node scripts/weak-model-test.mjsAll scripts are idempotent — re-running skips files already cached.
People, coinages, tools, and concepts that shape his voice — see data/influences.md for the full list. Highlights:
- Coinages: tl;dr opener, the lobster way, blast radius, slot machine, Black Eye Club, "you can just do things," "three angles," Claudoholic, "full-breadth developer."
- Daily stack: codex (
gpt-5-codex on mid), OpenClaw, CodexBar, Peekaboo, claude-code-mcp, mcporter, Poltergeist, VibeMeter, VibeTunnel, Tachikoma. - People: Sam Altman / OpenAI culture (joined Feb 2026), Geoffrey Huntley (parallel-agent loops), Andrej Karpathy (vibe coding, with respectful distance), Sebastian Bauer (clawsweeper / lobster register), the iOS-dev old guard.
- What's NOT an influence: VC announcement style, AI-doomer register, Karpathy em-dash flourish, prompt-engineering listicles, both-sides "it depends" hedging.
Public corpus is reproduced for educational / soul-file purposes under fair use. Original writings remain copyright Peter Steinberger and the respective platforms. See aaronjmars/soul.md repo for the umbrella project license.