Skip to content

Configuration

Every knob is an environment variable. There is no config file, because a config file is a second place for the truth to live.

VariableDefaultWhat it does
SNOWFLAKE_ADDR127.0.0.1:8448listen address. 0.0.0.0:8448 in a container
SNOWFLAKE_PUBLIC_URLhttp://127.0.0.1:8448the URL handed to clients that ask
SNOWFLAKE_DATA_DIR./datawhere the seeded PAT is written
SNOWFLAKE_DUCKDB_PATH(unset)the warehouse file, or :memory:
SNOWFLAKE_STAGE_DIR./stagesthe internal stage’s root
SNOWFLAKE_STAGE_CLIENT_DIRunsetthe stage’s root as the client sees it, for PUT
SNOWFLAKE_POLARIS_URL(unset)an Iceberg REST catalog to register into

SNOWFLAKE_DUCKDB_PATH has no default, and that is deliberate. An emulator that quietly attached an in-memory database would answer SELECT 1 and lose every table on the next statement, because each Exec is a separate CLI process. Unset, SQL is refused with the variable’s name in the message.

:memory: is supported and means what it says: no state survives a statement. Use it for a login probe, not for a pipeline.

SNOWFLAKE_STAGE_CLIENT_DIR matters for exactly one statement. PUT is a client-side upload: the server answers with a directory and the driver copies the bytes into it. A path this process knows is therefore only useful if it means the same thing on the client’s filesystem. It does when the emulator is a host binary, or when client and server share a container, and those are the cases where this can stay unset. It does not when the emulator runs in a container and the client does not, because the server knows /stages and the client cannot write there. Set this to the host side of the bind mount.

Getting it wrong does not corrupt anything: the bytes land somewhere the server cannot see, and the COPY INTO that follows fails naming the file it could not find.

SNOWFLAKE_STAGE_DIR is the user stage (@~). A named stage is a directory inside it, created by CREATE STAGE. External stages — s3://, azure:// — are refused by name rather than served from local disk: an emulator that answered them would work here and fail exactly where the credentials matter.

PUT is not implemented. It is a client-side upload protocol; put the bytes in the directory instead.

The PAT is minted on first start and written to $SNOWFLAKE_DATA_DIR/admin.pat, printed once. Delete the file to mint a new one. token=dev, an empty password, and any other credential are 401 — there is no anonymous mode, and no way to configure one.