A desktop application with a multi-terminal dashboard for managing and monitoring Kiro CLI sessions with support for both interactive and non-interactive modes.
- Kiro CLI installed and configured on your system
- Kiro CLI authenticated and logged in (run
kiro-cli configureif needed) - Verify by running
kiro-cli --versionin your terminal
PARK launches Kiro CLI sessions - it does not include or install Kiro CLI itself.
PARK is packaged as an Electron desktop app that provides:
- Native desktop application for macOS (with Windows/Linux support planned)
- Multi-terminal dashboard for managing Kiro CLI sessions
- Launch and manage multiple Kiro CLI sessions simultaneously
- Save session configurations for reuse
- Monitor session status in real-time
- View terminal output in an integrated interface
- Support both interactive chat and non-interactive command execution
Component Layers:
-
Presentation Layer (Browser)
- UI Components
- SessionList: Session rendering
- NewSessionModal: Modal dialogs
- EventHandlers: User interactions
- Terminal Emulator (xterm.js)
- Theme Management (Light/Dark)
- WebSocket Client
- UI Components
-
Frontend Business Logic
- SessionManager: Session state & operations
- TerminalManager: Terminal lifecycle
- CommandBuilder: Command construction
- PromptLoader: Template loading
-
Application Layer (Backend)
- Express HTTP Server
- WebSocket Server
- REST API Endpoints
- File Upload Handler
-
Backend Business Logic
- Session Manager (Core logic)
- PTY Process Management
- Spawn Process Management
- Client Connection Multiplexing
-
Data Layer
- SQLite Database (Session persistence)
- File System (Config, Uploads, Logs)
-
Process Layer
- Kiro CLI PTY Processes (Interactive)
- Kiro CLI Spawn Processes (Non-interactive)
Key Classes:
Frontend:
- SessionManager: Session state & operations (frontend)
- TerminalManager: Terminal lifecycle management
- TerminalInstance: xterm.js terminal emulator wrapper
- CommandBuilder: Kiro CLI command construction
- PromptLoader: Template loading utility
Backend:
- SessionManager: Core business logic for session lifecycle (backend)
- PTYInstance: Wrapper for node-pty with client connections
- ProcessInstance: Wrapper for child_process
- Database: SQLite operations layer
States:
- Configured: Saved config, not running (Gray dot, checkbox visible)
- Active: Process running with PID (Green dot, no checkbox)
- Stopped: Process killed/crashed (Red dot, checkbox visible)
- Completed: Process exited normally (Orange dot, checkbox visible)
Transitions:
- Save Config β Configured
- Launch/Rerun β Active
- Stop/Crash β Stopped
- Exit Normally β Completed
- Delete β Removed from DB
brew tap 13shivam/park
brew install --cask parkOr download the latest DMG from Releases.
# Clone repository
git clone https://github.com/13shivam/park.git
cd park
# Install all dependencies
npm run install:all
# Build and run in development
npm run dev# Build for macOS
npm run package:mac
# Output: dist/PARK-1.0.0.dmg- Click the + button in the sidebar
- Select mode:
- Interactive Chat: Launch Kiro CLI in interactive mode
- Non-Interactive Command: Run a command and exit
- Configure:
- Session name
- Working directory
- Optional: Initial prompt (interactive) or file upload (non-interactive)
- Choose action:
- Launch Now: Start immediately
- Save Config: Save for later
Session Status Indicators:
- π’ Green: Active (running)
- π΄ Red: Stopped (killed/crashed)
- π Orange: Completed (exited normally)
- β« Gray: Configured (not launched)
Actions:
- Checkbox: Select up to 5 non-active sessions
- Launch/Rerun Selected: Launch configured or rerun stopped sessions
- β» Button: Rerun individual stopped/completed session
- Clean Up: Delete all inactive sessions
- Click active session to view in terminal
- Red dot (β): Stop the session (kills process)
- X: Close terminal view (session keeps running)
- +: Launch new session from empty state
- Click β/π button in sidebar header
- Switches between light and dark themes
- Preference saved in browser localStorage
Configuration stored in: ~/.park-agent-launcher/config/config.json
{
"server": {
"port": 3000,
"host": "localhost"
},
"shell": {
"defaultShell": "/bin/bash",
"defaultCwd": "~"
},
"ui": {
"defaultLayout": "1x1",
"theme": "dark"
}
}SQLite database: ~/.park-agent-launcher/config/park.db
Sessions Table:
CREATE TABLE sessions (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
directory TEXT NOT NULL,
command TEXT NOT NULL,
status TEXT CHECK(status IN ('active', 'configured', 'stopped', 'completed')),
type TEXT CHECK(type IN ('interactive-pty', 'non-interactive')),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
pid INTEGER
);| Method | Endpoint | Description |
|---|---|---|
| GET | /api/sessions |
List all sessions |
| GET | /api/sessions/:id |
Get session details |
| POST | /api/sessions |
Create and launch session |
| POST | /api/sessions/config |
Save session config (don't launch) |
| POST | /api/sessions/launch |
Launch multiple sessions by ID |
| POST | /api/sessions/:id/stop |
Stop running session |
| DELETE | /api/sessions/:id |
Delete session |
| DELETE | /api/sessions |
Clean up all inactive sessions |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/system/config |
Get application configuration |
| GET | /api/system/prompts |
Get prompt templates |
| POST | /api/system/upload |
Upload file (returns path) |
| GET | /api/system/file-content?path=... |
Read uploaded file content |
Endpoint: ws://localhost:3000/terminal/:sessionId
Client β Server Messages:
{"type": "input", "data": "command\n"}
{"type": "resize", "cols": 80, "rows": 30}Server β Client Messages:
{"type": "output", "data": "terminal output"}
{"type": "exit", "code": 0}
{"type": "error", "message": "error description"}
{"type": "history", "data": "buffered output"}β
Multi-session management
β
Interactive and non-interactive modes
β
Real-time terminal output streaming
β
Session persistence across restarts
β
Batch launch/rerun (up to 5 sessions)
β
Light/dark theme toggle
β
File upload for prompts
β
Session status tracking with visual indicators
β
Automatic cleanup of inactive sessions
β
Terminal output buffering (1000 lines)
β
WebSocket reconnection support
β
Process lifecycle management
npm run dev # Development with auto-reload
npm run build # Build TypeScript
npm start # Productionnpm run dev # Development server with HMR
npm run build # Production build
npm run preview # Preview production buildInteractive PTY (interactive-pty):
- Uses
node-ptyto spawn pseudo-terminal - Full terminal emulation with ANSI escape codes
- Supports terminal resize
- Bidirectional I/O streaming
- Use case:
kiro-cli chatinteractive sessions
Non-Interactive Process (non-interactive):
- Uses Node.js
child_process.spawn - Captures stdout/stderr
- No terminal emulation
- Use case:
kiro-cli chat --no-interactivewith prompt file
- Session Creation: ~100ms (PTY spawn time)
- WebSocket Latency: <10ms (local)
- Database Operations: <5ms (SQLite)
- Concurrent Sessions: 50-100 (system resource dependent)
- Output Buffer: 1000 lines per session
- Max Selected Sessions: 5 (for batch operations)
- File System Access: Limited to configured directories
- Process Isolation: Each session runs in separate process
- WebSocket Validation: Session ID checked before attachment
- File Upload Limits: 10MB max file size
- Path Validation: Uploaded files restricted to uploads directory
Backend won't start:
- Check if port 3000 is available
- Verify Node.js version (18+)
- Check
~/.park-agent-launcher/directory permissions
Frontend can't connect:
- Ensure backend is running on port 3000
- Check browser console for errors
- Verify WebSocket connection in Network tab
Session shows as stopped but process is running:
- Backend was restarted while session was active
- PID tracking lost - rerun the session
Terminal not displaying output:
- Check WebSocket connection status
- Verify session is in 'active' state
- Check backend logs for errors
MIT License - see LICENSE file for details.
Copyright (c) 2025 https://github.com/13shivam
- Kiro CLI is a trademark of Amazon Web Services, Inc.
- AWS and related marks are trademarks of Amazon Web Services, Inc.
- All trademarks are the property of their respective owners.
This is an independent open-source project and is not officially affiliated with or endorsed by AWS.
Contributions are welcome! To contribute:
- Fork the repository at github.com/13shivam/park
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Test thoroughly
- Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
For issues and questions:
- GitHub Issues: github.com/13shivam/park/issues
- Maintainer: https://github.com/13shivam
- Documentation: See this README and architecture diagrams
Releases are automatically built and published via GitHub Actions when a version tag is pushed:
git tag v1.0.0
git push origin v1.0.0This will:
- Build architecture-specific DMGs (arm64 and x64) for macOS
- Create a GitHub release with the DMG files
- Generate release notes automatically
- Automatically update the homebrew-park tap with new version and SHA256 checksums
Users can install the latest version via: brew tap 13shivam/park && brew install --cask park
Download the latest release from Releases.
The Homebrew Cask formula is maintained in a separate repository: homebrew-park
A template cask file is provided in homebrew-cask-template.rb for reference.


