Skip to content

fix(otter): 43px Mac titlebar; no threads sidebar on usage and pull requests - #22

Merged
ckafrouni merged 2 commits into
mainfrom
otter/titlebar-43
Oct 6, 2026
Merged

ckafrouni merged 2 commits into
mainfrom
otter/titlebar-43

Conversation

@ckafrouni

Copy link
Copy Markdown
Collaborator

The Mac desktop titlebar was 42px; it should be 43px, with the 52px rail unchanged.

Raised --workspace-topbar-height to 43px for the Mac app and the matching height the desktop shell uses to center the traffic lights (as in Otter Mail: 14px inset, vertically centered). At 43px the center falls on a half point, so the initial position is rounded the same way the zoom/fullscreen resync already rounds it (y: 15).

Model: Claude Opus 5.5, via Claude Code in T3 Code.

🤖 Generated with Claude Code

ckafrouni and others added 2 commits October 6, 2026 17:02
The traffic lights stay centered in it, rounded to the nearest point.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@ckafrouni ckafrouni changed the title fix(otter): 43px titlebar on the Mac desktop app fix(otter): 43px Mac titlebar; no threads sidebar on usage and pull requests Oct 6, 2026
@ckafrouni
ckafrouni merged commit 978cd18 into main Oct 6, 2026
25 of 37 checks passed
@ckafrouni
ckafrouni deleted the otter/titlebar-43 branch October 6, 2026 15:14
ckafrouni added a commit that referenced this pull request Oct 6, 2026
* feat(otter): unify suite accounts and move Code to .app

* test(otter): remove obsolete Clerk fixtures

* fix(otter): finish account release and LAN support

* refactor(otter): remove unused account exports

* fix(otter): promote hosted domains together

* fix(otter): register web domains before promotion

* fix(otter): await web domain certificates

* ci(otter): host the web client on Cloudflare

* feat(otter): Otter Mail's window layout (#18)

Otter Code now looks and works like Otter Mail: a rail of spaces down the
window's left edge and one rounded content panel for the sidebar and panes.

- Space rail: All projects, each project, Add project and Pull requests;
  Usage and Settings at its foot. A project scopes the thread sidebar, whose
  heading names the space and opens the project picker. On phones the rail
  sits inside the sidebar sheet.
- Frame: in the desktop app the panes' headers sit on a 42px title band
  above an inset panel with a rim and rounded corners; in a browser tab the
  panel runs to the page's edges. The frame takes a lifted tone (or the
  theme's sidebar color), and the Mac traffic lights move into the band.
- Sidebar: no wordmark; the space's heading is the first row, with the dev
  and nightly art behind it inside the panel. Search and New thread share a
  row. Settings, Usage and Pull requests moved from the footer to the rail.
- Title band icons follow Otter Mail: pane toggles for the sidebar and right
  panel, a details icon for thread details; the terminal toggle is gone
  (mod+J still opens it).
- ChatGPT joins the built-in themes (web, desktop and iOS), with graphite
  stage art.
- The dev Dock icon gets the classic macOS shape (824px body, native
  shadow) instead of a full-bleed square.
- Performance: the messages timeline no longer re-renders each frame the
  chat canvas resizes, the details card stays pinned to the right edge with
  memoized content, and the thread sidebar skips window resize re-renders.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(otter): channel icons like T3 Code's (#19)

Dev and nightly builds now wear their own icons, as T3 Code's do, so they
are told apart from production at a glance: the otter on upstream's
blueprint (dev) and night sky (nightly) instead of the same black icon
everywhere.

- assets/otter-dev and assets/otter-nightly: Icon Composer projects with
  upstream's dev and nightly layers and shadows, the otter as a white glyph
  in place of the T3 mark. Their iOS, Linux, Windows and web exports come
  from vp run icons:export; the classic macOS PNGs use upstream's exports of
  the same projects for the body edge and shadow.
- The dev and nightly channels point at them: desktop dev runs, the dev
  launcher, packaged nightlies, hosted nightly web, the dev web favicons and
  the mobile dev and preview builds' icons and brand mark. Production keeps
  assets/otter unchanged.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): promote hosted web without local build files

* fix(web): finish account callbacks before onboarding

* fix(otter): update button in the rail, roomier right panel on desktop (#20)

- The desktop app's update button moves from the thread sidebar's footer
  to the foot of the space rail, above Usage and Settings, freeing the
  sidebar's last row. Its tooltip and nightly release notes open rightward.
- Desktop: the right panel's surfaces (browser address bar, file
  breadcrumbs, diff header) start a step inside the panel instead of
  touching its rim under the title band. The web keeps its spacing.
- Desktop: the floating browser preview's hover controls show again. The
  content panel no longer creates a stacking context, which had put them
  under the browser webview drawn at the app root.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): restore account dialog spacing and scrolling

* feat(otter): project groups in the rail

The rail listed every project, which stops scaling once a user works across
several organisations' repositories.

- The rail now holds spaces instead of projects: All projects, Chats
  (threads without a project), then the user's project groups. The + is
  gone; groups are made in Settings → Project groups.
- A group lists only its projects' threads in the sidebar. New threads
  default to one of its projects, and the draft's project picker and
  "New thread in…" offer only those. In Chats, a new thread starts without
  a project.
- Groups are stored as `railProjectGroups` in server settings, keyed by
  logical project, so one repository on several machines is one member.
  It is a shared setting, written to every connected environment, so every
  device and the hosted app show the same groups.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(otter): mock the rail space in useHandleNewThread tests

The hook now reads the rail's space, whose real module pulls in environment
state that this test's contracts mock does not provide, so the file failed
to load in CI. Mock the space as All projects, like the test's other
dependencies.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs(otter): land fork changes through pull requests (#21)

OTTER.md told contributors to commit directly to main. AGENTS.md has agents
run only targeted checks and leaves the full suite to CI, so a direct push
reaches main and the nightly release before CI has run. That is how a broken
test in useHandleNewThread blocked today's release.

Every change now lands through a PR that merges once CI is green. Asking an
agent to change the fork counts as asking it for that PR, which settles
AGENTS.md's "no PR unless asked". Publishing a sync stays the only direct
write to main.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): 43px Mac titlebar; no threads sidebar on usage and pull requests (#22)

* fix(otter): 43px titlebar on the Mac desktop app

The traffic lights stay centered in it, rounded to the nearest point.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): usage and pull requests pages drop the threads sidebar

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): page titles clear the traffic lights without the sidebar (#23)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(otter): sudo browser setup command uses otter-code

Upstream's new sudo test expects `npx t3`; the fork's CLI is `otter-code`.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Laurin-Notemann pushed a commit that referenced this pull request Oct 7, 2026
* feat(otter): unify suite accounts and move Code to .app

* test(otter): remove obsolete Clerk fixtures

* fix(otter): finish account release and LAN support

* refactor(otter): remove unused account exports

* fix(otter): promote hosted domains together

* fix(otter): register web domains before promotion

* fix(otter): await web domain certificates

* ci(otter): host the web client on Cloudflare

* feat(otter): Otter Mail's window layout (#18)

Otter Code now looks and works like Otter Mail: a rail of spaces down the
window's left edge and one rounded content panel for the sidebar and panes.

- Space rail: All projects, each project, Add project and Pull requests;
  Usage and Settings at its foot. A project scopes the thread sidebar, whose
  heading names the space and opens the project picker. On phones the rail
  sits inside the sidebar sheet.
- Frame: in the desktop app the panes' headers sit on a 42px title band
  above an inset panel with a rim and rounded corners; in a browser tab the
  panel runs to the page's edges. The frame takes a lifted tone (or the
  theme's sidebar color), and the Mac traffic lights move into the band.
- Sidebar: no wordmark; the space's heading is the first row, with the dev
  and nightly art behind it inside the panel. Search and New thread share a
  row. Settings, Usage and Pull requests moved from the footer to the rail.
- Title band icons follow Otter Mail: pane toggles for the sidebar and right
  panel, a details icon for thread details; the terminal toggle is gone
  (mod+J still opens it).
- ChatGPT joins the built-in themes (web, desktop and iOS), with graphite
  stage art.
- The dev Dock icon gets the classic macOS shape (824px body, native
  shadow) instead of a full-bleed square.
- Performance: the messages timeline no longer re-renders each frame the
  chat canvas resizes, the details card stays pinned to the right edge with
  memoized content, and the thread sidebar skips window resize re-renders.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(otter): channel icons like T3 Code's (#19)

Dev and nightly builds now wear their own icons, as T3 Code's do, so they
are told apart from production at a glance: the otter on upstream's
blueprint (dev) and night sky (nightly) instead of the same black icon
everywhere.

- assets/otter-dev and assets/otter-nightly: Icon Composer projects with
  upstream's dev and nightly layers and shadows, the otter as a white glyph
  in place of the T3 mark. Their iOS, Linux, Windows and web exports come
  from vp run icons:export; the classic macOS PNGs use upstream's exports of
  the same projects for the body edge and shadow.
- The dev and nightly channels point at them: desktop dev runs, the dev
  launcher, packaged nightlies, hosted nightly web, the dev web favicons and
  the mobile dev and preview builds' icons and brand mark. Production keeps
  assets/otter unchanged.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): promote hosted web without local build files

* fix(web): finish account callbacks before onboarding

* fix(otter): update button in the rail, roomier right panel on desktop (#20)

- The desktop app's update button moves from the thread sidebar's footer
  to the foot of the space rail, above Usage and Settings, freeing the
  sidebar's last row. Its tooltip and nightly release notes open rightward.
- Desktop: the right panel's surfaces (browser address bar, file
  breadcrumbs, diff header) start a step inside the panel instead of
  touching its rim under the title band. The web keeps its spacing.
- Desktop: the floating browser preview's hover controls show again. The
  content panel no longer creates a stacking context, which had put them
  under the browser webview drawn at the app root.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): restore account dialog spacing and scrolling

* feat(otter): project groups in the rail

The rail listed every project, which stops scaling once a user works across
several organisations' repositories.

- The rail now holds spaces instead of projects: All projects, Chats
  (threads without a project), then the user's project groups. The + is
  gone; groups are made in Settings → Project groups.
- A group lists only its projects' threads in the sidebar. New threads
  default to one of its projects, and the draft's project picker and
  "New thread in…" offer only those. In Chats, a new thread starts without
  a project.
- Groups are stored as `railProjectGroups` in server settings, keyed by
  logical project, so one repository on several machines is one member.
  It is a shared setting, written to every connected environment, so every
  device and the hosted app show the same groups.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(otter): mock the rail space in useHandleNewThread tests

The hook now reads the rail's space, whose real module pulls in environment
state that this test's contracts mock does not provide, so the file failed
to load in CI. Mock the space as All projects, like the test's other
dependencies.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs(otter): land fork changes through pull requests (#21)

OTTER.md told contributors to commit directly to main. AGENTS.md has agents
run only targeted checks and leaves the full suite to CI, so a direct push
reaches main and the nightly release before CI has run. That is how a broken
test in useHandleNewThread blocked today's release.

Every change now lands through a PR that merges once CI is green. Asking an
agent to change the fork counts as asking it for that PR, which settles
AGENTS.md's "no PR unless asked". Publishing a sync stays the only direct
write to main.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): 43px Mac titlebar; no threads sidebar on usage and pull requests (#22)

* fix(otter): 43px titlebar on the Mac desktop app

The traffic lights stay centered in it, rounded to the nearest point.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): usage and pull requests pages drop the threads sidebar

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): page titles clear the traffic lights without the sidebar (#23)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(otter): sudo browser setup command uses otter-code

Upstream's new sudo test expects `npx t3`; the fork's CLI is `otter-code`.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Laurin-Notemann pushed a commit that referenced this pull request Oct 8, 2026
* feat(otter): unify suite accounts and move Code to .app

* test(otter): remove obsolete Clerk fixtures

* fix(otter): finish account release and LAN support

* refactor(otter): remove unused account exports

* fix(otter): promote hosted domains together

* fix(otter): register web domains before promotion

* fix(otter): await web domain certificates

* ci(otter): host the web client on Cloudflare

* feat(otter): Otter Mail's window layout (#18)

Otter Code now looks and works like Otter Mail: a rail of spaces down the
window's left edge and one rounded content panel for the sidebar and panes.

- Space rail: All projects, each project, Add project and Pull requests;
  Usage and Settings at its foot. A project scopes the thread sidebar, whose
  heading names the space and opens the project picker. On phones the rail
  sits inside the sidebar sheet.
- Frame: in the desktop app the panes' headers sit on a 42px title band
  above an inset panel with a rim and rounded corners; in a browser tab the
  panel runs to the page's edges. The frame takes a lifted tone (or the
  theme's sidebar color), and the Mac traffic lights move into the band.
- Sidebar: no wordmark; the space's heading is the first row, with the dev
  and nightly art behind it inside the panel. Search and New thread share a
  row. Settings, Usage and Pull requests moved from the footer to the rail.
- Title band icons follow Otter Mail: pane toggles for the sidebar and right
  panel, a details icon for thread details; the terminal toggle is gone
  (mod+J still opens it).
- ChatGPT joins the built-in themes (web, desktop and iOS), with graphite
  stage art.
- The dev Dock icon gets the classic macOS shape (824px body, native
  shadow) instead of a full-bleed square.
- Performance: the messages timeline no longer re-renders each frame the
  chat canvas resizes, the details card stays pinned to the right edge with
  memoized content, and the thread sidebar skips window resize re-renders.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(otter): channel icons like T3 Code's (#19)

Dev and nightly builds now wear their own icons, as T3 Code's do, so they
are told apart from production at a glance: the otter on upstream's
blueprint (dev) and night sky (nightly) instead of the same black icon
everywhere.

- assets/otter-dev and assets/otter-nightly: Icon Composer projects with
  upstream's dev and nightly layers and shadows, the otter as a white glyph
  in place of the T3 mark. Their iOS, Linux, Windows and web exports come
  from vp run icons:export; the classic macOS PNGs use upstream's exports of
  the same projects for the body edge and shadow.
- The dev and nightly channels point at them: desktop dev runs, the dev
  launcher, packaged nightlies, hosted nightly web, the dev web favicons and
  the mobile dev and preview builds' icons and brand mark. Production keeps
  assets/otter unchanged.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): promote hosted web without local build files

* fix(web): finish account callbacks before onboarding

* fix(otter): update button in the rail, roomier right panel on desktop (#20)

- The desktop app's update button moves from the thread sidebar's footer
  to the foot of the space rail, above Usage and Settings, freeing the
  sidebar's last row. Its tooltip and nightly release notes open rightward.
- Desktop: the right panel's surfaces (browser address bar, file
  breadcrumbs, diff header) start a step inside the panel instead of
  touching its rim under the title band. The web keeps its spacing.
- Desktop: the floating browser preview's hover controls show again. The
  content panel no longer creates a stacking context, which had put them
  under the browser webview drawn at the app root.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): restore account dialog spacing and scrolling

* feat(otter): project groups in the rail

The rail listed every project, which stops scaling once a user works across
several organisations' repositories.

- The rail now holds spaces instead of projects: All projects, Chats
  (threads without a project), then the user's project groups. The + is
  gone; groups are made in Settings → Project groups.
- A group lists only its projects' threads in the sidebar. New threads
  default to one of its projects, and the draft's project picker and
  "New thread in…" offer only those. In Chats, a new thread starts without
  a project.
- Groups are stored as `railProjectGroups` in server settings, keyed by
  logical project, so one repository on several machines is one member.
  It is a shared setting, written to every connected environment, so every
  device and the hosted app show the same groups.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(otter): mock the rail space in useHandleNewThread tests

The hook now reads the rail's space, whose real module pulls in environment
state that this test's contracts mock does not provide, so the file failed
to load in CI. Mock the space as All projects, like the test's other
dependencies.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs(otter): land fork changes through pull requests (#21)

OTTER.md told contributors to commit directly to main. AGENTS.md has agents
run only targeted checks and leaves the full suite to CI, so a direct push
reaches main and the nightly release before CI has run. That is how a broken
test in useHandleNewThread blocked today's release.

Every change now lands through a PR that merges once CI is green. Asking an
agent to change the fork counts as asking it for that PR, which settles
AGENTS.md's "no PR unless asked". Publishing a sync stays the only direct
write to main.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): 43px Mac titlebar; no threads sidebar on usage and pull requests (#22)

* fix(otter): 43px titlebar on the Mac desktop app

The traffic lights stay centered in it, rounded to the nearest point.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): usage and pull requests pages drop the threads sidebar

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): page titles clear the traffic lights without the sidebar (#23)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(otter): sudo browser setup command uses otter-code

Upstream's new sudo test expects `npx t3`; the fork's CLI is `otter-code`.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Laurin-Notemann pushed a commit that referenced this pull request Oct 10, 2026
* feat(otter): unify suite accounts and move Code to .app

* test(otter): remove obsolete Clerk fixtures

* fix(otter): finish account release and LAN support

* refactor(otter): remove unused account exports

* fix(otter): promote hosted domains together

* fix(otter): register web domains before promotion

* fix(otter): await web domain certificates

* ci(otter): host the web client on Cloudflare

* feat(otter): Otter Mail's window layout (#18)

Otter Code now looks and works like Otter Mail: a rail of spaces down the
window's left edge and one rounded content panel for the sidebar and panes.

- Space rail: All projects, each project, Add project and Pull requests;
  Usage and Settings at its foot. A project scopes the thread sidebar, whose
  heading names the space and opens the project picker. On phones the rail
  sits inside the sidebar sheet.
- Frame: in the desktop app the panes' headers sit on a 42px title band
  above an inset panel with a rim and rounded corners; in a browser tab the
  panel runs to the page's edges. The frame takes a lifted tone (or the
  theme's sidebar color), and the Mac traffic lights move into the band.
- Sidebar: no wordmark; the space's heading is the first row, with the dev
  and nightly art behind it inside the panel. Search and New thread share a
  row. Settings, Usage and Pull requests moved from the footer to the rail.
- Title band icons follow Otter Mail: pane toggles for the sidebar and right
  panel, a details icon for thread details; the terminal toggle is gone
  (mod+J still opens it).
- ChatGPT joins the built-in themes (web, desktop and iOS), with graphite
  stage art.
- The dev Dock icon gets the classic macOS shape (824px body, native
  shadow) instead of a full-bleed square.
- Performance: the messages timeline no longer re-renders each frame the
  chat canvas resizes, the details card stays pinned to the right edge with
  memoized content, and the thread sidebar skips window resize re-renders.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(otter): channel icons like T3 Code's (#19)

Dev and nightly builds now wear their own icons, as T3 Code's do, so they
are told apart from production at a glance: the otter on upstream's
blueprint (dev) and night sky (nightly) instead of the same black icon
everywhere.

- assets/otter-dev and assets/otter-nightly: Icon Composer projects with
  upstream's dev and nightly layers and shadows, the otter as a white glyph
  in place of the T3 mark. Their iOS, Linux, Windows and web exports come
  from vp run icons:export; the classic macOS PNGs use upstream's exports of
  the same projects for the body edge and shadow.
- The dev and nightly channels point at them: desktop dev runs, the dev
  launcher, packaged nightlies, hosted nightly web, the dev web favicons and
  the mobile dev and preview builds' icons and brand mark. Production keeps
  assets/otter unchanged.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): promote hosted web without local build files

* fix(web): finish account callbacks before onboarding

* fix(otter): update button in the rail, roomier right panel on desktop (#20)

- The desktop app's update button moves from the thread sidebar's footer
  to the foot of the space rail, above Usage and Settings, freeing the
  sidebar's last row. Its tooltip and nightly release notes open rightward.
- Desktop: the right panel's surfaces (browser address bar, file
  breadcrumbs, diff header) start a step inside the panel instead of
  touching its rim under the title band. The web keeps its spacing.
- Desktop: the floating browser preview's hover controls show again. The
  content panel no longer creates a stacking context, which had put them
  under the browser webview drawn at the app root.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): restore account dialog spacing and scrolling

* feat(otter): project groups in the rail

The rail listed every project, which stops scaling once a user works across
several organisations' repositories.

- The rail now holds spaces instead of projects: All projects, Chats
  (threads without a project), then the user's project groups. The + is
  gone; groups are made in Settings → Project groups.
- A group lists only its projects' threads in the sidebar. New threads
  default to one of its projects, and the draft's project picker and
  "New thread in…" offer only those. In Chats, a new thread starts without
  a project.
- Groups are stored as `railProjectGroups` in server settings, keyed by
  logical project, so one repository on several machines is one member.
  It is a shared setting, written to every connected environment, so every
  device and the hosted app show the same groups.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(otter): mock the rail space in useHandleNewThread tests

The hook now reads the rail's space, whose real module pulls in environment
state that this test's contracts mock does not provide, so the file failed
to load in CI. Mock the space as All projects, like the test's other
dependencies.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs(otter): land fork changes through pull requests (#21)

OTTER.md told contributors to commit directly to main. AGENTS.md has agents
run only targeted checks and leaves the full suite to CI, so a direct push
reaches main and the nightly release before CI has run. That is how a broken
test in useHandleNewThread blocked today's release.

Every change now lands through a PR that merges once CI is green. Asking an
agent to change the fork counts as asking it for that PR, which settles
AGENTS.md's "no PR unless asked". Publishing a sync stays the only direct
write to main.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): 43px Mac titlebar; no threads sidebar on usage and pull requests (#22)

* fix(otter): 43px titlebar on the Mac desktop app

The traffic lights stay centered in it, rounded to the nearest point.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): usage and pull requests pages drop the threads sidebar

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): page titles clear the traffic lights without the sidebar (#23)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(otter): sudo browser setup command uses otter-code

Upstream's new sudo test expects `npx t3`; the fork's CLI is `otter-code`.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Laurin-Notemann pushed a commit that referenced this pull request Oct 12, 2026
* feat(otter): unify suite accounts and move Code to .app

* test(otter): remove obsolete Clerk fixtures

* fix(otter): finish account release and LAN support

* refactor(otter): remove unused account exports

* fix(otter): promote hosted domains together

* fix(otter): register web domains before promotion

* fix(otter): await web domain certificates

* ci(otter): host the web client on Cloudflare

* feat(otter): Otter Mail's window layout (#18)

Otter Code now looks and works like Otter Mail: a rail of spaces down the
window's left edge and one rounded content panel for the sidebar and panes.

- Space rail: All projects, each project, Add project and Pull requests;
  Usage and Settings at its foot. A project scopes the thread sidebar, whose
  heading names the space and opens the project picker. On phones the rail
  sits inside the sidebar sheet.
- Frame: in the desktop app the panes' headers sit on a 42px title band
  above an inset panel with a rim and rounded corners; in a browser tab the
  panel runs to the page's edges. The frame takes a lifted tone (or the
  theme's sidebar color), and the Mac traffic lights move into the band.
- Sidebar: no wordmark; the space's heading is the first row, with the dev
  and nightly art behind it inside the panel. Search and New thread share a
  row. Settings, Usage and Pull requests moved from the footer to the rail.
- Title band icons follow Otter Mail: pane toggles for the sidebar and right
  panel, a details icon for thread details; the terminal toggle is gone
  (mod+J still opens it).
- ChatGPT joins the built-in themes (web, desktop and iOS), with graphite
  stage art.
- The dev Dock icon gets the classic macOS shape (824px body, native
  shadow) instead of a full-bleed square.
- Performance: the messages timeline no longer re-renders each frame the
  chat canvas resizes, the details card stays pinned to the right edge with
  memoized content, and the thread sidebar skips window resize re-renders.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(otter): channel icons like T3 Code's (#19)

Dev and nightly builds now wear their own icons, as T3 Code's do, so they
are told apart from production at a glance: the otter on upstream's
blueprint (dev) and night sky (nightly) instead of the same black icon
everywhere.

- assets/otter-dev and assets/otter-nightly: Icon Composer projects with
  upstream's dev and nightly layers and shadows, the otter as a white glyph
  in place of the T3 mark. Their iOS, Linux, Windows and web exports come
  from vp run icons:export; the classic macOS PNGs use upstream's exports of
  the same projects for the body edge and shadow.
- The dev and nightly channels point at them: desktop dev runs, the dev
  launcher, packaged nightlies, hosted nightly web, the dev web favicons and
  the mobile dev and preview builds' icons and brand mark. Production keeps
  assets/otter unchanged.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): promote hosted web without local build files

* fix(web): finish account callbacks before onboarding

* fix(otter): update button in the rail, roomier right panel on desktop (#20)

- The desktop app's update button moves from the thread sidebar's footer
  to the foot of the space rail, above Usage and Settings, freeing the
  sidebar's last row. Its tooltip and nightly release notes open rightward.
- Desktop: the right panel's surfaces (browser address bar, file
  breadcrumbs, diff header) start a step inside the panel instead of
  touching its rim under the title band. The web keeps its spacing.
- Desktop: the floating browser preview's hover controls show again. The
  content panel no longer creates a stacking context, which had put them
  under the browser webview drawn at the app root.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): restore account dialog spacing and scrolling

* feat(otter): project groups in the rail

The rail listed every project, which stops scaling once a user works across
several organisations' repositories.

- The rail now holds spaces instead of projects: All projects, Chats
  (threads without a project), then the user's project groups. The + is
  gone; groups are made in Settings → Project groups.
- A group lists only its projects' threads in the sidebar. New threads
  default to one of its projects, and the draft's project picker and
  "New thread in…" offer only those. In Chats, a new thread starts without
  a project.
- Groups are stored as `railProjectGroups` in server settings, keyed by
  logical project, so one repository on several machines is one member.
  It is a shared setting, written to every connected environment, so every
  device and the hosted app show the same groups.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(otter): mock the rail space in useHandleNewThread tests

The hook now reads the rail's space, whose real module pulls in environment
state that this test's contracts mock does not provide, so the file failed
to load in CI. Mock the space as All projects, like the test's other
dependencies.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs(otter): land fork changes through pull requests (#21)

OTTER.md told contributors to commit directly to main. AGENTS.md has agents
run only targeted checks and leaves the full suite to CI, so a direct push
reaches main and the nightly release before CI has run. That is how a broken
test in useHandleNewThread blocked today's release.

Every change now lands through a PR that merges once CI is green. Asking an
agent to change the fork counts as asking it for that PR, which settles
AGENTS.md's "no PR unless asked". Publishing a sync stays the only direct
write to main.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): 43px Mac titlebar; no threads sidebar on usage and pull requests (#22)

* fix(otter): 43px titlebar on the Mac desktop app

The traffic lights stay centered in it, rounded to the nearest point.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): usage and pull requests pages drop the threads sidebar

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): page titles clear the traffic lights without the sidebar (#23)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(otter): sudo browser setup command uses otter-code

Upstream's new sudo test expects `npx t3`; the fork's CLI is `otter-code`.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Laurin-Notemann pushed a commit that referenced this pull request Oct 13, 2026
* feat(otter): unify suite accounts and move Code to .app

* test(otter): remove obsolete Clerk fixtures

* fix(otter): finish account release and LAN support

* refactor(otter): remove unused account exports

* fix(otter): promote hosted domains together

* fix(otter): register web domains before promotion

* fix(otter): await web domain certificates

* ci(otter): host the web client on Cloudflare

* feat(otter): Otter Mail's window layout (#18)

Otter Code now looks and works like Otter Mail: a rail of spaces down the
window's left edge and one rounded content panel for the sidebar and panes.

- Space rail: All projects, each project, Add project and Pull requests;
  Usage and Settings at its foot. A project scopes the thread sidebar, whose
  heading names the space and opens the project picker. On phones the rail
  sits inside the sidebar sheet.
- Frame: in the desktop app the panes' headers sit on a 42px title band
  above an inset panel with a rim and rounded corners; in a browser tab the
  panel runs to the page's edges. The frame takes a lifted tone (or the
  theme's sidebar color), and the Mac traffic lights move into the band.
- Sidebar: no wordmark; the space's heading is the first row, with the dev
  and nightly art behind it inside the panel. Search and New thread share a
  row. Settings, Usage and Pull requests moved from the footer to the rail.
- Title band icons follow Otter Mail: pane toggles for the sidebar and right
  panel, a details icon for thread details; the terminal toggle is gone
  (mod+J still opens it).
- ChatGPT joins the built-in themes (web, desktop and iOS), with graphite
  stage art.
- The dev Dock icon gets the classic macOS shape (824px body, native
  shadow) instead of a full-bleed square.
- Performance: the messages timeline no longer re-renders each frame the
  chat canvas resizes, the details card stays pinned to the right edge with
  memoized content, and the thread sidebar skips window resize re-renders.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(otter): channel icons like T3 Code's (#19)

Dev and nightly builds now wear their own icons, as T3 Code's do, so they
are told apart from production at a glance: the otter on upstream's
blueprint (dev) and night sky (nightly) instead of the same black icon
everywhere.

- assets/otter-dev and assets/otter-nightly: Icon Composer projects with
  upstream's dev and nightly layers and shadows, the otter as a white glyph
  in place of the T3 mark. Their iOS, Linux, Windows and web exports come
  from vp run icons:export; the classic macOS PNGs use upstream's exports of
  the same projects for the body edge and shadow.
- The dev and nightly channels point at them: desktop dev runs, the dev
  launcher, packaged nightlies, hosted nightly web, the dev web favicons and
  the mobile dev and preview builds' icons and brand mark. Production keeps
  assets/otter unchanged.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): promote hosted web without local build files

* fix(web): finish account callbacks before onboarding

* fix(otter): update button in the rail, roomier right panel on desktop (#20)

- The desktop app's update button moves from the thread sidebar's footer
  to the foot of the space rail, above Usage and Settings, freeing the
  sidebar's last row. Its tooltip and nightly release notes open rightward.
- Desktop: the right panel's surfaces (browser address bar, file
  breadcrumbs, diff header) start a step inside the panel instead of
  touching its rim under the title band. The web keeps its spacing.
- Desktop: the floating browser preview's hover controls show again. The
  content panel no longer creates a stacking context, which had put them
  under the browser webview drawn at the app root.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): restore account dialog spacing and scrolling

* feat(otter): project groups in the rail

The rail listed every project, which stops scaling once a user works across
several organisations' repositories.

- The rail now holds spaces instead of projects: All projects, Chats
  (threads without a project), then the user's project groups. The + is
  gone; groups are made in Settings → Project groups.
- A group lists only its projects' threads in the sidebar. New threads
  default to one of its projects, and the draft's project picker and
  "New thread in…" offer only those. In Chats, a new thread starts without
  a project.
- Groups are stored as `railProjectGroups` in server settings, keyed by
  logical project, so one repository on several machines is one member.
  It is a shared setting, written to every connected environment, so every
  device and the hosted app show the same groups.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(otter): mock the rail space in useHandleNewThread tests

The hook now reads the rail's space, whose real module pulls in environment
state that this test's contracts mock does not provide, so the file failed
to load in CI. Mock the space as All projects, like the test's other
dependencies.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs(otter): land fork changes through pull requests (#21)

OTTER.md told contributors to commit directly to main. AGENTS.md has agents
run only targeted checks and leaves the full suite to CI, so a direct push
reaches main and the nightly release before CI has run. That is how a broken
test in useHandleNewThread blocked today's release.

Every change now lands through a PR that merges once CI is green. Asking an
agent to change the fork counts as asking it for that PR, which settles
AGENTS.md's "no PR unless asked". Publishing a sync stays the only direct
write to main.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): 43px Mac titlebar; no threads sidebar on usage and pull requests (#22)

* fix(otter): 43px titlebar on the Mac desktop app

The traffic lights stay centered in it, rounded to the nearest point.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): usage and pull requests pages drop the threads sidebar

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): page titles clear the traffic lights without the sidebar (#23)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(otter): sudo browser setup command uses otter-code

Upstream's new sudo test expects `npx t3`; the fork's CLI is `otter-code`.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Laurin-Notemann pushed a commit that referenced this pull request Oct 14, 2026
* feat(otter): unify suite accounts and move Code to .app

* test(otter): remove obsolete Clerk fixtures

* fix(otter): finish account release and LAN support

* refactor(otter): remove unused account exports

* fix(otter): promote hosted domains together

* fix(otter): register web domains before promotion

* fix(otter): await web domain certificates

* ci(otter): host the web client on Cloudflare

* feat(otter): Otter Mail's window layout (#18)

Otter Code now looks and works like Otter Mail: a rail of spaces down the
window's left edge and one rounded content panel for the sidebar and panes.

- Space rail: All projects, each project, Add project and Pull requests;
  Usage and Settings at its foot. A project scopes the thread sidebar, whose
  heading names the space and opens the project picker. On phones the rail
  sits inside the sidebar sheet.
- Frame: in the desktop app the panes' headers sit on a 42px title band
  above an inset panel with a rim and rounded corners; in a browser tab the
  panel runs to the page's edges. The frame takes a lifted tone (or the
  theme's sidebar color), and the Mac traffic lights move into the band.
- Sidebar: no wordmark; the space's heading is the first row, with the dev
  and nightly art behind it inside the panel. Search and New thread share a
  row. Settings, Usage and Pull requests moved from the footer to the rail.
- Title band icons follow Otter Mail: pane toggles for the sidebar and right
  panel, a details icon for thread details; the terminal toggle is gone
  (mod+J still opens it).
- ChatGPT joins the built-in themes (web, desktop and iOS), with graphite
  stage art.
- The dev Dock icon gets the classic macOS shape (824px body, native
  shadow) instead of a full-bleed square.
- Performance: the messages timeline no longer re-renders each frame the
  chat canvas resizes, the details card stays pinned to the right edge with
  memoized content, and the thread sidebar skips window resize re-renders.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(otter): channel icons like T3 Code's (#19)

Dev and nightly builds now wear their own icons, as T3 Code's do, so they
are told apart from production at a glance: the otter on upstream's
blueprint (dev) and night sky (nightly) instead of the same black icon
everywhere.

- assets/otter-dev and assets/otter-nightly: Icon Composer projects with
  upstream's dev and nightly layers and shadows, the otter as a white glyph
  in place of the T3 mark. Their iOS, Linux, Windows and web exports come
  from vp run icons:export; the classic macOS PNGs use upstream's exports of
  the same projects for the body edge and shadow.
- The dev and nightly channels point at them: desktop dev runs, the dev
  launcher, packaged nightlies, hosted nightly web, the dev web favicons and
  the mobile dev and preview builds' icons and brand mark. Production keeps
  assets/otter unchanged.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): promote hosted web without local build files

* fix(web): finish account callbacks before onboarding

* fix(otter): update button in the rail, roomier right panel on desktop (#20)

- The desktop app's update button moves from the thread sidebar's footer
  to the foot of the space rail, above Usage and Settings, freeing the
  sidebar's last row. Its tooltip and nightly release notes open rightward.
- Desktop: the right panel's surfaces (browser address bar, file
  breadcrumbs, diff header) start a step inside the panel instead of
  touching its rim under the title band. The web keeps its spacing.
- Desktop: the floating browser preview's hover controls show again. The
  content panel no longer creates a stacking context, which had put them
  under the browser webview drawn at the app root.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): restore account dialog spacing and scrolling

* feat(otter): project groups in the rail

The rail listed every project, which stops scaling once a user works across
several organisations' repositories.

- The rail now holds spaces instead of projects: All projects, Chats
  (threads without a project), then the user's project groups. The + is
  gone; groups are made in Settings → Project groups.
- A group lists only its projects' threads in the sidebar. New threads
  default to one of its projects, and the draft's project picker and
  "New thread in…" offer only those. In Chats, a new thread starts without
  a project.
- Groups are stored as `railProjectGroups` in server settings, keyed by
  logical project, so one repository on several machines is one member.
  It is a shared setting, written to every connected environment, so every
  device and the hosted app show the same groups.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(otter): mock the rail space in useHandleNewThread tests

The hook now reads the rail's space, whose real module pulls in environment
state that this test's contracts mock does not provide, so the file failed
to load in CI. Mock the space as All projects, like the test's other
dependencies.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs(otter): land fork changes through pull requests (#21)

OTTER.md told contributors to commit directly to main. AGENTS.md has agents
run only targeted checks and leaves the full suite to CI, so a direct push
reaches main and the nightly release before CI has run. That is how a broken
test in useHandleNewThread blocked today's release.

Every change now lands through a PR that merges once CI is green. Asking an
agent to change the fork counts as asking it for that PR, which settles
AGENTS.md's "no PR unless asked". Publishing a sync stays the only direct
write to main.

Built by Claude Opus 5.5 in T3 Code (Claude Code harness).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): 43px Mac titlebar; no threads sidebar on usage and pull requests (#22)

* fix(otter): 43px titlebar on the Mac desktop app

The traffic lights stay centered in it, rounded to the nearest point.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): usage and pull requests pages drop the threads sidebar

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(otter): page titles clear the traffic lights without the sidebar (#23)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(otter): sudo browser setup command uses otter-code

Upstream's new sudo test expects `npx t3`; the fork's CLI is `otter-code`.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant