A native GTK4/libadwaita desktop application for working with AI coding assistants like Claude Code. Provides a visual IDE-like environment with session history, file editing, terminal, Git integration, and project notes.
v0.8 introduces multi-provider architecture. While currently supporting Claude Code, the codebase is designed to support additional AI CLI tools (Gemini CLI, Codex CLI, etc.) in future versions.
- Register and manage multiple projects
- Single-click to select, double-click to open
- Lock mechanism prevents opening the same project twice
Vertical toolbar with 5 tabs:
- File Tree — Browse project files with Material Design icons and git status indicators
- Unified Search — Search files by name and content, with find & replace
- Tasks Panel — Run VSCode tasks from
.vscode/tasks.json
- Changes Panel:
- View staged and unstaged changes
- Stage/unstage individual files or all at once
- Commit with message
- Push/Pull with HTTPS authentication dialog and credential storage
- Auto-refresh on file changes (centralized monitoring)
- History Panel:
- Browse commit history with filtering (by message/author/hash)
- View commit details (files list + full message + per-file diff)
- Checkout, reset, revert commits
- Branch Management:
- Create, switch, delete branches
- Branch popover with quick access
- Browse past AI CLI sessions (lazy loading for performance)
- Filter by preview text or date
- View messages with tool calls, thinking blocks, code/diff display
- One-click AI CLI session launch
- Provider selection in Settings (currently: Claude Code)
- My Notes — Personal notes in
notes/folder with New Note button - Docs — Documentation from
docs/folder andCLAUDE.md - TODOs — Auto-extracted from code (
TODO:,FIXME:,HACK:,XXX:,NOTE:)
- Linter Integration — Run ruff and mypy on project files
- File Grouping — Problems grouped by file with error counts
- Code Preview — View problem location with syntax highlighting
- Copy to Clipboard — Copy single problem or all problems
- File Editor — Syntax highlighting via GtkSourceView 5, autosave on focus loss, go-to-line
- Script Toolbar — Run button with arguments dialog, code outline for .py/.sh/.md files
- Markdown Preview — WebKit-based preview with syntax highlighting (highlight.js)
- Terminal Tabs — Embedded VTE terminal with Dracula theme, left padding, auto
.venvactivation - Session View — Claude session content with Markdown support
- Commit Detail View — Files list + commit message + unified diff
- Snippets Bar — Quick-access text snippets
- Theme: System/Light/Dark via libadwaita
- Syntax Scheme: All GtkSourceView schemes available
- Font: Family, size, line height (shared by editor + terminal)
- Editor: Tab size, insert spaces, word wrap
- File Tree: Show/hide hidden files
- Linters: Enable/disable ruff and mypy, ignore specific codes
- Window State: Auto-saves size, position, sidebar width, maximized state
System dependencies (Fedora):
sudo dnf install gtk4-devel libadwaita-devel gtksourceview5-devel \
vte291-gtk4-devel python3-gobject libgit2-devel webkitgtk6.0-devel libspelling-devel \
ripgrep fd-findSystem dependencies (Ubuntu/Debian):
sudo apt install libgtk-4-dev libadwaita-1-dev libgtksourceview-5-dev \
libvte-2.91-gtk4-dev libwebkitgtk-6.0-dev libgit2-dev \
libspelling-1-dev gir1.2-spelling-1 \
libcairo2-dev libgirepository-2.0-dev pkg-config python3-dev python3-gi \
ripgrep fd-find# Clone the repository
git clone https://github.com/typedev/code-companion.git
cd code-companion
# Install Python dependencies with uv
uv sync
# Run the application
uv run python -m src.mainThese are not required to launch the app, but improve specific features. The
install.sh script installs ripgrep/fd for you; the rest are on demand.
| Tool / package | Feature | Without it |
|---|---|---|
ripgrep (rg) |
Unified search (content) | Falls back to grep — slower, less .gitignore-aware |
fd / fd-find |
Unified search (file names) | Falls back to find — slower |
hunspell-<lang> dictionaries |
Spell check in Query Editor | Language missing from the picker (no crash) |
uv |
App launch (bin/code-companion runs uv run on every start) |
App won't start |
On Debian/Ubuntu the
fdbinary is installed asfdfind— the app detects both names automatically, no symlink needed.
- Console warnings: launching from a terminal prints
PyGIWarningandGtk.StyleContext ... deprecatedmessages (GTK 4.10+). These are cosmetic and do not affect functionality. - Markdown preview: code highlighting (highlight.js) is bundled locally and
works offline. If the preview renders blank, it's usually the WebKitGTK
sandbox — install
bubblewrapandxdg-dbus-proxy. - Launching from the app menu: the launcher calls
uv run, souvmust be on the PATH of your desktop session. If it lives in~/.local/bin, make sure that directory is on the session PATH (log out/in after adding it). - Git HTTPS auth: push/pull credentials are saved via git's credential store
in
~/.git-credentials(plain text), the same as on other distros.
uv run python -m src.mainuv run python -m src.main --project /path/to/your/projectsrc/
├── main.py # Entry point, NON_UNIQUE application
├── project_manager.py # Project selection window
├── project_window.py # Main workspace window
├── models/ # Data models
│ ├── project.py # Project model
│ ├── session.py # Session model
│ ├── message.py # Message model
│ └── tool_call.py # Tool call model
├── widgets/ # UI components
│ ├── file_tree.py # File browser with git status, gitignore filtering
│ ├── file_editor.py # Code editor with autosave, go-to-line
│ ├── unified_search.py # Unified search (files + content) with replace
│ ├── terminal_view.py # VTE terminal with Dracula theme
│ ├── session_view.py # Claude session content viewer
│ ├── claude_history_panel.py # Claude sessions list with filtering
│ ├── code_view.py # Read-only code display + DiffView
│ ├── git_changes_panel.py # Git changes (stage/commit/push/pull)
│ ├── git_history_panel.py # Git commit history with filtering
│ ├── commit_detail_view.py# Commit details (files + message + diff)
│ ├── branch_popover.py # Branch management popover
│ ├── tasks_panel.py # VSCode tasks.json runner
│ ├── notes_panel.py # Notes panel (My Notes + Docs + TODOs)
│ ├── problems_panel.py # Problems sidebar (ruff/mypy)
│ ├── problems_detail_view.py # Problems detail with code preview
│ ├── script_toolbar.py # Run button + Outline for scripts
│ ├── markdown_preview.py # WebKit markdown preview
│ ├── snippets_bar.py # Quick-access snippets
│ ├── preferences_dialog.py# Settings dialog
│ └── ...
├── services/ # Business logic
│ ├── history_adapter.py # Abstract base for AI CLI adapters
│ ├── adapter_registry.py # Adapter registration and lookup
│ ├── adapters/ # AI CLI provider adapters
│ │ └── claude_adapter.py # Claude Code adapter
│ ├── history.py # Claude session reader (low-level)
│ ├── project_registry.py # Registered projects storage
│ ├── project_lock.py # Lock files for single-instance per project
│ ├── git_service.py # Git operations via pygit2 (with HTTPS auth)
│ ├── tasks_service.py # tasks.json parser
│ ├── toast_service.py # Toast notifications singleton
│ ├── settings_service.py # App settings (JSON storage)
│ ├── snippets_service.py # Text snippets management
│ ├── file_monitor_service.py # Centralized file monitoring
│ ├── problems_service.py # Linter runner (ruff/mypy)
│ ├── icon_cache.py # Material Design icons cache
│ ├── python_outline.py # Python AST parser for outline
│ └── markdown_outline.py # Markdown heading parser
└── resources/
└── icons/ # Material Design SVG icons
- Multi-process architecture — Each project opens in a separate process (
Gio.ApplicationFlags.NON_UNIQUE) - Lock files —
/tmp/code-companion-locks/prevents duplicate project instances - Project registry —
~/.config/code-companion/projects.jsonstores registered projects - Settings —
~/.config/code-companion/settings.jsonstores user preferences - AI Provider abstraction —
HistoryAdapterinterface for multi-provider support - Material Design Icons — Pre-loaded SVG icons from vscode-material-icon-theme with O(1) lookup
- Centralized file monitoring —
FileMonitorServicehandles all file watching with debouncing - Lazy loading — AI history and problems load only when needed (background thread)
- Git authentication — HTTPS credentials dialog with git credential storage
- v0.1: History viewer
- v0.2: Session content (tool calls, thinking blocks)
- v0.3: Embedded terminal
- v0.4: Project workspace (file tree, editor)
- v0.4.1: VSCode tasks support
- v0.5: Git integration (stage/commit/push/pull, unified diff)
- v0.5.1: Git history (commit list, checkout/reset/revert)
- v0.5.2: Material Design icons
- v0.5.3: UX improvements (toast notifications, branch management, auto-refresh)
- v0.6: Search & Notes (unified search, notes panel, filtering)
- v0.7: Settings & Preferences
- v0.7.1: Performance & UX (lazy loading, file monitoring, terminal enhancements, git auth)
- v0.7.2: Problems Panel (ruff/mypy integration, vertical toolbar)
- v0.7.3: Script Toolbar (Run button, Python outline)
- v0.7.4: Markdown Support (outline, WebKit preview)
- v0.8: Code Companion (multi-provider architecture, AI settings page)
- v0.9: Packaging (Flatpak, .desktop file)
- v1.0: Multi-agent orchestration with Git worktrees
- Icons: Material Icon Theme (MIT License)
- Markdown: mistune (BSD-3 License)
- Syntax Highlighting: highlight.js (BSD-3 License)
Apache License 2.0
Alexander Lubovenko (@typedev)
