Export your first workspace file

Time: 10 minutes. You'll need: the workspace-admin role (role 20), the Enterprise plan on the workspace, and a machine with either DuckDB or the sqlite3 CLI installed.

By the end you'll have a .zip containing your entire workspace as a SQLite database, plus a small DuckDB session running a real query against it.

1. Trigger the export from the app

Open Workspace settings (the gear icon at the bottom of the left rail). Click into the Exports section. Click New export.

In the format dropdown, pick Workspace file (SQLite). Click Start export.

A row appears at the top of the exports table with status queued. It flips to processing within a couple of seconds, then to completed once the bundle is built. For a busy workspace this usually takes under a minute. You'll also get an email when the bundle is ready.

2. Download the zip

Click the row's Download link. The URL is a 7-day presigned link; if you need to keep the file long-term, download it and archive it in your own storage. If you miss the window, trigger a fresh export.

Unzip the download:

unzip workspace-<slug>-<utc-timestamp>.zip

You get two files:

  • workspace.db: the SQLite 3 database with 19 tables.
  • README.md: the schema plus five example DuckDB queries.

3. Open it in DuckDB

DuckDB reads SQLite files natively and gives you a nicer analytical query experience. In the directory that has workspace.db, run:

duckdb

Then in the DuckDB prompt:

ATTACH 'workspace.db' AS ws (TYPE sqlite);
USE ws;
SHOW TABLES;

You should see the 19 tables listed: workspace, users, workspace_members, projects, project_members, states, labels, cycles, modules, issues, issue_assignees, issue_labels, issue_cycles, issue_modules, issue_comments, issue_activities, wiki_pages, goals, audit_logs.

4. Run your first real query

The bundled README has five sample queries out of the box. Pick the average cycle time this quarter:

SELECT
  ROUND(AVG(julianday(completed_at) - julianday(created_at)), 1) AS avg_days,
  COUNT(*) AS completed
FROM issues
WHERE completed_at IS NOT NULL
  AND completed_at >= '2026-05-01';

DuckDB returns a two-column result: the average number of days a task took to complete, and the count of completed tasks in the window. That's an answer no built-in report would give you exactly this way, and you got it in ten seconds without an API token.

5. Try a second query, then archive

Sprint velocity is a good next one:

SELECT c.name, COUNT(*) AS committed,
  SUM(CASE WHEN i.completed_at IS NOT NULL THEN 1 END) AS done
FROM issue_cycles ic
JOIN cycles c ON c.id = ic.cycle_id
JOIN issues i ON i.id = ic.issue_id
WHERE c.end_date IS NOT NULL
GROUP BY c.name, c.end_date
ORDER BY c.end_date DESC
LIMIT 6;

Once you're done, .quit out of DuckDB. Archive the .zip somewhere durable (git-tracked storage, an S3 bucket, an air-gapped USB drive). The workspace file is now your offline snapshot of the whole workspace.

What next

  • Workspace file: the full 19-table schema, what is and isn't included in v1 (attachments and CRDT logs are not), and the API endpoint if you want to trigger exports from automation.
  • Sovereign: where this feature sits in the GDPR Article 20 (portability), NIS2 21(2)(c) (business continuity), and DORA (exit and substitutability) stories.