A short checklist before you run anyDocumentation Index
Fetch the complete documentation index at: https://ekso.dev/llms.txt
Use this file to discover all available pages before exploring further.
ekso migrate command. None of these are optional.
Prerequisites
You need:- An Ekso tenant. If you don’t have one yet, sign up at ekso.app and pick a subdomain (e.g.
acme.ekso.app). - An Ekso API key with admin scope. Mint one in the admin surface —
ekso migratewrites containers, items, users, files, and labels, so it needs admin write permissions for the duration of the run. - A destination Ekso process. The migrator writes every item to a single
DataProcessyou choose at apply time via--process <process-id>. Create the process in Ekso first (or pick an existing one). The Apply layer auto-creates any custom fields you reference in your field-map; system fields (Status, Priority, Severity, etc.) must already exist on the process. - A destination Ekso board. Cycles need a board to attach to. Pass
--board <board-id>at apply time, or let the CLI auto-discover when the tenant has exactly one board. - Read access to the source platform. Whatever credential type the source needs — API token, PAT, SQL user, GraphQL key. See the per-source page for shape:
- Jira — Atlassian email + API token
- Linear — Personal API key
- Azure DevOps — Personal Access Token (PAT)
- Zendesk — Email + API token
- Gemini — SQL connection string or API key
- The Ekso CLI itself. Run
ekso --versionto confirm. If it’s not installed, follow Installation.
The configuration file
Everyekso migrate command takes --config <FILE> (default: ./migration.config.json). This is the file that holds your source-platform credentials.
Start from the sample shipped with the CLI source tree:
Secrets policy
This file holds live credentials for both the source platform and your Ekso tenant. Treat it like any other secret:-
Never commit
migration.config.json. Add it to your.gitignore. The Ekso repo’s own gitignore already blocksmigration.config.json,*.migration.json, andmigration.*.jsonpatterns. -
Use environment variables for CI/CD. Each per-source token has an env-var override that takes precedence over the file:
In CI, set the env vars and ship a config file with placeholder strings. The CLI reads env first, file second.
Source Env var Overrides Jira EKSO_MIGRATE_JIRA_TOKENjira.apiTokenLinear EKSO_MIGRATE_LINEAR_KEYlinear.apiKeyAzure DevOps EKSO_MIGRATE_DEVOPS_PATdevops.personalAccessTokenZendesk EKSO_MIGRATE_ZENDESK_TOKENzendesk.apiTokenGemini EKSO_MIGRATE_GEMINI_KEY,EKSO_MIGRATE_GEMINI_DB_PWDgemini.apiKey, password ingemini.connectionString - Rotate source-platform tokens after the migration finishes. A migration credential needs read-everything scope on the source; that’s a lot of authority to leave hanging around. Rotate the source-platform credential as soon as the apply phase succeeds. The Ekso API key can stay (or rotate it too — your call).
-
The cache file is local-only.
~/.ekso/migrate/<source>-<timestamp>.sqliteholds the data you fetched from the source platform — descriptions, comment bodies, attachment bytes. Treat the cache file the same way you’d treat the source data itself: don’t paste it into a public bug tracker, don’t commit it, delete it once apply has succeeded.
What the cache contains
The SQLite cache holds raw source data — every comment body, every attachment blob, every assignee email. It is not encrypted at rest. If you’re handling a regulated data set, run the migration on an encrypted volume and delete the cache file once apply has succeeded. The cache does not contain credentials. Tokens stay in the config file or environment, never in the SQLite file.Verifying you’re set up
Before kicking off a realcollect, prove your credentials work with a read-only call:
3), fix the credentials before continuing. If they work, you’re ready for collect.
Where to next
- Command reference — every command, every flag.
- Field mapping — write a
migration.fields.yamlfor your custom fields. - Pick your source: Jira / Linear / Azure DevOps / Zendesk / Gemini.