You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Saved to ~/.nanobot/workspace/github-discussion/nanobot-folders-discussion.md. Paste-ready for HKUDS/nanobot → Discussions → category "Feature request":
Folders inside a project to classify chats
Version: nanobot-ai 0.3.5 (WebUI gateway)
The problem
Running nanobot as a daily driver across several domains (fleet ops, 3D printing, media, family/school, admin) the sidebar becomes the product. After ~20 chats, pin / archive / rename / sort are not enough: there is no way to classify chats into folders inside a project, e.g.
How it works today (checked against v0.3.5 source)
webui/workspaces.py — a project is only a workspace scope (project_path) stamped on each chat. One project per chat; no child structure below it.
webui/sidebar_state.py — the complete classification vocabulary is pinned_keys, archived_keys, session_order, title_overrides, project_name_overrides, collapsed_groups, workbench.tabs.
workbench.tabs is the only grouping primitive, and it is built for split-pane layouts, not classification: one level only (no nesting), hard cap of 4 chats per tab (_MAX_WORKBENCH_PANES = 4), and claimed_panes makes membership exclusive — a chat can live in at most one tab.
tags_by_key already exists in the persisted sidebar schema (server sanitizes, persists and prunes it per chat), but the shipped bundle references it only in the state serializer — no UI renders tags as chips, filters, or groups. A latent hook waiting for a UI.
Proposal
1. Folder tree in sidebar state (core ask). Add to sidebar state, bumping WEBUI_SIDEBAR_STATE_SCHEMA_VERSION:
Sidebar renders chats as a collapsible folder tree (default: flat list, so existing users see no change). Limits mirroring existing sanitizers: depth ≤ 2, titles ≤ _MAX_TITLE_LEN, ≤ 2000 folders, chat_keys validated against live sessions (reuse the existing prune pass so deleted chats drop out).
2. Reuse existing machinery, not new plumbing. Everything needed is there: the set_sidebar_state WS round-trip (no new protocol verb), _clean_string / list caps / prune (validation for free), and collapsed_groups (collapse state per folder id, same shape). Implementation = schema add + tree renderer + "Move to folder…" / "New folder" context menu; drag-and-drop later.
3. Cheaper first step (optional). Ship the tag layer that's already persisted: render tags_by_key as chips, add a tag editor, add "group by tag" as a sidebar view. Zero schema migration, and chats can carry multiple tags (which folders cannot).
UX details worth fixing in the same pass
If tabs remain a grouping substrate, the three hard limits (no nesting, 4-pane cap, exclusive membership) are exactly what blocks folder use — separating "layout tabs" from "classification groups", or making the caps configurable, is worth deciding together with this feature.
Alternatives considered
One project per topic — breaks the point of a project (shared workspace/scope), multiplies sessions; not viable for 8+ topics.
Community sidecar driving set_sidebar_state over the live WebSocket works today, but patches around the caps and is fragile across app updates. Native folders remove that patch class.
Willing to contribute
I can prototype #1 (schema + renderer + context menu) — the backend half is mostly sanitizers that already exist. Happy to align on the schema shape before sending a PR.
Before posting: _MAX_WORKBENCH_PANES = 4 is from your install — spot-check it against main so the claim ages well. I can't post it (no auth for HKUDS/nanobot on this host, and it should carry your account), so it's yours to paste.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Saved to
~/.nanobot/workspace/github-discussion/nanobot-folders-discussion.md. Paste-ready for HKUDS/nanobot → Discussions → category "Feature request":Folders inside a project to classify chats
Version: nanobot-ai 0.3.5 (WebUI gateway)
The problem
Running nanobot as a daily driver across several domains (fleet ops, 3D printing, media, family/school, admin) the sidebar becomes the product. After ~20 chats, pin / archive / rename / sort are not enough: there is no way to classify chats into folders inside a project, e.g.
How it works today (checked against v0.3.5 source)
webui/workspaces.py— a project is only a workspace scope (project_path) stamped on each chat. One project per chat; no child structure below it.webui/sidebar_state.py— the complete classification vocabulary ispinned_keys,archived_keys,session_order,title_overrides,project_name_overrides,collapsed_groups,workbench.tabs.workbench.tabsis the only grouping primitive, and it is built for split-pane layouts, not classification: one level only (no nesting), hard cap of 4 chats per tab (_MAX_WORKBENCH_PANES = 4), andclaimed_panesmakes membership exclusive — a chat can live in at most one tab.tags_by_keyalready exists in the persisted sidebar schema (server sanitizes, persists and prunes it per chat), but the shipped bundle references it only in the state serializer — no UI renders tags as chips, filters, or groups. A latent hook waiting for a UI.Proposal
1. Folder tree in sidebar state (core ask). Add to sidebar state, bumping
WEBUI_SIDEBAR_STATE_SCHEMA_VERSION:Sidebar renders chats as a collapsible folder tree (default: flat list, so existing users see no change). Limits mirroring existing sanitizers: depth ≤ 2, titles ≤
_MAX_TITLE_LEN, ≤ 2000 folders, chat_keys validated against live sessions (reuse the existing prune pass so deleted chats drop out).2. Reuse existing machinery, not new plumbing. Everything needed is there: the
set_sidebar_stateWS round-trip (no new protocol verb),_clean_string/ list caps / prune (validation for free), andcollapsed_groups(collapse state per folder id, same shape). Implementation = schema add + tree renderer + "Move to folder…" / "New folder" context menu; drag-and-drop later.3. Cheaper first step (optional). Ship the tag layer that's already persisted: render
tags_by_keyas chips, add a tag editor, add "group by tag" as a sidebar view. Zero schema migration, and chats can carry multiple tags (which folders cannot).UX details worth fixing in the same pass
If tabs remain a grouping substrate, the three hard limits (no nesting, 4-pane cap, exclusive membership) are exactly what blocks folder use — separating "layout tabs" from "classification groups", or making the caps configurable, is worth deciding together with this feature.
Alternatives considered
set_sidebar_stateover the live WebSocket works today, but patches around the caps and is fragile across app updates. Native folders remove that patch class.Willing to contribute
I can prototype #1 (schema + renderer + context menu) — the backend half is mostly sanitizers that already exist. Happy to align on the schema shape before sending a PR.
Before posting:
_MAX_WORKBENCH_PANES = 4is from your install — spot-check it againstmainso the claim ages well. I can't post it (no auth for HKUDS/nanobot on this host, and it should carry your account), so it's yours to paste.All reactions