Skip to main content
The Dovetail CLI (dt) is a command-line tool for importing content into your Dovetail workspace from external sources — Notion, Confluence, Google Drive, Airtable, Productboard, EnjoyHQ, Marvin, Condens, and local files. Use it when you want to bulk-migrate historical research, run repeatable imports from a scriptable workflow, or stage a migration locally before sending data to Dovetail.

What can you do with the Dovetail CLI?

  • Bulk import from 9+ sources — Notion, Confluence, Google Drive, Airtable, Marvin, Condens, EnjoyHQ, Productboard, and local files
  • Preserve formatting and metadata — Headings, lists, tables, code blocks, attachments, author info, dates, and tags come through intact
  • Preview before committing — See exactly what will be imported before data touches your workspace
  • Resume interrupted imports — If an import fails partway through, pick up where you left off—no re-processing needed
  • Batch multiple sources — Configure migrations from Notion and Confluence in one config file, run them together
  • Filter and limit — Import only records matching specific titles, dates, or file types
  • Test connections — Validate API credentials and workspace permissions before running the full migration

Security and permissions

The CLI authenticates to Dovetail using a personal API key from your workspace settings. It only has write access to the destinations you configure — it cannot read or modify anything else in your workspace. Source credentials (Notion token, Confluence API token, etc.) are stored locally in your dt.yaml or as environment variables and are never transmitted anywhere except the source service itself.

Prerequisites

Before you install, make sure you have:
  • A Dovetail workspace and an API key. Generate one in your workspace settings.
  • What plans support the CLI?
    • All plans except plans that have HIIPA enabled.
  • Your workspace URL — for example, https://yourcompany.dovetail.com.
  • One of the supported install paths:
    • npm install: Node.js and npm. 
  • The credentials for each source you plan to import from. These vary by source — see Authenticate below.
  • Build from source: Go 1.25 or later, plus make.
  • The credentials for each source you plan to import from. These vary by source — see Authenticate below.
The CLI runs on macOS, Linux, and Windows. The published npm package ships per-platform binaries (@heydovetail/dt-darwin-arm64, @heydovetail/dt-linux-x64, and so on) and npm install only downloads the binary for your machine.\

Install

You can install the CLI in two ways. Most people should use npm.

Option 1: Install via npm

Verify the install:
You should see a version number print to your terminal. If dt isn’t found, your global npm bin directory may not be on your PATH — run npm prefix -g to see where npm installs global binaries and add that path’s bin subdirectory to your shell profile.

Option 2: Build from source

You’ll need Go 1.25 or later.
make install builds the dt binary and installs it to~/.local/bin/dt.If ~/.local/bin isn’t on your PATH, add it:
Other make targets you may need:
  • make build — compile the binary without installing it.
  • make test — run the test suite.
  • make lint — run golangci-lint.

Install shell completions

After installing, you can turn on autocompletion for dt subcommands and flags:
This supports bash, zsh, and fish.

Authenticate

Authentication happens at two levels: the CLI authenticates to your Dovetail workspace, and each source you connect authenticates separately to its own provider.

Authenticate to Dovetail

Set your Dovetail API key as an environment variable, then run the setup wizard:
dt init is an interactive wizard that:
  1. Confirms your workspace URL (for example, https://yourcompany.dovetail.com).
  2. Stores your API key.
  3. Walks you through adding your first source.
Re-run with dt init --force to overwrite an existing configuration. You can also set your workspace URL persistently in your config under dovetail.base_url. This is important — it ensures every link the CLI generates points to the right workspace.

Authenticate each source

Every source has its own credential. Most use a personal access token set via environment variable; Google Drive uses OAuth or a service account.
Note The sources available through the Dovetail CLI are provided for your convenience, but connecting them is at your own discretion. Before authenticating a source, make sure you have the necessary permissions to access and import that data into Dovetail, and that doing so aligns with your organization’s data governance policies.

Supported sources & field mapping

Notion

What gets migrated:
  • Pages and database entries with all formatting (headings, lists, tables, code blocks, callouts, toggles)
  • Inline attachments and cover images
  • Metadata: author, creation date, last-modified date, tags, properties
  • Child pages (up to 3 levels of nesting, configurable)
Field mapping to Dovetail: Requirements:
  • Notion Integration created at https://www.notion.so/my-integrations
  • All databases you want to migrate must be explicitly shared with the integration
  • Integration must have “Read” permissions at minimum
Setup:
Field mapping configuration (optional): You can map Notion database properties to Dovetail custom fields. If not configured, properties are stored as tags.

Confluence

What gets migrated:
  • Cloud pages and blog posts with full HTML content and formatting
  • Attachments (PDFs, images, Word docs, etc.)
  • Labels and metadata (author, creation/modification dates, space key)
  • Parent-child page relationships preserved
  • Comments (available as metadata)
Field mapping to Dovetail: Requirements: Setup:
Rate limits:
  • 300 requests per minute per API token (Atlassian limit)
  • The CLI automatically retries with exponential backoff; no action needed

Google Drive

What gets migrated:
  • Google Docs (exported as HTML with formatting)
  • Google Sheets (optionally, as CSV)
  • PDFs, images, and other files (as attachments)
  • Folder structure and hierarchy preserved
  • File metadata (owner, creation/modification dates)
Field mapping to Dovetail: Requirements: Choose one authentication method:
  1. OAuth (personal/shared drives, recommended for most users)
  • Google Cloud project with Drive API enabled
  • OAuth 2.0 Desktop client ID created
  • dt source add gdrive opens your browser to sign in
  • No credential file needed; token is stored securely
  1. Service account (org/shared drives)
  • Service account created in Google Cloud
  • JSON key file downloaded
  • Drive folder explicitly shared with the service account email
  • Set GOOGLE_APPLICATION_CREDENTIALS environment variable
Setup:
Rate limits:
  • 10 million read requests per day (per project)
  • 600 requests per minute per user
  • The CLI automatically retries rate-limited requests
Technical details:
  • Large files (>50 MB) may take longer to transfer; no timeout
  • Empty files are skipped
  • Google Sheets are converted to CSV format

Airtable

What gets migrated:
  • Records from all tables/views
  • All field values (text, numbers, attachments, linked records, etc.)
  • Attachment files uploaded as Dovetail attachments
  • Linked record metadata (record name, ID)
  • Field names and types preserved
Field mapping to Dovetail: Requirements:
  • Airtable personal access token from https://airtable.com/create/tokens
  • Required scopes: data.records:read and schema.bases:read
  • Read access to the base(s) you’re migrating
Setup:
Rate limits:
  • 5 requests per second (Airtable limit)
  • The CLI respects this automatically; no backoff needed
Technical details:
  • Linked records are imported as metadata; you can later link them in Dovetail
  • Attachment metadata is preserved (file name, size, URL)

Marvin

What gets migrated:
  • Video/audio recordings → uploaded as data with automatic transcription
  • Insights (reports) → imported as docs with markdown content
  • Interview metadata (date, duration, tags, participant info)
Field mapping to Dovetail: Requirements:
  • Manual export from Marvin (no public API), or use Claude Code /marvin-download skill
  • Folder structure:
Setup: Option A: Automated export (recommended)
Option B: Manual export
  1. In Marvin, go to each project → All Actions → Download Video
  2. Copy insight markdown into content.md files in the folder structure above
  3. Run:
Technical details:
  • Video/audio files are uploaded as attachments; Dovetail generates transcripts automatically
  • Transcription typically completes within 10 minutes for 1-hour recordings
  • Insights are imported as plain markdown docs; no special formatting required
  • Maximum file size: 5 GB per recording

Condens

What gets migrated:
  • Sessions (interview notes, transcripts, video) → data records
  • Artifacts (reports, deliverables) → docs
  • Video attachments automatically included
  • Session metadata (date, participants, tags)
Field mapping to Dovetail: Requirements:
  • Condens export ZIP file from Project → Settings → Export data
  • No API credentials needed
Setup:
Technical details:
  • ZIP is processed locally; never uploaded to Dovetail servers
  • Large projects (>1 GB) may take 5–10 minutes to process
  • Video formats supported: MP4, WebM, MOV (same as Dovetail)

EnjoyHQ

What gets migrated:
  • Stories (customer feedback) with HTML content → data records
  • Projects (plans + summaries) → docs
  • Documents (feedback text) → data records
  • Labels, state, customer info preserved
Field mapping to Dovetail: Requirements:
  • EnjoyHQ API token from workspace settings
  • Read access to stories, projects, and documents
Setup:
Rate limits:
  • 100 requests per minute
  • The CLI automatically respects this limit

Productboard

What gets migrated:
  • Notes (customer feedback, research) → data records
  • Features (with descriptions, metadata) → docs
  • Linked data (initiatives, objectives)
  • Metadata (date, priority, status, owner)
Field mapping to Dovetail: Requirements:
  • Productboard API token from Settings → Integrations → Public API
  • Read access to notes and features
Setup:
Rate limits:
  • 60 requests per minute (Productboard public API)
  • The CLI automatically queues and retries

Local files

What gets migrated:
  • Markdown (.md) → record body
  • Text files (.txt, .html) → record body
  • PDFs, images, videos, Word docs → attachments
  • Folder structure preserved
Field mapping to Dovetail: Requirements:
  • Local folder with files you want to import
  • No credentials needed
Setup:
Options:
Technical details:
  • File permissions: must have read access
  • Symlinks are followed
  • Hidden files (starting with .) are skipped
  • Maximum file size: 5 GB

Configuration

Configuration file structure (dt.yaml)

The CLI uses a YAML configuration file to manage migrations:

Configuration resolution order

The CLI resolves configuration from (highest to lowest priority):
  1. CLI flagsdt migrate run --source notion --limit 100
  2. Environment variablesexport NOTION_TOKEN="..."
  3. dt.yaml filesources.notion.token
  4. Defaults — Built-in sensible defaults

Environment variables reference

Running migrations

Preview before importing

Always preview first to see exactly what will be imported:
This shows:
  • Number of records that will be imported
  • Size of attachments
  • Any records that will be skipped (and why)
  • Estimated import time
No data is sent to Dovetail in preview mode.

Run the migration

The CLI will:
  1. Fetch records from the source
  2. Transform them into Dovetail format
  3. Upload in batches with progress updates
  4. Show a summary of imported records and any errors

Advanced migration options

Duplicate handling & upsert behavior

By default, running a migration multiple times creates duplicate records. To prevent duplicates on re-runs:
How it works:
  • Records are matched by source ID (Notion page ID, Confluence page ID, etc.)
  • If a record with the same source ID exists in Dovetail, it’s updated (not duplicated)
  • New records are created if they don’t exist
  • The upsert feature works with all sources except local files
    Important: If you delete a record in Dovetail, running —upsert again will re-create it from the source.

Testing & validation

Validate a source connection

Before running a full migration, test that your credentials work:
This checks:
  • API token is valid and not expired
  • Token has necessary permissions
  • You have access to at least one database/page
  • Network connectivity to the source API

Validate migration configuration

Check your dt.yaml syntax and workspace connectivity:

Workspace health check

See what’s already in your Dovetail workspace:
Shows:
  • Workspace name and URL
  • Number of projects, docs, records
  • Configured migrations
  • Any incomplete or failed imports

Workspace statistics

Quick count of content:

Diagnostic check

Full system diagnostics:
Checks:
  • Configuration file validity
  • Dovetail API connectivity
  • Source credentials
  • Staging directory available
  • Disk space

Troubleshooting

Run dt doctor first whenever something is wrong. It checks your config, your network connection to Dovetail, every configured source credential, and the staging directory. Most issues show up there before you have to debug deeper. For verbose logs across any command:
To get structured output that’s easier to parse from scripts or pipelines:
If you’ve tried dt doctor, checked the table above, and you’re still stuck, capture the output of dt doctor and dt migrate run --verbose and contact Dovetail support via support@dovetail.com or the Support in-app chat.

Uninstall

How you uninstall depends on how you installed.

If you installed via npm

If you built from source

Remove the binary:
If you added ~/.local/bin to your PATH only for the CLI, you can revert that change in your shell profile.

Clean up configuration and staging

Uninstalling the binary doesn’t remove your config file or any staging directories from completed migrations. To remove them:
  • Delete your config file (dt.yaml in whichever directories you ran the CLI from).
  • Run dt clean before uninstalling to remove staging directories. After uninstall, remove any remaining staging directories manually.
  • Unset the environment variables you exported (DOVETAIL_API_KEY, NOTION_TOKEN, and so on) from your shell profile.

Revoke credentials

Uninstalling the CLI doesn’t revoke the tokens or OAuth grants it used. For a complete cleanup:
  • Delete your Dovetail API key in your workspace settings.
  • Revoke each source token from the source’s own settings (Notion integrations page, Atlassian API tokens, Airtable tokens page, Productboard public API, and so on).
  • For Google Drive OAuth, revoke access at myaccount.google.com/permissions. For service accounts, delete the JSON key from your Google Cloud project.

Need a source the CLI doesn’t yet support, or hitting something the troubleshooting table doesn’t cover? Let us know.