Phase 1 of systematic debugging: Gather evidence Added detailed logging to trace the complete command flow: - launchCommand: Shows when called, terminalId, command, WebSocket state - waitForTerminalReady: Shows waiting period and ready state - handleTerminalMessage: Shows all messages from backend with details - WebSocket message content logged before sending Also fixed duplicate 'ready' message (removed line 113-116). Now when user creates "Claude Code CLI" terminal, console will show: 1. launchCommand called with terminalId and command 2. Waiting for terminal ready 3. Ready message received (or timeout) 4. Command sent to WebSocket 5. All backend messages logged This will reveal exactly where the flow breaks. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Claude Code Web Interface
A powerful web-based IDE for Claude Code CLI with session management, project organization, real-time chat, and AI-powered development tools.
Table of Contents
- Features
- Quick Start
- Installation
- Configuration
- Usage Guide
- API Reference
- Development
- Troubleshooting
- Contributing
Features
🎯 Core Capabilities
- Session Management - Create, monitor, and control Claude Code sessions with real-time status tracking
- Project Organization - Group sessions into projects with smart suggestions and auto-assignment
- Real-Time Chat - WebSocket-powered communication with live command execution
- File Browser - Navigate, view, and edit files in your Obsidian vault
- Terminal Integration - Full terminal emulation with xterm.js and session picker
- XML Tag System - Structured AI operations for writing files, editing, and running commands
📦 What's New
Project Organization (Latest)
- ✨ Persistent projects as first-class entities
- ✨ Smart session assignment based on directory, recency, and name similarity
- ✨ Drag-and-drop session reassignment via context menu
- ✨ Soft delete with recycle bin (restore or permanent delete)
- ✨ Auto-assign new sessions to selected project
Quick Start
Prerequisites
- Node.js 18+ and npm
- Claude Code CLI installed
- Obsidian vault (optional, for session storage)
3-Minute Setup
# 1. Clone the repository
git clone https://github.rommark.dev/admin/ClaudeCLI-Web.git
cd ClaudeCLI-Web
# 2. Install dependencies
npm install
# 3. Start the server
npm start
# 4. Open your browser
# Navigate to http://localhost:3010/claude
# Login with: admin / !@#$q1w2e3r4!A
That's it! You're ready to use Claude Code through the web interface.
Installation
Production Deployment
Using Systemd (Recommended)
- Copy the service file:
cp obsidian-web.service /etc/systemd/system/
- Reload systemd and start:
sudo systemctl daemon-reload
sudo systemctl enable obsidian-web
sudo systemctl start obsidian-web
- Configure Nginx reverse proxy (optional):
cp obsidian-nginx.conf /etc/nginx/sites-available/claude-web
sudo ln -s /etc/nginx/sites-available/claude-web /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Using PM2
npm install -g pm2
pm2 start server.js --name claude-web
pm2 save
pm2 startup
Environment Variables
Create a .env file in the project root:
# Server Configuration
PORT=3010
SESSION_SECRET=your-secret-key-here
# Database
DB_PATH=./database.sqlite
# Claude Code
VAULT_PATH=/home/uroma/obsidian-vault
CLAUDE_CLI_PATH=claude # Path to claude command
Configuration
Server Settings
Edit server.js to customize:
- PORT (default: 3010) - Server port
- VAULT_PATH - Path to your Obsidian vault
- SESSION_SECRET - Session encryption key
Authentication
Default credentials:
- Username:
admin - Password:
!@#$q1w2e3r4!A
⚠️ Change these in production! Edit the users object in server.js:
const users = {
admin: {
passwordHash: bcrypt.hashSync('your-secure-password', 10)
}
};
Usage Guide
Managing Sessions
Creating a Session
- Click "+ New Session" on the landing page
- Enter a working directory
- (Optional) Select a project to auto-assign
- Click Create Session
The session will start automatically and you can begin chatting with Claude.
Session Controls
- Send Commands - Type in the chat input and press Enter
- View Output - Real-time terminal output in the session panel
- Terminate - Click the stop button to end the session
- Duplicate - Clone a session with the same working directory
Organizing Projects
Creating a Project
- Navigate to /projects or click "Projects" in the header
- Click "+ New Project"
- Fill in the details:
- Name (required) - Project identifier
- Path (required) - Working directory
- Description - What this project is about
- Icon - Emoji for visual identification (📁, 🚀, etc.)
- Color - Theme color for the project card
- Click Save Project
Assigning Sessions to Projects
Automatic Assignment:
- When creating a session, select a project from the dropdown
- The session will be automatically assigned to that project
Manual Assignment:
- Go to the sessions landing page
- Right-click on any session card
- Select "Move to Project"
- Choose from:
- 🎯 Suggestions - Smart recommendations based on directory, recency, and name
- 📂 Show All Projects - Full project list
- 📄 Move to Unassigned - Remove project association
Smart Suggestions
The system suggests projects based on:
- Same directory (90 points) - Exact path match
- Subdirectory (50 points) - Session path under project path
- Used today (20 points) - Active within last 24 hours
- Used this week (10 points) - Active within last 7 days
- Similar name (15 points) - Name overlap
Suggestions with 90+ points show 🎯, 50-89 show 📂, lower show 💡
Managing Projects
Edit Project:
- Right-click project card → Edit
- Modify description, icon, color, or path
- Save changes
Delete Project:
- Right-click project card → Move to Recycle Bin
- Project and all sessions are soft-deleted
- Can restore from recycle bin within 30 days
Recycle Bin:
- Click "🗑️ Recycle Bin" button on projects page
- Restore deleted projects (restores all sessions too)
- Permanently delete (cannot be undone)
Using the Terminal
Opening a Terminal
- Click "+ New Terminal" in the IDE
- Select a working directory
- The terminal will open with the Claude CLI ready
Session Picker
When creating a new terminal:
- Select from your last 10 sessions (web and local CLI sessions)
- Sessions are grouped by type:
- Web Sessions 💬 - Created through this interface
- Local CLI Sessions 💻 - Created using Claude Code CLI directly
- Click "Create New Session" to start fresh
Terminal Features
- Tabbed Interface - Multiple terminals open simultaneously
- Status Indicators - Running, Stopped, Error states
- Session Attachment - Click "🔗 Attach" to link terminal to a session
- Auto-Focus - Clicking a terminal automatically focuses it for keyboard input
XML Tag System
Claude can use special XML tags to perform actions:
<!-- Write a new file -->
<claude-write path="src/components/Header.tsx">
import React from 'react';
export default function Header() {
return <h1>My App</h1>;
}
</claude-write>
<!-- Edit existing file -->
<claude-edit path="src/App.tsx" mode="replace">
<search>
export default function App() {
return <div>Old Content</div>;
}
</search>
<replace>
export default function App() {
return <div>New Content</div>;
}
</replace>
</claude-edit>
<!-- Execute command -->
<claude-command working-dir="/path/to/project">
npm run dev
</claude-command>
<!-- Add dependency -->
<claude-dependency package="react-query">
npm install @tanstack/react-query
</claude-dependency>
These tags are automatically parsed and executed when Claude includes them in responses.
API Reference
Session Endpoints
Create Session
POST /claude/api/claude/sessions
Content-Type: application/json
{
"workingDir": "/path/to/project",
"projectId": 1
}
List Sessions
GET /claude/api/claude/sessions
Get Session Details
GET /claude/api/claude/sessions/:id
Duplicate Session
POST /claude/api/claude/sessions/:id/duplicate
Terminate Session
DELETE /claude/api/claude/sessions/:id
Project Endpoints
List Projects
GET /api/projects
Create Project
POST /api/projects
Content-Type: application/json
{
"name": "My API Project",
"path": "/home/uroma/my-api",
"description": "REST API development",
"icon": "🚀",
"color": "#4a9eff"
}
Update Project
PUT /api/projects/:id
Content-Type: application/json
{
"description": "Updated description",
"icon": "⚡"
}
Delete Project (Soft Delete)
DELETE /api/projects/:id
Restore Project
POST /api/projects/:id/restore
Permanently Delete Project
DELETE /api/projects/:id/permanent
Get Recycle Bin
GET /api/recycle-bin
Session Reassignment
Move Session to Project
POST /claude/api/claude/sessions/:id/move
Content-Type: application/json
{
"projectId": 1
}
Get Project Suggestions for Session
GET /api/projects/suggestions?sessionId=session-123
WebSocket
Connect to Session
const ws = new WebSocket('ws://localhost:3010/claude/api/claude/chat');
ws.onopen = () => {
ws.send(JSON.stringify({
type: 'auth',
sessionId: 'session-123',
token: 'your-session-token'
}));
};
ws.onmessage = (event) => {
const message = JSON.parse(event.data);
if (message.type === 'response') {
console.log(message.content);
}
};
Development
Project Structure
obsidian-web-interface/
├── services/
│ ├── claude-service.js # Claude Code CLI manager
│ ├── claude-workflow-service.js # Workflow orchestration
│ ├── terminal-service.js # Terminal (pty) management
│ ├── xml-parser.js # Custom XML tag processor
│ ├── response-processor.js # Response streaming
│ ├── tag-parser.js # Tag extraction
│ └── system-prompt.js # AI rules configuration
├── public/
│ ├── claude-ide/
│ │ ├── index.html # Main IDE interface
│ │ ├── ide.css # IDE styles
│ │ ├── ide.js # IDE JavaScript
│ │ ├── terminal.js # Terminal management
│ │ ├── terminal.css # Terminal styles
│ │ ├── chat-enhanced.js # Chat functionality
│ │ ├── preview-manager.js # Preview panel
│ │ └── sessions-landing.js # Sessions landing page
│ ├── css/ # Global styles
│ └── projects.html # Projects page
├── scripts/
│ └── migrate-to-projects.js # Database migration
├── server.js # Express + WebSocket server
├── package.json # Dependencies
└── database.sqlite # SQLite database (generated)
Running in Development
# Install dependencies
npm install
# Start with hot-reload (if using nodemon)
npm run dev
# Or standard start
npm start
# Run database migration
npm run migrate:projects
Database Schema
Projects Table
CREATE TABLE projects (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
description TEXT,
icon TEXT DEFAULT '📁',
color TEXT DEFAULT '#4a9eff',
path TEXT NOT NULL,
createdAt TEXT NOT NULL,
lastActivity TEXT NOT NULL,
deletedAt TEXT NULL
);
Sessions Table
CREATE TABLE sessions (
id TEXT PRIMARY KEY,
projectId INTEGER NULL,
deletedAt TEXT NULL,
FOREIGN KEY (projectId) REFERENCES projects(id) ON DELETE SET NULL
);
Adding New Features
- Backend - Add endpoints to
server.js - Frontend - Create components in
public/claude-ide/ - Styles - Add CSS to component-specific stylesheets
- Database - Update schema in
services/database.js - Test - Verify functionality and document API changes
Troubleshooting
Common Issues
Server won't start
# Check if port is in use
lsof -i :3010
# Kill existing process
kill -9 <PID>
# Or change PORT in server.js
Claude CLI not found
# Verify claude is in PATH
which claude
# If not found, install Claude Code CLI
npm install -g @anthropic-ai/claude-code
Database errors
# Recreate database
rm database.sqlite
npm start # Will recreate automatically
WebSocket connection failed
- Check browser console for errors
- Verify server is running on correct port
- Ensure no firewall is blocking WebSocket connections
- Check CORS settings if using custom domain
Sessions not showing
- Verify
VAULT_PATHpoints to correct directory - Check file permissions on vault directory
- Ensure
Claude Sessionsfolder exists
Getting Help
- Documentation - Check
docs/folder for detailed guides - Issues - Report bugs on Gitea: https://github.rommark.dev/admin/ClaudeCLI-Web/issues
- Logs - Check server logs:
journalctl -u obsidian-web -f(systemd) or console output
Contributing
We welcome contributions! Here's how to get started:
Development Workflow
- Fork the repository on Gitea
- Clone your fork:
git clone https://github.rommark.dev/<your-username>/ClaudeCLI-Web.git - Create a branch:
git checkout -b feature/your-feature-name - Make changes following the coding standards
- Test thoroughly (manual and automated)
- Commit with clear messages:
git commit -m "feat: add your feature" - Push to your fork:
git push origin feature/your-feature-name - Create Pull Request on Gitea
Coding Standards
- Use ES6+ JavaScript features
- Follow existing code style and formatting
- Add comments for complex logic
- Update documentation for new features
- Test across browsers (Chrome, Firefox, Safari)
Commit Message Format
<type>(<scope>): <subject>
<body>
<footer>
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Types: feat, fix, docs, style, refactor, perf, test
Example:
feat(terminal): add session picker for new terminals
Implement modal with last 10 sessions grouped by type (web/local).
Shows visual indicators for session status and working directory.
- Add session picker modal
- Group sessions by web/local
- Add visual status indicators
Closes #42
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
License
ISC
Acknowledgments
- Claude (Anthropic) - AI assistant powering the IDE
- Claude Code - Official CLI tool
- Obsidian - Knowledge base and note-taking platform
- xterm.js - Terminal emulation
- Express.js - Web framework
- SQLite - Embedded database
Links
- Documentation: docs/
- Gitea Repository: https://github.rommark.dev/admin/ClaudeCLI-Web
- Issue Tracker: https://github.rommark.dev/admin/ClaudeCLI-Web/issues
- Claude Code Docs: https://docs.anthropic.com/claude-code