Scanner CLI
Scan your codebase to map services, endpoints, and connections.
The Arcanon Scanner analyses your codebase to extract service boundaries, endpoints, connections, and schemas — then uploads the results to your Arcanon Hub workspace. It runs entirely on your machine.
Installation
macOS / Linux:
curl -fsSL https://arcanon.dev/install.sh | shWindows (PowerShell):
irm https://arcanon.dev/install.ps1 | iexVerify the installation:
arcanon --versionQuick start
# Set your credentials (from Settings > API Keys in the dashboard)
export ARCANON_API_KEY=arc_your_key_here
export ARCANON_HUB_URL=https://api.arcanon.dev
# Scan and upload
arcanon
# Preview results first
arcanon --dry-runOptions
| Option | Description |
|---|---|
--dry-run | Preview results without uploading |
--output <FILE> | Save results to a file |
--project-slug <SLUG> | Group scans under a project |
--plugins <LIST> | Only run specific plugins (e.g. typescript,openapi) |
--exclude <GLOB> | Exclude additional paths (repeatable) |
-v / -vv / -vvv | Increase log detail |
All options can also be set via environment variables (ARCANON_API_KEY, ARCANON_HUB_URL, ARCANON_PROJECT_SLUG) or in .arcanon.toml.
Configuration
Add .arcanon.toml to your repo root to customise scanner behaviour. Commit this file — it's shared across the team.
[scanner]
project_slug = "my-project"
hub_url = "https://api.arcanon.dev"
[scanner.exclude]
paths = ["vendor/**", "legacy/**"]Override service names
When the scanner misdetects a service name:
[services."packages/api"]
name = "api-server"
[services."packages/shared"]
ignore = true # not a serviceDeclare connections manually
For connections the scanner can't detect (runtime service discovery, sidecar proxies):
[[connections.manual]]
source = "api-server"
target = "auth-proxy"
protocol = "rest"
confidence = "high"Better results
Install dependencies first
The scanner analyses installed packages to detect custom libraries and internal SDKs. Install dependencies before scanning for the most complete results:
pip install -r requirements.txt # Python
npm ci # Node.js
bundle install # RubyGo and Rust read lock files directly — no install needed.
What it detects
Endpoints — Express, FastAPI, Django, Flask, Spring Boot, ASP.NET Core, Gin, Axum, Rails routes, plus OpenAPI/proto/GraphQL specs.
Connections — HTTP clients (fetch, axios, requests, httpx), message queues (Kafka, RabbitMQ, NATS), databases (PostgreSQL, MongoDB, Redis), gRPC, and 90+ more libraries across 7 languages.
Services — From Dockerfiles, docker-compose, Kubernetes manifests. In monorepos, each service is detected and source files are attributed automatically.
Custom libraries — If your team has internal SDKs, the scanner traces through wrapper functions to detect connections made by libraries it hasn't seen before.
CI integration
GitHub Actions
name: Arcanon Scan
on:
push:
branches: [main]
pull_request:
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install scanner
run: curl -fsSL https://arcanon.dev/install.sh | sh
- name: Install dependencies
run: pip install -r requirements.txt # or npm ci, bundle install, etc.
- name: Scan and upload
env:
ARCANON_API_KEY: ${{ secrets.ARCANON_API_KEY }}
ARCANON_HUB_URL: ${{ secrets.ARCANON_HUB_URL }}
run: arcanon --project-slug my-projectGitLab CI
arcanon-scan:
stage: test
script:
- curl -fsSL https://arcanon.dev/install.sh | sh
- pip install -r requirements.txt
- arcanon --project-slug my-project
variables:
ARCANON_API_KEY: $ARCANON_API_KEY
ARCANON_HUB_URL: $ARCANON_HUB_URLSelf-hosted runners
If you use self-hosted runners (Actions Runner Controller, etc.), update the runs-on field:
runs-on: your-runner-setThe scanner auto-detects CI environment variables for branch and commit SHA across GitHub Actions, GitLab CI, and Jenkins.
Troubleshooting
Check the scan log
Every scan saves a debug log:
ls ~/.arcanon/logs/
cat ~/.arcanon/logs/my-repo-*.logRun with verbose output
arcanon -vvv --dry-runNo services detected
If your repo doesn't have Dockerfiles or docker-compose, the scanner infers a service from the repo name. To name it explicitly:
# .arcanon.toml
[services."."]
name = "my-service"Exit codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Upload failed |
| 2 | Invalid arguments |