Everything the IntelliJ Git client does, and the bar is what Rebased ships as a standalone product: git4idea plus the platform's log, diff and merge. Each tile is a feature, ranked by how much it matters to a day's work, left to right and top to bottom. Glazed tiles are supported. Bisque tiles are fired before 1.0, and the gold seam is where 1.0 gets cut. Hover a tile to see what it is; click it to find it in the log below.
107of 176features supported
107 supported
28 before 1.0
30 after 1.0
11 not planned
next up
The glaze, rank 1 to 176
1.0
What 1.0 means. The top 135 tiles, the essential and important tiers, all glazed, and the settings and command IDs frozen. That's 28 to go. Until then the extension stays in preview and a minor version may still rename a porcelain.* setting.
Next up Full grammar coverage in diffs, lazy-loaded · Auto-fetch on an interval, with a last-fetch tooltip · Commit message inspections · Rename following in file history
The log
The same 176 features as a log, in the same order: rank is importance, so everything before 1.0 sits above the seam and everything after it below. One lane per area, a node per feature, and every lane merging into 1.0 before it fans out again. Filled nodes are supported, rings are waiting. Every ring expands into a mock of the feature drawn on the real surface.
Essentialfelt every session
49 of 57 supported
1Commit graph with colour-coded lanes and merge bubblesLog & graph
2Branch tree: local, remote and tags, searchableLog & graph
3Commit tool window with checkbox partial commitsCommit, shelf & stash
4Changed files and details for the selected commitLog & graph
21Merge Conflicts group nested in Changes, with a continue/abort bannerCommit, shelf & stash
22Author, date and paths filtersLog & graph
23Go to hash, branch or tag (⌘G)Log & graph
24Collapse linear branches, per fragment and all at onceLog & graph
25Resizable, hideable columnsLog & graph
26FavouritesBranches, tags & remotes
27Update (fast-forward) with upstream awarenessBranches, tags & remotes
28Merge into current, Rebase current ontoBranches, tags & remotes
29Annotate with Git Blame: author and date gutter with a hover cardBlame & file history
30Show File History from the editor or the explorerBlame & file history
31Force push with --force-with-leasePush, update & fetch
32Protected branches refuse force pushPush, update & fetch
33Rollback, with the option to delete added filesCommit, shelf & stash
34Unversioned files groupCommit, shelf & stash
35Directory grouping and multi-selectionCommit, shelf & stash
36Ignore whitespace: four policiesDiff & merge
37Find in a diff (⌘F)Diff & merge
38Next and Previous file (⌘F7 / ⌘⇧F7)Diff & merge
39Multi-root workspaces with a shared active repositoryPlatform
40Syntax highlighting in diffs and merges, six grammarsDiff & merge
41Full grammar coverage in diffs, lazy-loaded (D2)Next upMockDiff & merge
What it would look like
Six grammars ship today and everything else falls back to plain text. The full Shiki grammar set is loaded on demand, one grammar per language the first time a diff needs it, and cached for the session, so a Python or Go diff colours the same way a TypeScript one does. Nothing is bundled up front; the first diff in a new language pays a one-off load.
Mock, drawn on the real surfaces. Nothing here is built.
pool.py · 1 of 2 · ac2edb5 ↔ 6ab30ba — repoSign In
↑↓✎‹›⇅⌕Python · grammar loaded on demand1 difference⚙
🔒 ac2edb5 src/db/pool.py🔒 6ab30ba src/db/pool.py
1classPool:
2def__init__(self, size: int):
3 self.free: list[Client] = []
4
5defclose(self) -> None:
6 self.sweeper.cancel()
7
8defsweep(self):
1classPool:
2def__init__(self, size: int):
3 self.free: list[Client] = []
4
5asyncdefdrain(self) -> None:
6 self.sweeper.cancel()
7await asyncio.gather(*[c.close() for c in self.free])
8
42Auto-fetch on an interval, with a last-fetch tooltipNext upMockPush, update & fetch
What it would look like
A background fetch on a timer keeps the incoming and outgoing arrows honest without a manual Fetch. The interval is a setting, zero turns it off, and the tree shows when the last fetch ran. It uses the same fetch path as the toolbar button, so protected branches, tag mode and the remote resolution all apply.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
⌄Local
🏷main↓3
⌄feature
⑂rate-limit↑1
⑂sessions↓2 ↑1
⑂webhooks
⌄Remote
⌄origin
★main
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Alan Turingchore: bump dependencies16 days ago573752d
Grace Hopperfeat: structured request logging17 days agoe2d9496
Fetched 4 minutes ago · every 15 minutes 2 incoming from origin/feature/sessions, 1 outgoing
⌕porcelain
Porcelain › Fetch: Interval
Minutes between automatic fetches. 0 fetches only when you ask.
15
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
43Commit message inspections: subject length, blank line, body wrap, with a quick fixNext upMockCommit, shelf & stash
What it would look like
IntelliJ checks the message as you type: a subject over 72 characters, no blank line before the body, body lines past the wrap. Each gets a squiggle and a quick fix. Limits come from porcelain.commit.subjectLimit and porcelain.commit.bodyWrap, defaulting to 72 like IntelliJ. Warnings only; Commit stays enabled.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Commit
CommitShelfStash
⌄CHANGES4 FILES
⌄src3 files
TSwebhooks.tsA
TSconfig.tsM
TSrouter.tsM
M↓README.mdM
⌄UNVERSIONED FILES1 FILE
M↓NOTES.mdU
feat: return JSON on unmatched routes instead of the HTML error page from express
Subject is 84 characters. Keep the first line under 72.
💡Move the rest into the body⌥⏎
Amend Sign-off⚙🕓
CommitCommit and Push…⌄
The three rules, and their fixes
Subject over 72
Move the rest into the body
No blank line before the body
Insert one
Body line over 72
Reflow the paragraph
Warnings only. Commit stays enabled, the way IntelliJ leaves it.
46Compare with Current: a branch comparison tab with per-side filtersLog & graph
47Compare Versions between two commitsLog & graph
48Commit message history dropdownCommit, shelf & stash
49Message seeded from commit.template or MERGE_MSGCommit, shelf & stash
50Native diff editor fallback through porcelain.diff.viewerDiff & merge
51Fetch, with porcelain.fetch.tagsPush, update & fetch
52Git Operations popup (⌘⌥G)Platform
53Commit checks: CRLF, large files, detached HEAD, unset user.name or emailBefore 1.0MockCommit, shelf & stash
What it would look like
The git-level checks IntelliJ runs before a commit, as one dialog that lists what it found and offers the fix inline: convert line separators, skip a file over the size limit or keep it, commit on a detached HEAD anyway, or set user.name and user.email right there. Nothing runs until you choose.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Commit
CommitShelfStash
⌄CHANGES4 FILES
⌄src3 files
TSwebhooks.tsA
TSconfig.tsM
TSrouter.tsM
M↓README.mdM
⌄UNVERSIONED FILES1 FILE
M↓NOTES.mdU
feat: return JSON on unmatched routes
Amend Sign-off⚙🕓
CommitCommit and Push…⌄
Commit
3 checks before the commit runs
⚠
2 files use CRLF line separatorsconfig.ts, server.ts. The repository is set to LF.
Fix and Commit
⚠
NOTES.pdf is 14 MBOver the 10 MB warning threshold. Git LFS would keep it out of every clone.
Skip file
⊗
user.name is not setThe commit needs an author.
Set…
CancelCommit AnywayCommit
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
54Delete notification with RestoreBefore 1.0MockBranches, tags & remotes
What it would look like
Deleting a branch puts its tip hash in the notification, and Restore recreates the branch there. The hash is kept for the session, so the undo works even after the tree has refreshed. Force-deletes carry the same button, which is the point: the counted warning stays, and the mistake becomes cheap.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
⌄Local
🏷main
⌄feature
⑂rate-limit
⑂sessions
⌄Remote
⌄origin
★main
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Alan Turingchore: bump dependencies16 days ago573752d
Grace Hopperfeat: structured request logging17 days agoe2d9496
ⓘDeleted branch feature/webhooks, which was at 5a03f42.×
A fourth highlighter, the one IntelliJ turns on in branch comparisons: commits on the other side whose patch already exists on the current branch are dimmed, and the ones that would actually bring something are left bright. It reads git cherry once per comparison, so it costs nothing on the plain log.
Mock, drawn on the real surfaces. Nothing here is built.
The settings menu keeps its per-window behaviour, and gains a place: a diff opened from the Commit view, from the log, or inside the merge editor remembers its own ignore policy, granularity and layout, the way IntelliJ keeps three sets. The menu says which place it is saving for, so nothing changes silently.
Mock, drawn on the real surfaces. Nothing here is built.
pool.ts · 2 of 3 · ac2edb5 ↔ 6ab30ba — repoSign In
57Rename following in file history (--follow)Next upMockBlame & file history
What it would look like
Show File History runs git log --follow with rename detection, so the history keeps going past the commit that moved the file. The rename row carries the old path as a chip, and the diff from that row opens with the two paths in its headers instead of an add and a delete.
Mock, drawn on the real surfaces. Nothing here is built.
102Change stripe with click to jump; live difference countDiff & merge
103Diff titles carry position and both revisionsDiff & merge
104Binary and image diffs side by side; large-file placeholder with Show anywayDiff & merge
105Changed-on-disk banner: reload or keepDiff & merge
106Revert or include a hunk from the working-tree diff gutterDiff & merge
107Apply non-conflicting changesDiff & merge
108Resolve automatically for non-overlapping editsDiff & merge
109Accept, accept both, revert to base, ignore, per conflictDiff & merge
110One undo/redo timeline across typed edits and gutter verbsDiff & merge
111Conflict stepping, per-pane find, collapse unchanged in the mergeDiff & merge
112Open in Porcelain Merge Editor from the VS Code Source Control viewDiff & merge
113Worktrees: list, open, create on a new branch, remove, prunePlatform
114Workspace trust: disabled until the folder is trustedPlatform
115Edit Source from any diffPlatform
116Author completion from historyBefore 1.0MockCommit, shelf & stash
What it would look like
The Author override in the commit options completes from the authors already in the history, most commits first, in git's Name <email> form. Picking one fills both parts; the option-lookalike check still runs on whatever ends up in the field.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Commit
CommitShelfStash
⌄CHANGES4 FILES
⌄src3 files
TSwebhooks.tsA
TSconfig.tsM
TSrouter.tsM
M↓README.mdM
⌄UNVERSIONED FILES1 FILE
M↓NOTES.mdU
feat: return JSON on unmatched routes
Gra
Grace Hopper <grace@example.com>412 commits
Grace Hopper <g.hopper@navy.mil>3 commits
Amend Sign-off⚙🕓
CommitCommit and Push…⌄
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
117Shelf: rename, recently deleted with restoreBefore 1.0MockCommit, shelf & stash
What it would look like
Two shelf conveniences from IntelliJ. Rename edits the shelf's name in place, and the patch directory under .idea/shelf/ is renamed with it so IntelliJ still sees the same shelf. Deleting a shelf moves it to a Recently Deleted group, from which Restore brings it back, and it is only really gone when you clear that group.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Commit
CommitShelfStash
⌄SHELVED2
▤wip: pagination cursor3 files · today
▤spike: rate limiter1 file · 2 days ago
⌄RECENTLY DELETED1
▤old: session cookiesdeleted 1 hour agoRestore
Unshelve…⇧⌘U
Unshelve Silently
Rename…
Show Diff⌘D
Delete
Amend Sign-off⚙🕓
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
118Set or unset the tracked branch from the treeBefore 1.0MockBranches, tags & remotes
What it would look like
A branch's upstream is editable from its context menu instead of only at push time. The picker lists the remote branches, with the same-name one first, and a None entry that unsets it. Update and Reset to upstream light up as soon as a tracked branch exists.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
›Recent
⌄Local
🏷main↑1
⌄feature
⑂rate-limit
⑂sessions↓2
⑂webhooks
⌄fix
⑂pool-leak
⌄Remote
⌄origin
★main
›Tags
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Alan Turingchore: bump dependencies16 days ago573752d
Grace Hopperfeat: structured request logging17 days agoe2d9496
Checkout
Update
Push…
Merge 'sessions' into current
Rebase current onto 'sessions'
Compare with Current
Set Tracked Branch…
New Branch from 'sessions'…
Rename…
Delete
Tracked branch for feature/sessions
origin/feature/sessionssame name
origin/main
origin/feature/webhooks
Noneunset the tracked branch
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
119Show diff with working tree from any refBefore 1.0MockBranches, tags & remotes
What it would look like
Compare with Current shows commit lists. This is the file-level diff between any branch, tag or commit and what is on disk right now, opened as a Changes window like Compare Versions, so every file there is double-clickable into the diff viewer with the working-tree side editable.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
›Recent
⌄Local
🏷main↑1
⌄feature
⑂rate-limit
⑂sessions↓2
⑂webhooks
⌄fix
⑂pool-leak
⌄Remote
⌄origin
★main
›Tags
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Alan Turingchore: bump dependencies16 days ago573752d
Grace Hopperfeat: structured request logging17 days agoe2d9496
Checkout
Update
Push…
Compare with Current
Show Diff with Working Tree
New Branch from 'main'…
Reset to upstream
Changes Between main and Working Tree — repoSign In
Changes Between main and working tree3 files
⌄src2 files
TSconfig.tsM
TSrouter.tsM
M↓NOTES.mdU
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
120Fix tracked branch: pick an upstream when Update has noneBefore 1.0MockPush, update & fetch
What it would look like
Update on a branch with no upstream is disabled today, with the reason. IntelliJ instead asks which remote branch to update from and offers to make it the tracked branch. Same picker as Set Tracked Branch, with a checkbox that does the setting.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
›Recent
⌄Local
🏷main↑1
⌄feature
⑂rate-limit
⑂sessions↓2
⑂webhooks
⌄fix
⑂pool-leak
⌄Remote
⌄origin
★main
›Tags
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Alan Turingchore: bump dependencies16 days ago573752d
Grace Hopperfeat: structured request logging17 days agoe2d9496
feature/rate-limit has no tracked branch. Update from…
origin/feature/rate-limitsame name
origin/main
origin/develop
Update
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
121Remember the rejected-push choiceBefore 1.0MockPush, update & fetch
What it would look like
When a push is rejected the chooser already offers merge or rebase. IntelliJ adds a checkbox that remembers the answer, so later rejections update silently the same way and push again. The memory is per repository and lives in porcelain.push.rejectedAction, which is how you change your mind.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Push Rejected
origin/main has moved since your last fetch. Update main first, then push again.
RebaseReplay your 2 commits on top of origin/main. Keeps the history linear.
MergeBring origin/main in with a merge commit.
CancelRebase and Push
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
122Add a remote inline when the push panel finds noneBefore 1.0MockPush, update & fetch
What it would look like
A fresh repository has nowhere to push. Instead of an empty target list, the push panel shows Name and URL fields in place, adds the remote, sets upstream, and pushes in one go. The same option-lookalike validation as Manage Remotes applies.
Mock, drawn on the real surfaces. Nothing here is built.
Push — repoSign In
Push main → no remotes configured
origin
git@github.com:ada/repo.git
HashMessageDate
6ab30badocs: expand the README9 days ago
04c6465chore: shut the pool down with the server10 days ago
72fd1fbfix: keep pagination stable across inserts11 days ago
ac2edb5feat: pagination for the user list13 days ago
Fixup commits the working tree as fixup! of a chosen commit. Squash Into does the same with squash!, which keeps its message for the autosquash rebase to fold in. Same picker, same guard rails, and the message box is pre-filled with the prefix and the target subject.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Commit
CommitShelfStash
⌄CHANGES4 FILES
⌄src3 files
TSwebhooks.tsA
TSconfig.tsM
TSrouter.tsM
M↓README.mdM
⌄UNVERSIONED FILES1 FILE
M↓NOTES.mdU
squash! feat: pagination for the user list
Keep the cursor stable when a page is inserted into
Amend Sign-off⚙🕓
CommitCommit and Push…⌄
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
›Recent
⌄Local
🏷main↑1
⌄feature
⑂rate-limit
⑂sessions↓2
⑂webhooks
⌄fix
⑂pool-leak
⌄Remote
⌄origin
★main
›Tags
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Once the last conflicted file is ticked in the Merge Conflicts group, the banner turns green and asks the question, with the conflict count gone. The Continue verb is the same one; the prompt just makes the moment obvious instead of leaving a resolved rebase sitting there.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Commit
CommitShelfStash
Rebasing onto main · all conflicts resolved. Continue?Continue RebaseAbortSkip Commit
⌄CHANGES2 FILES
⌄MERGE CONFLICTS0 leftResolve
TSpool.tsresolved
TSusers.tsM
fix: expire sessions on the server clock
Amend Sign-off⚙🕓
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
125Warn before rewriting commits already on a protected branchBefore 1.0MockHistory rewriting
What it would look like
The rewriting verbs check whether the commit is reachable from a branch in porcelain.push.protectedBranches on the remote. If it is, the operation warns first: rewriting it means a force push that main will refuse. The guard reuses the same setting, so there is one list to keep.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Edit Commit Message
⚠
ac2edb5 is already on origin/mainRewriting it creates a new commit that origin/main does not have. Pushing that needs a force push, and main is a protected branch, so Porcelain will refuse it.
You can still rewrite it locally, for example to move the branch elsewhere afterwards.
CancelRewrite Anyway
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
126Annotate previous revision from a blame lineBefore 1.0MockBlame & file history
What it would look like
From any blame line: annotate the file as it was in that line's parent commit, so you can walk backwards through who changed what, the way IntelliJ's gutter menu does. The gutter header names the revision you are looking at, and Show Diff opens that commit's change to the file.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
pool.tsrouter.ts
Blame: HEAD · src/db/pool.ts
Ada Lovelace 2026-08-24exportclassPool {
Ada Lovelace 2026-08-24privatereadonly free: Client[] = [];
127Click a blame line to select the commit in the logBefore 1.0MockBlame & file history
What it would look like
A click on the blame gutter selects that commit in the Porcelain panel: the log navigates to it, the details pane shows it, and the file's change in it is one double-click away. The hover card keeps working; the click is the shortcut IntelliJ users reach for.
Mock, drawn on the real surfaces. Nothing here is built.
128History for a selection (log -L)Before 1.0MockBlame & file history
What it would look like
Select a range in an editor and ask for its history: git log -L follows those lines through every commit that touched them, moves included. The log shows the filtered commits with a chip naming the range, and each diff opens scrolled to it. The git layer already has the call; this is the menu item and the chip.
Mock, drawn on the real surfaces. Nothing here is built.
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Alan Turingfeat: token bucket limiter24 days ago990169a
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
129Compare with base from the merge editor: Left↔Base, Right↔Base, Left↔RightBefore 1.0MockDiff & merge
What it would look like
Three two-pane diffs reachable from the merge toolbar, for when the three-pane view hides what a side actually changed. Each opens in the reused diff window with the merge's own labels, so Yours ↔ Base reads as main against the merge base rather than two hashes.
Mock, drawn on the real surfaces. Nothing here is built.
Merge: pool.ts — repoSign In
↑↓⇉✨⇄↶↷✕⌕1 conflict · 0 resolvedCancelApply
🔒 main src/db/pool.ts YOURS✎ Result src/db/pool.ts🔒 fix/pool-leak src/db/pool.ts THEIRS
1release(client: Client): void {
2this.free.push(client);
3 }
4close(): void {
5clearInterval(this.sweeper);
6 }
7
8privatesweep() {
≫✕
1release(client: Client): void {
2this.free.push(client);
3 }
4
5privatesweep() {
6const cutoff = Date.now();
≪✕
1release(client: Client): void {
2this.free.push(client);
3 }
4asyncdrain(): Promise<void> {
5clearInterval(this.sweeper);
6await Promise.all(…);
7 }
8
Yours ↔ Base
Theirs ↔ Base
Yours ↔ Theirs
pool.ts · main ↔ base — repoSign In
🔒 main src/db/pool.ts YOURS🔒 base 814f249
29close(): void {
30clearInterval(this.sweeper);
31 }
32
29privatesweep(): void {
30const cutoff = …;
31 }
32
130Conflict-type labels in the Conflicts window: both modified, deleted by them…Before 1.0MockDiff & merge
What it would look like
The Conflicts window says Modified / Modified for everything today. Git knows more: both modified, both added, deleted by you, deleted by them, added by each. The label changes what Accept Yours or Theirs will do, which is why IntelliJ prints it, and a deleted-by-them row makes Accept Theirs read as delete.
Mock, drawn on the real surfaces. Nothing here is built.
Conflicts — repoSign In
Conflicts — repoMerge in progress4 files with conflicts
NameYoursTheirsType
src/db2 files
TS pool.tsModifiedModifiedBoth modified
TS users.tsModifiedDeletedDeleted by them
TS router.tsAddedAddedBoth added
M↓ NOTES.mdDeletedModifiedDeleted by you
Accept YoursAccept Theirs (delete)Merge…
131Nested repositories inside one workspace folderBefore 1.0MockPlatform
What it would look like
Discovery stops at one repository per workspace folder. IntelliJ scans for nested roots and lists them alongside. The active-repository selector gains the nested ones, labelled by their path under the folder, and each behaves as its own repository in Commit and Git Log.
Mock, drawn on the real surfaces. Nothing here is built.
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Alan Turingchore: bump dependencies16 days ago573752d
Grace Hopperfeat: structured request logging17 days agoe2d9496
Active repository
repo/Users/ada/repomain
repo › vendor/limiternestedv2.1.0
repo › tools/clinestedfeature/init
docs/Users/ada/docsmain
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
132GPG signing: configure the key and show signing statusBefore 1.0MockPlatform
What it would look like
The config read already exists. This puts it somewhere: a settings row for the signing key, a toggle for commit.gpgsign, and a status line in the commit options that says which key will sign and whether the program was found, so a signed commit does not fail at the last second.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Commit
CommitShelfStash
⌄CHANGES4 FILES
⌄src3 files
TSwebhooks.tsA
TSconfig.tsM
TSrouter.tsM
M↓README.mdM
⌄UNVERSIONED FILES1 FILE
M↓NOTES.mdU
feat: return JSON on unmatched routes
🔏 Signing with 3AA5C343…7BD2gpg 2.4.5 found
Amend Sign-off⚙🕓
CommitCommit and Push…⌄
⌕porcelain
Porcelain › Signing: Sign Commits
Sign commits with GPG or SSH (commit.gpgsign).
Porcelain › Signing: Key
Key id or fingerprint (user.signingkey). Empty uses gpg's default.
3AA5C34371567BD2
Porcelain › Signing: Format
openpgp or ssh.
openpgp⌄
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
133Create patch from selected commits or changesBefore 1.0MockPlatform
What it would look like
Create Patch from the commit context menu and from the Commit view: a unified diff of the selected commits or the ticked changes, written to a file or the clipboard. The reverse option is the git one. Apply lives with the shelf's import today and grows its own dialog after 1.0.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
›Recent
⌄Local
🏷main↑1
⌄feature
⑂rate-limit
⑂sessions↓2
⑂webhooks
⌄fix
⑂pool-leak
⌄Remote
⌄origin
★main
›Tags
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Copy Revision Numbers
Cherry-Pick 2 Commits
Create Patch…
Compare Versions
Squash 2 Commits…
Create Patch
2 commits: 72fd1fb, ac2edb5
/Users/ada/pagination.patch
CancelCreate
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
134Branch filter patterns and a..b rangesBefore 1.0MockLog & graph
What it would look like
The branch filter's field accepts what git accepts: a glob like feature/* selects every matching ref, and main..release/1.2 is a range. Both sit alongside the checkboxes, and the chip shows what was typed rather than expanding it.
Mock, drawn on the real surfaces. Nothing here is built.
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Alan Turingchore: bump dependencies16 days ago573752d
Grace Hopperfeat: structured request logging17 days agoe2d9496
feature/* main..release/1.2
feature/rate-limitmatches feature/*
feature/sessionsmatches feature/*
feature/webhooksmatches feature/*
main..release/1.2range · 14 commits
fix/pool-leak
origin/main
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
135Confirmation settings: force push, branch delete, discardBefore 1.0MockPlatform
What it would look like
IntelliJ's Confirmation page, reduced to the three that matter: force push, deleting a branch, and discarding changes. Each dialog gains a Don't ask again box that writes the setting, and the settings page is where you turn a confirmation back on.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
⌕porcelain
Porcelain › Confirm: Force Push
Ask before a force push to a branch that is not protected.
Porcelain › Confirm: Delete Branch
Ask before deleting a fully merged branch. Unmerged branches always ask.
Porcelain › Confirm: Discard Changes
Ask before Rollback throws away local changes.
Force Push
Push feature/webhooks to origin with --force-with-lease? The remote branch will move back by 2 commits.
CancelForce Push
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
1.0
Usefulmonthly
0 of 30 supported
136Diff preview pane inside the logAfter 1.0MockLog & graph
What it would look like
A toggle on the details pane swaps the changed-files list for the selected file's diff, inline, the way IntelliJ's log can show a diff preview without opening a window. Same viewer, read-only, with the file list collapsed to a strip above it.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
›Recent
⌄Local
🏷main↑1
⌄feature
⑂rate-limit
⑂sessions↓2
⑂webhooks
⌄fix
⑂pool-leak
⌄Remote
⌄origin
★main
›Tags
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Alan Turingchore: bump dependencies16 days ago573752d
Grace Hopperfeat: structured request logging17 days agoe2d9496
137Drop or extract changes from a commit (split)After 1.0MockHistory rewriting
What it would look like
Pick files out of a commit: drop them from it, or extract them into a new commit right after it. Under the hood it is an interactive rebase with an edit stop, so the guard rails and the conflict banner are the same ones. Stretch in the roadmap; still stretch.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Extract Changes from ac2edb5
feat: pagination for the user list · 4 files
TSsrc/db/pool.tsM
TSsrc/db/users.tsM
TSsrc/handlers/users.tsM
TSREADME.mdM
refactor: pool cursor helpers
CancelExtract
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
138Rebase --root and --keep-emptyAfter 1.0MockHistory rewriting
What it would look like
Two more boxes in the rebase dialog: --root rebases everything from the first commit, which is how you rewrite an initial commit, and --keep-empty stops git dropping commits that become empty. Both are passed through verbatim like the existing options.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Rebase feature/sessions
main⌄
CancelRebase
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
139Cherry-pick and revert without committingAfter 1.0MockHistory rewriting
What it would look like
The no-commit variants: the change lands in the working tree, ticked, with the message seeded, and you commit when ready. Useful for combining several picks into one commit, or for editing a revert before it lands.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Commit
CommitShelfStash
⌄CHANGES2 FILES
TSpool.tsM
TSusers.tsM
(cherry picked from commit ac2edb5) feat: pagination for the user list
Amend Sign-off⚙🕓
CommitCommit and Push…⌄
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
›Recent
⌄Local
🏷main↑1
⌄feature
⑂rate-limit
⑂sessions↓2
⑂webhooks
⌄fix
⑂pool-leak
⌄Remote
⌄origin
★main
›Tags
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Cherry-Pick
Cherry-Pick Without Committing
Revert Commit
Revert Without Committing
Drop Commit
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
140Terminal-initiated rebases open the editorAfter 1.0MockHistory rewriting
What it would look like
Because Porcelain already registers as the sequence editor, a git rebase -i typed in the integrated terminal can open the same Rebasing Commits table instead of vim. The terminal waits on the editor; Cancel aborts the rebase the way an empty todo does.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
~/repo$ git rebase -i main
hint: Waiting for Porcelain to close the rebase plan…
Rebasing Commits
ActionHashMessage
pick⌄72fd1fbfix: keep pagination stable across inserts
Typing a trailer name in the message box completes it: Co-authored-by: with the same author list as the Author override, and Signed-off-by: with your own identity. Trailers stay on their own lines at the end, which the blank-line inspection also enforces.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Commit
CommitShelfStash
⌄CHANGES4 FILES
⌄src3 files
TSwebhooks.tsA
TSconfig.tsM
TSrouter.tsM
M↓README.mdM
⌄UNVERSIONED FILES1 FILE
M↓NOTES.mdU
feat: pagination for the user list
Co-au
Co-authored-by: Radia Perlman <radia@example.com>
Co-authored-by: Alan Turing <alan@example.com>
Co-authored-by: Grace Hopper <grace@example.com>
Amend Sign-off⚙🕓
CommitCommit and Push…⌄
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
142Changed-file-name completion in the messageAfter 1.0MockCommit, shelf & stash
What it would look like
The names of the ticked files complete in the message box, so a subject can name the file it touches without retyping it. Basenames first, full paths on a second press.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Commit
CommitShelfStash
⌄CHANGES4 FILES
⌄src3 files
TSwebhooks.tsA
TSconfig.tsM
TSrouter.tsM
M↓README.mdM
⌄UNVERSIONED FILES1 FILE
M↓NOTES.mdU
fix: rou
router.tssrc/handlers/router.ts
routes.test.tssrc/handlers/routes.test.ts
Amend Sign-off⚙🕓
CommitCommit and Push…⌄
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
143Reinstate index on unstashAfter 1.0MockCommit, shelf & stash
What it would look like
Git's stash pop --index: restore what was staged as staged. Porcelain's checkbox model does not show the index, so the option matters only when something else staged files, which is exactly when IntelliJ users expect it. It is a box in the unstash dialog, off by default.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Unstash
stash@{0} · WIP on main: 6ab30ba docs: expand the README
CancelUnstash
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
144Show the diff of a stash before applying itAfter 1.0MockCommit, shelf & stash
What it would look like
A stash entry expands to its files, and each file opens in the diff viewer against the stash's base, so you can see what you are about to pop. The same view IntelliJ gives from the Stash node.
Mock, drawn on the real surfaces. Nothing here is built.
145Move changes between shelvesAfter 1.0MockCommit, shelf & stash
What it would look like
Move a file from one shelf to another, or into a new one, from the shelved file's context menu. Both patches are rewritten, and the XML entries with them, so IntelliJ sees the same result.
Mock, drawn on the real surfaces. Nothing here is built.
Selecting a file in the Commit view shows its diff in the editor area without opening a window, the way IntelliJ's Commit tool window can. The pane is the real viewer with the working-tree side editable and the hunk checkboxes live, so ticking a hunk here is the same as ticking it in the window.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Commit
CommitShelfStash
⌄CHANGES4 FILES
⌄src3 files
TSwebhooks.tsA
TSconfig.tsM
TSrouter.tsM
M↓README.mdM
⌄UNVERSIONED FILES1 FILE
M↓NOTES.mdU
feat: return JSON on unmatched routes
Amend Sign-off⚙🕓
CommitCommit and Push…⌄
🔒 HEAD src/handlers/router.ts✎ Working tree src/handlers/router.ts editable
Deleting a remote branch asks about the local branches that track it, pre-ticked, so a finished feature disappears in one go. The local delete goes through the same unmerged check.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
›Recent
⌄Local
🏷main↑1
⌄feature
⑂rate-limit
⑂sessions↓2
⑂webhooks
⌄fix
⑂pool-leak
⌄Remote
⌄origin
★main
›Tags
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Alan Turingchore: bump dependencies16 days ago573752d
Grace Hopperfeat: structured request logging17 days agoe2d9496
Delete origin/feature/webhooks
The branch will be deleted on origin.
Local branches tracking it:
CancelDelete
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
148Update a branch not checked out; worktree-aware fast-forwardAfter 1.0MockBranches, tags & remotes
What it would look like
Update on a branch that is not checked out fast-forwards it in place, without switching. If another worktree has it checked out, the update happens there, and the notification says so. Anything that is not a fast-forward is refused with the reason.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
›Recent
⌄Local
🏷main↑1
⌄feature
⑂rate-limit
⑂sessions↓2
⑂webhooks
⌄fix
⑂pool-leak
⌄Remote
⌄origin
★main
›Tags
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Alan Turingchore: bump dependencies16 days ago573752d
Grace Hopperfeat: structured request logging17 days agoe2d9496
Checkout
Update
Push…
Compare with Current
ⓘfeature/sessions fast-forwarded to origin/feature/sessions (2 commits). It is checked out in ../sessions-wt, which was updated.×
Source: Porcelain
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
149Update Info tab: received commits, filterableAfter 1.0MockPush, update & fetch
What it would look like
After Update Project, a tab in the Porcelain panel lists what arrived: the commits, with the same graph rows and filters as the log, and the files they touched. The arrivals notification stays; the tab is where you read it properly.
Mock, drawn on the real surfaces. Nothing here is built.
When a fetch shows the upstream moved backwards, Porcelain names the commits of yours that are no longer on it and offers the two sane recoveries: rebase onto the new upstream, or cherry-pick your commits onto it. Stretch in the roadmap; still stretch.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: feature/sessions
⌄Local
🏷feature/sessions⚠ ↓3 ↑2
⑂main
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Alan Turingchore: bump dependencies16 days ago573752d
Grace Hopperfeat: structured request logging17 days agoe2d9496
⚠origin/feature/sessions was force-pushed. 2 of your commits (4182e66, aac7e3b) are no longer on it.×
Source: Porcelain
Rebase onto new upstreamCherry-pick mineIgnore
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
151Push all up to hereAfter 1.0MockPush, update & fetch
What it would look like
From a commit in the log: push the branch only as far as that commit. The push panel opens with the later commits greyed out of the preview, and pushes a hash:branch refspec. Handy for landing the reviewed half of a branch.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
›Recent
⌄Local
🏷main↑1
⌄feature
⑂rate-limit
⑂sessions↓2
⑂webhooks
⌄fix
⑂pool-leak
⌄Remote
⌄origin
★main
›Tags
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Checkout Revision
Push All up to Here…
Interactively Rebase from Here…
Push — repoSign In
Push main → origin/mainup to 72fd1fb
6ab30badocs: expand the README9 days ago
04c6465chore: shut the pool down with the server10 days ago
72fd1fbfix: keep pagination stable across inserts11 days ago
ac2edb5feat: pagination for the user list13 days ago
CancelPush 2 commits
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
152Show repository at a revision (tree browser)After 1.0MockBlame & file history
What it would look like
Browse the whole tree as it was at a commit, read-only, in the explorer. Every file opens through the porcelain: content scheme that already serves single files, so this is a tree over an existing door.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Explorer
Repository at ac2edb5 read-only
⌄src
⌄db
TSpool.ts
TSusers.ts
›handlers
M↓README.md
{}package.json
pool.ts @ ac2edb5
1exportclassPool {
2privatereadonly free: Client[] = [];
3
4close(): void {
5clearInterval(this.sweeper);
6 }
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
153Annotate at a chosen revisionAfter 1.0MockBlame & file history
What it would look like
Blame the file as it was at any commit or tag, picked from the same ref picker as Go to. The gutter header names the revision, and Annotate Previous Revision walks back from there.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
pool.ts
Blame: v0.2.0 · src/db/pool.ts Change revision…
Alan Turing 2026-07-30exportclassPool {
Alan Turing 2026-07-30privatereadonly free: Client[] = [];
Blame Options gains three toggles for what the gutter shows: the short hash, the date, the author. IntelliJ users who keep only the revision get a narrow gutter; the hover card still carries everything.
Mock, drawn on the real surfaces. Nothing here is built.
155Aligned changes mode with filler linesAfter 1.0MockDiff & merge
What it would look like
A layout option that inserts filler rows so matching lines sit at the same height on both sides, the way IntelliJ's Align Changes does. The merge editor's shared axis already does this for three panes; this ports it to the two-pane diff.
Mock, drawn on the real surfaces. Nothing here is built.
pool.ts · 2 of 3 · ac2edb5 ↔ 6ab30ba — repoSign In
↑↓✎‹›⇅⌕1 difference⚙
🔒 ac2edb5 src/db/pool.ts🔒 6ab30ba src/db/pool.ts
1exportclassPool {
2privatereadonly free: Client[] = [];
3close(): void {
4clearInterval(this.sweeper);
5 }
7
8privatesweep(): void {
1exportclassPool {
2privatereadonly free: Client[] = [];
3asyncdrain(): Promise<void> {
4clearInterval(this.sweeper);
5await Promise.all(…);
6 }
7
8privatesweep(): void {
Side by side
Unified
Align changes
156Compare with clipboardAfter 1.0MockDiff & merge
What it would look like
Diff the current file, or the selection, against whatever is on the clipboard, in the reused diff window. Cheap, and the thing IntelliJ users reach for when a colleague pastes a snippet into chat.
Mock, drawn on the real surfaces. Nothing here is built.
157Press again to step to the next fileAfter 1.0MockDiff & merge
What it would look like
On the last change in a file, the next-change action shows a hint instead of doing nothing: press it again to move to the next file. The file steppers stay; this is the IntelliJ habit of holding one key through a whole review.
Mock, drawn on the real surfaces. Nothing here is built.
pool.ts · 2 of 3 · ac2edb5 ↔ 6ab30ba — repoSign In
Last change in this file. Press ↓ again for users.ts (3 of 3)
158Merge finish escape hatch: save with unresolved regionsAfter 1.0MockDiff & merge
What it would look like
Apply is gated on every conflict being resolved, which is stricter than IntelliJ. This adds the way out: save what you have and mark the file resolved anyway, after a dialog that counts what is left. Cancel keeps offering to restore the original.
Mock, drawn on the real surfaces. Nothing here is built.
Merge: pool.ts — repoSign In
↑↓⇉✨↶↷✕⌕2 conflicts · 0 resolvedCancelApply
🔒 main src/db/pool.ts YOURS✎ Result src/db/pool.ts🔒 fix/pool-leak src/db/pool.ts THEIRS
1release(client: Client): void {
2this.free.push(client);
3 }
4close(): void {
5clearInterval(this.sweeper);
6 }
7
8privatesweep() {
≫✕
1release(client: Client): void {
2this.free.push(client);
3 }
4
5privatesweep() {
6const cutoff = Date.now();
≪✕
1release(client: Client): void {
2this.free.push(client);
3 }
4asyncdrain(): Promise<void> {
5clearInterval(this.sweeper);
6await Promise.all(…);
7 }
8
Apply with Unresolved Conflicts
2 changes left unprocessed. Save the result as it is and mark pool.ts resolved anyway?
The conflict markers are not in the result; the unprocessed regions keep the base text.
Keep EditingSave Anyway
159Structure filter: pick paths in a tree dialogAfter 1.0MockLog & graph
What it would look like
The Paths filter takes free text today. IntelliJ's structure filter is a tree of the repository with checkboxes, plus recent selections. Ticking a folder narrows the log to it; the free-text field stays for pathspecs the tree cannot express.
Mock, drawn on the real surfaces. Nothing here is built.
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Alan Turingchore: bump dependencies16 days ago573752d
Grace Hopperfeat: structured request logging17 days agoe2d9496
src/handlers/*.test.ts
Repository
⌄ 📁 src
📁 db
📁 handlers
M↓ README.md
{} package.json
Recent
src/db/pool.ts
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
160Show changes from a chosen parent of a mergeAfter 1.0MockLog & graph
What it would look like
A merge commit's changed files depend on which parent you compare against. The details pane gets a parent picker for merges: first parent by default, the way git shows it, and the second parent one click away.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
›Recent
⌄Local
🏷main↑1
⌄feature
⑂rate-limit
⑂sessions↓2
⑂webhooks
⌄fix
⑂pool-leak
⌄Remote
⌄origin
★main
›Tags
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia PerlmanMerge branch 'fix/session-expiry'19 days ago814f249
Alan Turingfix: expire sessions on the server clockfix/session-expiry19 days ago4182e66
Changed files vs first parent aac7e3b · 4182e66
TS src/handlers/sessions.ts
TS src/db/sessions.ts
Merge branch 'fix/session-expiry'
814f249 Radia Perlman on 2026-08-14
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
161Signature column in the log: verified, bad, expiredAfter 1.0MockPlatform
What it would look like
A column for commit signatures, read from %G? in the same log format: verified, bad, expired key, unknown key, unsigned. The hover names the key and the signer. Off by default, like IntelliJ's.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
›Recent
⌄Local
🏷main↑1
⌄feature
⑂rate-limit
⑂sessions↓2
⑂webhooks
⌄fix
⑂pool-leak
⌄Remote
⌄origin
★main
›Tags
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageSigDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main✓9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server✓10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts✗11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list⚠13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Bad signature Key 3AA5C34371567BD2 · alan@example.com
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
162Apply patch with base mapping; reverse patchAfter 1.0MockPlatform
What it would look like
Apply Patch as its own dialog: the files in the patch, each mapped to where it now lives in the tree when the path moved, a reverse option, and a preview of what will not apply cleanly before anything is written. Import as shelf stays for the IntelliJ round trip.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Apply Patch: pagination.patch
File in patchApply toStatus
src/pool.tssrc/db/pool.ts (moved)applies
src/db/users.tssrc/db/users.tsapplies
README.mdREADME.md2 hunks fail
CancelApply
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
163Unshallow notice on shallow clonesAfter 1.0MockPlatform
What it would look like
A shallow clone stops blame and history at its depth without saying so. Porcelain notices the shallow file, says where history ends, and offers the fetch that deepens it. Clone itself stays VS Code's.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
PROBLEMSOUTPUTTERMINALPORCELAIN⟳ ⤢ ✕
⌕Branch or tag
Current Branch: main
›Recent
⌄Local
🏷main↑1
⌄feature
⑂rate-limit
⑂sessions↓2
⑂webhooks
⌄fix
⑂pool-leak
⌄Remote
⌄origin
★main
›Tags
⌕Search commits…Cc.*Branch: main ×User ⌄Date ⌄Paths ⌄⊕◉
AuthorMessageDateHash
Ada Lovelacedocs: expand the READMEHEADmainv0.3.0origin/main9 days ago6ab30ba
Radia Perlmanchore: shut the pool down with the server10 days ago04c6465
Alan Turingfix: keep pagination stable across inserts11 days ago72fd1fb
Grace Hopperfeat: pagination for the user list13 days agoac2edb5
Ada Lovelacerefactor: split the router table14 days ago7697272
Radia Perlmantest: logging middleware15 days agoe914342
Alan Turingchore: bump dependencies16 days ago573752d
Grace Hopperfeat: structured request logging17 days agoe2d9496
⚠This repository is a shallow clone (depth 50). Blame and history stop at 2026-07-01.×
Source: Porcelain
UnshallowDon't show again
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
164Settings UI for every warning and confirmationAfter 1.0MockPlatform
What it would look like
The rest of IntelliJ's VCS settings page, as porcelain.* contributions: the warnings and confirmations that the Confirmation trio does not cover, each with the same Don't ask again round trip.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
⌕porcelain
Porcelain › Warn: Detached Head
Warn before committing on a detached HEAD.
Porcelain › Warn: Large Files
Warn when a file over this many MB is ticked for commit.
10
Porcelain › Warn: CRLF
Warn when ticked files use CRLF and the repository is set to LF.
Ask⌄
Porcelain › Confirm: Move to Another Branch
Ask before smart checkout carries changes across.
Porcelain › Update: Show Update Info
Open the Update Info tab after Update Project.
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
165Multi-root sync mode: branch operations across every rootAfter 1.0MockPlatform
What it would look like
IntelliJ's Control repositories synchronously: one checkout, branch or update applied to every root at once, with a per-repository status and a rollback of the ones that succeeded when one fails. Porcelain's per-repository model is coherent, which is why this is deferred until someone needs it.
Mock, drawn on the real surfaces. Nothing here is built.
[Extension Development Host] repo
Checkout feature/sessions in 3 repositories
RepositoryStatus
repo✓ switched
docs✓ switched
tools/cli✗ local changes would be overwritten
One repository failed. Roll back the two that switched, or leave them on feature/sessions.
Leave as isRoll back all
><⑂ main*+⑂ Porcelain⊗ 0 ⚠ 0
Outside parityIntelliJ lacks it, or VS Code already has it
176Committed-changes and Incoming tabsNot plannedLog & graph
How things get on this page
The tiers are my judgement of how often a feature is felt in a day's work, so the order will move as I use the thing. I build what I actually use, and the seam exists so the long tail can never hold up 1.0. The last tier is outside the bar on purpose: features IntelliJ itself lacks, or that VS Code already provides, count as parity by integration rather than by rebuilding. If there is something in IntelliJ's Git you use every week and it's ranked too low, open an issue and say what it's for.