<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>ThinkRail on Trevor's Blog</title><link>http://mings.in/en/tags/thinkrail/</link><description>Recent content in ThinkRail on Trevor's Blog</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Wed, 04 Nov 2026 21:10:00 +0800</lastBuildDate><atom:link href="http://mings.in/en/tags/thinkrail/index.xml" rel="self" type="application/rss+xml"/><item><title>JetBrains' New IDE, and the Editor Is Read-Only</title><link>http://mings.in/en/posts/thinkrail/</link><pubDate>Wed, 04 Nov 2026 21:10:00 +0800</pubDate><guid>http://mings.in/en/posts/thinkrail/</guid><description>JetBrains shipped an AI IDE, and getting it running showed me that the feature list isn&amp;rsquo;t the interesting part: the source hardcodes readOnly: true, and when I typed into the editor the file hash didn&amp;rsquo;t move. This is an IDE that won&amp;rsquo;t let you change code.</description><content:encoded><![CDATA[<p>JetBrains released something new on August 19, 2026, called ThinkRail, and almost nobody in the Chinese tech circles has written about it.</p>
<p>I read the repo before I installed the local build. Reading the source turned up one thing that surprised me more than any of its features: the editor in this &ldquo;IDE&rdquo; is read-only.</p>
<p>Line 110 of <code>monacoSetup.ts</code> says <code>readOnly: true</code>, with a hint string to go with it. I opened the UI and tried typing into it. Not a single character went in, and the file hash didn&rsquo;t change.</p>
<p>This post is about that one thing: an IDE that won&rsquo;t let you edit code, and what exactly it&rsquo;s betting on.</p>
<h2 id="it-isnt-the-next-intellij">It Isn&rsquo;t the Next IntelliJ</h2>
<p>The repo is at <code>JetBrains/thinkrail</code>, Apache-2.0, with a &ldquo;JetBrains incubator project&rdquo; badge on the README.</p>
<p>Their own description is one sentence: use pi to do vibe coding in this lightweight IDE, and it customizes itself around the way you work.</p>
<p>What&rsquo;s pi? A third-party minimal agent harness, package name <code>@earendil-works/pi-coding-agent</code>, from the Earendil folks. Its philosophy is &ldquo;no features, just primitives&rdquo;. Sub-agents, plan mode, permission prompts, none of it is built in. You write your own extensions.</p>
<p>What ThinkRail does is wrap that command-line agent in a full interface: workspace, editor, diff, terminal, spec tree.</p>
<p>So what you&rsquo;re looking at is a company of a couple thousand people writing a shell in TypeScript to wrap an agent that somebody else wrote. That&rsquo;s a different road from the one IntelliJ took with its own kernel.</p>
<p><img loading="lazy" src="/images/thinkrail/fig1.png"></p>
<h2 id="installing-it-means-a-218-mb-file">Installing It Means a 218 MB File</h2>
<p>It comes in two shapes: a desktop installer, and a self-contained command line build.</p>
<p>I downloaded the CLI version. A single 218 MB file with a Bun runtime stuffed inside, so you don&rsquo;t have to install node first. Running it looks like this:</p>
<p><code>./thinkrail --no-open --port 24242 &lt;your repo path&gt;</code></p>
<p>Open <code>localhost:24242</code> in a browser and you get the full interface. There&rsquo;s no account system of its own. Models come from pi&rsquo;s config.</p>
<p>I was all set to go into settings and paste a DeepSeek key, and then the Providers page opened with a line already sitting there: DeepSeek, env key <code>DEEPSEEK_API_KEY</code>, connected.</p>
<p>It had read the connection pi already had configured in my shell environment. Zero setup.</p>
<h2 id="i-gave-it-a-broken-repo">I Gave It a Broken Repo</h2>
<p>I prepared the test case on purpose: a small JS library that turns titles into URL slugs, with one of its two tests red because the implementation doesn&rsquo;t handle punctuation.</p>
<p>The landing page has three options: write specs, start work directly, or work inside the project directory. I clicked the first one, which is its signature flow.</p>
<p>I kept the prompt restrained: write out the specs as things stand, don&rsquo;t change any code yet.</p>
<p>After I hit create, the first thing it did was cut a real git worktree at <code>~/.thinkrail/worktrees/demo-repo/workspace-1</code>, on a branch called <code>write-slug-lib-specs</code>. I went back to the main repo to check. <code>main</code> was still on the same commit, not a hair moved.</p>
<p>This step isn&rsquo;t simulated. <code>git worktree list</code> shows two lines.</p>
<h2 id="six-minutes-seventeen-seconds-three-files">Six Minutes Seventeen Seconds, Three Files</h2>
<p>When it finished I looked at the numbers: 6 minutes 17 seconds, 26 tool calls, 15 steps, with three <code>spec_create</code>, three file reads, and three file edits. It used 5.3% of a one million token context and cost 0.138 dollars.</p>
<p>It didn&rsquo;t start writing right away. First <code>ls</code> to see the structure, read the README, read the tests, then it actually ran <code>node --test</code>, saw that red test, and only then started writing.</p>
<p>Three markdown files came out:</p>
<p><code>goal-and-requirements.md</code> covers what the library is, who it&rsquo;s for, and that for now it only does &ldquo;lowercase plus spaces to hyphens&rdquo;. <code>architecture.md</code> covers the single-module topology, with dependencies going only from tests to source. <code>src/SPEC.md</code> covers the <code>slugify</code> contract and its boundaries.</p>
<p>All three carry frontmatter, <code>id</code>, <code>type</code>, <code>status: draft</code> and <code>parent</code>, strung together into a graph. That&rsquo;s not a format I taught it. It&rsquo;s the fixed rule from the <code>spec-graph</code> skill pack it loads.</p>
<p>The most interesting part is how it handled that red test. It didn&rsquo;t write &ldquo;strips punctuation&rdquo; down as a capability that already works. Instead it opened a separate section in the module spec called &ldquo;Known limitation&rdquo; and spelled it out: the test expects <code>hello-world</code>, the function returns <code>hello,-world!</code>, punctuation left as is.</p>
<p>When it was done it ran <code>spec_validate</code> itself. It passed.</p>
<p><img loading="lazy" src="/images/thinkrail/fig2.png"></p>
<h2 id="what-the-spec-graph-looks-like">What the Spec Graph Looks Like</h2>
<p>The three files aren&rsquo;t documents sitting side by side. They&rsquo;re a tree with <code>parent</code> pointers.</p>
<p>The root is the goal document, the middle is architecture, the leaves are specs for individual modules. The right column in the UI is that tree. Click a node and the editor on the left renders the file, with Preview and Source views.</p>
<p>Their blog post &ldquo;Spec-Driven Development&rdquo; says the point is to let intent outlive the session. Close the chat and the code is still there, but the &ldquo;why it&rsquo;s written this way&rdquo; usually disappears along with the chat. Specs keep that part around, and the agent reads the whole graph in at the start of every run.</p>
<p>This time I only had it write, not edit. When it does edit, it reads the same graph.</p>
<p><img loading="lazy" src="/images/thinkrail/fig3.png"></p>
<h2 id="then-i-found-the-read-only-thing">Then I Found the Read-Only Thing</h2>
<p>After it finished I wanted to change a sentence myself, so I clicked into the Source view of <code>src/SPEC.md</code>, selected a line, and pressed a key.</p>
<p>Nothing. I assumed it was a focus problem, clicked a few times, then tried shoving text straight into the editable region with devtools. Same conclusion: input doesn&rsquo;t go in, and the file hash on disk is identical before and after.</p>
<p>So I went back to the source for the answer, and it&rsquo;s that <code>readOnly: true</code> from the top of this post. The UI even has a hint prepared, telling you to have the agent make the change.</p>
<p>Someone raised this on Hacker News, saying the chat panel is the lead actor in ThinkRail and the editor and file tree are supporting cast, that &ldquo;you&rsquo;re not even allowed to edit files by hand&rdquo;.</p>
<p>I checked it, and it&rsquo;s true. In fairness though: the terminal works. There&rsquo;s a real PTY at the bottom, and nobody stops you from running <code>vim</code> in it. Only that Monaco panel is locked.</p>
<p>The problem is that this design swaps out the subject of &ldquo;changing code&rdquo;. In an old IDE, you and the agent each own half of that. Here the division of labor is clear: the agent writes, you review.</p>
<p><img loading="lazy" src="/images/thinkrail/fig4.png"></p>
<h2 id="why-it-dares-to-design-it-this-way">Why It Dares to Design It This Way</h2>
<p>Because in its architecture, the IDE part was never the point.</p>
<p>The official architecture doc splits the system into three rings: the engine host, the protocol line, and the UI client.</p>
<p>The first ring runs in <code>packages/server</code>, using Bun to start an HTTP + WebSocket service with pi running in-process. The second ring is the versioned protocol in <code>packages/contracts</code>, the only coupling between the two ends. The third ring is <code>apps/web</code>, a React client that is mobile first.</p>
<p>&ldquo;Mobile first&rdquo; is not a figure of speech. The doc says so: the UI ships independently of the host, dials into a host over the network, and a phone can connect through Tailscale.</p>
<p>So from day one it never designed itself as a traditional IDE. It&rsquo;s a remote panel for an agent host, and the desktop build just happens to wrap it in Electrobun.</p>
<p>The read-only editor isn&rsquo;t a crippled editor. It&rsquo;s the natural result of that architecture: the UI is only the observer and the approver, and the thing that actually does the work is the agent inside the host.</p>
<p><img loading="lazy" src="/images/thinkrail/fig5.png"></p>
<h2 id="the-repo-itself">The Repo Itself</h2>
<p>The codebase isn&rsquo;t small: 1,493 TypeScript files plus 349 TSX files, 354,000 lines.</p>
<p>The stack is new too: Bun runtime, React 19, Monaco 0.57 with shiki, xterm 6, Tailwind 4, TypeScript 6.0.3, Astro for the site. The desktop shell isn&rsquo;t Electron, it&rsquo;s Electrobun.</p>
<p>Community numbers: 7,484 stars, 450 forks, 365 open issues. The repo was created on July 8, 2026, and it got there in under four months. That&rsquo;s a fast pace.</p>
<p>Releases are dense too: 0.2.0 on October 18, 0.3.0 on October 29, 0.3.1 on November 1, and the nightlies are already at 0.4.0.</p>
<h2 id="two-things-that-dont-sound-good">Two Things That Don&rsquo;t Sound Good</h2>
<p>First, telemetry is on by default. <code>analyticsEnabled</code> and <code>analyticsConsentConfirmed</code> are both true in <code>config.json</code>. That <code>--no-analytics</code> launch flag only turns off &ldquo;additional usage data&rdquo;, not the basic stats, so you have to go into settings to kill those.</p>
<p>Second, JetBrains&rsquo; AI strategy is a bit scattered right now. The two Hacker News threads together have over two hundred points and over two hundred comments, and the top voted one isn&rsquo;t praise, it&rsquo;s a complaint: Air and ThinkRail are both still half finished, while the AI Assistant that actually works well got pushed to the side.</p>
<p>I agree with that one. ThinkRail feels more like a bet, an experiment. JetBrains itself hangs the incubator sign on it.</p>
<h2 id="my-call">My Call</h2>
<p>If your first reaction is &ldquo;what use is an IDE that won&rsquo;t let you edit&rdquo;, then it really wasn&rsquo;t built for you.</p>
<p>It serves a different group: people already used to letting the agent do the work, whose main job is reviewing diffs and writing specs, moving forward one session after another. For them, being able to edit is actually a burden, because when you and the agent are fighting over the same file, the conflict can only be settled by self-discipline.</p>
<p>The answer it gives is physical isolation: one worktree and one branch per workspace, so the agent&rsquo;s mess stays on its own branch, and you merge only after you&rsquo;ve reviewed it.</p>
<p>I think that idea is more thorough than &ldquo;add an AI button to the editor&rdquo;. Its bet is that the IDE of the future is mainly for review, not for writing.</p>
<p>Whether the bet is right, check back in a year. As for this version, I&rsquo;ll use it for small jobs. I won&rsquo;t use it to replace IDEA.</p>
<p>When you write code these days, is that moment of changing a file still mostly your own hands, or has it already gone to the agent? If it&rsquo;s the latter, this read-only design probably won&rsquo;t bother you.</p>
]]></content:encoded></item></channel></rss>