CLI reference
Every maple command, argument and flag, plus the local server's endpoints, environment variables and a troubleshooting guide.
The maple binary is one CLI with two backends: the local server it starts itself (maple start) and a hosted Maple workspace (maple auth login). Every query command runs against whichever backend is resolved for that invocation. Output is JSON by default, clean enough to pipe into jq or an agent.
New here? Start with the Maple Local walkthrough, or use the CLI with hosted Maple. This page lists every command.
Command index
| Command | What it does |
|---|---|
maple start · stop · reset | Run the local server, stop it, or clear its live data |
maple checkpoint · restore | Take a restore point of the local store, or roll back to one |
maple archive … | Export sealed days to Parquet and manage those archives |
maple delete | Delete one service’s or namespace’s local telemetry |
maple schema … | Inspect and migrate the local store’s schema |
maple update · changelog | Upgrade a script-installed binary, read the release notes |
maple services · diagnose · service-map · top-ops | Services, their health, dependencies and hottest operations |
maple traces · trace · slow-traces | Search spans, inspect one trace, find the slowest |
maple errors · error | Error groups by fingerprint, and one group in detail |
maple logs · log-patterns | Search logs, or cluster them into templates |
maple attributes keys · values | Discover attribute keys and their values |
maple metrics · metrics show · query | List metrics, read one over time, run read-only SQL |
maple timeseries · breakdown · compare | Bucketed metrics, top-N breakdowns, two windows side by side |
maple auth … · whoami · use | Sign in to a workspace, see the resolved backend, pin one |
Global flags
Accepted by every command, in any position (maple --local traces and maple traces --local both work):
| Flag | Description |
|---|---|
--local | Force local mode (requires a running maple start) |
--remote | Force remote mode (requires maple auth login) |
--debug | Print the compiled SQL and per-query timing to stderr; stdout stays clean JSON |
--format <json|table> | Output format, default json. table renders a flat row set as an aligned table |
Most query commands also share a set of filter flags. Which ones apply is listed per command below; the shapes are always the same:
| Flag | Alias | Default | Description |
|---|---|---|---|
--since <range> | 6h | Relative time range: 30m, 1h, 6h, 24h, 7d | |
--start <time> | Absolute start, YYYY-MM-DD HH:mm:ss UTC (use with --end) | ||
--end <time> | Absolute end, YYYY-MM-DD HH:mm:ss UTC | ||
--service <name> | -s | Filter by service name | |
--env <name> | -e | Filter by deployment environment, e.g. production | |
--limit <n> | -n | 20 | Maximum number of results |
--offset <n> | 0 | Pagination offset |
Server commands
Local mode only. maple start is the long-lived process that owns the embedded ClickHouse connection; every other command talks to it over HTTP.
maple start
Start the local ingest and query server.
| Flag | Default | Description |
|---|---|---|
--host <address> | 127.0.0.1 | Bind address. Off loopback, set MAPLE_LOCAL_INGEST_KEY and MAPLE_LOCAL_ACCESS_TOKEN, or the UI, OTLP ingest and raw SQL are open to the network (see Server endpoints) |
--advertise-host <host> | Hostname printed for clients and used by the bundled UI. Defaults to the bind address (--host) | |
--port <int> | 4318 | Port for OTLP ingest, the query API and the bundled UI |
--data-dir <path> | ~/.maple/data | Embedded ClickHouse data directory |
--offline | false | Serve the UI bundled in the binary instead of linking to local.maple.dev |
--background, -d | false | Run detached, logging to ~/.maple/maple.log; stop with maple stop |
--reset | false | Wipe live data before starting, keeping checkpoints. For an incompatible upgrade |
--checkpoint-interval <dur> | 30m | How often to refresh the restore point while running (45s, 2h, or off) |
--on-dirty-store <policy> | fail | What to do when the store was not cleanly closed: fail, wipe or restore-checkpoint |
--chdb-config-file <path> | Your own ClickHouse config for the embedded engine, instead of the generated one. Must keep backups enabled for checkpoints to work | |
--minimum-raw-telemetry-retention-days <n> | Persist a retention floor for the raw tables (at least 90 days). Survives reset and restore | |
--in-memory | false | Keep telemetry for this run only, in a throwaway store deleted on exit, with no checkpoints. Cannot be combined with -d, --data-dir, --reset, --checkpoint-interval, --on-dirty-store or the retention floor |
--projector-module <path> | Load a trusted local projector .mjs module. Repeatable. The module runs with Maple’s permissions |
maple start # foreground, UI from local.maple.dev
maple start --offline # foreground, bundled UI, no internet needed
maple start -d --port 4400 # detached on a custom port
maple start --in-memory # throwaway store, deleted on exit
maple start --host 0.0.0.0 --advertise-host maple.home.arpa --offline
The default recovery policy is fail, so an unclean shutdown never silently deletes telemetry. What each policy does, and how reset and restore protect the store, is on Checkpoints and archives.
maple stop
Stop a running server. Reads the PID file beside the data directory.
| Flag | Default | Description |
|---|---|---|
--data-dir <path> | ~/.maple/data | Data directory of the server to stop |
maple reset
Delete live data so the next maple start bootstraps fresh. Checkpoints under <data-dir>/backups are kept. Refuses to run while a server owns the store.
| Flag | Default | Description |
|---|---|---|
--data-dir <path> | ~/.maple/data | Store whose live data to clear |
--yes, -y | false | Skip the confirmation prompt |
maple checkpoint
Create and validate a restorable checkpoint of the local store. Works out of the box against a running maple start.
| Flag | Default | Description |
|---|---|---|
--host <address> | 127.0.0.1 | Host of the running server |
--port <int> | 4318 | Port of the running server |
--data-dir <path> | ~/.maple/data | The server’s data directory |
If the server was started with a custom data directory, pass the same one. Without --port, the command reads the server’s address from the store’s discovery file.
maple restore
Restore the local store from the current checkpoint. Refuses to run while a server owns the store. The existing store is moved beside the data directory as <data-dir>.quarantine-<ids>, never deleted; maple schema gc lists it and --apply removes it.
| Flag | Default | Description |
|---|---|---|
--data-dir <path> | ~/.maple/data | Store to restore |
--checkpoint-id <uuid> | Restore one specific checkpoint instead of the current one | |
--yes, -y | false | Skip the confirmation prompt |
maple restore --yes
maple restore --checkpoint-id 01234567-89ab-4cde-8fab-0123456789ab --yes
maple delete
Delete one service’s or namespace’s telemetry from the local store, in the raw tables and every derived rollup. Local mode only. Without --yes it only prints what would be deleted.
| Flag | Description |
|---|---|
--service <name> | The service.name whose telemetry to delete |
--namespace <name> | The service.namespace whose telemetry to delete. With --service, both must match |
--env <name> | Only rows whose deployment environment equals this value |
--before <age|ts> | Only rows older than an age (7d, 12h) or a UTC timestamp, floored to the hour |
--yes | Delete. Without it the command is a dry run |
maple delete --service checkout-pr-42 # preview
maple delete --namespace pr-42 --yes
maple delete --service api --before 7d --yes
maple archive
Local mode only. Export whole UTC days of the six raw telemetry tables from a checkpoint into Parquet files, and manage those exports. How archives work is explained on Checkpoints and archives.
| Subcommand | What it does |
|---|---|
archive create <YYYY-MM-DD> <signal> | Export one day of one signal. --checkpoint-id picks the checkpoint. Refuses days past retention, and refuses to replace an archived day with fewer rows unless you pass --allow-shrink |
archive list [--output summary|paths|json] [--signal <name>] | List archived days. paths prints Parquet file paths for DuckDB and needs --signal |
archive verify [--signal <name>] | Re-check the SHA-256 of every archived file |
archive expire <YYYY-MM-DD> --apply | Delete one archived day across all six signals |
archive retire-live <YYYY-MM-DD> --apply | Delete a day from the live store once all six signals are archived and verified. The day must be at least --sealing-lag-hours (default 24) past UTC midnight |
archive gc [--keep <n>] [--apply] | Delete replaced copies of re-exported days, keeping the newest n per signal and day (default 1). Without --apply it only prints the plan |
archive reconcile | Finish an interrupted create or gc without exporting again |
archive rebuild <signal> | Rebuild a signal’s catalog.jsonl from its manifests |
Signals: logs, traces, metrics_sum, metrics_gauge, metrics_histogram, metrics_exponential_histogram.
Common flags: --data-dir (default ~/.maple/data), --archive-dir (default ~/.maple/archive) and --scratch-root (default ~/.maple/scratch). gc, expire and retire-live change nothing unless you pass --apply. reconcile acts by default; pass --dry-run to print the plan without changing anything.
Export settings are fixed: one writer thread, 10,000-row row groups, and files of at most 500,000 rows or 256 MiB. Older releases had archive calibrate; archive create still accepts its --config flag but ignores it.
maple schema
Inspect and migrate the local store’s schema. Needed only when a release note says a store needs migrating; a normal upgrade opens the store as is.
| Subcommand | What it does |
|---|---|
schema status | Show the store’s schema identity and migration journal state |
schema plan | Show the deterministic migration plan for this store |
schema migrate [--dry-run] [--yes] | Migrate a populated store into a staged current-schema store. Needs a stopped server; keeps the original as a rollback point |
schema abandon [--yes] | Quarantine an unfinished staged target, preserving the active source (also when the source was left dirty) |
schema gc [--apply] [--release-preserved] | List what restores, resets and migrations set aside (quarantined stores, migration sources, stale locks). --apply deletes it; --release-preserved also unpins the checkpoints a reset kept |
All five take --data-dir <path> (default ~/.maple/data).
maple update
Update a script-installed binary to the latest release: download, verify the checksum and release signature, install in place.
| Flag | Description |
|---|---|
--check | Only report whether a newer version is available |
--tag <vX.Y.Z> | Install a specific release instead of the latest |
--insecure-skip-signature | Install even if the signature is missing or invalid. The checksum is still checked |
Homebrew installs refuse maple update so the package manager stays in charge; run brew upgrade maple instead.
maple changelog
Print the release notes for the installed version. --since <version> prints every release after that version instead (maple changelog --since 0.0.20). Text by default; --format json for JSON.
Services
maple services
List active services with throughput, error rate and P95 latency. Flags: --since / --start / --end, --env, --service/-s (services whose name contains the text), --limit (default 50).
maple diagnose <service-name>
Deep-dive one service: health, top errors, recent traces and logs.
<service-name>: the service to diagnose- Flags:
--since/--start/--end,--env
maple service-map
Service dependency edges with call counts, errors and latency. Flags: --since / --start / --end, --service, --env.
edges: service-to-service calls, drawn when an instrumented callee continues the caller’s tracedatabases: calls from client spans withdb.system.name(or the legacydb.system), keyed by system anddb.namespaceexternal: HTTP, messaging and RPC targets that are not a traced service; listed only with--service, since that query is scoped to one caller
Databases and external calls are local-only. In remote mode the command prints edges, and --service keeps that service’s outbound edges only; locally it keeps both directions.
maple top-ops <service-name>
Top operations (span names) for a service, ranked by a metric.
<service-name>: the service to inspect-: ranking metric, default- metric < count| avg_ duration| p50_ duration| p95_ duration| p99_ duration| error_ rate| apdex> count- Flags:
--since/--start/--end,--limit
Traces
maple traces
Search traces and spans.
| Flag | Description |
|---|---|
--span-name <substr> | Filter by span name (substring, case-insensitive) |
--errors | Only traces with errors |
--min-duration-ms <int> | Minimum duration in milliseconds |
--max-duration-ms <int> | Maximum duration in milliseconds |
--http-method <method> | Filter by HTTP method (GET, POST, …) |
Plus --since / --start / --end, --service, --env, --limit, --offset.
maple traces --service api --min-duration-ms 500 --errors --since 1h
maple trace <trace-id>
Inspect one trace: the full span tree plus correlated logs.
<trace-id>: the trace to inspect, 32 hex characters- Flags:
--since/--start/--end. With none set, the command looks back 24 hours, then up to 30 days
maple slow-traces
The slowest traces with duration stats. Flags: --since / --start / --end, --service, --env, --limit.
Errors
maple errors
Error groups by fingerprint, with count, affected services and last seen. Flags: --since / --start / --end, --service, --env, --limit.
maple error <fingerprint-hash>
One error group in detail: sample traces and a timeseries.
<fingerprint-hash>: the fingerprint frommaple errors- Flags:
--since/--start/--end,--service,--limit
Logs
maple logs
Search logs.
| Flag | Alias | Description |
|---|---|---|
--severity <level> | TRACE, DEBUG, INFO, WARN, ERROR or FATAL | |
--search <text> | -q | Substring match on the body |
--trace-id <id> | Only logs from one trace | |
--attributes | Include every log attribute on each entry, not only error keys |
Plus --since / --start / --end, --service, --env, --limit, --offset.
maple log-patterns
Cluster logs into templates to surface the noisiest patterns. Flags: --since / --start / --end, --service, --env, --severity, --search/-q, --limit.
Attributes
maple attributes keys
Discover the attribute keys present in your data.
| Flag | Default | Description |
|---|---|---|
--source <traces|metrics|services> | traces | Where to look |
--scope <span|resource> | span | Span or resource attributes (traces only) |
Plus --service, --since / --start / --end, --limit.
maple attributes values <key>
List the values seen for one attribute key.
<key>: the attribute key- Flags: same as
attributes keys
Metrics and raw SQL
maple metrics
List available metrics. Flags: --since / --start / --end, --service, --search/-q, --limit.
maple metrics show <metric-name>
One metric’s values over time, per service. Monotonic counters are shown as a per-second rate, every other type as the average per bucket.
<metric-name>: the exact metric name, frommaple metrics--bucket <seconds>: bucket size, default about 60 buckets over the window- Flags:
--since/--start/--end,--service,--env(local mode only)
maple metrics show http.server.request.count --since 1h
maple query "<sql>"
Run a read-only ClickHouse SELECT, for anything the typed commands don’t cover. Writes, multiple statements and table functions are rejected.
<sql>: the query to run- Flags:
--since/--start/--end, the window the macros use
The macros $__orgFilter, $__timeFilter(col), $__startTime, $__endTime and $__interval_s expand in both modes (see SQL). Locally, SQL without macros also runs as written. Remote queries must include $__orgFilter and return at most 100 rows. Quote the SQL in single quotes so the shell leaves $__ alone:
maple query "SELECT ServiceName, count() FROM traces GROUP BY ServiceName ORDER BY 2 DESC" # local
maple query 'SELECT ServiceName, count() AS spans FROM traces WHERE $__orgFilter AND $__timeFilter(Timestamp) GROUP BY ServiceName' --since 1h
Analytics
maple timeseries
Time-bucketed trace metrics: count, latency quantiles, error rate and apdex per bucket.
| Flag | Default | Description |
|---|---|---|
--group-by <none|service|span_name|status_code|http_method> | none | Split the series by a dimension |
--span-name <substr> | Filter by span name | |
--errors | false | Only errored spans |
--bucket <seconds> | 60 | Bucket size |
Plus --since / --start / --end, --service, --env.
maple breakdown
Top-N breakdown of traces by a dimension.
| Flag | Default | Description |
|---|---|---|
--group-by <service|span_name|status_code|http_method> | span_name | Dimension to group by |
--span-name <substr> | Filter by span name | |
--errors | false | Only errored spans |
Plus --since / --start / --end, --service, --env, --limit.
maple compare
Compare service health between two windows, for regression detection. Give either --around or all four explicit bounds.
| Flag | Description |
|---|---|
--around <ts> | Compare the 30 minutes before and after this UTC time (YYYY-MM-DD HH:mm:ss) |
--current-start <ts> / --current-end <ts> | The “current” window |
--previous-start <ts> / --previous-end <ts> | The baseline window |
--env <name> | Filter by deployment environment |
Using the CLI with hosted Maple
The query commands also work against a hosted Maple organization. Sign in once:
maple auth login # US organizations
maple auth login --api-url https://api.eu.maple.dev # EU organizations
maple use remote # optional: stop auto-detecting
maple services --since 1h
maple auth login opens your browser, and you approve the CLI for one organization. The CLI then holds an API key with full access that expires after 90 days. It appears under Settings → Keys with the description “Created by maple auth login”. Run maple auth login again when it expires, and maple auth logout to revoke it.
Every query command works in remote mode, maple query included. The server commands (start, stop, reset, checkpoint, restore, delete, archive, schema) always act on the local store. Which region your organization is in is on Regions.
Auth and configuration
maple auth login
Sign in to a hosted Maple workspace. Opens your browser to approve the CLI; the credential is stored in the macOS keychain where available, otherwise in ~/.maple/config.json (mode 0600). maple login is a shorthand for the same command.
| Flag | Description |
|---|---|
--api-url <url> | Maple API base URL, default https://api.maple.dev |
--with-token | Read an existing API token from stdin instead of opening a browser, so it stays out of shell history |
maple auth login
echo "$MAPLE_TOKEN" | maple auth login --with-token
maple auth status
Show and validate the active login: API URL, user, workspace and where the credential is stored.
maple auth logout
Revoke the credential with the API and remove it locally. maple logout is the shorthand. A token supplied through MAPLE_API_TOKEN cannot be removed this way; unset the variable instead.
maple whoami
Show the resolved mode (local or remote) and the target it would talk to, plus any pinned default.
maple use <local|remote|auto>
Pin the default backend so commands stop auto-detecting, or auto to clear the pin.
Mode resolution, per command, in priority order:
- An explicit
--localor--remoteflag. - The default pinned with
maple use. - Auto-detect: an explicitly set
MAPLE_LOCAL_URLmeans local; otherwise a stored credential means remote; otherwise the CLI probes the local server (GET /local/status, falling back to/healthfor older binaries). If neither is available the CLI prints what to do next.
Server endpoints
maple start binds 127.0.0.1 by default. --host or MAPLE_LOCAL_BIND_HOST can select another address. Every route below is then reachable from the network, so set the two secrets below whenever you do.
| Method | Path | Auth | Purpose |
|---|---|---|---|
GET | /health | None | Liveness probe, returns OK |
POST | /v1/traces | Ingest key | OTLP traces ingest, responds { "accepted": < |
POST | /v1/logs | Ingest key | OTLP logs ingest |
POST | /v1/metrics | Ingest key | OTLP metrics ingest |
POST | /local/query | Access token | Run SQL: { "sql": "..." } in, a bare JSON array of rows out |
GET | /local/status | Access token | Server identity, version and last ingest time. Used by mode auto-detect |
GET | /login, POST /local/auth/login | None | Sign-in page; exchanges the access token for a session cookie |
GET | any other path | Access token | The bundled UI, with --offline only. Signed-out page loads go to /login |
OPTIONS | * | None | CORS and private-network preflight, for the configured hosted UI origin only |
POST | /local/checkpoint/backup | Maintenance token | Take a checkpoint. maple checkpoint calls this |
POST | /local/maintenance/delete | Maintenance token | Delete one service’s or namespace’s telemetry. maple delete calls this |
POST | /local/retention/retire | Maintenance token | Delete one UTC day from the live tables. maple archive retire- calls this |
GET | /local/eventing/health, /projections, /consumers, /outbox | Maintenance token | Read local event projection and consumer state |
POST | /local/eventing/projections, /consumers, /consumers/disable, /consumers/accept-gap, /outbox/abandon | Maintenance token | Administer local event projections and consumers |
POST | /local/eventing/claims, /local/eventing/acks | Event consumer token | Claim and acknowledge local events |
Ingest key and Access token apply only when MAPLE_LOCAL_INGEST_KEY and MAPLE_LOCAL_ACCESS_TOKEN are set (each at least 16 characters; openssl rand -hex 32 makes a good one). Unset, those routes check nothing, and on a non-loopback bind anyone who can reach the port can read all local telemetry through /local/query and write to it through OTLP. maple start warns when that is the case.
- The ingest key goes in
Authorization: Bearer <key>orx-maple-ingest-key, the same headers Maple’s hosted ingest accepts, so an exporter configured for Maple only needs its endpoint changed. It never grants a read. - The access token signs browsers in through
/login(a 30-day, HttpOnly session cookie; rotating the token signs everyone out) and is accepted asAuthorization: Bearer <token>by scripts. CLI commands send it whenMAPLE_LOCAL_ACCESS_TOKENis set in their environment. Ten failed sign-ins within a minute lock the sign-in form for everyone until the minute passes; Bearer requests and existing sessions are unaffected. - With an access token set, the dashboard works on whatever hostname reaches it (a platform URL, a reverse proxy), without
--advertise-host.
Behind an authenticating proxy
A server exposed through a proxy that checks its own credentials (Cloudflare Access, an auth gateway) also needs those credentials on every CLI request. Set MAPLE_LOCAL_HEADERS to comma-separated name=value pairs, the same format as OTEL_EXPORTER_OTLP_HEADERS (values may be percent-encoded). The CLI sends them only to the MAPLE_LOCAL_URL origin, and never in place of a header it already sets:
MAPLE_LOCAL_URL=https://maple.example.com \
MAPLE_LOCAL_HEADERS='CF-Access-Client-Id=<id>,CF-Access-Client-Secret=<secret>' \
maple services
For Cloudflare Access with your own identity instead of a service token, sign in once with cloudflared:
cloudflared access login https://maple.example.com
MAPLE_LOCAL_URL=https://maple.example.com maple services
When MAPLE_LOCAL_URL is https on another host and MAPLE_LOCAL_HEADERS carries no Access credential, the CLI asks cloudflared access token for the cached token once per command and sends it as cf-access-token. Without cloudflared or a cached token it sends nothing extra. If the proxy still refuses or redirects to a sign-in page, the command says so and names both fixes.
The maintenance token is sent in x-maple-maintenance-token and the event consumer token in x-maple-event-consumer-token. maple start creates them on first run as <data-dir>.maintenance-token and < (mode 0600). Anyone who can read those files can call the token routes, including /local/retention/retire, which deletes data. The event routes are described in the local event consumers design doc.
OTLP bodies may be protobuf (the default) or JSON, optionally gzip-encoded. The /local/query handler owns the output format: it strips any trailing FORMAT <ident>, appends FORMAT JSONEachRow, and wraps the rows into a JSON array, so clients POST their compiled SQL verbatim.
Environment variables
Runtime (CLI and server):
| Variable | Default | Purpose |
|---|---|---|
MAPLE_LOCAL_BIND_HOST | 127.0.0.1 | Server bind host and the CLI’s default local target; wildcards map to loopback |
MAPLE_LOCAL_ADVERTISE_HOST | the bind host | Host printed for clients and used by the bundled UI |
MAPLE_LOCAL_URL | bind host + 4318 | Explicit base URL for CLI queries and mode detection |
MAPLE_LOCAL_INGEST_KEY | Required on OTLP ingest (/v1/*) when set. At least 16 characters | |
MAPLE_LOCAL_ACCESS_TOKEN | Required on the dashboard and query API when set, and sent by CLI commands. At least 16 characters | |
MAPLE_LOCAL_HEADERS | Comma-separated name=value headers the CLI sends to the MAPLE_LOCAL_URL origin, for a proxy in front of the server | |
MAPLE_LOCAL_UI_URL | https://local.maple.dev | The hosted UI origin maple start links to and allows through CORS |
MAPLE_LIBCHDB | (auto) | Explicit path to libchdb. Otherwise resolved beside the binary, then ~/ |
MAPLE_API_URL | https://api.maple.dev | Remote API base URL |
MAPLE_API_TOKEN | Remote bearer token; overrides the stored credential | |
MAPLE_ORG_ID | Remote organization override | |
MAPLE_DEBUG | 1 enables --debug | |
MAPLE_FORMAT | json | json or table, same as --format |
MAPLE_NO_UPDATE_CHECK | Any non-empty value disables the startup update check (the Homebrew wrapper sets it). The check runs at most once per 24 hours, only when stderr is a terminal |
CLI telemetry. The CLI sends its own traces and metrics (service maple-cli) to Maple by default. See What connects to the internet for what is recorded.
| Variable | Default | Purpose |
|---|---|---|
MAPLE_TELEMETRY | on | off disables the CLI’s own telemetry entirely. Any other value leaves it on |
MAPLE_INGEST_KEY | a key built into the binary | Ingest key used for the CLI’s own telemetry |
MAPLE_ENDPOINT | https://ingest.maple.dev (https://ingest.eu.maple.dev with MAPLE_REGION=eu) | Where the CLI’s own telemetry is sent. Takes precedence over OTEL_EXPORTER_OTLP_ENDPOINT, which is also read. If you export OTEL_EXPORTER_OTLP_ENDPOINT= for your app in the same shell, the CLI’s telemetry goes to your local server too |
MAPLE_ENVIRONMENT | ci when CI is set, otherwise cli | deployment.environment reported on the CLI’s own telemetry |
Install script (scripts/install.sh):
| Variable | Default | Purpose |
|---|---|---|
MAPLE_VERSION | latest | Release tag to install |
MAPLE_INSTALL_DIR | ~/.maple/bin | Where the two-file bundle lands |
MAPLE_BIN_DIR | (auto) | Where maple is symlinked onto PATH |
MAPLE_SKIP_CHECKSUM | 0 | 1 skips SHA-256 verification (air-gapped mirrors only) |
~/.maple/config.json stores apiUrl, orgId, defaultMode and, when the keychain is unavailable, the token. Environment variables take precedence over stored values.
Troubleshooting
libchdb not found. The binary loads libchdb from beside its own path, then falls back to ~/.maple/bin. Homebrew keeps maple and libchdb together; the install script keeps them in ~/.maple/bin. If you moved files by hand, keep libchdb.so or .dylib beside maple, or set MAPLE_LIBCHDB to its full path. Running from source has no sibling library, so set MAPLE_LIBCHDB or drop one into ~/.maple/bin.
Homebrew installed, but maple still runs the old binary. A script-installer symlink is earlier on PATH. Confirm with command -v maple, then remove the old symlink or run curl -fsSL https://maple.dev/ before reinstalling with Homebrew.
maple is already running (. Another server owns this data directory. Stop it with maple stop, or start a second instance on its own port and store: maple start -.
Incompatible store after an upgrade. A new binary that refuses an older store (the local store … is incompatible) needs the live data cleared: maple reset --yes, or maple start --reset in one step. Both keep checkpoints. If the release notes call for a migration instead, use maple schema.
Store was not cleanly closed. The default --on-dirty-store fail stops rather than guess. Restart with - to roll back to the last good checkpoint, or wipe to discard live data. Neither touches checkpoints.
Browser asks to “access devices on your local network”, or CORS errors. The default dashboard at local.maple.dev is a public origin reaching your loopback server, which trips Chrome’s private network gate. Run maple start --offline to serve the dashboard same-origin. For a wildcard LAN bind, also set --advertise-host to the hostname the browser will use; other hosts and origins are rejected.
Authentication proxy blocks the bundled UI. The UI works behind TLS with browser-managed authentication such as a session cookie or HTTP auth. It does not inject a bearer token or copy an entry-page query parameter into its /local/query and OTLP requests.
No data appearing. Confirm the exporter points at the advertised host and port and the server is up (maple whoami, or curl <host>:4318/health). Widen the time range; the default is --since 6h. A successful ingest responds { "accepted": <n> }.
No Maple backend found. Neither backend could be resolved. Start local mode (maple start), sign in to a workspace (maple auth login), or force one with --local / --remote.