Skip to main content
Genie’s export/import system produces schema-versioned JSON documents for full backups, selective snapshots, and cross-instance migration. Data is organized into 9 groups that can be exported individually or all at once.

At a Glance

Data Groups

Every export targets one or more groups. Each group maps to a set of database tables:
Groups that reference optional tables (apps, config) will gracefully skip any tables not present in your database schema.

Export Format

Every export produces a JSON document with this structure:

Export Commands

genie export all

Full backup of all 9 data groups. Automatically generates an output filename if --output is not specified.
Terminal
The auto-generated filename follows the pattern genie-backup-YYYYMMDD.json.

genie export boards

Export boards, board templates, and custom task types. Optionally filter by board name.
Terminal
Custom task types (is_builtin = false) are included. Built-in types are excluded since they’re recreated on install.

genie export tasks

Export tasks with tags, actors, dependencies, and stage log. Optionally filter by project.
Terminal
Ephemeral fields (checkout_run_id, execution_locked_at, session_id, pane_id) are automatically stripped from exported tasks to avoid stale lock state on import.

genie export tags

Export tag definitions. Test tags (prefixed with test-) are excluded.
Terminal

genie export projects

Export project records.

genie export schedules

Export cron schedules with their run_spec configuration. Optionally filter by schedule name.
Terminal

genie export agents

Export agent configurations, templates, and state checkpoints.

genie export comms

Export all communication data: conversations, messages, mailbox, team chat, and notification preferences.

genie export config

Export infrastructure configuration. Gracefully skips if config tables don’t exist.

Shared Export Options

All export commands accept:

Import Command

genie import

Import data from a JSON export file. Validates schema version, resolves FK dependencies automatically, and runs the entire import in a single transaction.

Conflict Modes

Checks all tables for conflicting primary keys before inserting anything. If any row already exists, the entire import is aborted with an error message showing which rows conflict.
Terminal
Uses INSERT ... ON CONFLICT DO NOTHING — existing rows are untouched, only new rows are added. Safe for incremental imports where you want to preserve local changes.
Terminal
Deletes the conflicting row first, then inserts the imported version. Use this to force-sync from a known-good export.
Terminal
--overwrite replaces existing data. Make sure you have a backup before using this mode.

Selective Import

Use --groups to import only specific data groups from a full backup:
Terminal
Unknown group names produce a warning and are skipped.

FK Dependency Resolution

Import automatically sorts tables into 4 dependency levels to satisfy foreign key constraints: Self-referential columns (tasks.parent_id, messages.reply_to_id, conversations.parent_message_id) are handled with a two-pass insert: rows are inserted with NULL self-references first, then updated after all rows exist.

Audit Trail

Every successful import is recorded as an audit event with:
  • Conflict mode used
  • Per-table row counts
  • Skipped tables
  • Source export version and date

Recipes

Nightly backup

Migrate boards between instances

Clone a project’s tasks

Selective restore after incident