From 6a6cf3385650d1f72b02b7b4b70c179ed461550f Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 11 Jul 2026 19:07:57 -0500 Subject: [PATCH 1/5] refac --- cptr/frontend/src/routes/+page.svelte | 52 ++++++++++++++++----------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/cptr/frontend/src/routes/+page.svelte b/cptr/frontend/src/routes/+page.svelte index 9545041d..6aa03af9 100644 --- a/cptr/frontend/src/routes/+page.svelte +++ b/cptr/frontend/src/routes/+page.svelte @@ -1035,6 +1035,37 @@ }} />
+ {#each homePane.tabs.filter((tab) => tab.type === 'chat') as tab (tab.id)} +
+ + updateHomeChatTab(tabId, chatId, label, homePane.id)} + onopenchat={(chatId) => openHomeChat(chatId, homePane.id)} + /> +
+ {/each} + {#each homePane.tabs.filter((tab) => tab.type === 'terminal' && tab.sessionId) as tab (tab.id)} +
+ +
+ {/each} + {#each homePane.tabs.filter((tab) => tab.type === 'browser' && tab.browserSessionId) as tab (tab.id)} +
+ updateHomeBrowserTab(tab.id, label, homePane.id)} + onOpenBrowser={(url) => openHomeBrowser(url, homePane.id)} + /> +
+ {/each} {#if homeTab?.type === 'home'}
@@ -1213,27 +1244,6 @@ {/if}
- {:else if homeTab?.type === 'chat'} - - updateHomeChatTab(tabId, chatId, label, homePane.id)} - onopenchat={(chatId) => openHomeChat(chatId, homePane.id)} - /> - {:else if homeTab?.type === 'terminal' && homeTab.sessionId} - - {:else if homeTab?.type === 'browser' && homeTab.browserSessionId} - updateHomeBrowserTab(homeTab.id, label, homePane.id)} - onOpenBrowser={(url) => openHomeBrowser(url, homePane.id)} - /> {/if}
{#if dragOverZone?.groupId === homePane.id} From b67fa001ece5341ef51bc79b7e6d84f0a8bfa25b Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 11 Jul 2026 19:08:09 -0500 Subject: [PATCH 2/5] refac --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9badcb65..27b24c36 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ![Open WebUI Computer Demo](./demo.png) -Open WebUI Computer (`cptr`) runs on your machine and serves your whole computer to any browser: files, terminal, editor, git, running sessions, AI agents, and tools. It literally is your computer. +Open WebUI Computer (`cptr`) runs on your machine and serves your whole computer to any browser: files, terminal, editor, git, browser tabs, running sessions, AI agents, and tools. It literally is your computer. Use it from your phone, tablet, laptop, another computer, or the machine it's running on. Designed to feel native on every screen. Connect your own AI via API key, plug in a coding agent you already subscribe to, or work directly in the terminal. One tool, full workstation, any device. @@ -65,10 +65,11 @@ Open WebUI Computer is the real workstation surface: files, shell, git state, wo | ✏️ **Editor** | Syntax-highlighted editing with tabs. Open multiple files side by side. | | 🔀 **Git** | Stage, commit, diff, branch, push. Visual changes view. No command line required. | | ⌨️ **Terminal** | Full shell in the browser. Run your tools, your scripts, or your favourite coding agent. | +| 🌐 **Browser** | Open websites and local app previews beside your work. Browse back and forward, switch to a mobile view, and choose the picture quality that fits your connection. | | 🔄 **Sessions persist** | Terminal keeps running when you close the tab. Come back on any device. | -| 🗂️ **Tabs** | Open terminals, files, chats, and tools in separate tabs. Rearrange or split your layout. | +| 🗂️ **Tabs** | Open browsers, terminals, files, chats, and tools in separate tabs. Rearrange or split your layout. | | 📂 **Workspaces** | Multiple projects, one instance. Switch without losing your place. | -| 🔍 **Search** | Find files by name, search across file contents and chat history. ⌘K to find anything. | +| 🔍 **Search** | Find files by name or contents, then jump straight to a matching line. ⌘K also searches chat history. | | 📱 **Mobile-first** | Not a desktop UI made smaller. Built for the screen in your pocket. | ## AI agent From 40c8d00c5d2acbe5789fc6ba0dc19c934abe9693 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 11 Jul 2026 19:10:10 -0500 Subject: [PATCH 3/5] refac --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 27b24c36..214dcd93 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ Open WebUI Computer is the real workstation surface: files, shell, git state, wo | ✏️ **Editor** | Syntax-highlighted editing with tabs. Open multiple files side by side. | | 🔀 **Git** | Stage, commit, diff, branch, push. Visual changes view. No command line required. | | ⌨️ **Terminal** | Full shell in the browser. Run your tools, your scripts, or your favourite coding agent. | -| 🌐 **Browser** | Open websites and local app previews beside your work. Browse back and forward, switch to a mobile view, and choose the picture quality that fits your connection. | +| 🌐 **Browser** | Open websites and local app previews beside your work. Choose Proxy for lightweight browsing, Managed Chrome for a private profile, or Personal Chrome to use your own session, then browse back and forward, switch to a mobile view, and choose the picture quality that fits your connection. | | 🔄 **Sessions persist** | Terminal keeps running when you close the tab. Come back on any device. | | 🗂️ **Tabs** | Open browsers, terminals, files, chats, and tools in separate tabs. Rearrange or split your layout. | | 📂 **Workspaces** | Multiple projects, one instance. Switch without losing your place. | From 0569a1a36652398f2d46ac567fee1e01ae11eef3 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 11 Jul 2026 19:11:06 -0500 Subject: [PATCH 4/5] refac --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 214dcd93..01166942 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ Open WebUI Computer is the real workstation surface: files, shell, git state, wo | ✏️ **Editor** | Syntax-highlighted editing with tabs. Open multiple files side by side. | | 🔀 **Git** | Stage, commit, diff, branch, push. Visual changes view. No command line required. | | ⌨️ **Terminal** | Full shell in the browser. Run your tools, your scripts, or your favourite coding agent. | -| 🌐 **Browser** | Open websites and local app previews beside your work. Choose Proxy for lightweight browsing, Managed Chrome for a private profile, or Personal Chrome to use your own session, then browse back and forward, switch to a mobile view, and choose the picture quality that fits your connection. | +| 🌐 **Browser** | Browse with Proxy, a private Managed Chrome profile, or your own Personal Chrome session. | | 🔄 **Sessions persist** | Terminal keeps running when you close the tab. Come back on any device. | | 🗂️ **Tabs** | Open browsers, terminals, files, chats, and tools in separate tabs. Rearrange or split your layout. | | 📂 **Workspaces** | Multiple projects, one instance. Switch without losing your place. | From e6f3b277377accec654516ac7a4fbb707e23f884 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 11 Jul 2026 19:17:48 -0500 Subject: [PATCH 5/5] refac --- CHANGELOG.md | 6 ++++++ cptr/frontend/src/routes/+layout.svelte | 15 +++++++++++---- cptr/utils/skills.py | 2 +- pyproject.toml | 2 +- uv.lock | 2 +- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59ffa461..bfc4be5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.9.1] - 2026-07-11 + +### Fixed + +- 🏠 **Home chats work like workspace chats.** Home keeps chats, terminals, and browser pages alive while you switch tabs, streams replies as they arrive, and correctly loads global skills. + ## [0.9.0] - 2026-07-11 ### Added diff --git a/cptr/frontend/src/routes/+layout.svelte b/cptr/frontend/src/routes/+layout.svelte index a48b8085..4700a977 100644 --- a/cptr/frontend/src/routes/+layout.svelte +++ b/cptr/frontend/src/routes/+layout.svelte @@ -351,16 +351,23 @@ }); } - // Connect system events when workspace is active + // Chat events belong to the authenticated user, not a workspace. + $effect(() => { + if (authState === 'authenticated') { + socketStore.connect(); + bindGlobalChatListener(); + } else { + socketStore.disconnect(); + } + }); + + // Filesystem events remain workspace-scoped. $effect(() => { const ws = $currentWorkspace; if (ws) { systemEvents.connect(ws.fileBrowserCwd || ws.path); - socketStore.connect(); - bindGlobalChatListener(); } else { systemEvents.disconnect(); - socketStore.disconnect(); } }); diff --git a/cptr/utils/skills.py b/cptr/utils/skills.py index 790b060f..53d4b7f7 100644 --- a/cptr/utils/skills.py +++ b/cptr/utils/skills.py @@ -423,7 +423,7 @@ def discover_skills(workspace: str) -> list[SkillMeta]: ws = Path(workspace) # 1. Workspace-level skills (project-specific, git-trackable) - if ws.is_dir(): + if workspace and ws.is_dir(): for rel_dir in WORKSPACE_SKILL_DIRS: skills_dir = ws / rel_dir for skill in _scan_skills_dir(skills_dir, source="workspace", workspace=workspace): diff --git a/pyproject.toml b/pyproject.toml index edfb6d12..fbea2a51 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "cptr" -version = "0.9.0" +version = "0.9.1" description = "Your computer, from anywhere. Code, manage, and control your machine from the web." license = {file = "LICENSE"} readme = "README.md" diff --git a/uv.lock b/uv.lock index c878d043..95f61857 100644 --- a/uv.lock +++ b/uv.lock @@ -284,7 +284,7 @@ wheels = [ [[package]] name = "cptr" -version = "0.9.0" +version = "0.9.1" source = { editable = "." } dependencies = [ { name = "aiosqlite" },