devscope is a fast local project scanner plus terminal dashboard for developers.
It is built for the case where you have many folders, many repos, mixed stacks, and you want one place to answer:
- what projects exist under my roots
- what stack each one uses
- which ones are active, stale, dirty, or missing basics
- what branch, remote, upstream, and activity they have
- what commands, artifacts, ports, notes, and status belong to each project
devscope can:
- scan one or more root folders and discover projects automatically
- detect stacks, frameworks, package managers, scripts, commands, artifacts, Git state, activity, notes, health, and ports
- rank, filter, search, and inspect projects in a TUI
- open projects through configurable actions
- print project data in human-readable text or JSON from the CLI
- persist notes, manual status, and usage scores in config
Each detected project becomes a Project model with data such as:
nameandpathstacklabels likeRust,Node,Flutter/Dart,Python,Docker,.NET,Java,C/C++,Ruby,Swift- package manager
- detected scripts
- Git branch, upstream, ahead/behind, remote, last commit, dirty state
- activity timestamps plus relative activity text
- health score with visible positives and warnings
- suggested commands
- build artifacts
- listening TCP ports that match project processes
- user note
- manual or inferred status
Run the TUI:
devscopeAdd a root and scan it:
devscope add-root C:\Users\me\projects
devscope scanList everything as JSON:
devscope list --jsonAnnotate a project:
devscope note devscope "Needs perf review"
devscope status devscope activeIf no roots are configured, devscope can auto-discover likely roots on first run.
Run without a subcommand to launch the TUI:
devscopeAvailable commands:
devscope scan
devscope list [--json]
devscope add-root <path>
devscope remove-root <path>
devscope roots
devscope note <project> <text>
devscope status <project> <active|paused|stale|archived>
devscope config [--edit]
devscope open <project>
devscope discover [--apply]
scanScans configured roots and prints a compact summary.listPrints a simple list with name, stack, status, activity, and path.list --jsonPrints the full serialized internalProjectarray.add-root <path>Adds a directory to the roots list in config.remove-root <path>Removes a configured root.rootsShows configured roots.note <project> <text>Saves a note for a project.status <project> <new_status>Persists a manual status.configPrints the path toconfig.toml.config --editAlso prints the config path and tells you to edit it manually.open <project>Resolves a project and prints its path.discoverShows likely root folders found automatically.discover --applyAdds discovered roots into config.
The project argument accepted by note, status, and open can be:
- an exact project name
- a partial project name
- a path
Resolution tries path first when the input looks like a path, then exact name, then partial match.
scan prints a compact row-oriented summary with:
- project name
- stack
- relative activity
- status
- Git summary
list --json exposes the full project model, including:
id,name,pathstack,manager,scriptsgitactivitystatus,notewarningscommandshealthartifactsports
list --json is useful for scripting, but it is the serialized internal model, not a versioned stable public API.
The TUI is where devscope is strongest.
It supports:
- search
- filters
- sorts
- compact and detailed views
- notes
- manual status changes
- open action menu
- config action menu
- background Git hydration
- background port detection
- help overlay
q/Q: quitEsc: cancel or clear transient stateUp,Down,j,k: move selectionPageUp,PageDown: jump by 10Home,End: first or last project/: search modef: cycle filters: cycle sortr: reload scann: edit notem: change statuso: open action menu,: config action menuD: toggle compact / detailedEnter: record visit?: open help
- Search mode
Type to filter,
Backspacedeletes,Enteraccepts,Esccancels. - Note mode
Type to edit,
Backspacedeletes,Entersaves. - Status mode
Up/Downchoose a status,Enterconfirms. - Open menu Press the action key shown in the footer.
- Config menu Press the action key shown in the footer.
Current filters:
allactivedirtystalepausedarchivedflutterrustnodepythongodockerwindowswith-notes
Current sorts:
activitynamestackstatusdirtypathscore
compactSingle-pane list view that uses the full width for the table.detailedSplit view with the project table plus a details panel.
In narrow terminals, detailed view switches to a vertical split automatically.
devscope walks configured roots and treats a directory as a project when it finds a recognized marker file.
Markers include:
.gitpackage.jsonpnpm-lock.yamlyarn.lockpackage-lock.jsonCargo.tomlgo.modpyproject.tomlrequirements.txtPipfilepoetry.lockpubspec.yamlcomposer.jsonpom.xmlbuild.gradlebuild.gradle.ktssettings.gradleDockerfiledocker-compose.ymldocker-compose.yamlCMakeLists.txtMakefileGemfilePackage.swiftdeno.jsondeno.jsoncsetup.pysetup.cfg.sln.csproj
The scanner skips heavy or noisy directories such as:
node_modules.gittargetdistbuildout.next.nuxt.svelte-kit.dart_tool.idea.vscodevendor__pycache__.venvvenvenv.gradle.mvncoverage.cachePodsbinobj
devscope can infer:
- Flutter/Dart and platform folders for Windows, Android, iOS, Web, Linux, macOS
- Node and frameworks/tools like React, Vue, Svelte, Next.js, Nuxt, Vite, Tailwind, Electron, Tauri, Express, Fastify, Angular, TypeScript
- package manager labels such as
pnpm,yarn,npm,Bun,Deno - Rust and crates like Ratatui, Tauri, Axum, Actix, Bevy, Tokio, Serde
- Go
- Python and frameworks/libraries like FastAPI, Django, Flask, PyTorch, TensorFlow, NumPy, Pandas
- Docker and Compose
.NET/C#- Java with Maven or Gradle
- Kotlin
C/C++with CMake- Ruby and Rails
- Swift
- DB / migration-oriented projects
devscope does not run project commands automatically, but it can suggest likely commands based on stack and files.
Examples:
- Node:
npm run dev,pnpm build,yarn test, install commands - Flutter:
flutter pub get,flutter run -d windows,flutter build web,flutter build apk - Rust:
cargo run,cargo build,cargo test,cargo build --release - Go:
go run .,go build,go test ./... - Python:
pytest,pip install -r requirements.txt, framework-specific serve commands - Docker:
docker compose up,docker compose up --build,docker compose down .NET:dotnet run,dotnet build,dotnet test- Java: Maven or Gradle run, test, and build commands
For Git repos, devscope reads:
- current branch
- last commit hash, message, date, and timestamp
- remote URL, sanitized when needed
- upstream branch
- ahead/behind counts
- parsed remote host/repo
- dirty state
- modified count
- untracked count
The TUI uses a fast first pass and hydrates expensive working tree status in the background.
CLI scan and list hydrate Git status before printing so their output stays complete.
devscope computes activity from project file timestamps plus Git commit timestamps when available.
That activity feeds:
- relative labels such as
3m,2h,5d,2mo,1y - inferred project status when no manual status exists
- sorting by activity
- part of the health heuristics
Automatic status is roughly:
- recent activity =>
active - older activity =>
stale - no useful signal =>
unknown
Manual status overrides can still be saved through config or the TUI.
Health is a derived score from 0 to 100.
It rewards:
- README present
.gitignorepresent- detected commands
- clean working tree
- remote configured
- mainline branch
It penalizes things such as:
- missing README
- missing
.gitignore .envfiles- no commands
- no remote
- no upstream
- dirty working tree
- many uncommitted files
- non-mainline branch
- ahead/behind or diverged branch
- stale branch or low activity
- mixed Node lockfiles
- no Git repository
Levels:
80..=100=>good50..=79=>warn0..=49=>bad
Health warnings shown in the UI are intended to explain why the score changed.
Artifact detection currently includes:
- Flutter Windows executables and release folders
- Flutter Android APKs
- Flutter web build output
- Flutter Linux and macOS bundles when present
- Rust debug and release binaries
- Tauri release and bundle outputs
- common Node output folders like
dist,build, andout
devscope can detect listening TCP ports that belong to running project processes.
How it works:
- enumerate active TCP listeners
- inspect the owning process command line
- match that command line against known project paths
- attach matching ports to the corresponding project
Port detection runs asynchronously after reload, so ports may appear shortly after the first render.
Config lives at:
- Windows:
%APPDATA%/devscope/config.toml - Linux/macOS: the platform config directory from
directories::ProjectDirs
Important top-level fields:
roots = ["C:\\Users\\me\\projects"]
max_depth = 4
respect_gitignore = true
scan_hidden = false
follow_symlinks = false
[ui]
theme = "default"
show_icons = true
right_panel = true
[open]
default = "cursor"
[project_status]
"C:\\Users\\me\\projects\\devscope" = "active"
[notes]
"C:\\Users\\me\\projects\\devscope" = "Needs perf review"Open actions are configurable and shown from the TUI open menu.
Example:
[[open.actions]]
key = "c"
name = "cursor"
command = "cursor"
args = ["{path}"]
current_dir = false
terminal_mode = false
kind = "command"
[[open.actions]]
key = "g"
name = "lazygit"
command = "lazygit"
args = []
current_dir = true
terminal_mode = true
kind = "command"
[[open.actions]]
key = "f"
name = "folder"
kind = "file_manager"Supported open.actions fields:
keySingle-character trigger used in the menu.nameLabel shown in the UI.commandExecutable to run. Optional for specialkinds.argsArguments. Supports{path}and{name}placeholders.current_dirRun the command inside the project directory.terminal_modeSuspend the TUI and run interactively in the terminal.envExtra environment variables.kindOne ofcommand,file_manager,build_output, orexecutable.
Default action sets include common editors and tools such as:
cursorvscodenvimhelixlazygityaziterminalfolderbuild outputexecutable
Notes, statuses, and usage scores are persisted in config.
devscope discover looks for likely root folders under common developer locations such as:
~/dev~/projects~/source~/workspace~/code~/reposDocumentsDesktop- common OneDrive-backed variants
Each candidate gets a confidence level like HIGH, MEDIUM, or LOW.
Use:
devscope discover --applyto add discovered roots into config.
cargo check
cargo test
cargo clippy -- -D warningsFor local CLI help:
cargo run -- --help- Rust toolchain
git2/libgit2build prerequisites- on many systems, a C compiler and CMake
- CLI
openonly resolves and prints the project path; richer launching behavior lives in the TUI open menu - TUI layout is responsive, but final validation is still mostly manual because there are no snapshot render tests yet
- some config fields exist before every scanner path fully honors them consistently
- JSON output reflects the serialized internal project model, not a versioned contract