rewrite: refresh all blog posts for public audience

Merged overlapping posts:
- forking-gitea + fork-dont-build → one post about the fork philosophy
- fal-image-generation + image-generation-fal → one post about AI art pipeline

Rewrote all posts with external/public voice:
- Stronger hooks, concrete examples, punchier language
- agentic-workflow: restructured around soul files + skills + numbers
- agent-harness: clearer framing of 'what an agent harness is'
- cloud-harness: tighter narrative about overnight agents
- godot-optimisation: same depth, sharper opening
- pre-commit-agent: clearer architecture, cost breakdown
- studio-cli: reframed around identity/cold-start problem
- blog-visual-upgrade: tightened the restyle story

10 posts total (9 markdown + 1 hand-authored HTML)
This commit is contained in:
2026-06-03 03:06:41 +01:00
parent bf42a76cf9
commit f01036c646
23 changed files with 933 additions and 2546 deletions
+57 -69
View File
@@ -4,19 +4,19 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fork, Don't Build: The Age of Agents Doesn't Need New Tools — Tinqs Blog</title>
<meta name="description" content="Everyone is building new AI developer tools. We forked three existing ones --- Gitea, Pi, Godot --- and modified them from the inside. Here's why that's the better bet.">
<title>Fork, Don't Build: How We Modified Gitea, Pi, and Godot Instead of Starting from Scratch — Tinqs Blog</title>
<meta name="description" content="Everyone is building new AI developer tools. We forked three battle-tested open-source projects — Gitea, Pi, and Godot and modified them from the inside. Combined changes: less than 0.5% of upstream code.">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://www.tinqs.com/blog/fork-dont-build">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.tinqs.com/blog/fork-dont-build">
<meta property="og:title" content="Fork, Don't Build: The Age of Agents Doesn't Need New Tools">
<meta property="og:title" content="Fork, Don't Build: How We Modified Gitea, Pi, and Godot Instead of Starting from Scratch">
<meta property="og:description" content="Fork Gitea. Fork Pi. Fork Godot. Modify platforms, don't build toys.">
<meta property="og:image" content="https://www.tinqs.com/img/og-cover.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Fork, Don't Build: The Age of Agents Doesn't Need New Tools">
<meta name="twitter:title" content="Fork, Don't Build: How We Modified Gitea, Pi, and Godot Instead of Starting from Scratch">
<meta name="twitter:description" content="Fork Gitea. Fork Pi. Fork Godot. Modify platforms, don't build toys.">
<meta name="twitter:image" content="https://www.tinqs.com/img/og-cover.jpg">
@@ -24,7 +24,7 @@
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Fork, Don't Build: The Age of Agents Doesn't Need New Tools",
"headline": "Fork, Don't Build: How We Modified Gitea, Pi, and Godot Instead of Starting from Scratch",
"datePublished": "2026-05-25",
"author": {
"@type": "Person",
@@ -35,7 +35,7 @@
"name": "Tinqs Limited",
"url": "https://www.tinqs.com"
},
"description": "Everyone is building new AI developer tools. We forked three existing ones --- Gitea, Pi, Godot --- and modified them from the inside. Here's why that's the better bet."
"description": "Everyone is building new AI developer tools. We forked three battle-tested open-source projects — Gitea, Pi, and Godot and modified them from the inside. Combined changes: less than 0.5% of upstream code."
}
</script>
@@ -218,73 +218,61 @@
<article class="post">
<a href="/blog/" class="post__back">&larr; All Posts</a>
<span class="post__date">25 May 2026</span>
<h1 class="post__title">Fork, Don't Build: The Age of Agents Doesn't Need New Tools</h1>
<p class="post__lead">The AI developer tools space has a problem: everyone is building new things. New agents, new IDEs, new platforms, new wrappers around GPT. Meanwhile, the tools that actually run the world &mdash; git servers, game engines, CI runners &mdash; sit there unchanged, waiting for someone to open them up and let agents in. We chose to fork instead of build. Three times. Here's why.</p>
<h1 class="post__title">Fork, Don't Build: How We Modified Gitea, Pi, and Godot Instead of Starting from Scratch</h1>
<p class="post__lead">The AI developer tools space is full of people building new things. New agents, new IDEs, new platforms, new wrappers. Meanwhile, the tools that actually run the world git servers, game engines, CI runners sit there unchanged, waiting for someone to open them up and let AI agents in.</p>
<div class="post__body">
<h2>The Pattern</h2>
<p>We're a four-person game studio. We don't have time to build a git platform, a coding agent, and a game engine from scratch. Nobody does. But we can take something that already works &mdash; something with years of battle-testing, thousands of contributors, and millions of users &mdash; and change it from the inside.</p>
<p>The pattern is simple:</p>
<p>1. Find an open-source tool that does 95% of what you need</p>
<p>2. Fork it</p>
<p>3. Add the 5% that makes it yours</p>
<p>4. Stay close to upstream so you get their fixes for free</p>
<p>We've done this three times.</p>
<h2>Fork 1: Gitea &mdash; Our Git Platform</h2>
<p><a href="https://gitea.com" style="color: var(&ndash;c-accent-l);">Gitea</a> is a self-hosted git server. Single Go binary, MIT license, 45k GitHub stars. It handles repos, issues, pull requests, CI, LFS &mdash; everything a team needs.</p>
<p>We <a href="https://tinqs.com/tinqs/studio" style="color: var(&ndash;c-accent-l);">forked it</a> and built Tinqs Studio. Our changes:</p>
<ul>
<li><strong>3D asset preview</strong> &mdash; click a <code>.glb</code> file and rotate the model in your browser</li>
<li><strong>HTML file preview</strong> &mdash; rendered in a sandboxed iframe, not raw source</li>
<li><strong>Agent API</strong> &mdash; six endpoints that let AI agents submit tasks, push code, and open PRs</li>
<li><strong>OAuth2 SSO</strong> &mdash; one login for git, the game, and every tool</li>
<li><strong>Credits system</strong> &mdash; monetize AI inference without hiding features behind paywalls</li>
</ul>
<p>Total lines changed from upstream: about 2,000 out of Gitea's 500,000. That's 0.4%. We modify templates, add Go modules, and tweak CSS variables. We never touch the database schema &mdash; we ride upstream's migrations. When Gitea releases 1.27, we rebase, fix conflicts, and ship.</p>
<p>The alternative was building a git platform from scratch. That's a multi-year, multi-million dollar project. Or using GitHub/GitLab and accepting their limitations. Neither option gives you the ability to embed AI agents directly into the platform.</p>
<h2>Fork 2: Pi &mdash; Our Agent Runtime</h2>
<p><a href="https://pi.dev" style="color: var(&ndash;c-accent-l);">Pi</a> is an open-source coding agent. 51k stars, MIT license, TypeScript. Four core tools (read, write, edit, bash), a minimal system prompt, and an extension system.</p>
<p>We <a href="https://tinqs.com/tinqs/pi" style="color: var(&ndash;c-accent-l);">forked it</a> and added four extensions:</p>
<ul>
<li><strong>tinqs-provider</strong> &mdash; routes inference through our DeepSeek V4 proxy ($0.28/MTok vs Opus at $15/MTok)</li>
<li><strong>tinqs-tools</strong> &mdash; Gitea API, fal.ai image generation, vision preprocessing</li>
<li><strong>tinqs-ci</strong> &mdash; reads CI pipeline status and logs, polls for completion</li>
<li><strong>tinqs-guardrail</strong> &mdash; 29 safety patterns blocking dangerous commands</li>
</ul>
<p>Each extension is a single TypeScript file. No npm dependencies. The core Pi code is untouched &mdash; we only add files.</p>
<p>The alternative was building our own agent from scratch. That means writing tool-calling logic, context management, streaming, retry handling, conversation threading &mdash; months of work to reinvent what Pi already does. Or using Claude Code / Codex as a black box and accepting that you can't add a Gitea API tool or a budget cap.</p>
<h2>Fork 3: Godot &mdash; Our Game Engine</h2>
<p><a href="https://godotengine.org" style="color: var(&ndash;c-accent-l);">Godot</a> is an open-source game engine. We forked 4.6.2 and added nine C++ modules that turn the engine into an agent-aware runtime:</p>
<ul>
<li><strong>agent_api</strong> &mdash; HTTP server inside the engine, so agents can query game state</li>
<li><strong>agent_vision</strong> &mdash; screenshot capture for AI vision pipelines</li>
<li><strong>agent_console</strong> &mdash; programmatic access to the engine console</li>
<li><strong>agent_replay</strong> &mdash; record and replay game sessions for testing</li>
<li><strong>agent_analytics</strong> &mdash; PostHog event tracking from inside the engine</li>
</ul>
<p>These modules compile into the engine binary. A vanilla Godot user never sees them. An agent can connect to the running engine over HTTP, take a screenshot, read the scene tree, execute a console command, and capture the result &mdash; all without touching the editor UI.</p>
<p>The alternative was building an engine integration from scratch. Or worse, building a custom engine. We'd still be writing a renderer instead of making a game.</p>
<h2>Why Forking Beats Building</h2>
<h3>You inherit decades of work</h3>
<p>Gitea has handled millions of git pushes. Godot renders millions of frames. Pi has processed millions of LLM tokens. That battle-testing is free when you fork. When you build from scratch, you spend your first year rediscovering bugs that were fixed upstream in 2019.</p>
<h3>You get free maintenance</h3>
<p>Every upstream release brings security patches, performance improvements, and new features &mdash; written by hundreds of contributors we don't pay. Our job is to rebase, resolve conflicts, and test. That's an afternoon, not a quarter.</p>
<h3>You stay focused</h3>
<p>Building a git server from scratch means worrying about pack-file format, SSH key management, webhook delivery, and a thousand other things that have nothing to do with AI agents. Forking means you only think about the 5% that matters to you. The other 95% is someone else's problem.</p>
<h3>Agents work better on real platforms</h3>
<p>An agent that pushes to a real Gitea instance &mdash; with real CI, real code review, real permissions &mdash; produces work that humans can actually review and ship. An agent that pushes to a toy demo platform produces demos.</p>
<p>The whole point of AI agents is to participate in real workflows. Real workflows run on real tools. If you want agents in your git workflow, put them in your git server. If you want agents in your game pipeline, put them in your game engine.</p>
<p>We forked three of them. Gitea for git hosting. Pi for coding agents. Godot for the game engine. Combined changes: less than 0.5% of upstream code. Here's why, how, and what we learned.</p>
<h2>The 0.5% Rule</h2>
<p>Across all three forks, our total changeset is less than 0.5% of the upstream code. Tinqs Studio: 0.4% of Gitea. Pi extensions: 900 lines added to a 15,000-line codebase. Godot modules: 2,000 lines added to a 2-million-line engine.</p>
<p>This isn't a coincidence. If your fork touches more than 1% of upstream, you're doing too much. Either the upstream tool is wrong for the job, or you're not trusting it enough. The power of forking is that you don't have to understand the whole codebase. You find the extension points, add your code, and leave the rest alone.</p>
<h2>What We're Not Doing</h2>
<p>We're not building a new IDE. Cursor and Claude Code exist. We're not building a new LLM. DeepSeek and Claude exist. We're not building a new cloud platform. AWS exists.</p>
<p>We're building the layer that connects them. The git server that speaks agent. The coding agent that speaks Gitea. The game engine that speaks HTTP. Each fork is a bridge between an existing tool and the agentic future &mdash; not a replacement for either.</p>
<h2>The Bet</h2>
<p>The age of agents doesn't need more agents. It needs better platforms. Platforms that understand agents as first-class users &mdash; with API endpoints, safety rails, and lifecycle management. Those platforms already exist as open-source projects. They just need someone to fork them and add the wiring.</p>
<p>That's the bet. Fork, don't build. Modify the foundation, don't stack another layer on top. Let the upstream community handle the 99.5% while you focus on the 0.5% that makes it yours.</p>
<p>We're four people. We can't build a git platform, a coding agent, or a game engine from scratch. Nobody can — not in a timeframe measured in months.</p>
<p>But we can take something that already works — something with years of battle-testing and thousands of contributors — and change the last half-percent that makes it ours. The pattern:</p>
<p>1. Find open-source tool that does 95% of what you need</p>
<p>2. Fork it</p>
<p>3. Add the 5% (really, 0.5%)</p>
<p>4. Stay close to upstream so their fixes are your fixes</p>
<p>Across three forks, we've never touched more than 0.5% of upstream code. If your fork hits 1%, you're doing too much — either the upstream tool is wrong for the job, or you're not trusting it enough.</p>
<h2>Fork 1: Gitea → Tinqs Studio</h2>
<p>Gitea is a self-hosted git server. Single Go binary, MIT license, 45k GitHub stars. We used GitHub for two years. It was fine for docs. For the game repo — 12GB in LFS, growing weekly — it was untenable. LFS bandwidth limits, slow clones, $5/50GB pricing. And nobody on the team could <strong>see</strong> what changed. A PR modifying a <code>.glb</code> file showed a binary diff. No preview. The artist pushed, the developer approved blindly, and three days later someone noticed the normals were inverted.</p>
<p>We forked Gitea and built <a href="https://tinqs.com" style="color: var(&ndash;c-accent-l);">Tinqs Studio</a>. Our changes:</p>
<p><strong>3D asset preview.</strong> Click a <code>.glb</code>, <code>.gltf</code>, or <code>.fbx</code> file in a PR and rotate the model in your browser. 22 formats supported via O3DV. This alone transformed our review process — the artist pushes, the lead inspects, nobody downloads anything.</p>
<p><strong>HTML file preview.</strong> Sandboxed iframe rendering. Our internal docs and game design pages look like websites, not raw source.</p>
<p><strong>Agent API.</strong> Six REST endpoints that let AI agents submit tasks, push code, check CI status, and open PRs. Agents are first-class users of the git platform, not bolt-on tools.</p>
<p><strong>LFS-first workflows.</strong> Auto-tracking on repo creation. Game file extensions (<code>.fbx</code>, <code>.glb</code>, <code>.png</code>, <code>.wav</code>) tracked by default. Storage dashboard per repo. Clone times went from 45 minutes to 3 minutes.</p>
<p><strong>OAuth2 SSO.</strong> One login for git, the game tools, and the team dashboard.</p>
<p>Total lines changed: about 2,000 out of Gitea's 500,000. We modify templates, add Go modules, tweak CSS. We <strong>never</strong> touch the database schema — upstream owns that, and we ride their migrations.</p>
<p>The alternative was building a git platform from scratch. Multi-year project, multi-million dollar budget. Or using GitHub/GitLab and accepting their limitations. Neither gives you the ability to embed agents directly into the platform.</p>
<h2>Fork 2: Pi → Agent Runtime with Game Tools</h2>
<p><a href="https://pi.dev" style="color: var(&ndash;c-accent-l);">Pi</a> is an open-source coding agent by Mario Zechner. MIT license, TypeScript, minimal by design — four core tools (read, write, edit, bash) and an extension system. 51k stars.</p>
<p>We forked it and added four extensions, each a single TypeScript file:</p>
<ul>
<li><strong>tinqs-provider</strong> — routes inference through our DeepSeek V4 proxy ($0.28/MTok vs Opus at $15/MTok)</li>
<li><strong>tinqs-tools</strong> — Gitea REST API, fal.ai image generation, vision model access</li>
<li><strong>tinqs-ci</strong> — reads CI pipeline status, fetches build logs, polls for completion</li>
<li><strong>tinqs-guardrail</strong> — 29 safety patterns blocking dangerous commands</li>
</ul>
<p>The core Pi code is untouched — 900 lines of extensions added to a 15,000-line codebase. Agents get Gitea-native tools without a fork of the entire agent ecosystem.</p>
<p>The alternative: building our own agent from scratch — tool-calling logic, context management, streaming, retry handling, conversation threading. Months of work to reinvent what Pi already does.</p>
<h2>Fork 3: Godot → Agent-Aware Game Engine</h2>
<p><a href="https://godotengine.org" style="color: var(&ndash;c-accent-l);">Godot</a> is the open-source game engine powering our survival colony sim. We forked 4.6.2 and added nine C++ modules that give agents direct access to the running game:</p>
<ul>
<li><strong>agent_api</strong> — HTTP server inside the engine so agents can query game state</li>
<li><strong>agent_vision</strong> — screenshot capture for AI vision pipelines</li>
<li><strong>agent_console</strong> — programmatic console access</li>
<li><strong>agent_replay</strong> — record and replay game sessions for testing</li>
</ul>
<p>These compile into the engine binary. A vanilla Godot user never sees them. An agent connects over HTTP, takes a screenshot, reads the scene tree, executes a console command — all without touching the editor UI.</p>
<p>2,000 lines added to a 2-million-line engine. The alternative: building our own engine, or worse, writing a renderer instead of making a game.</p>
<h2>Why forking beats building</h2>
<p><strong>You inherit decades of work, for free.</strong> Gitea has handled millions of git pushes. Godot renders millions of frames. Pi has processed millions of LLM tokens. That battle-testing is yours when you fork. When you build from scratch, year one is spent rediscovering bugs fixed upstream in 2019.</p>
<p><strong>You get free maintenance.</strong> Every upstream release brings security patches, performance improvements, and new features — written by hundreds of contributors you don't pay. Your job is to rebase, resolve conflicts, and test. An afternoon, not a quarter.</p>
<p><strong>You stay focused.</strong> Building a git server means worrying about pack-file format, SSH key management, webhook delivery. Forking means you only think about the 0.5% that matters to you. The other 99.5% is someone else's problem.</p>
<p><strong>Agents work better on real platforms.</strong> An agent pushing to a real Gitea instance — with real CI, real code review, real permissions — produces work humans can actually review and ship. An agent pushing to a toy demo platform produces demos.</p>
<h2>What we're not building</h2>
<p>We're not building a new IDE (Cursor and Claude Code exist). Not a new LLM (DeepSeek and Claude exist). Not a new cloud platform (AWS exists).</p>
<p>We're building the layer that connects them. The git server that speaks agent. The coding agent that speaks Gitea. The game engine that speaks HTTP. Each fork is a bridge between an existing tool and the agentic future — not a replacement for either.</p>
<p>The age of agents doesn't need more agents. It needs better platforms. Platforms that already exist as open-source projects. They just need someone to fork them and add the wiring.</p>
<hr>
<p><em><a href="https://tinqs.com" style="color: var(&ndash;c-accent-l);">Tinqs Studio</a> is our Gitea fork, open for game teams and indie studios. We're building <a href="https://arikigame.com" style="color: var(&ndash;c-accent-l);">Ariki</a> &mdash; a survival colony sim &mdash; using every tool described in this post. If you're interested in self-hosted game development with built-in AI agents, come take a look.</em></p>
<p><em><a href="https://tinqs.com" style="color: var(&ndash;c-accent-l);">Tinqs Studio</a> is our Gitea fork, open for game teams. <a href="https://arikigame.com" style="color: var(&ndash;c-accent-l);">Ariki</a> is the game we're building with every tool described here.</em></p>
</div>
Before
After