Skip to content

feat(desktop): add recently closed projects to home#34926

Merged
Brendonovich merged 3 commits into
devfrom
recently-closed-projects
Jul 3, 2026
Merged

feat(desktop): add recently closed projects to home#34926
Brendonovich merged 3 commits into
devfrom
recently-closed-projects

Conversation

@usrnk1

@usrnk1 usrnk1 commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Issue for this PR

Closes #

Type of change

  • Bug fix
  • New feature
  • Refactor / code improvement
  • Documentation

What does this PR do?

Adds a "Recently closed" projects list to the desktop home view.

When a server has no open projects, the projects column now shows an Add project row, and — if the user has previously closed projects on that server — a Recently closed section listing them. Selecting an entry re-adds and focuses the project.

Implementation notes:

  • Tracking (server.tsx): close() records the closed worktree in the persisted per-server store; open() removes it. A separate remove() is used for internal, non-user removals (sandbox/worktree normalization in layout.tsx) so those don't pollute the history.
  • Deleted projects are excluded: consumers (global.tsx / layout.tsx) enrich the stored worktrees and filter them against the live project list (sync.data.project), so projects deleted from disk don't show.
  • Stable list: the store retains more history than is displayed and the visible count is capped after filtering (RECENTLY_CLOSED_DISPLAY_LIMIT). This prevents entries that are temporarily filtered out from evicting still-visible ones — which was causing closing one project to make an unrelated one disappear. Path matching/dedup uses pathKey to avoid false negatives from path formatting.
  • Component (ui): adds a neutral outline variant to the v2 ProjectAvatar (used to de-emphasize recently closed rows), kept out of the color rotation.
  • The redundant header add-project icon is hidden while the full Add project row is shown; the Projects / Recently closed headings use the design weights.

How did you verify your code works?

  • Added unit tests in server.test.ts covering: recording on close, dropping on reopen, remove() not recording, history retained beyond the display limit, the store cap, and pathKey dedup.
  • bun typecheck (app + ui) and bun test src/context/server.test.ts pass; touched files pass Prettier.
  • Manually exercised opening/closing projects and confirmed the list stays stable and deleted projects are excluded.

Screenshots / recordings

Screenshot.2026-07-02.at.15.33.04.mp4

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

usrnk1 added 3 commits July 2, 2026 15:30
Adds a neutral, muted outline style to the v2 ProjectAvatar for de-emphasized
projects (e.g. recently closed). Uses bg-base, border-strong and muted text
tokens, kept out of the color rotation. Includes a Storybook story.
Records user-closed projects in the persisted server store and exposes an
enriched, deleted-project-filtered accessor.

- close() records the worktree; open() drops it; internal (non-user) removals
  use a new remove() so sandbox/worktree normalization does not pollute history.
- Store retains more history than is shown so display-filtered entries cannot
  evict still-visible ones; consumers filter against the live project list and
  cap the visible count (RECENTLY_CLOSED_DISPLAY_LIMIT).
- Matching/dedup uses pathKey to avoid false negatives from path formatting.
When a server has no open projects, the home column shows an Add project row
and, if projects were previously closed, a Recently closed section. Rows use
the muted outline avatar and a tooltip with the home-relative worktree path;
selecting one re-adds and focuses the project.

The redundant header add-project icon is hidden while the full Add project row
is shown, and the Projects / Recently closed headings use the design weights.
@usrnk1 usrnk1 marked this pull request as ready for review July 2, 2026 13:47
@usrnk1 usrnk1 requested review from Brendonovich and Hona as code owners July 2, 2026 13:47
@Hona Hona added the beta label Jul 3, 2026
@Brendonovich Brendonovich merged commit bf58fae into dev Jul 3, 2026
15 of 18 checks passed
@Brendonovich Brendonovich deleted the recently-closed-projects branch July 3, 2026 07:52
Wiktor102 pushed a commit to Wiktor102/opencode that referenced this pull request Jul 5, 2026
github-actions Bot added a commit to wallentx/opencode-termux that referenced this pull request Jul 6, 2026
* ci: Add Android build and publish workflow with APK artifact upload

Signed-off-by: wallentx <william.allentx@gmail.com>

* ci: Allow publish workflow to run with android_only input

Signed-off-by: wallentx <william.allentx@gmail.com>

* ci: Use github.token instead of committer output in publish workflow

Signed-off-by: wallentx <william.allentx@gmail.com>

* feat: Add aarch64-linux-android target to sidecar binaries

Signed-off-by: wallentx <william.allentx@gmail.com>

* ci: Simplify publish workflow and fix Android build conditions

Signed-off-by: wallentx <william.allentx@gmail.com>

* feat: Refactor app initialization and add WSL path conversion

Signed-off-by: wallentx <william.allentx@gmail.com>

* ci: Fix Android-only workflow condition and update dependencies

Signed-off-by: wallentx <william.allentx@gmail.com>

* sync release versions for v1.17.13

* chore: bump gitlab-ai-provider to 6.10.0 (anomalyco#34756)

* chore: update nix node_modules hashes

* feat(stats): redesign lab hero

* feat(stats): add lab overview

* feat(stats): redesign lab usage

* feat(data): another redesigned lab section

* feat(stats): use catalog descriptions

* chore: generate

* fix(stats): refine lab page tooltips

* fix(stats): include locale header in vary (anomalyco#34789)

* zen: new inference

* fix(desktop): keep window tabs across app close (anomalyco#34807)

* fix(app): stabilize session timeline layout continuity (anomalyco#34533)

* feat(desktop): refine session tab preview popover (anomalyco#34792)

* fix(ui): raise v2 tooltip layer (anomalyco#34455)

Co-authored-by: Jay <53023+jayair@users.noreply.github.com>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>

* chore: update nix node_modules hashes

* fix(opencode): update Cerebras SDK reasoning replay (anomalyco#34826)

Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>

* chore: update nix node_modules hashes

* fix(app): resolve target session lineage outside router transition (anomalyco#34838)

* chore: generate

* fix(opencode): filter session list by resolved instance directory (anomalyco#34842)

* fix(app): only allow \(...\) syntax for inline latex (anomalyco#34850)

* test(opencode): cover Windows session list directory spellings (anomalyco#34857)

* fix(app): scope session tab indicators to the tab's server (anomalyco#34861)

* chore: generate

* fix(app): clear original prompt after retarget (anomalyco#34863)

* fix(app): seed session status before warming session info (anomalyco#34864)

* feat(app): v2 review panel overhaul (anomalyco#31882)

Co-authored-by: LukeParkerDev <10430890+Hona@users.noreply.github.com>

* fix(app): keep terminal mounted when switching session tabs in a workspace (anomalyco#34852)

Co-authored-by: Brendan Allan <git@brendonovich.dev>

* fix(ui): resolve toast icon inside the toast component (anomalyco#34874)

* fix(copilot): honor advertised model endpoints (anomalyco#34958)

* fix(stats): polish lab pages

* feat(stats): redesign model hero

* chore: generate

* feat(tui): add debug info dialog with copy to clipboard (anomalyco#35004)

* zen: new inference

* zen: new inference

* feat(app): navigate tabs on mousedown in new layout (anomalyco#35042)

* zen: new inference

* zen: new inference

* fix(app): keep v2 review pane mounted across session tab switches (anomalyco#35074)

* feat: experimental codemode (anomalyco#34677)

* chore: generate

* fix(ci): setup Node 24 before bun install for node-gyp (anomalyco#35076)

* revert: back out experimental codemode (anomalyco#35077)

* feat(codemode): add confined execution package (anomalyco#35079)

* chore: generate

* chore: update nix node_modules hashes

* chore: remove root node-gyp pin after Node 24 setup (anomalyco#35092)

* feat(desktop): add recently closed projects to home (anomalyco#34926)

* feat(app): align subagent UI with v2 (anomalyco#34931)

Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>

* chore: generate

* feat(desktop): papercut fixes (anomalyco#34939)

* refactor(opencode): expose MCP tools in native shape from the service (anomalyco#35103)

* feat(app): improvements to model search (anomalyco#34954)

* chore: generate

* feat(opencode): add code-mode MCP adapter (anomalyco#35085)

* chore: generate

* chore: update nix node_modules hashes

* feat(app): dropdown search fix (anomalyco#34961)

Co-authored-by: Brendan Allan <git@brendonovich.dev>

* fix(opencode): provide Observability beneath all route service graphs (anomalyco#35171)

* chore: upgrade turbo (anomalyco#35173)

* feat(stats): add model momentum section

* chore: generate

* fix(core): rewrite replacements while hoisting layers (anomalyco#35175)

* fix(stats): link market share labs

* chore: artifacts

* chore: generate

* feat(tui): render code-mode execute tool with child calls (anomalyco#35113)

* refactor(opencode): fail the execute tool on program failure (anomalyco#35180)

* fix(tui): align execute child calls with task indentation (anomalyco#35190)

* refactor(core): move path resolve into fs service (anomalyco#35202)

* feat(opencode): gate execute tool behind code mode flag (anomalyco#35185)

* chore: generate

* cleanup: tweak compaction prompt (anomalyco#35220)

Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>

* fix(app): restore unfocused composer typing (anomalyco#35249)

* fix(app): delay initial tab preview (anomalyco#35266)

Co-authored-by: Jay <53023+jayair@users.noreply.github.com>

* fix(desktop): stabilize esm shim injection (anomalyco#35270)

* fix(app): match new session panel corners (anomalyco#35257)

* tui: preserve spinner registration (anomalyco#35292)

* feat: Add aarch64-linux-android target to sidecar binaries

Signed-off-by: wallentx <william.allentx@gmail.com>

* chore(ci): Improve workflow portability and add Android build support

Signed-off-by: wallentx <william.allentx@gmail.com>

* feat(ci): Add Android artifact build workflow and guidance

Signed-off-by: wallentx <william.allentx@gmail.com>

* fix(opencode): use NDK sysroot for Android artifact build

* fix(opencode): pass Android NDK libc paths to Zig

* fix(opencode): patch OpenTUI Android system libs

* fix(opencode): rely on NDK libc config for Android

* fix(opencode): resolve Android OpenTUI loader relatively

* chore(ci): add Android Bun compile smoke target

* fix(opencode): relocate Android Bun payload pointer

* chore(ci): build Android Bun runtime from source

* fix(ci): install LLVM for Android Bun source build

* fix(ci): bootstrap LLVM 21 for Android Bun build

* fix(ci): keep Bun Android build inside source tree

* fix(ci): link Android NDK runtimes for Bun build

* fix(ci): use Android strip for Bun runtime build

* chore(termux): add release mirror workflows

* chore(termux): align app token variables

* chore(termux): use app client id input

* chore(termux): fall back to github token

* chore(termux): prepare v1.17.13

---------

Signed-off-by: wallentx <william.allentx@gmail.com>
Co-authored-by: wallentx <william.allentx@gmail.com>
Co-authored-by: opencode <opencode@sst.dev>
Co-authored-by: Vladimir Glafirov <vglafirov@gitlab.com>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com>
Co-authored-by: Frank <frank@anoma.ly>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: usrnk1 <7547651+usrnk1@users.noreply.github.com>
Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>
Co-authored-by: Jay <53023+jayair@users.noreply.github.com>
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com>
Co-authored-by: Brendan Allan <git@brendonovich.dev>
Co-authored-by: Dustin Deus <deusdustin@gmail.com>
Co-authored-by: Kit Langton <kit.langton@gmail.com>
Co-authored-by: James Long <longster@gmail.com>
Co-authored-by: Simon Klee <hello@simonklee.dk>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants