Getting started with Snowflake App Runtime¶
This guide walks you through setting up your environment and deploying your first app on Snowflake. Start with the setup section below, then choose your path: use Cortex Code CLI or Cortex Code Desktop to build from a description, or use the Snowflake CLI directly if you already have code.
Set up your environment¶
Before you can build or deploy, install Cortex Code (CLI or Desktop) and the Snowflake CLI on your machine. Use the install guides below, then confirm the Snowflake Apps command surface in the next section.
Cortex Code¶
Use Cortex Code CLI or Cortex Code Desktop to scaffold, test, and deploy
apps from natural language. Both bundle the snowflake-apps
skill and use the Snowflake CLI for deployment.
Cortex Code CLI (macOS, Linux, and Windows):
- Install and connect: Cortex Code CLI (including Windows instructions)
- Product overview: Cortex Code
- Custom skills and extensions: Cortex Code CLI extensibility
Cortex Code Desktop (macOS and Windows):
- Install and sign in: Onboarding and authentication
- Build and deploy Snowflake App Runtime apps: Building apps
(starter card, in-IDE live preview, Apps view, and
snow app deploy) - Product overview:
Snowflake CLI¶
Install the Snowflake CLI using Installing Snowflake CLI.
Use a current Snowflake CLI (3.17 or later). After install, verify that Snowflake Apps commands are available:
If snow app setup --help fails, reinstall or upgrade the Snowflake CLI using
the installation guide linked above.
Other requirements¶
- Snowflake App Runtime enabled: Your account administrator must complete
infrastructure setup in Snowsight at
/settings/account/appsbefore you can deploy. - Node.js 22+: Required for local development and testing when you build Node.js apps locally (including projects scaffolded by Cortex Code).
Build and deploy with Cortex Code¶
Cortex Code assistants can scaffold, build, test, and deploy Snowflake apps from a natural language description. This is the fastest path to a running app.
Tip
In Cortex Code CLI or Desktop, invoke the bundled snowflake-apps
skill with $snowflake-apps, select the Build an app starter card in Desktop,
or describe your app in natural language. See Building apps
for Desktop entry points, live preview, and the Apps view.
Step 1: Describe your app¶
Invoke the $snowflake-apps skill, select the Build an app starter card (Desktop),
or describe what you want to build in chat:
Cortex Code scaffolds a Next.js project with:
- A working UI matching your description
- Snowflake data access wired up automatically
- An
app.ymlmanifest describing how the app is built, and asnowflake.ymlproject definition
Step 2: Test locally¶
Cortex Code starts a local dev server so you can preview and iterate:
Make changes by describing what you want. Cortex Code edits the code, and the local preview updates in real time.
Step 3: Deploy¶
When you’re happy with the app, deploy it:
Cortex Code runs snow app deploy, which uploads your source, builds it
remotely, and starts the service. You get a live URL.
Step 4: Open and share¶
Open your deployed app:
The URL is authenticated through Snowflake SSO. Anyone with the appropriate role can access it; no additional auth setup required. To grant access to other roles, see Access control for Snowflake App Runtime.
Step 5: Iterate¶
Make changes and redeploy. Each deploy produces a new version and upgrades the running service in place. The URL stays the same.
Build and deploy with the CLI¶
If you have an existing application or prefer working directly with code, use the Snowflake CLI. Cortex Code isn’t required for this path.
Step 1: Initialize your project¶
From your project directory, run snow app setup to generate a
snowflake.yml project definition:
Pass --app-name my_app_name when you want an explicit Snowflake identifier
instead of the name derived from the current directory.
This creates a snowflake.yml in the current directory with a
snowflake-app entity preconfigured using defaults set by your account
administrator. If your administrator hasn’t configured defaults, the command
falls back to your personal database.
The generated file looks like this:
The specific values for database, query_warehouse, compute pools, and
build_eai come from your account administrator’s configuration. The
artifacts section controls which files are uploaded; the ignore list
excludes build output and local-only files.
Run with --dry-run to preview the resolved configuration without writing
the file.
For snowflake.yml and the snowflake-app entity after setup, use the
snow app setup
command reference and
Specify entities
for identifier rules, mixins, and other project-definition patterns the CLI applies
to snowflake.yml.
Step 2: Deploy¶
From your project directory:
The CLI uploads your source files, triggers a remote build, creates (or upgrades) the Application Service, and prints the live URL. The URL looks like:
This URL is stable across redeploys. It doesn’t change when you upgrade to a new version.
Step 3: Open your app¶
Use snow app open --print-only to print the URL without opening a browser.
Use snow app open --settings to open the app in Snowsight instead of the live
endpoint.
What happens under the hood¶
Whether you use Cortex Code or the CLI, snow app deploy automates these
steps:
- Uploads source files to an internal stage.
- Triggers the builder service, which runs
installandbuildcommands from yourapp.yml(or auto-detected from your project layout). - Stores the built output as an immutable versioned package in an artifact
repository (
TYPE = APPLICATION). - Creates or upgrades the Application Service from the latest package version.
Your account admin configures the required infrastructure (database, schema,
compute, and networking) through Snowsight at /settings/account/apps. Once setup is
complete, you can deploy without additional configuration.
Connecting to Snowflake data¶
Your application can query Snowflake directly with no credentials to manage. Snowflake handles authentication automatically at runtime.
Tip
Cortex Code scaffolds a querySnowflake() helper that handles
connection pooling, token rotation, and both execution modes described
below. You don’t need to implement this yourself.
Owner’s rights vs. caller’s rights¶
When your app runs a query, it executes in one of two modes:
| Mode | How it works | When to use it |
|---|---|---|
| Owner’s rights | Queries run as the service’s own identity (the owner role). All users see the same data. | Shared dashboards, aggregate views, internal tools where every user sees the same results. |
| Caller’s rights | Queries run as the end user who opened the app. Snowflake applies that user’s role and privileges. | Apps where different users should see different data, per-user audit trails, row-level security. |
With the scaffolded SDK, switching between modes is one parameter:
Caller’s rights is enabled by default for Application Services. No additional
configuration is needed in your app.yml.
Caller grants¶
When using caller’s rights, the application operates under restricted caller’s rights. This means both the calling user’s privileges AND the service owner’s caller grants must allow the operation. The service owner must be granted permission to act on behalf of callers:
For the full details on how restricted caller’s rights work, see Configuring caller’s rights.
How authentication works (reference)¶
For developers building without the scaffolded SDK:
- Snowflake injects an OAuth token at
/snowflake/session/tokenin each container. The token rotates automatically; read it fresh on each request. - For caller’s rights, Snowflake inserts an
Sf-Context-Current-User-TokenHTTP header on each incoming request. Concatenate the service token and caller token (serviceToken + "." + callerToken) and authenticate withauthenticator: "OAUTH". - No credentials, connection strings, or manual token management is required.
For a complete walkthrough of the low-level implementation, see Tutorial 7:Create a Snowpark Container Services service that uses caller’s rights.
Other CLI commands¶
Beyond snow app setup, snow app deploy, and snow app open, the
CLI provides additional commands for managing your app lifecycle:
| Command | Description |
|---|---|
snow app validate | Check that the target database and schema exist and that the project can
be bundled (resolves artifacts from |
snow app bundle | Copy resolved artifacts into |
snow app events | Fetch recent container logs (default: 500 lines). Use |
snow app teardown | Drop the Application Service and clean up associated objects (stage or
workspace files). Use |
Retrying a failed deploy¶
If snow app deploy fails partway through, you can retry just the phase
that failed instead of starting over:
snow app deploy --upload-only: re-upload source files without rebuilding or redeploying.snow app deploy --build-only: re-trigger the build without re-uploading or redeploying.snow app deploy --deploy-only: create or upgrade the service without re-uploading or rebuilding.
Only one of these flags can be used at a time.
Next steps¶
- Cortex Code CLI: install and connect
snowflake-appsbundled skill: scaffold and deploy with Cortex Code CLI or Desktop- Building apps: build and deploy with Cortex Code Desktop
- Onboarding and authentication: install and sign in to Cortex Code Desktop
- Snowflake Apps CLI commands: full Snowflake CLI command reference
- Snowflake Apps SQL commands: SQL commands and
SYSTEM$GET_APPLICATION_SERVICE_LOGS - Optional app.yml manifest for Snowflake App Runtime: optional
app.ymlmanifest - Access control for Snowflake App Runtime: share your app with other roles
- Observability for Snowflake App Runtime: logs and service status
- Snowflake App Runtime limitations: known limitations during public preview