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
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
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
--fail (default)
--fail (default)
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
--merge
--merge
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
--overwrite
--overwrite
Deletes the conflicting row first, then inserts the imported version. Use this to force-sync from a known-good export.
Terminal
Selective Import
Use--groups to import only specific data groups from a full backup:
Terminal
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