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 9545041..6aa03af 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 9badcb6..27b24c3 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 27b24c3..214dcd9 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 214dcd9..0116694 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 59ffa46..bfc4be5 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 a48b808..4700a97 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 790b060..53d4b7f 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 edfb6d1..fbea2a5 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 c878d04..95f6185 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" },