Skip to main content

flight

Preview
This feature is in preview and is subject to change.

Create and manage Flights, Python data pipelines that run on a schedule or on demand. You build a Flight locally, push it to MotherDuck, then trigger runs and read their logs.

Usage​

motherduck flight <command> [options]

Commands​

CommandDescription
guidePrint the Flight authoring guide
initInitialize a new Flight in a local directory
pushPush a local Flight to MotherDuck
pullPull a Flight from MotherDuck into a local directory
runRun a Flight once, now
cancelCancel a running Flight run
logsPrint the logs of a Flight run
list-runsList the runs of a Flight
listList the Flights owned by the current user, or visible in their organization
list-versionsList the versions of a Flight in MotherDuck
create-secretCreate a flight secret
list-secretsList your flight secrets
delete-secretDelete a flight secret
deleteDelete a Flight from MotherDuck

Every command also takes the global options.

Flight directories​

A Flight directory holds:

my_flight/
├── main.py # the script, run as `python main.py`
├── requirements.txt # packages to install first (optional)
└── flight.metadata.json # name, schedule, config, and the Flight ID that
# push and pull resolve

Commands that act on one Flight take its directory (or --dir), and read the ID from flight.metadata.json. Pass --flight instead to name it outright, as an ID or an app URL:

--flight 123e4567-e89b-12d3-a456-426614174000
--flight https://app.motherduck.com/flights/my-flight-123e4567-e89b-12d3-a456-426614174000

A URL ending in /versions/<n> also selects that version for pull, unless --version says otherwise.

Where a command below says which Flight, the rule is the same: --flight, else the ID recorded in the Flight directory's flight.metadata.json. Given both, the two must resolve to the same ID. Given neither, the ID is read from flight.metadata.json in the current directory.

flight guide​

Print the Flight authoring guide — read this before writing or editing a Flight.

The guide covers the runtime's expectations, the supported APIs, and the data pipeline practices it assumes. It's written for an AI agent to consume directly. See working with agents.

motherduck flight guide

flight init​

Creates a new local Flight directory and writes main.py, requirements.txt, and flight.metadata.json there.

motherduck flight init [options] [dir]

Arguments​

ArgumentDescription
dirDirectory to create the Flight in. Defaults to a directory named after --name

Options​

OptionDescription
--name <string>Flight name. Required
--dir <path>Directory to create the Flight in. Defaults to a directory named after --name

Examples​

motherduck flight init --name my_flight # create ./my_flight
motherduck flight init flight_dir --name my_flight # create ./flight_dir

flight push​

Publishes a local Flight to MotherDuck, creating it when flight.metadata.json has no ID and updating it after that. Every push makes a new version. The options below override what that file records, and are written back into it.

motherduck flight push [options] [dir]

Arguments​

ArgumentDescription
dirDirectory holding the local Flight. Defaults to the current directory

Options​

OptionDescription
--dir <path>Directory holding the local Flight. Defaults to the current directory
--name <string>Flight name
--schedule-cron <cron>Schedule as a 5-field cron expression in UTC, for example "0 9 * * 1-5". Pass "" to unschedule
--config <json>Non-secret values exposed to the Flight as environment variables, for example '{"TARGET_DB":"prod"}'
--access-token-name <string>MotherDuck access token the Flight runs with
--secret-names <names>Comma-separated MotherDuck secret names to expose
--max-runtime-sec <n>Per-run timeout in seconds. 0 means no timeout
--runRun the Flight once after pushing

Examples​

motherduck flight push my_flight # push ./my_flight
motherduck flight push # push the current directory
motherduck flight push my_flight --run # push, then run it once
motherduck flight push my_flight --schedule-cron "0 9 * * 1-5"
motherduck flight push my_flight --schedule-cron "" # stop the schedule
motherduck flight push my_flight --config '{"TARGET_DB":"prod"}'

flight pull​

Fetches a Flight from MotherDuck. It overwrites existing main.py, requirements.txt, and flight.metadata.json. Find IDs with flight list.

motherduck flight pull [options] [id-or-url]

Which Flight: the positional ID or app URL, otherwise the ID recorded in flight.metadata.json in the destination directory.

Where to pull: --dir, otherwise the current directory. Pull writes files, so it always has a destination.

Arguments​

ArgumentDescription
id-or-urlFlight ID or app URL. Defaults to the ID from flight.metadata.json

Options​

OptionDescription
--dir <path>Directory to pull the Flight into. Defaults to the current directory
--version <n>Pull a specific version. Defaults to the one named by the Flight URL, else the latest

Examples​

motherduck flight pull # update the Flight in the current directory
motherduck flight pull <id-or-url> # into the current directory
motherduck flight pull <id-or-url> --dir my_flight
motherduck flight pull <id-or-url> --version 2

flight run​

Runs a Flight's current version once, now. The run is queued and the command returns its number right away; watch it with flight list-runs and read its output with flight logs --run <n>.

motherduck flight run [options] [dir]

Arguments​

ArgumentDescription
dirFlight directory to read the Flight ID from. Defaults to the current directory

Options​

OptionDescription
--flight <id-or-url>Flight ID or app URL
--dir <path>Flight directory to read the Flight ID from. Defaults to the current directory
--config <json>Override config values for this run only. Keys must already be defined on the Flight, for example '{"TARGET_DB":"staging"}'

Examples​

motherduck flight run # the current directory's
motherduck flight run my_flight
motherduck flight run --flight <id-or-url>
motherduck flight run my_flight --config '{"TARGET_DB":"staging"}'

flight cancel​

Stops a run of a Flight. Only a pending or running one can be cancelled, and only on a Flight you own. Run numbers come from flight list-runs.

motherduck flight cancel [options] [dir]

Arguments​

ArgumentDescription
dirFlight directory to read the Flight ID from. Defaults to the current directory

Options​

OptionDescription
--run <number>Run number to cancel. Required
--flight <id-or-url>Flight ID or app URL
--dir <path>Flight directory to read the Flight ID from. Defaults to the current directory

Examples​

motherduck flight cancel --run 4 # the current directory's
motherduck flight cancel my_flight --run 4
motherduck flight cancel --flight <id-or-url> --run 4

flight logs​

Prints what a run has printed so far, stdout and stderr together, verbatim so it can be piped. Run numbers come from flight list-runs.

motherduck flight logs [options] [dir]

Arguments​

ArgumentDescription
dirFlight directory to read the Flight ID from. Defaults to the current directory

Options​

OptionDescription
--run <number>Run number. Required
--flight <id-or-url>Flight ID or app URL
--dir <path>Flight directory to read the Flight ID from. Defaults to the current directory

Examples​

motherduck flight logs --run 4 # the current directory's
motherduck flight logs my_flight --run 4
motherduck flight logs --flight <id-or-url> --run 4 | grep -i error

flight list-runs​

Lists a Flight's runs, newest first, with the version each one ran and how it ended. The run numbers here are what --run takes.

motherduck flight list-runs [options] [dir]

Arguments​

ArgumentDescription
dirFlight directory to read the Flight ID from. Defaults to the current directory

Options​

OptionDescription
--flight <id-or-url>Flight ID or app URL
--dir <path>Flight directory to read the Flight ID from. Defaults to the current directory
--limit <number>Limit results. Defaults to 100
--offset <number>Result offset. Defaults to 0

Examples​

motherduck flight list-runs # the current directory's
motherduck flight list-runs my_flight --limit 5
motherduck flight list-runs --flight <id-or-url>

To watch a run from a script, poll this command with -o json and read the status field rather than parsing the table.

flight list​

Newest first, by the time each Flight was last updated.

--name filters the page --limit and --offset selected, so it can return fewer rows than --limit. Raise --limit to search deeper.

motherduck flight list [options]

Options​

OptionDescription
--limit <number>Limit results. Defaults to 100
--offset <number>Result offset. Defaults to 0
--name <text>Only Flights whose name contains this text, case insensitive
--allInclude Flights shared with your organization. Defaults to false

Examples​

motherduck flight list
motherduck flight list --name nightly # names containing "nightly"
motherduck flight list --name nightly --limit 500
motherduck flight list --all # the organization's too

flight list-versions​

Lists a Flight's versions in MotherDuck, one per push, newest first. Fetch one with flight pull --version <n>.

motherduck flight list-versions [options] [dir]

Arguments​

ArgumentDescription
dirFlight directory to read the Flight ID from. Defaults to the current directory

Options​

OptionDescription
--flight <id-or-url>Flight ID or app URL
--dir <path>Flight directory to read the Flight ID from. Defaults to the current directory
--limit <number>Limit results. Defaults to 100
--offset <number>Result offset. Defaults to 0

Examples​

motherduck flight list-versions # the current directory's
motherduck flight list-versions my_flight
motherduck flight list-versions --flight <id-or-url> --limit 5

flight create-secret​

Stores a flight secret in MotherDuck, from KEY=VALUE pairs or a dotenv file. A Flight reads its fields as environment variables once it's attached with flight push --secret-names. Values are never printed back.

motherduck flight create-secret [options] <name> [pairs...]

Arguments​

ArgumentDescription
nameName of the secret. This is what --secret-names takes
pairs...Inline KEY=VALUE fields. Omit when using --secrets-file

Options​

OptionDescription
--secrets-file <path>Read fields from a dotenv-format file instead of inline KEY=VALUE pairs. Double-quote any value containing # or leading or trailing whitespace
--if-exists <action>What to do when the name is taken: ignore, error, or replace. Defaults to error

Examples​

motherduck flight create-secret my_api_creds api_key=key123
motherduck flight create-secret my_api_creds --secrets-file ./secrets.env
motherduck flight create-secret my_api_creds --if-exists replace api_key=key456
motherduck flight create-secret my_api_creds --if-exists ignore api_key=key123
motherduck flight push my_flight --secret-names my_api_creds # attach it
warning

Inline values are visible in your shell history and to other processes on the machine. --secrets-file keeps them out of the command line.

flight list-secrets​

Lists the flight secrets stored in MotherDuck: their names and shape, never their values. These are the names --secret-names takes.

motherduck flight list-secrets [options]

Examples​

motherduck flight list-secrets
motherduck flight list-secrets -o json

flight delete-secret​

Removes a flight secret from MotherDuck. Any Flight that still names it fails on its next run, so check flight list first if you're unsure.

motherduck flight delete-secret [options] <name>

Arguments​

ArgumentDescription
nameName of the secret to remove

Options​

OptionDescription
--if-not-exists <action>What to do when the secret isn't there: ignore or error. Defaults to error
--dangerously-skip-confirmationDelete without interactive confirmation

Examples​

motherduck flight delete-secret my_api_creds
motherduck flight delete-secret my_api_creds --if-not-exists ignore
motherduck flight delete-secret my_api_creds --dangerously-skip-confirmation

flight delete​

Deletes a Flight from MotherDuck, along with its versions, schedule, and run history. This can't be undone. The local files stay where they are.

motherduck flight delete [options]

Options​

OptionDescription
--flight <id-or-url>Flight ID or app URL. Required
--dangerously-skip-confirmationDelete without interactive confirmation

Examples​

motherduck flight delete --flight <id-or-url>
motherduck flight delete --flight <id-or-url> --dangerously-skip-confirmation
warning

Pass --dangerously-skip-confirmation only in scripts where you've already confirmed the ID.