Skip to content

feat(sidebar-v2): bring back thread pinning - #5312

Merged
t3dotgg merged 4 commits into
mainfrom
t3code/sidebar-v2-pinning
Aug 4, 2026
Merged

feat(sidebar-v2): bring back thread pinning#5312
t3dotgg merged 4 commits into
mainfrom
t3code/sidebar-v2-pinning

Conversation

@t3dotgg

@t3dotgg t3dotgg commented Aug 4, 2026

Copy link
Copy Markdown
Member

Sidebar v2 shipped without a way to keep an important thread from drifting: active cards hold creation order, and the settle/snooze lifecycle eventually parks everything on a shelf. There was no way to say "this one stays on top."

Pinning brings that back. Pinned threads render as full cards above the inbox behind a thin divider (no header text — the pin glyphs carry the meaning). A pin overrides the lifecycle: while pinned, a thread can neither auto-settle out of sight nor be hidden by snooze state, and its settle/snooze affordances yield to a single Unpin. Unpinning returns the thread to wherever it would otherwise classify.

Pin state is server-backed and syncs across devices, following the snooze template layer for layer:

  • Contracts: optional pinnedAt on thread + shell (pre-pin servers still decode), thread.pin/thread.unpin commands and events, and a threadPinning capability so clients hide the affordance under version skew.
  • Server: decider cases (idempotent by re-emission, archived threads rejected; no other invariants — a pin only ever promotes visibility), projector, projection pipeline, pinned_at column via migration 036, and snapshot/persistence plumbing.
  • Web: pinned partition ahead of snooze/settle, pin glyph on cards, Unpin hover action, Pin/Unpin in the context menu.
  • Mobile: same partition in thread list v2, Unpin as the swipe primary on pinned rows, Pin in card long-press menus.

Covered by focused tests at each layer: decider pin/unpin invariants, projector lifecycle, persistence round-trip, client reducer events, and a mobile partition test proving a pinned thread cannot vanish into a shelf.


Built by Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Medium Risk
Touches orchestration decider event bundles and list classification across web, mobile, and DB projections; behavior is well-tested but pin/settle/snooze interactions affect core inbox ordering.

Overview
Adds thread pinning end-to-end so important threads stay as full cards above the inbox instead of drifting into settle/snooze shelves.

Contracts & clients: Optional pinnedAt on thread shells, thread.pin / thread.unpin commands and events, and a threadPinning capability (same version-skew pattern as snooze). Client runtime dispatches pin/unpin; web and mobile gate UI on the capability and surface Pin/Unpin in context menus (mobile long-press menus + pin glyph on pinned rows).

Server & persistence: Decider handles pin/unpin (idempotent re-emission, archived threads rejected). Pinning promotes visibility by also emitting unsettle/unsnooze when needed; settling a pinned thread also emits thread.unpinned. Projector, projection pipeline, and queries carry pinnedAt; migration 036 adds pinned_at to projection_threads. Server advertises threadPinning: true.

List behavior (web sidebar v2 + mobile thread list v2): Partition order is pinned → active → snoozed → settled. Snooze still hides a thread (pin preserved underneath); pinned threads skip settled classification. Tests cover decider, projector, persistence, reducer, and mobile partition parity with web.

Reviewed by Cursor Bugbot for commit 5d8f568. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add thread pinning to sidebar v2 on web and mobile

  • Adds a pinned block that appears above the active inbox in both the web sidebar (SidebarV2.tsx) and mobile thread lists, showing pinned threads in creation order with a pin icon.
  • Introduces thread.pin and thread.unpin orchestration commands with full decider, projector, and projection pipeline support; settling a pinned thread also emits thread.unpinned.
  • Adds database migration 036_ProjectionThreadsPinned.ts to add pinned_at to projection_threads.
  • Pinning is gated by a new threadPinning server capability; environments not advertising this capability hide pin actions.
  • Pinned threads are exempt from auto-settle; snoozed pinned threads are hidden until they wake, then return to the pinned block.

Macroscope summarized 5d8f568.

Pinned threads render as full cards above the inbox behind a thin
divider. A pin overrides the settled/snoozed lifecycle: while pinned, a
thread can neither auto-settle out of sight nor be hidden by snooze
state, and the settle/snooze affordances yield to Unpin.

Pin state is server-backed (same template as snooze): a pinnedAt field
on the thread contracts, thread.pin/unpin commands and events through
the decider and projector, a pinned_at projection column, and a
threadPinning capability so clients hide the affordance against
pre-pinning servers. Mobile's thread list v2 gets the same partition,
swipe, and menu treatment.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: c90c084a-a72f-4953-88ec-706df2cdc316

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 4, 2026
Comment thread apps/mobile/src/features/home/HomeScreen.tsx
Comment thread apps/mobile/src/features/home/HomeScreen.tsx
Comment thread apps/web/src/components/SidebarV2.tsx
@macroscopeapp

macroscopeapp Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. This PR introduces a complete thread pinning feature with new commands, events, database migration, and UI across web and mobile. As a new user-facing capability with multiple unresolved bugs identified (including high-severity issues with re-pin idempotency and mobile swipe actions), it warrants human review.

You can customize Macroscope's approvability policy. Learn more.

t3dotgg and others added 2 commits August 3, 2026 19:06
- Add the pin handlers and capability set to both mobile v2 render
  callbacks' dependency arrays (stale-closure risk flagged by Macroscope
  and Bugbot).
- Exempt pinned threads from bulk settle and bulk snooze in the web
  multi-select menu: the pin overrides both classifications, so either
  would stamp state that only surfaces after unpin (Bugbot).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Pin/unpin move to the context menu (and mobile long-press menu) only.
Pinned cards keep Settle as the hover/swipe quick action, and the
decider now clears the pin as part of thread.settle — "done" beats
"keep on top", so settling a pinned thread parks it like any other.
Snooze stays hidden while pinned: it does not unpin, so the pin would
override it invisibly. Bulk settle correspondingly includes pinned rows
again.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
updatedAt: occurredAt,
},
},
];

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Settle leaves latent snooze

Medium Severity

When thread.settle runs on a pinned thread, the decider clears the pin but leaves snoozedUntil/snoozedAt unchanged. After unpin, list partition treats snooze before settled, so the thread moves to the snoozed shelf instead of the settled tail despite the user choosing Settle.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 0f171bd. Configure here.

// server-side); Unpin is the menu-only escape hatch. Snooze is withheld —
// it does not unpin, so the pin would override it invisibly.
const PINNED_MENU_ACTIONS: MenuAction[] = [
{ id: "settle", title: "Settle", image: "checkmark" },

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pinned menu ignores settlement

Low Severity

Pinned rows always use PINNED_MENU_ACTIONS with Settle, regardless of settlementSupported. Swipe correctly falls back to Archive when settlement is unsupported, but long-press Settle hits the server guard and shows an error instead of offering archive like other legacy rows.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 0f171bd. Configure here.

Final pin/snooze/settle semantics:

- Settle clears the pin (already in place): "done" beats "keep on top".
- Pin now clears parked state: pinning a settled thread un-settles it
  (reason "user") and pinning a snoozed thread wakes it — the thread is
  on top NOW, not on Tuesday.
- Snooze no longer loses to the pin in classification: a snoozed pinned
  thread leaves the list until it wakes, then returns to the pinned
  block (pinned cards are creation-ordered, so it lands back at its
  original spot). The pin survives underneath.

Snooze affordances are restored on pinned rows everywhere (hover
button, context/long-press menus, bulk snooze) since snoozing them is
meaningful again.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 High

const primaryAction = useMemo(() => {
// Pre-settlement server: archive is the swipe action, as in v1. (Slim
// rows cannot occur here — unsupported environments never classify as
// settled.)
if (swipeActions.primary === "archive") {

A pinned card's primary swipe action is still Settle (or Archive on legacy servers), not Unpin — so the main mobile swipe gesture on a pinned row settles or archives the thread instead of unpinning it. The pinnedRow flag only controls the pin glyph and the long-press menu item; it is never passed into resolveThreadListV2SwipeActions or the primaryAction memo, so the swipe path never produces an Unpin action. Route the pinned state into primaryAction selection and return handleUnpin for pinned rows.

Suggested change
const primaryAction = useMemo(() => {
if (pinnedRow && props.pinningSupported) {
return {
accessibilityLabel: `Unpin ${thread.title}`,
icon: "pin.slash" as const,
label: "Unpin",
onPress: handleUnpin,
};
}
// Pre-settlement server: archive is the swipe action, as in v1. (Slim
// rows cannot occur here — unsupported environments never classify as
// settled.)
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @apps/mobile/src/features/threads/thread-list-v2-items.tsx around lines 513-517:

A pinned card's primary swipe action is still Settle (or Archive on legacy servers), not Unpin — so the main mobile swipe gesture on a pinned row settles or archives the thread instead of unpinning it. The `pinnedRow` flag only controls the pin glyph and the long-press menu item; it is never passed into `resolveThreadListV2SwipeActions` or the `primaryAction` memo, so the swipe path never produces an Unpin action. Route the pinned state into `primaryAction` selection and return `handleUnpin` for pinned rows.

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 2 potential issues.

There are 4 total unresolved issues (including 2 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5d8f568. Configure here.

: swipeActions.secondary === "snooze"
? snoozableCardMenuActions
: CARD_MENU_ACTIONS
: cardMenuActions

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mobile snoozed shelf lacks Unpin

Medium Severity

When a pinned thread is snoozed, its mobile long-press menu incorrectly shows only "Wake" and "Delete". The "Unpin" option is missing, requiring users to wake the thread before unpinning, which differs from web behavior.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 5d8f568. Configure here.

},
});
}
return promotionEvents.length > 0 ? [pinnedEvent, ...promotionEvents] : pinnedEvent;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-pin emits promotion events

High Severity

thread.pin always emits thread.unsettled / thread.unsnoozed when settled or snooze fields are set, even on idempotent re-pin when pinnedAt is already set. Retries or duplicate pin commands on a pinned-and-snoozed thread can wake it early instead of no-op re-emission.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 5d8f568. Configure here.

@t3dotgg
t3dotgg merged commit da6e1a9 into main Aug 4, 2026
17 checks passed
@t3dotgg
t3dotgg deleted the t3code/sidebar-v2-pinning branch August 4, 2026 23:35
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 5, 2026
## What's Changed
* fix(web): better right panel (new diffs styling) by @maria-rcks in pingdotgg/t3code#5260
* fix(server): keep regenerated titles on topic by @t3dotgg in pingdotgg/t3code#5365
* refactor(server): make title prompts plaintext by @t3dotgg in pingdotgg/t3code#5368
* feat(web): configurable fonts and sizes under Settings → Appearance by @StiensWout in pingdotgg/t3code#5103
* feat(sidebar-v2): bring back thread pinning by @t3dotgg in pingdotgg/t3code#5312
* feat(web): make pairing QR codes actually scannable, with endpoint choice by @t3dotgg in pingdotgg/t3code#5360
* fix(desktop,web): improve in-app browser shortcuts and URL behavior by @t3dotgg in pingdotgg/t3code#4703
* fix(web): prevent legacy model picker layout shift by @FllipEis in pingdotgg/t3code#5349
* fix(server): allow remote updates with database migrations by @t3dotgg in pingdotgg/t3code#5374


**Full Changelog**: pingdotgg/t3code@v0.0.32-nightly.20260804.1000...v0.0.32-nightly.20260805.1002

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.32-nightly.20260805.1002
phoenixtail26 added a commit to phoenixtail26/t3code that referenced this pull request Aug 5, 2026
31 upstream commits (through 3c5bdb8). Three conflicts, all in fork
contact files:

- apps/server/src/http.ts: upstream replaced the hand-rolled
  compression middleware with HttpMiddleware.compression(). Dropped the
  stale middleware from our side, kept the fork's static cache-header
  block (HTML_SHELL_CACHE_HEADERS / IMMUTABLE_ASSET_CACHE_HEADERS /
  isFingerprintedAsset); its response-site usages auto-merged.
- apps/web/src/components/SidebarV2.tsx: upstream expanded the
  useThreadActions destructure for thread pinning (pingdotgg#5312). Took theirs,
  re-appended the fork's `const forkThread = useForkThread()`.
- apps/web/src/components/settings/SettingsPanels.tsx: upstream
  relocated the word-wrap row into the new typography area (pingdotgg#5103).
  Dropped the stale word-wrap block, kept the fork's
  <ExternalSessionsSettingRow /> at the end of the Appearance section.

Tripwire reported zero dropped fork lines. pnpm-lock.yaml auto-merged
and `corepack pnpm install --lockfile-only` confirmed it consistent.
vp run typecheck and vp check both clean (0 errors, 0 warnings).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 5, 2026
- Port thread pinning (#5312) into the orchestration-v2 command pipeline:
  thread.pin/unpin commands, thread.pinned/unpinned events, pinnedAt on the
  v2 thread state and projected shells, promotion semantics (pin clears
  settle/snooze, settle clears pin) matching the v1 decider, and client
  pin/unpin operations in the v2 dispatch style.
- Port the regenerated-title context anchoring (#5365) into
  ThreadTitleRegenerationService: pin the first user message ahead of the
  retained tail when the digest is truncated.
- Re-apply the right-panel controls positioning from #5260 to the v2
  ChatView title bar controls.
- Repair merge artifacts: committed conflict markers in BranchToolbar,
  duplicate capability keys, duplicate CommandPalette import, v1 turn
  naming in DiffPanel's focus-refresh effect, onSend signature merge.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
cursor Bot pushed a commit to aaditagrawal/t3code that referenced this pull request Aug 6, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
cursor Bot pushed a commit to aaditagrawal/t3code that referenced this pull request Aug 6, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
cursor Bot pushed a commit to aaditagrawal/t3code that referenced this pull request Aug 6, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
cursor Bot pushed a commit to aaditagrawal/t3code that referenced this pull request Aug 6, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
cursor Bot pushed a commit to aaditagrawal/t3code that referenced this pull request Aug 6, 2026
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
stevesarmiento added a commit to stevesarmiento/harness that referenced this pull request Aug 7, 2026
…ffect beta.103

67 upstream commits (through 6b73b3d): paginated thread loading with
user-anchored turn windows (pingdotgg#5493), contract-backed fonts (pingdotgg#5103),
subagent/workflow observability agents panel (pingdotgg#5219), sidebar-v2 thread
pinning (pingdotgg#5312, migrations 036/037), scannable pairing QR (pingdotgg#5360), MCP
tool-result trimming (pingdotgg#5482), renderer OOM containment (pingdotgg#5148), tunnel
survives updates/stops, terminal polish batch, forward-compat
ServerProviders decode (pingdotgg#5327), Effect beta.103, many fixes.

Forma preserved: composer surface/footer, ComposerMetaBar, diff panel
skin, RightPanelTabs Forma strip/icons with BOTH componentPreview and
agents surfaces, sidebar tone map, forma:// CORS origins, ~/.forma,
fork migrations 935-941 after upstream 036/037, fork contract fields
alongside fonts/threadPinning. Fonts unification starts (terminal now
settings-driven); fix-forward follows.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 7, 2026
- Port thread pinning (#5312) into the orchestration-v2 command pipeline:
  thread.pin/unpin commands, thread.pinned/unpinned events, pinnedAt on the
  v2 thread state and projected shells, promotion semantics (pin clears
  settle/snooze, settle clears pin) matching the v1 decider, and client
  pin/unpin operations in the v2 dispatch style.
- Port the regenerated-title context anchoring (#5365) into
  ThreadTitleRegenerationService: pin the first user message ahead of the
  retained tail when the digest is truncated.
- Re-apply the right-panel controls positioning from #5260 to the v2
  ChatView title bar controls.
- Repair merge artifacts: committed conflict markers in BranchToolbar,
  duplicate capability keys, duplicate CommandPalette import, v1 turn
  naming in DiffPanel's focus-refresh effect, onSend signature merge.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 7, 2026
## What's Changed
* fix(mobile): reduce thread feed scroll jank by @gabrielelpidio in pingdotgg/t3code#4874
* fix(web): restore sidebar v2 thread actions and terminal icon by @Noojuno in pingdotgg/t3code#4712
* fix(web): settle button now works on hover, not just right-click by @t3dotgg in pingdotgg/t3code#4905
* fix(clients): disable add project while disconnected by @StiensWout in pingdotgg/t3code#4834
* fix(composer): hide default Codex service tier by @maxktz in pingdotgg/t3code#4784
* docs: link iOS and Android app store downloads by @t3dotgg in pingdotgg/t3code#4902
* fix(web): align remote server update action by @StiensWout in pingdotgg/t3code#4731
* fix(connect): suggest a serve command that matches how you ran connect by @t3dotgg in pingdotgg/t3code#4897
* fix(mobile): stop shared content errors in Personal Team builds by @t3dotgg in pingdotgg/t3code#4943
* perf(mobile): sends respond instantly, thread opens stop freezing by @t3dotgg in pingdotgg/t3code#4882
* fix(web): show Codex fast mode as a bolt by @t3dotgg in pingdotgg/t3code#4947
* docs: seed worktrees with a copy of real userdata instead of banning it by @t3dotgg in pingdotgg/t3code#4949
* fix(mobile): support dragged images in the composer by @t3dotgg in pingdotgg/t3code#4953
* fix(mobile): stop long iOS threads from jumping while scrolling up by @t3dotgg in pingdotgg/t3code#4867
* fix(web): keep worktree default when switching a draft's machine by @t3dotgg in pingdotgg/t3code#4964
* perf(mobile): reconnect environments immediately on resume by @t3dotgg in pingdotgg/t3code#4878
* feat(web): pasting a huge screenshot now compresses it instead of erroring by @t3dotgg in pingdotgg/t3code#4967
* feat(web): regenerate thread titles from sidebar by @t3dotgg in pingdotgg/t3code#4810
* fix(web): show server update progress through reconnect by @t3dotgg in pingdotgg/t3code#4903
* feat(search): find threads by conversation content by @t3dotgg in pingdotgg/t3code#4959
* fix: marketing site Vercel builds no longer die after ~100 deploys by @t3dotgg in pingdotgg/t3code#4975
* docs: split user and maintainer docs, fix 100+ stale claims by @t3dotgg in pingdotgg/t3code#4807
* fix(web): server updates no longer look like warnings by @t3dotgg in pingdotgg/t3code#4992
* fix(connect): reboots no longer strand the relay link, 403s now say why by @t3dotgg in pingdotgg/t3code#4988
* Add project file picker (⌘P) and project content search (⇧⌘F) by @jakeleventhal in pingdotgg/t3code#4855
* Check for mobile app updates on launch by @juliusmarminge in pingdotgg/t3code#4958
* fix(mobile): support pre-Liquid-Glass iOS bottom toolbar by @gabrielelpidio in pingdotgg/t3code#4984
* fix(server): restore PR detection without HOME by @StiensWout in pingdotgg/t3code#4985
* fix(web): fill fast mode icon by @maria-rcks in pingdotgg/t3code#5004
* fix: cache project favicons across web and mobile by @gabrielelpidio in pingdotgg/t3code#4767
* perf(ci): cut stale runs and redundant setup by @t3dotgg in pingdotgg/t3code#4802
* style(web): make scroll-to-end pill translucent by @maria-rcks in pingdotgg/t3code#5036
* fix(desktop): bump Clerk Electron SDK to 0.0.24 and register t3code:// scheme on Linux by @juliusmarminge in pingdotgg/t3code#5015
* perf(server): cache default branch name and origin existence across status refreshes by @UtkarshUsername in pingdotgg/t3code#5008
* feat(shared): support shorthand (major-only) versions in the semver helpers by @arhxam in pingdotgg/t3code#5027
* fix(mobile): remove unnecessary photo library permission by @skjiisa in pingdotgg/t3code#4929
* fix(shared): lenient JSON parser deletes commas inside string values by @arhxam in pingdotgg/t3code#5025
* fix(mobile): default bare IP pairing to HTTP by @Lucenx9 in pingdotgg/t3code#4990
* fix(mobile): restore iOS Threads branding by @PixPMusic in pingdotgg/t3code#4862
* chore: add mobile issue template area by @MaxAnderson95 in pingdotgg/t3code#4895
* fix(desktop): link release notes from the update downloaded toast by @Sy-D in pingdotgg/t3code#4771
* fix(mobile): accept Android clipboard images in composer by @adityavardhansharma in pingdotgg/t3code#4836
* fix(mobile): show the correct build channel in Android's Threads page header by @PixPMusic in pingdotgg/t3code#4861
* fix(contracts): decode growing config unions forward-compatibly by @juliusmarminge in pingdotgg/t3code#5055
* fix(mobile): server model, worktree, and origin preferences now apply to new tasks by @t3dotgg in pingdotgg/t3code#5064
* fix(ci): repair the mobile showcase screenshots workflow by @juliusmarminge in pingdotgg/t3code#5057
* fix(ci): capture iPad App Store screenshots in landscape by @PixPMusic in pingdotgg/t3code#5065
* fix(oxlint-plugin): Resolve the oxlint bin without assuming a pnpm layout by @mwolson in pingdotgg/t3code#5066
* feat(cli): `npx t3 pair` - generate QR code from a running server by @t3dotgg in pingdotgg/t3code#4955
* fix(server): self-update no longer rolls itself back on restart by @t3dotgg in pingdotgg/t3code#5095
* fix(ci): rotate iPad showcase captures without Simulator UI scripting by @juliusmarminge in pingdotgg/t3code#5094
* feat(web): render terminals with libghostty-vt by @StiensWout in pingdotgg/t3code#4860
* refactor: move the canonical libghostty-vt vendor to the repository root by @StiensWout in pingdotgg/t3code#5102
* feat(mobile): add thread snoozing by @gabrielelpidio in pingdotgg/t3code#5053
* feat(mobile): make settled threads collapsible by @PixPMusic in pingdotgg/t3code#5056
* follow-up normalization after #4700. by @shivamhwp in pingdotgg/t3code#4498
* feat(web): search threads from the sidebar by @shivamhwp in pingdotgg/t3code#4769
* feat(web): add settings sidebar search by @shivamhwp in pingdotgg/t3code#4682
* fix: threads with open PRs no longer auto-settle by @t3dotgg in pingdotgg/t3code#5151
* fix(server): bound thread catch-up replay and stop full-DB snapshot hydration by @t3dotgg in pingdotgg/t3code#5147
* fix(server): follow branch drift in dedicated worktrees so PRs link to their thread by @t3dotgg in pingdotgg/t3code#5159
* fix(server): make remote updates rollback-safe by @t3dotgg in pingdotgg/t3code#5181
* fix(web): stop settle controls overlapping the status label by @ipanasenko in pingdotgg/t3code#4574
* fix: normalize app icon glyph sizing by @t3-code[bot] in pingdotgg/t3code#5202
* fix(server): surface cloudflared FTL/PNC relay logs as warnings, not debug by @arhxam in pingdotgg/t3code#5076
* fix(server): stop npx service updates from silently leaving the old server running by @t3dotgg in pingdotgg/t3code#5217
* feat: fold legacy models into separate menus by @t3dotgg in pingdotgg/t3code#5190
* fix(desktop): claim the t3code:// scheme default on Linux at startup by @juliusmarminge in pingdotgg/t3code#5054
* fix(web): polish interface spacing by @maria-rcks in pingdotgg/t3code#5252
* fix(desktop): Niri/Hyprland - Linux secret storage backend by @mwolson in pingdotgg/t3code#2916
* fix(web): match loading screen to dark theme by @t3-code[bot] in pingdotgg/t3code#5303
* fix(web): blink the terminal cursor again by @StiensWout in pingdotgg/t3code#5314
* fix(terminal): protect held Ctrl/Cmd+W close shortcut by @StiensWout in pingdotgg/t3code#5322
* fix(server): strip replayable terminal queries from history by @StiensWout in pingdotgg/t3code#5319
* fix(contracts): decode ServerProviders forward-compatibly by @Brechard in pingdotgg/t3code#5327
* fix(web): simplify chat code blocks by @t3-code[bot] in pingdotgg/t3code#5301
* fix(web): align multiline error alert controls by @t3-code[bot] in pingdotgg/t3code#5304
* Upgrade Effect to beta.103 by @juliusmarminge in pingdotgg/t3code#5331
* fix(web): increase tooltip z-index to overlay popovers and menus by @naMqe-h in pingdotgg/t3code#5326
* fix(server): use a Cursor todo's title when its content is blank by @arhxam in pingdotgg/t3code#5073
* fix(ssh): isolate managed tunnel processes by @nateEc in pingdotgg/t3code#4347
* fix(server): scrub AppImage XDG_DATA_DIRS and GSETTINGS_SCHEMA_DIR from terminals by @arhxam in pingdotgg/t3code#5075
* fix(mobile): show correct provider icons for Grok, Cursor, and OpenCode by @Wraient in pingdotgg/t3code#4586
* fix(web): stop the chat timeline reading through the provider status banner by @Bil0000 in pingdotgg/t3code#5353
* fix(desktop,web): contain renderer memory growth and recover from renderer OOM crashes by @t3dotgg in pingdotgg/t3code#5148
* fix(server): generate durable thread titles by @t3dotgg in pingdotgg/t3code#5357
* fix(web): better right panel (new diffs styling) by @maria-rcks in pingdotgg/t3code#5260
* fix(server): keep regenerated titles on topic by @t3dotgg in pingdotgg/t3code#5365
* refactor(server): make title prompts plaintext by @t3dotgg in pingdotgg/t3code#5368
* feat(web): configurable fonts and sizes under Settings → Appearance by @StiensWout in pingdotgg/t3code#5103
* feat(sidebar-v2): bring back thread pinning by @t3dotgg in pingdotgg/t3code#5312
* feat(web): make pairing QR codes actually scannable, with endpoint choice by @t3dotgg in pingdotgg/t3code#5360
* fix(desktop,web): improve in-app browser shortcuts and URL behavior by @t3dotgg in pingdotgg/t3code#4703
* fix(web): prevent legacy model picker layout shift by @FllipEis in pingdotgg/t3code#5349
* fix(server): allow remote updates with database migrations by @t3dotgg in pingdotgg/t3code#5374
* fix(mcp): unblock Kimi models in OpenCode with preview tools by @hwanseoc in pingdotgg/t3code#5128
* fix(web): clear main branch lint warnings by @t3dotgg in pingdotgg/t3code#5384
* fix(mobile): preserve grouped project workspaces by @shivamhwp in pingdotgg/t3code#4642
* fix(mobile): prevent Android thread search crash by @shivamhwp in pingdotgg/t3code#5386
* fix(web): truncate long project switcher names by @FllipEis in pingdotgg/t3code#5348
* fix(mobile): avoid double dividers between thread sections by @shivamhwp in pingdotgg/t3code#5391
* fix(web): keep the composer command menu anchored to the composer by @StiensWout in pingdotgg/t3code#5336
* fix(web): restore terminal link hover styles by @StiensWout in pingdotgg/t3code#5382
* fix(ci): isolate releases from shared API rate limits by @t3dotgg in pingdotgg/t3code#5394
* fix(web): keep model picker shortcuts in sync by @t3dotgg in pingdotgg/t3code#5400
* fix(web): keep terminal font settings reliable by @StiensWout in pingdotgg/t3code#5397
* Enrich terminal font previews by @juliusmarminge in pingdotgg/t3code#5428
* fix(web): preserve terminal font size when splitting by @t3-code[bot] in pingdotgg/t3code#5444
* Prevent terminal loading flash by @juliusmarminge in pingdotgg/t3code#5432
* fix: reconnect faster after remote server updates by @t3dotgg in pingdotgg/t3code#5404
* feat: native subagent & workflow observability by @t3dotgg in pingdotgg/t3code#5219
* perf(server): stop shipping full MCP tool results in thread payloads by @t3dotgg in pingdotgg/t3code#5482
* fix(web): closed plan sidebar stays closed when returning to a thread by @t3dotgg in pingdotgg/t3code#5484
* fix: respect time format for sidebar snooze by @huxcrux in pingdotgg/t3code#4438
* fix: smooth remote server updates by @t3dotgg in pingdotgg/t3code#5470
* fix(server): drop superseded tool updates from snapshots by @t3dotgg in pingdotgg/t3code#5483
* fix(web): clarify auto permission fallback by @t3-code[bot] in pingdotgg/t3code#5431
* fix(acp): keep unknown approvals actionable by @t3-code[bot] in pingdotgg/t3code#5430
* fix(mobile): stop thread messages reading through pending cards by @carlosricojr in pingdotgg/t3code#5450
* fix(web): align composer inline chips with prompt text by @StiensWout in pingdotgg/t3code#5495
* fix(web): clear woke state on explicit thread actions by @StiensWout in pingdotgg/t3code#5486
* fix(server): skip origin fetch when creating worktrees in repos without an origin remote by @t3dotgg in pingdotgg/t3code#5556
* fix(web): update tooltip no longer dismisses when scrolling release notes by @t3dotgg in pingdotgg/t3code#5547
* fix(server): stop showing commit/push/PR notices as errors in the work log by @t3dotgg in pingdotgg/t3code#5559
* fix(web): show remote environment for non-Git projects by @t3dotgg in pingdotgg/t3code#5555
* fix(server): stopping a Claude thread no longer shows an ede_diagnostic error by @t3dotgg in pingdotgg/t3code#5557
* fix(web): show one toast when snoozing threads in bulk by @t3dotgg in pingdotgg/t3code#5560
* fix(server): let stopped threads settle immediately by @t3dotgg in pingdotgg/t3code#5553
* feat: paginate thread loading with user-anchored turn windows by @t3dotgg in pingdotgg/t3code#5493
* fix: prevent reconnect loops during server stalls by @gfsaaser24 in pingdotgg/t3code#5561
* fix(server): settle stopped Claude subagents by @t3dotgg in pingdotgg/t3code#5568
* fix: scrolling up during a running thread no longer snaps back to the bottom by @t3dotgg in pingdotgg/t3code#5566
* fix(server): one disconnecting client no longer blocks every reconnect by @t3dotgg in pingdotgg/t3code#5572
* test(server): catch client transfer regressions in CI by @t3dotgg in pingdotgg/t3code#5350
* fix(web): stop the "requests are slow" warning from firing on every provider update by @t3dotgg in pingdotgg/t3code#5570
* fix(web): keep agent panel rows stable by @t3dotgg in pingdotgg/t3code#5569
* docs: ship production T3 Connect public config in .env.example by @t3dotgg in pingdotgg/t3code#5573
* fix(web): plans stop hijacking the UI, fold into chat instead by @t3dotgg in pingdotgg/t3code#5558
* feat(web): remove Build/Plan toggle from the composer by @t3dotgg in pingdotgg/t3code#5551
* feat(web): per-device provider settings by @t3dotgg in pingdotgg/t3code#4479
* fix(mobile): invisible T3 Connect devices can now be seen and removed by @t3dotgg in pingdotgg/t3code#5563
* fix: add missing space before 'GitHub releases page' link on download page by @Mateleo in pingdotgg/t3code#4511
* fix(web): stop the sidebar "Working" label from pulsing by @t3dotgg in pingdotgg/t3code#5580
* feat(web): add modular theme library by @StiensWout in pingdotgg/t3code#5226
* fix(web): reading a thread clears Done; Woke is dismissible by @t3dotgg in pingdotgg/t3code#5579
* perf(dev): faster cold-start for dev web serving by @t3dotgg in pingdotgg/t3code#5584
* fix(dev): agents get --share right on the first try by @t3dotgg in pingdotgg/t3code#5586
* fix(mobile): improve keyboard avoiding by @jmeistrich in pingdotgg/t3code#5451
* fix(web): live background-work banner no longer hides behind the update notice by @t3dotgg in pingdotgg/t3code#5595
* fix(web): stabilize chat timeline positioning by @jmeistrich in pingdotgg/t3code#5449
* feat(server): record runtime mode per turn and on mode changes by @t3dotgg in pingdotgg/t3code#5593
* feat(web): thread actions from the chat header title by @t3dotgg in pingdotgg/t3code#5592
* fix(mobile): avoid iOS terminal reset on clear by @justynleung in pingdotgg/t3code#5440
* fix(mobile): pad scroll views above Android nav bar by @StoneCotton in pingdotgg/t3code#5415
* fix(mobile): keep Android chat text from showing through the composer by @PollyGlot in pingdotgg/t3code#5582
* fix(mobile): repair Clerk auth navigation headers by @gabrielelpidio in pingdotgg/t3code#5140
* Bump mobile app version to 1.0.2 by @juliusmarminge in pingdotgg/t3code#5588
* feat(web): click the pin icon to unpin a thread by @UtkarshUsername in pingdotgg/t3code#5578
* fix(web): show the correctly matching shortcut in new thread button's tooltip by @UtkarshUsername in pingdotgg/t3code#5594

## New Contributors
* @gabrielelpidio made their first contribution in pingdotgg/t3code#4874
* @arhxam made their first contribution in pingdotgg/t3code#5027
* @skjiisa made their first contribution in pingdotgg/t3code#4929
* @Lucenx9 made their first contribution in pingdotgg/t3code#4990
* @MaxAnderson95 made their first contribution in pingdotgg/t3code#4895
* @t3-code[bot] made their first contribution in pingdotgg/t3code#5202
* @Brechard made their first contribution in pingdotgg/t3code#5327
* @naMqe-h made their first contribution in pingdotgg/t3code#5326
* @Bil0000 made their first contribution in pingdotgg/t3code#5353
* @gfsaaser24 made their first contribution in pingdotgg/t3code#5561
* @Mateleo made their first contribution in pingdotgg/t3code#4511
* @jmeistrich made their first contribution in pingdotgg/t3code#5451
* @justynleung made their first contribution in pingdotgg/t3code#5440
* @StoneCotton made their first contribution in pingdotgg/t3code#5415
* @PollyGlot made their first contribution in pingdotgg/t3code#5582

**Full Changelog**: pingdotgg/t3code@v0.0.31...v0.0.32

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.32
JTBroad added a commit to JTBroad/t3code that referenced this pull request Aug 7, 2026
Catches the fork up on 101 upstream commits (2026-08-03..08-07, through
v0.0.32), and adopts upstream's thread pinning and pinned-thread ordering
in place of the fork's own manual thread ordering.

Ordering: upstream's pingdotgg#5312 and pingdotgg#5581 implement pinning plus drag ordering
server-side -- pinned/pinOrderKey columns, fractional base-26 order keys,
synced across devices, with mobile move up/down. The fork's version was
client-only (uiStateStore.threadOrder), single-device, and its two follow-up
fixes existed to patch problems the key-based design does not have (dense
array rewrites, stale ranks, undraggable new rows). Upstream's supersedes it
on every axis the fork cared about except ordering unpinned threads and
multi-select drag, both of which we are choosing to drop. So a124e82,
907e62f and cda5f09 are dropped: SidebarV2, Sidebar.logic, and
uiStateStore take upstream's side wholesale, and the design docs for the
fork feature go with them.

thread.clear survives the SidebarV2 rewrite, re-applied onto upstream's
extracted buildThreadActionMenuItems. Its capability is optional on the
menu state rather than a plain boolean, so upstream's new chat-header menu
does not silently inherit a destructive action nobody wired up there.

Migrations: upstream claimed 036-038, so the fork's 036_MemoryAndDrive is
renumbered to 039 -- the number is the applied-order key, so it moves rather
than collides. Its test migrated to 36 and now migrates to 39.

Editor discovery: upstream added its own Clock-based discovery cache, which
replaces the fork's Effect.cachedWithTTL from a1e7a48. Same defect fixed
the same way; theirs is the maintained one. Note this lowers the cached TTL
from 5 minutes to upstream's 60s -- still no per-request PATH sweep, which
was the actual bug.

Effect beta.103 (upstream 2b1d4fe) tightened two things the fork's own
tests tripped on: McpServer.layerHttp now requires `protocols`, and MCP
sessions reject requests that omit the mcp-protocol-version header, so the
memory toolkit listing test needed both.

The VCS upstream-fetch constants from 81e99bb survive untouched; upstream
did not go near them.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL 500-999 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant