Releases: Lexus2016/claude-code-studio
v5.30.0 — Forum UX: Buttons, Commands & Navigation
Forum Mode UX Overhaul
Forum Mode is now fully interactive — every action has a button, every topic has contextual help, and activity notifications double as a navigation hub.
What's New
Clickable Session Buttons
/historynow shows inline buttons for each session — tap to switch instead of typing/session N
Contextual Forum Buttons
- Done messages in forum topics show [📜 History] and [🆕 New] instead of the private-chat [Continue] / [Menu]
- Error messages show [🔄 Retry] that resends the last user message automatically
- Progress messages in forum threads show only [🛑 Stop] (no Menu — you're already in the right topic)
Expanded Task Commands
/todo ID— move task to "todo" status/block ID— mark task as blocked/backlog ID— move task to backlog/delete ID— permanently remove a task- Previously only
/doneand/startwere available
More Project Topic Commands
/cat <file>— read file contents/last [n]— show last N messages/full— show full last response/help— contextual help for the current topic type
Activity Navigation Buttons
- Every activity notification now has [💬 Open chat] and [📁 Project] buttons
- [Open chat] activates the session and shows last messages in the project topic
- [Project] navigates you directly to the project thread
- Activity topic is now a navigation hub, not just a log
Command Normalization
- All forum commands are now case-insensitive (
/STOP,/History,/NEWall work) @botnamesuffix stripped automatically (/connect@MyBotworks)- Unknown commands get helpful feedback with
/helpsuggestion
Contextual /help
/helpin a project topic shows session & file commands/helpin the Tasks topic shows task lifecycle commands/helpin General shows forum-wide commands- Each topic type gets its own relevant help text
Stats
- 228 insertions across 2 files (telegram-bot.js + server.js)
- 3 new callback handlers:
fs:(session switch),fm:(forum actions),fa:(activity navigation) - Full i18n for all new strings in Ukrainian, English, and Russian
- Updated README in all 3 languages
Upgrade
npx github:Lexus2016/claude-code-studio@latestv5.29.4 — Fix Project Topics Creation
Bug Fix
Project topics not created in Forum Mode
When /connect ran _syncProjectTopics(), it read projects.json entries looking for the path field — but the actual field name is workdir. Result: no project topics were created at all.
Fixed:
project?.path→project?.workdir || project?.path(supports both for safety)- Project
namefield is now passed to_createProjectTopic()as display name — topics show the human-readable project name instead of just the directory basename _createProjectTopic()accepts optionaldisplayNameparameter, falls back to directory name
Impact: Anyone who ran /connect on v5.29.0–v5.29.3 got Tasks and Activity topics but zero project topics. Running /connect again on v5.29.4 will re-sync and create the missing project topics.
Upgrade
npx github:Lexus2016/claude-code-studio@latestv5.29.3 — Forum /connect Re-Sync
Bug Fix
/connect now re-syncs forum structure instead of refusing
Previously, running /connect in a supergroup that was already paired would simply reply "Forum is already connected" — even if topics were missing (e.g. new projects added after initial setup, or topics accidentally deleted).
Now /connect is idempotent:
- First time: pairs the group and creates full structure (Tasks, Activity, project topics)
- Already paired: shows "Syncing Forum — Creating missing topics..." and re-runs
_createForumStructure()to fill in any gaps - Rollback safety: only rolls back
forum_chat_idon failure if this was a fresh connection (not a re-sync)
New i18n string forum_syncing added in all 3 languages (ua/en/ru).
Upgrade
npx github:Lexus2016/claude-code-studio@latestv5.29.2 — Telegram i18n HTML Fix
Bug Fixes
HTML entity escaping in Telegram messages
- All angle brackets in i18n placeholder hints (e.g.
<number>,<file>,<n>) are now properly escaped as<...>inside<code>tags - Previously, Telegram's HTML parse mode would silently strip these as unknown tags, showing broken hints like
/projectinstead of/project <number> - Fixed across all 3 languages (Ukrainian, English, Russian) — ~27 strings total
/forum command added to help text
/forumnow appears in the help output (/help) for all 3 languages under a new "Forum Mode" section- Users can discover forum setup instructions without guessing commands
Upgrade
npx github:Lexus2016/claude-code-studio@latestv5.29.1 — Forum Mode Fixes
Bug Fixes
/connect command reliability
- Moved
/connecthandling before forum routing and authorization checks — works immediately in any supergroup context - Strips
@botnamesuffix (e.g./connect@MyBotnow works correctly) - Works in both General and topic threads
Forum structure creation ordering
- "Connected" confirmation now sent before topic creation begins (user sees feedback instantly)
- Cleared
_currentThreadIdduring structure creation so Tasks/Activity topics receive their pinned messages in the correct threads (not in the/connectthread) - Added diagnostic logging for topic creation steps
- Proper rollback on failure with
_currentThreadIdrestoration viafinallyblock
Upgrade
npx github:Lexus2016/claude-code-studio@latestv5.29.0 — Telegram Forum Mode
Telegram Forum Mode — Your Project Dashboard Inside Telegram
Turn any Telegram supergroup into a structured project workspace. Each project gets its own topic thread. Tasks, activity, and conversations — all organized by topic.
What's New
Forum Mode (/connect in a supergroup)
- Auto-creates Tasks, Activity, and per-project topic threads
- Project topics: send messages to Claude in project context;
/new,/history,/session N,/files,/diff,/log,/stop - Tasks topic: type a title to create a task;
/list,/done ID,/start ID - Activity topic: all notifications (task completed, failed, session events) posted automatically
- Forum disconnect and cleanup via settings
Inline Creation (private chat)
- New Chat and New Task buttons for quick creation without commands
- Multi-step task creation flow with title + optional description
Thread ID Routing (server.js)
TelegramProxynow acceptsthreadIdparameter- All messages auto-route to the correct forum topic via
_tgSend()helper - Typing indicators respect
message_thread_idfor forum threads
Internals
- New
forum_topicsSQLite table with(thread_id, chat_id)primary key - 15+ new prepared statements for forum CRUD operations
- Full i18n coverage for forum strings in Ukrainian, English, and Russian
forum_chat_idcolumn added totelegram_devicestable
Stats
- 941 insertions, 71 deletions across 6 files
- telegram-bot.js: +886 lines (forum handlers, i18n, DB schema)
- server.js: +49 lines (thread routing in TelegramProxy)
- README updates in all 3 languages
Upgrade
npx github:Lexus2016/claude-code-studio@latestv5.28.2 — Smarter auto-skill classifier with plugin skill matching
What's New
Improved Auto-Skill Classifier
The Haiku-powered skill classifier that automatically picks specialist personas for each message has been significantly improved:
Better plugin skill matching — Plugin skills (IDs like plugin:name:skill) are now first-class citizens in the classifier. The system prompt explicitly instructs Haiku to match them by intent and domain, not just exact keyword overlap. If you have an oh-my-claudecode:frontend-ui-ux skill installed, asking "design a dashboard layout" will now reliably activate it alongside the built-in frontend skill.
Keywords field — Skills with a keywords array in their config now pass those keywords to the classifier in brackets, giving Haiku additional signal for matching. Example: a skill with keywords: ["React", "CSS", "responsive"] shows as - frontend: Frontend — Build UIs [React, CSS, responsive].
Expanded meta-skill filter — 16 meta/system/setup skills are now excluded from classification: cancel, help, doctor, omc-setup, release, skill, learner, mcp-setup, hud, note, psm, project-session-manager, learn-about-omc, local-skills-setup. Previously only auto-mode was filtered. This prevents the classifier from wasting slots on system utilities.
Always select at least one — Changed from "select 0-4 skills" back to "select 1-4 skills". The previous 0-4 range caused the classifier to sometimes skip all skills even for domain-specific coding tasks. Simple factual questions still get handled correctly — the filter catches system-only results.
Diagnostic logging — When something goes wrong with classification, server logs now show:
- Raw Haiku response with accepted and rejected skill IDs
- Warning when Haiku returns skill IDs that don't exist in the config
- Warning when no JSON is found in the response
- Message preview (first 120 chars) in the classify-done log for debugging
Who benefits
Anyone using plugin skills (e.g., from oh-my-claudecode) will see noticeably better automatic activation. Built-in skills are also matched more reliably for domain-specific tasks.
Full Changelog: v5.28.1...v5.28.2
v5.28.1 — Fix crash on task resume when proxy buffer uninitialized
What's Fixed
Task resume crash — proxy buffer guard
The problem: When resuming a running Kanban task (switching back to a tab with an active task, or reconnecting after a WebSocket drop), the server could crash with Cannot read properties of undefined (reading 'filter') if the task's proxy _buffer hadn't been initialized as an array.
The fix: Added Array.isArray() guard before calling .filter() on proxy._buffer in both task resumption code paths (legacy handler and tab-aware handler). If _buffer isn't an array, the filter step is safely skipped — the task resumes normally without the text deduplication optimization, which is a graceful degradation.
Who is affected: Users running multiple Kanban tasks who switch between browser tabs or experience WebSocket reconnections during task execution.
Full Changelog: v5.28.0...v5.28.1
v5.28.0 — Mobile UI redesign, plugin skills, session replay, cross-tab isolation
Highlights
The biggest release since v5.25 — 2,400+ lines changed across 10 files, delivering a native-feel mobile experience, self-healing sessions, plugin skill discovery, and a critical cross-session isolation fix.
📱 Native Mobile UI
A complete redesign for small screens that feels like a native app:
- Mobile header bar — hamburger menu, session title, live status dot (pulsing orange = working, green = idle, red = error), action buttons
- Settings bottom sheet — slides up from the edge with chip selectors for Mode, Agent, Model, Max Turns, plus quick links to Kanban, Schedule, Config
- Tabs overlay — full-screen session list with individual close buttons and tab counter badge
- Swipe edge areas — 16px touch targets on left/right edges for gesture navigation
- iOS safe area — proper insets on header and input area for notched devices
🔄 Self-Healing Sessions (Session Replay)
When a Claude session is lost — server restart, network timeout, expired session, "invalid session" errors — Studio now automatically rebuilds the full conversation context from SQLite history and replays it into a fresh session. Claude continues coherently from where it left off.
- Works for both local CLI and SSH sessions
- Covers all known Claude session-invalid error patterns via unified
isResettableClaudeSessionError()regex - Restart Session button appears when Claude exhausts auto-continues — one click to clear the broken session and keep going
🧩 Plugin Skill Discovery
Studio now auto-discovers skills from your installed Claude Code plugins:
- Scans
~/.claude/plugins/marketplaces/and~/.claude/plugins/cache/directories - Reads
plugin.jsonmanifest andSKILL.mdfrontmatter for metadata - Plugin skills appear in sidebar grouped by plugin name under "🧩 Plugin Skills"
- System prompt includes plugin root and skill directory paths for file references
- Auto-skill classifier tightened: selects 0–4 skills (was 1–4), prefers narrow matches, skips generic skills for simple questions
🛡 Cross-Session Message Leak Fix
Fixed a multi-vector bug where messages from a running chat could appear in newly opened tabs:
| Root cause | Fix |
|---|---|
done handler cleared global state for any session |
Guard with tabId === generatingTabId check |
Task worker notifications broadcast without tabId |
Added tabId: task.source_session_id |
Notification handler showed messages when tabId missing |
Removed fallback; require isVisible |
Telegram-originated messages lacked tabId |
Added tabId: sessionId to all Telegram flows |
Rich Tooltips for MCP & Skills
- MCP server tooltips — hover to see name, description, transport type, source URL/command (tokens sanitized)
- Skill tooltips — label, description, plugin name/version, file path
- Session bar chips — auto-skills and active skill chips show rich HTML tooltips on hover
- Visual refinement: larger fonts, border separators, proper spacing
SSH & CLI Improvements
- SFTP attachment upload — files attached in SSH sessions are automatically uploaded to remote server via SFTP before processing
- Session restart button — when CLI/SSH agent exhausts auto-continues, a Restart button renders in-chat
- Thinking block fix — system prompt no longer re-sent on resumed sessions (prevents signature invalidation)
- SSH host password form — fixed masked password overwrite, added validation guards
- File-type attachments — CLI now handles
filetype blocks (not just images), preserves original filenames
Accessibility & UX
- ARIA-compliant modal stack — all modals: focus trap, Escape-to-close, focus restoration,
role="dialog",aria-modal - Slash command modal — redesigned from inline form to full modal with keyboard navigation
- Composer state per-tab — textarea draft, attachments, reply-to state saved/restored atomically on tab switch
- Safe markdown links — state-machine parser blocks
javascript:URLs, handles nested parentheses - prefers-reduced-motion — respects OS setting, disables animations for users who opt out
- Copy image button — in file preview, copies image blob to clipboard
Full Changelog: v5.25.9...v5.28.0
v5.27.0 — Session Replay Recovery & Attachment Handling Improvements
🔄 Session Replay Recovery
When a Claude session becomes unavailable (e.g., after server restart, session ID corruption, or timeout), Claude Code Studio can now replay the conversation history to a fresh session to recover context. This allows Claude to understand the full prior conversation without the original session.
How it works
- Studio detects when the session ID is invalid or points to an expired session
- A "session recovery" message is shown in the session bar with a "Restart" button
- On restart, the system fetches all messages from the database for that session
- Messages are serialized and replayed to Claude as a structured context
- Claude receives the full conversation history and continues from where it left off
Why this matters
For long-running projects: No more losing hours of context when you return days later.
For scheduled tasks: Kanban tasks that recover gracefully from server restarts.
For interrupted work: Browser crash or network issue? Session replay has you back.
📎 Attachment Handling Improvements
Normalized Attachment Storage
- New
normalizeStoredAttachment()function ensures consistent handling across all code paths serializeMessageAttachments()andparseMessageAttachments()for reliable serialization/deserialization- SSH attachments now properly resolve host credentials from stored host configuration
Better UI Feedback
- Attachment chips show "Copy" button with visible label for better discoverability
- Focus-within support for action buttons (accessibility improvement)
- Session restart cleans up UI state more thoroughly (retry flags, session bar elements)
Full Changelog: v5.26.0...v5.27.0