devtask-radar
v0.1.4
Published
Local AI coding task radar: collect Claude Code / Codex / OpenCode events, run project-scoped analysis sessions, and project the result into a calendar-first daily task view.
Maintainers
Readme
DevTask Radar
DevTask Radar collects AI coding-agent events, groups them into conversation turns, runs project-scoped Claude Code analysis sessions, and projects the resulting task patches into a calendar-first daily task view.
Install & Run
Requires Node.js ≥ 24.
# Global install (recommended for personal use)
npm install -g devtask-radar
devtask-radar
# Starts in the background and opens http://127.0.0.1:8787Or as a local dependency in a project:
npm install devtask-radar
npx devtask-radarThe global command runs like a small local service. Closing the terminal window does not stop DevTask Radar; use the CLI commands below:
devtask-radar status
devtask-radar stop
devtask-radar --fg # foreground mode for development/debugging
devtask-radar --no-open # start without opening the browser
devtask-radar --port 8790 # choose a port; default auto-fallback is 8787-8806
devtask-radar --host 0.0.0.0 # bind to all interfacesOn first start DevTask Radar will auto-install Claude Code / Codex hooks into your user-level CLI config so events flow in. To opt out:
DEV_TASK_RADAR_AUTO_INSTALL_CLI=0 devtask-radar # macOS / Linux
$env:DEV_TASK_RADAR_AUTO_INSTALL_CLI = "0"; devtask-radar # PowerShellDefault URLs after start:
- Worker and calendar UI:
http://127.0.0.1:8787 - Health check:
http://127.0.0.1:8787/api/health - SSE stream:
http://127.0.0.1:8787/stream
Useful environment variables
| Var | Default | Purpose |
|---|---|---|
| DEV_TASK_RADAR_HOST | 127.0.0.1 | Listen host |
| DEV_TASK_RADAR_PORT | 8787 | Listen port |
| DEV_TASK_RADAR_PID_FILE | OS temp dir .devtask-radar.pid | Background CLI PID file |
| DEV_TASK_RADAR_DATA_DIR | Windows: %LOCALAPPDATA%\DevTask Radar; macOS: ~/Library/Application Support/DevTask Radar; Linux: ~/.local/share/devtask-radar | SQLite + settings location |
| DEV_TASK_RADAR_ANALYSIS_DATA_DIR | <data>/analysis-runtime | AI profiles + Claude session history |
| DEV_TASK_RADAR_AUTO_INSTALL_CLI | 1 | Auto-install Claude/Codex hooks on startup |
| DEV_TASK_RADAR_ANALYSIS_WORKER | 1 | Spawn analyzer child process; set to 0 to disable |
| DEV_TASK_RADAR_INLINE_ANALYSIS | 0 | Run analyzer inside the web process |
| DEV_TASK_RADAR_ANALYSIS_POLL_MS | 2000 | Analyzer polling interval |
Develop from source
Clone the repo and run from the project root:
git clone https://github.com/SanQianX/devtask-radar.git
cd devtask-radar
npm install
npm startnpm start boots both the web server and the analyzer worker. Run only the analyzer with npm run analyzer, only the smoke tests with npm run smoke, or auto-reload on file changes with npm run dev.
Product Rule
- Today shows all unfinished tasks plus tasks completed today.
- Past dates show only tasks completed on that date.
- Future dates are not clickable and are rejected by the API.
- Unfinished tasks do not stay on past dates; they keep flowing forward to today.
The main API for the frontend is:
GET /api/days/:yyyy-mm-dd/tasks
GET /api/calendar/month?month=yyyy-mmClaude Code Analysis
The worker uses the embedded Claude Agent SDK runner in apps/worker/src/lib/claude-cli-runner.js. It does not proxy or require any external AI module.
AI profiles, project bindings, and Claude terminal session records are stored in DevTask Radar's analysis data directory. By default that is:
%LOCALAPPDATA%\DevTask Radar\analysis-runtimeOverride it with:
$env:DEV_TASK_RADAR_DATA_DIR = "$env:LOCALAPPDATA\DevTask Radar"
$env:DEV_TASK_RADAR_ANALYSIS_DATA_DIR = "$env:LOCALAPPDATA\DevTask Radar\analysis-runtime"Each imported project gets its own work directory under the configured workspace root, using the project slug plus the -task suffix. Claude Code terminal sessions run in that project work directory, so switching projects in the analysis panel switches to that project's own Claude terminal history and cwd.
AI CLI Integration
On startup, DevTask Radar automatically detects supported local AI CLI settings and installs the matching hooks once. The UI has an AI CLI Integration view so you can see what was installed, repair missing hooks, or remove an integration later.
Claude Code and Codex are currently supported.
Claude Code hooks are merged into:
%USERPROFILE%\.claude\settings.jsonExisting settings such as claude-mem enabled plugins are kept intact. If you remove the DevTask Radar hook from the UI, the worker remembers that choice and will not reinstall it on the next startup. Set this environment variable to disable startup auto-install:
$env:DEV_TASK_RADAR_AUTO_INSTALL_CLI = "0"The generated hook config lives here:
connectors\claude-code\hooks.jsonThe hook scripts are fire-and-forget and post to http://127.0.0.1:8787/api/ingest/claude-code.
The integration page also shows pushed hook events and recent conversation turns, so you can see prompts arrive while chatting in Claude Code.
Codex is installed through its notify command in:
%USERPROFILE%\.codex\config.tomlDevTask Radar preserves the original Codex notify command, adds connectors\codex\notify-hook.js in front of it, and reads the latest Codex session JSONL from %USERPROFILE%\.codex\sessions. User prompts and assistant replies are posted to http://127.0.0.1:8787/api/ingest/codex.
The activity feed has three display modes:
- Normal user: only user prompts and AI replies.
- Admin: user prompts, AI replies, and important file-changing tools such as
Write,Edit, andMultiEdit. - Debug: every raw hook event, including reads, searches, lifecycle events, and all tool results.
Analysis Worker
DevTask Radar runs task extraction as a background worker. The web process receives CLI events and writes conversation turns into SQLite; the analyzer process continuously polls analysis_jobs, starts a project-scoped Claude Code analysis session with the configured DevTask Radar AI profile, and projects the AI output into the task list.
npm start starts both the web server and the analyzer worker by default. You can run only the analyzer with:
npm run analyzerUseful switches:
$env:DEV_TASK_RADAR_ANALYSIS_WORKER = "0" # do not auto-start the analyzer child process
$env:DEV_TASK_RADAR_INLINE_ANALYSIS = "1" # analyze inside the web process instead
$env:DEV_TASK_RADAR_ANALYSIS_POLL_MS = "2000" # analyzer polling interval