Repository navigation
feat(otter): Otter Mail's window layout - #18
Merged
Merged
Conversation
ckafrouni
force-pushed
the
t3/match-otter-mail-ui
branch
from
October 6, 2026 10:46
cd60268 to
761d2e9
Compare
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>
ckafrouni
force-pushed
the
t3/match-otter-mail-ui
branch
from
October 6, 2026 10:53
761d2e9 to
e02df86
Compare
This was referenced Oct 6, 2026
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Otter Code's layout and look drifted from Otter Mail, which has since moved to a rail of spaces and one rounded content panel. This brings Otter Code in line with it on web and desktop. The iOS app only gets the new ChatGPT theme; its layout is unchanged.
Layout
Themes and icons
Performance (measured against the code before this change; the remaining resize and toggle cost is upstream's)
Most of the frame lives in a new
appFrame.cssand new components (SpaceRail,PaneIcons), so upstream syncs touch little. User docs cover the rail (thread-sidebar.md,usage.md).Verified with targeted typechecks (shared, web, desktop, server, mobile), lint on changed files, and the touched test suites: web 1700, desktop 35, mobile 46, server 25. Checked visually in the browser preview (browser and simulated desktop layouts, light, dark and themed) and in the desktop dev app.
Built by Claude Opus 5.5 in T3 Code (Claude Code harness).
🤖 Generated with Claude Code