By Hussain Sultan | February 12, 2026
(If it feels like Claude Code… it might basically be that.)
Snowflake shipped a new coding-agent CLI called Cortex Code CLI. It’s an “agentic shell” that’s tightly integrated with your Snowflake account: it understands Snowflake Auth, can run SQL against your warehouse, validates dbt models, and generally tries to behave like a Snowflake-native developer buddy.
And if you try it for five minutes and go: “wait… why does this feel like Claude Code?” — you’re not imagining it.
Snowflake’s own docs basically wink at Cortex Code’s lineage: Cortex Code CLI supports .claude/... paths alongside .cortex/... for skills and settings. That’s not an accident.
So the best way to understand Cortex Code isn’t “clone vs not clone.”
It’s:
What’s different when you take a Claude-Code-like agent loop and harden it for Snowflake’s world?
This post is that shallow dive:
Snowflake describes Cortex Code as an AI agent integrated into the Snowflake platform, optimized for data engineering, analytics, ML, and agent-building tasks, with deep awareness of Snowflake RBAC and schemas.
It’s delivered in two places:
The CLI release itself went GA on Feb 02, 2026.
The official Cortex Code extensibility docs explicitly support Claude-ish project layout.
Skills: .cortex/skills and .claude/skills both work
The docs list skill locations like:
.cortex/skills/ or .claude/skills/~/.snowflake/cortex/skills/ or ~/.claude/skills/That’s not just “inspired by.” That’s straight-up compatibility.
Hooks: .claude/settings.json and .claude/settings.local.json are supported
Hook configuration can live in:
.claude/settings.local.json or .cortex/settings.local.json.claude/settings.json or .cortex/settings.json~/.snowflake/cortex/hooks.jsonAlso: the hook event table in Snowflake docs includes this absolute gem:
Stop — “When user stops Claude”
That’s… a tell.
Snowflake’s official install is a curl-to-shell installer that drops the cortex executable into ~/.local/bin by default:
curl -LsS https://ai.snowflake.com/static/cc-scripts/install.sh | shYou can try Cortex Code immediately without installing anything:
nix run github:xorq-labs/cortex-cli-nix --refreshOr install it declaratively via nix profile (with support for upgrades, rollbacks, and version pinning):
nix profile install github:xorq-labs/cortex-cli-nixCompared to curl | sh, the Nix flake offers reproducible builds, explicit version pinning, and clean uninstall/rollback semantics, and integrates naturally with NixOS and Home Manager setups. The package is automatically updated as Snowflake releases new Cortex Code builds, but remains entirely unofficial and community-supported.
On first run, cortex launches a setup wizard and asks you to pick or create a connection.
It reads from ~/.snowflake/connections.toml, the same file used by Snowflake CLI (snow).
The default auth method is browser-based auth (externalbrowser), and Snowflake also recommends PATs for scoped access.
Cortex Code CLI supports Claude models like:
claude-sonnet-4-5claude-4-sonnetclaude-opus-4-5You’re expected to use Cortex cross-region inference.
ALTER ACCOUNT SET CORTEX_ENABLED_CROSS_REGION = 'AWS_US';Snowflake’s cross-region inference doc clarifies what this is: it routes inference to a different region when your default region can’t serve a given model, and it’s controlled by the account parameter CORTEX_ENABLED_CROSS_REGION.
From my own inspection, Cortex Code CLI is distributed as a native executable (and it looks like a Bun-packaged single-file app, very similar to Claude Code’s “native” distribution pattern).
But Snowflake ships it in a more modular bundle than Claude Code typically does.
In the Cortex package I looked at, it wasn’t just one cortex binary. It also included:
fdbt binary (a “dbt” foundation tool for data workflows)cortex artifact create notebookSnowflake’s docs do explicitly call out that the CLI includes built-in Snowflake skills and supports extension via tools, skills, subagents, hooks, profiles.
So even if Snowflake doesn’t document “here are the extra binaries we ship,” the product shape is: agent core + Snowflake-specific tooling (cortex, fdbt) + curated skills.
That’s the first “why it feels heavier”: the distro itself is heavier.
Let’s use the smallest possible prompt:
Test prompt: “hello”
Claude Code: JSONL log
Claude Code logs as newline-delimited JSON (JSONL) — one record per line/turn. It’s stream-friendly and diff-friendly.
Cortex Code: single JSON session file
Cortex stores sessions as a single JSON document under:
~/.snowflake/cortex/conversations/
This isn’t just “file format preference.” It reflects different priorities:
This is the part that makes Cortex Code feel heavy even when it’s being brief.
In the session artifacts you captured, Cortex prepends every user message with a stack of <system-reminder> blocks:
Whether those are literally sent to the model every turn or partially cached/compacted, the intent is clear:
Cortex is trying to make every turn self-contained and policy-governed.
That’s an enterprise product posture.
Claude Code has guardrails too, but it keeps them mostly out of the transcript and out of your face.
So if you’re injecting ~7KB of policy blobs per turn, you’re paying for that “helpfulness” one way or another (tokens, cache tokens, latency, or all three). Even if Snowflake does prompt caching behind the scenes, the baseline footprint is still real.
This is what I mean by “the cost of customization on top of vanilla Claude.”
Cortex isn’t just “Claude answering your prompt.” It’s “Claude + Snowflake governance wrapper + connection context + tool discipline.”
Snowflake actually gives you a lot here — but it’s spread across a few surfaces.
Settings files
Snowflake documents the main config directory and files:
~/.snowflake/cortex/settings.json~/.snowflake/cortex/permissions.json~/.snowflake/cortex/mcp.json~/.snowflake/cortex/conversations/ (session files)Environment variables (official list)
The settings docs list a small set of env vars:
SNOWFLAKE_HOMECORTEX_AGENT_MODELCORTEX_ENABLE_MEMORYCOCO_DANGEROUS_MODE_REQUIRE_SQL_WRITE_PERMISSIONThat’s the “blessed” surface area.
See appendix for undocumented environment variables that impact agent behavior.
Permissions + modes
Snowflake documents three modes (Confirm / Plan / Bypass), plus permission caching, plus the --private flag to disable saving conversations.
If you’re using this inside real repos / real accounts, that --private flag is not optional. It’s the difference between “agent helped me” and “agent left a paper trail in my home directory forever.”
Hooks are where Cortex becomes “programmable.”
Snowflake documents hook events like:
PreToolUse, PostToolUsePermissionRequestUserPromptSubmitSessionStart, SessionEndStop, SubagentStop, Setup, etc.And the hook config paths explicitly support .claude/... and .cortex/... files.
One nerdy observation that matters if you’re migrating workflows:
Claude Code’s hook system includes an event named PostToolUseFailure in its reference docs.
Snowflake’s documented hook event list does not include PostToolUseFailure.
So either:
I’d treat it as: expect slight drift vs upstream Claude Code workflows.
Snowflake says Cortex Code CLI includes built-in Snowflake skills for things like agent creation, ML, data engineering, governance.
And the skill loader supports both .cortex/skills and .claude/skills layouts.
Here are the bundled skills:
!agent-optimization!cortex-code-guide!cost-management!data-governance!developing-with-streamlit!machine-learning!openflow!semantic-view-optimization!skill-development!snowflake-postgresSnowflake leans on domain packs (“skills”) you can version, bundle, and distribute.
Cortex Code feels like Claude Code because it shares the same mental model: a local agent loop, skills, hooks, project-scoped configuration, and conversational state. The compatibility with .claude/ paths isn’t accidental — it lowers friction for users already familiar with that ecosystem.
But Cortex isn’t trying to be a general-purpose coding agent.
It’s a governed, Snowflake-aware wrapper around that agent loop:
That’s why it feels “heavier.” It is heavier — by design.
If you’re a Snowflake-first team, that weight is a feature. You get tighter integration, fewer auth hacks, and a more opinionated workflow aligned to data engineering inside Snowflake.
If you’re used to vanilla Claude Code, expect:
| Variable | Type | Default | What it does |
|---|---|---|---|
CORTEX_THINKING_EFFORT |
enum | medium |
Controls reasoning effort: minimal, low, medium, high, max |
CORTEX_MAX_ITERATIONS |
int | unlimited (main), 100 (background) | Maximum API round-trips before the agent stops |
CORTEX_AGENT_SUMMARIZATION_TRIGGER_THRESHOLD |
float | 0.9 |
Token usage ratio that triggers context summarization |
CORTEX_AGENT_DISABLE_PLAN_MODE |
bool | false |
Disables plan mode |
CORTEX_AGENT_ENABLE_SUBAGENTS |
bool | false |
Enables spawning child agents |
CORTEX_CODING_AGENT_TOOL_TRUNCATION |
bool | false |
Truncates large tool results to save context |