<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Dash</title>
    <description>The latest articles on Forem by Dash (@iamontheinet).</description>
    <link>https://forem.com/iamontheinet</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3832897%2F6a342ade-0e41-4698-8f5c-bc5c82364a81.png</url>
      <title>Forem: Dash</title>
      <link>https://forem.com/iamontheinet</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/iamontheinet"/>
    <language>en</language>
    <item>
      <title>I built a remote control for Cortex Code in Slack so I can step away from my laptop</title>
      <dc:creator>Dash</dc:creator>
      <pubDate>Mon, 13 Apr 2026 14:00:00 +0000</pubDate>
      <link>https://forem.com/snowflake/i-built-a-remote-control-for-cortex-code-in-slack-so-i-can-step-away-from-my-laptop-2dag</link>
      <guid>https://forem.com/snowflake/i-built-a-remote-control-for-cortex-code-in-slack-so-i-can-step-away-from-my-laptop-2dag</guid>
      <description>&lt;h2&gt;
  
  
  Snowflake Cortex Code CLI Meets Slack
&lt;/h2&gt;

&lt;p&gt;Cortex Code CLI is Snowflake's AI coding agent that runs in your terminal. It can write code, execute SQL and DDL scripts, create and deploy data pipelines, generate dashboards, reads &amp;amp; write files, manages git repos and more.&lt;/p&gt;

&lt;p&gt;Cortex Code CLI also has a hook system and skill framework that make it extensible so you can build sidecar apps that plug into its lifecycle. I wanted to explore this extensibility by building a Slack bridge: get DM notifications about what the agent is doing, and reply with instructions to steer it, all from your phone. The whole conversation happens in Slack while the agent keeps working in the terminal. No servers, no databases, no cloud infra. Just a Slack bot, some JSON files, and a shell wrapper.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It Actually Does
&lt;/h3&gt;

&lt;p&gt;It supports two interaction patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free-text conversations:&lt;/strong&gt; You type a message in the Slack DM. It lands in a session-specific inbox file. The agent's cron job picks it up on the next cycle and treats it as user input. This is the core of the bridge — you can ask questions (“what's the row count on that table?”), give instructions (“skip that step and move to the next one”), make decisions (“use approach #2”), or redirect the work entirely (“actually, focus on the API layer first”). The agent responds back via Slack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notifications:&lt;/strong&gt; The agent sends you status updates as Slack DMs. “Feature engineering done, 5 tables created.” “Model training complete, 3 models evaluated.” “Blog post committed and pushed.” You see them on your phone and know what's happening without being at the terminal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This bridge works best with “bypass safeguards” enabled in Cortex Code CLI, which lets the agent execute tools without pausing for terminal confirmations. That's what makes the remote workflow possible; if the agent stopped to ask for permission at the terminal, you'd have to be sitting there anyway.&lt;/p&gt;

&lt;p&gt;But understand the tradeoff: bypass safeguards means the agent can execute bash commands, write files, run SQL, and push to git without asking first. You're trusting the agent to do the right thing. The Slack bridge gives you visibility (notifications) and steering (free-text replies), but it doesn't replace the confirmation gate — it replaces the terminal. Use it on repos and environments where you're comfortable with that level of autonomy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Design Decisions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Socket Mode:&lt;/strong&gt; No public URLs needed. The bot connects outbound to Slack's WebSocket API. Works behind firewalls, no ngrok required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File-based inbox:&lt;/strong&gt; Each Cortex Code CLI session gets its own &lt;code&gt;inbox_{session_id}.json&lt;/code&gt;. The bridge bot writes to it; the CLI polls it via cron. Dead simple, zero dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metadata routing:&lt;/strong&gt; Every outbound Slack message includes session metadata. When you reply, Slack sends that metadata back. The bridge uses it to write to the correct session's inbox. Multiple sessions, no crosstalk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sidecar process:&lt;/strong&gt; The bridge bot runs as a background process, started automatically by a SessionStart hook. It's not embedded in Cortex Code CLI ; it's a separate Python process that communicates via the filesystem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Code
&lt;/h3&gt;

&lt;p&gt;The project has four main files.&lt;/p&gt;

&lt;h4&gt;
  
  
  1) config.py: Configuration and Session Management
&lt;/h4&gt;

&lt;p&gt;It handles paths, tokens, and multi-session routing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;BRIDGE_DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;home&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.cortex-slack-bridge&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;INBOX_FILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BRIDGE_DIR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inbox.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;PID_FILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BRIDGE_DIR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bridge.pid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Token lookup follows a priority chain: environment variable &amp;gt; macOS Keychain &amp;gt; config file. Env vars (&lt;code&gt;SLACK_BRIDGE_APP_TOKEN&lt;/code&gt;, &lt;code&gt;SLACK_BRIDGE_BOT_TOKEN&lt;/code&gt;) are checked first, then Keychain via the &lt;code&gt;security&lt;/code&gt; CLI, then &lt;code&gt;~/.cortex-slack-bridge/config.json&lt;/code&gt; as a fallback. The Keychain path means tokens never sit in plain text on disk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;KEYCHAIN_SERVICE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;coco-slack-bridge&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;keychain_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;security&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;find-generic-password&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;KEYCHAIN_SERVICE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;returncode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;FileNotFoundError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TimeoutExpired&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero new dependencies; just the &lt;code&gt;security&lt;/code&gt; CLI that ships with macOS. Session management is minimal: &lt;code&gt;get_session_inbox()&lt;/code&gt; returns the inbox path for a session ID, and &lt;code&gt;set_active_session()&lt;/code&gt; / &lt;code&gt;get_active_session()&lt;/code&gt; track which session the bridge should route messages to when there's no metadata to go on.&lt;/p&gt;

&lt;h4&gt;
  
  
  2) bridge.py: The Socket Mode Bot
&lt;/h4&gt;

&lt;p&gt;This is the long-running process. It connects to Slack via Socket Mode so when you type in the Slack DM, it captures the text and writes it to the active session's inbox:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_dm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;say&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;subtype&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;target_user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="nf"&gt;_append_inbox&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reply&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="c1"&gt;# ...
&lt;/span&gt;    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="nf"&gt;say&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Message sent to CoCo CLI. Awaiting response…&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both &lt;code&gt;bridge.py&lt;/code&gt; and &lt;code&gt;notify.py&lt;/code&gt; append every message to &lt;code&gt;~/.cortex-slack-bridge/history.jsonl&lt;/code&gt; which acts as a permanent audit trail. Inbound DMs, outbound notifications, consumed confirmations — everything gets logged with direction and timestamp.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_log_history&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;direction&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;logged_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HISTORY_FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt; &lt;span class="c1"&gt;# history logging done not break core functionality
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three direction values: &lt;code&gt;inbound&lt;/code&gt; (user DMs and button clicks), &lt;code&gt;outbound&lt;/code&gt; (agent notifications and confirmation requests), &lt;code&gt;consumed&lt;/code&gt; (confirmation responses popped from the inbox).&lt;/p&gt;

&lt;h4&gt;
  
  
  3) notify.py: Sending Messages
&lt;/h4&gt;

&lt;p&gt;This is the outbound side. The main function is &lt;code&gt;send_message()&lt;/code&gt; — it sends a plain DM or a color-coded message (blue for status, green for success, yellow for warnings, red for errors). Every message includes session metadata so replies route back correctly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cortex_bridge&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event_payload&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;session_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sid&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's also a &lt;code&gt;send_confirmation()&lt;/code&gt; function that sends Approve/Deny buttons and polls the inbox for a response. It's used by &lt;code&gt;coco-bridge confirm&lt;/code&gt; for scripted gate checks.&lt;/p&gt;

&lt;h4&gt;
  
  
  4) bin/coco-bridge: The Shell Wrapper
&lt;/h4&gt;

&lt;p&gt;A bash script that makes everything easy to use from Cortex Code CLI's skill system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;coco-bridge start          &lt;span class="c"&gt;# Start the bridge bot&lt;/span&gt;
coco-bridge stop           &lt;span class="c"&gt;# Stop it&lt;/span&gt;
coco-bridge status         &lt;span class="c"&gt;# Check if running&lt;/span&gt;
coco-bridge send &lt;span class="s2"&gt;"message"&lt;/span&gt; &lt;span class="c"&gt;# Send a DM&lt;/span&gt;
coco-bridge send &lt;span class="s2"&gt;"msg"&lt;/span&gt; - &lt;span class="nb"&gt;type &lt;/span&gt;success &lt;span class="c"&gt;# Color-coded&lt;/span&gt;
coco-bridge confirm &lt;span class="s2"&gt;"question"&lt;/span&gt; &lt;span class="c"&gt;# Approve/Deny buttons&lt;/span&gt;
coco-bridge inbox          &lt;span class="c"&gt;# Read inbox contents&lt;/span&gt;
coco-bridge &lt;span class="nb"&gt;history&lt;/span&gt;        &lt;span class="c"&gt;# Last 20 messages (audit log)&lt;/span&gt;
coco-bridge &lt;span class="nb"&gt;history &lt;/span&gt;50     &lt;span class="c"&gt;# Last N messages&lt;/span&gt;
coco-bridge setup-keychain &lt;span class="c"&gt;# Store tokens in macOS Keychain&lt;/span&gt;
coco-bridge clear-keychain &lt;span class="c"&gt;# Remove tokens from Keychain&lt;/span&gt;
coco-bridge logs           &lt;span class="c"&gt;# Tail the log file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It auto-detects the project's virtualenv, manages the PID file, and dispatches to the Python modules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Works
&lt;/h3&gt;

&lt;p&gt;Most AI coding agents don't expose lifecycle hooks as in programmatic entry points where your own code runs at specific moments in the agent's execution. Cortex Code CLI does! It has a hook system that fires shell commands at session start, after every tool call, on user input, and at session end. Combined with a skill framework that lets you teach the agent new behaviors via markdown files, you get a real extensibility contract. This Slack bridge exists entirely because of that, and it's worth understanding the two mechanisms that make it work.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Hook System
&lt;/h3&gt;

&lt;p&gt;Cortex Code CLI has a lifecycle hook system defined in &lt;code&gt;~/.snowflake/cortex/hooks.json&lt;/code&gt;. You can register shell commands that fire at specific points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SessionStart:&lt;/strong&gt; runs when a new session begins (before the agent does anything)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostToolUse:&lt;/strong&gt; fires after every tool call (bash, file write, SQL execution, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UserPromptSubmit:&lt;/strong&gt; fires when the user sends a message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop:&lt;/strong&gt; fires when the session ends&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SubagentStop:&lt;/strong&gt; fires when a background agent completes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each hook is a shell command with a configurable timeout. The stdout from SessionStart hooks gets passed to the agent as context, which is how the bridge tells Cortex Code CLI “hey, I'm running, ask the user if they want Slack enabled.”&lt;/p&gt;

&lt;p&gt;This is a big deal. It means you can build sidecar applications that plug into Cortex Code CLI's lifecycle without modifying the CLI itself.&lt;/p&gt;

&lt;p&gt;The Slack bridge uses SessionStart to auto-launch. But you could just as easily build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A PostToolUse hook that logs every tool call to a database (audit trail)&lt;/li&gt;
&lt;li&gt;A UserPromptSubmit hook that captures conversation history (flight recorder)&lt;/li&gt;
&lt;li&gt;A Stop hook that sends a session summary to Slack or email&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Setting It Up
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Prerequisites
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;A Slack workspace where you can install apps&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.snowflake.com/en/developers/guides/getting-started-with-cortex-code-cli/" rel="noopener noreferrer"&gt;Cortex Code CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Create the Slack App
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt; Go to &lt;a href="https://api.slack.com/apps" rel="noopener noreferrer"&gt;api.slack.com/apps&lt;/a&gt; and create a new app&lt;/li&gt;
&lt;li&gt; Under Socket Mode, enable it and create an App-Level Token with &lt;code&gt;connections:write&lt;/code&gt; scope. Copy the &lt;code&gt;xapp-…&lt;/code&gt; token.&lt;/li&gt;
&lt;li&gt; Under OAuth &amp;amp; Permissions, add these Bot Token Scopes:
&lt;code&gt;chat:write&lt;/code&gt; to send DMs, &lt;code&gt;im:history&lt;/code&gt; to read DM history, &lt;code&gt;im:read&lt;/code&gt; to view DM channels, &lt;code&gt;im:write&lt;/code&gt; to open DM channels&lt;/li&gt;
&lt;li&gt; Under Event Subscriptions, enable events and subscribe to the &lt;code&gt;message.im&lt;/code&gt; bot event&lt;/li&gt;
&lt;li&gt; Under Interactivity &amp;amp; Shortcuts, enable interactivity (no URL needed for Socket Mode)&lt;/li&gt;
&lt;li&gt; Install the app to your workspace. Copy the Bot User OAuth Token (&lt;code&gt;xoxb-…&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; Find your Slack User ID: click your profile picture in Slack, click the three dots, “Copy member ID”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;NOTE: the app-level token, bot user oauth token and your Slack member ID will be used later under Configure Tokens section.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Install the Bridge
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/iamontheinet/cortex-code-cli-slack-bridge.git &lt;span class="se"&gt;\&lt;/span&gt;
  ~/Apps/cortex-code-cli-slack-bridge
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Apps/cortex-code-cli-slack-bridge
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
.venv/bin/pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Install Cortex Code CLI Skill
&lt;/h4&gt;

&lt;p&gt;Cortex Code CLI has a skill system that lets you teach the agent new behaviors via markdown files. The repo includes the Cortex Code CLI skill file that teaches the agent how to manage the bridge. For example, when to poll, how to format messages, how to activate and deactivate.&lt;/p&gt;

&lt;p&gt;Copy it to your skills directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.snowflake/cortex/skills/slack-bridge
&lt;span class="nb"&gt;cp &lt;/span&gt;skill/SKILL.md ~/.snowflake/cortex/skills/slack-bridge/SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Slack bridge skill defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trigger phrases: “slack on”, “enable slack”, “/slack”, etc.&lt;/li&gt;
&lt;li&gt;Activation flow: what to do when the user opts in&lt;/li&gt;
&lt;li&gt;Message routing: how to handle inbox entries, when to send notifications&lt;/li&gt;
&lt;li&gt;Deactivation: how “slack off” tears down the polling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you say “slack on”, the skill instructs the agent to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Create a session-scoped cron job that polls the inbox every minute&lt;/li&gt;
&lt;li&gt; Send an activation message to Slack&lt;/li&gt;
&lt;li&gt; Start routing questions and status updates through Slack instead of the terminal&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The cron pattern here is worth calling out. Cortex Code CLI's &lt;code&gt;cron_create&lt;/code&gt; tool lets you schedule prompts that fire on a schedule — and they're session-scoped, meaning they die when the session ends. The bridge uses this as a heartbeat: every minute, a “Slack inbox check” prompt fires. The skill tells the agent to read the inbox file, and if it's empty, sleep 30 seconds and check again. Two checks per cron fire gives you ~30-second worst-case latency without doubling the cron frequency or adding a file watcher. It's a cheap way to give an agent a polling loop — just a cron job and a JSON file. The skill also handles “slack off” to disable the bridge mid-session.&lt;/p&gt;

&lt;h4&gt;
  
  
  Configure Tokens
&lt;/h4&gt;

&lt;p&gt;The recommended approach stores tokens in macOS Keychain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;coco-bridge setup-keychain
&lt;span class="c"&gt;# Prompts for app token, bot token, and user ID&lt;/span&gt;
&lt;span class="c"&gt;# Stores them in Keychain under the "coco-slack-bridge" service&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you already have a &lt;code&gt;config.json&lt;/code&gt;, &lt;code&gt;setup-keychain&lt;/code&gt; reads from it, migrates to Keychain, and offers to delete the file.&lt;/p&gt;

&lt;p&gt;Alternatively, use a config file or env vars:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Config file approach&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.cortex-slack-bridge
&lt;span class="nb"&gt;cp &lt;/span&gt;config.json.example ~/.cortex-slack-bridge/config.json
&lt;span class="c"&gt;# Edit with your actual tokens&lt;/span&gt;

&lt;span class="c"&gt;# Or env vars&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SLACK_BRIDGE_APP_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"xapp-1-A0…"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SLACK_BRIDGE_BOT_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"xoxb-…"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SLACK_BRIDGE_USER_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"U02M…"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Start and Test
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start the bridge&lt;/span&gt;
bin/coco-bridge start

&lt;span class="c"&gt;# Send a test message&lt;/span&gt;
bin/coco-bridge send &lt;span class="s2"&gt;"Hello from the bridge!"&lt;/span&gt;

&lt;span class="c"&gt;# Test a reply - type something back in the Slack DM, then check:&lt;/span&gt;
bin/coco-bridge inbox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Wire Up the SessionStart Hook
&lt;/h4&gt;

&lt;p&gt;Add this to &lt;code&gt;~/.snowflake/cortex/hooks.json&lt;/code&gt; so the bridge auto-starts with every Cortex Code CLI session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SessionStart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/Users/YOUR_USERNAME/.cortex-slack-bridge/start-hook.sh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy the start hook script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp &lt;/span&gt;demo-start-hook.sh ~/.cortex-slack-bridge/start-hook.sh
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x ~/.cortex-slack-bridge/start-hook.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Beauty of Extensibility
&lt;/h3&gt;

&lt;p&gt;The whole project is ~300 lines of Python plus a shell wrapper. No servers, no databases, no cloud infra. It extends Cortex Code CLI with a mobile-friendly communication layer so you can kick off a task, walk away, get updates, reply with instructions, all from Slack.&lt;/p&gt;

&lt;p&gt;But the bigger takeaway isn't the Slack bridge itself, it's that Cortex Code CLI is built to be extended this way. Hooks give you lifecycle access. Skills give you behavioral control. The filesystem gives you a dead-simple IPC layer. This bridge is one example; the pattern works for any sidecar you can imagine: audit loggers, custom approval gates, integration bridges to other tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stay Connected
&lt;/h2&gt;

&lt;p&gt;Thank you for your time. I hope you found this blog both educational and inspiring. The code can be found &lt;a href="https://www.google.com/search?q=https://github.com/iamontheinet/cortex-code-cli-slack-bridge" rel="noopener noreferrer"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Clone it, plug in your Slack tokens, and build something on top of it. The Cortex Code CLI is waiting for your hooks. If you're experimenting with this workflow or planning to, I'd love to hear what you're building. &lt;/p&gt;

&lt;p&gt;Connect with me on &lt;a href="https://www.linkedin.com/in/dash-desai/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; for more demos as well as AI product &amp;amp; feature updates.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>cli</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Hot off the press -- Snowflake Cortex Code in Snowsight is now GA!</title>
      <dc:creator>Dash</dc:creator>
      <pubDate>Thu, 26 Mar 2026 18:40:50 +0000</pubDate>
      <link>https://forem.com/snowflake/hot-off-the-press-snowflake-cortex-code-in-snowsight-is-now-ga-3m3n</link>
      <guid>https://forem.com/snowflake/hot-off-the-press-snowflake-cortex-code-in-snowsight-is-now-ga-3m3n</guid>
      <description>&lt;p&gt;Building and scaling AI apps natively on your data just got a massive upgrade.&lt;/p&gt;

&lt;p&gt;Here is what is included in this release:&lt;/p&gt;

&lt;p&gt;⚡ Rapid prototyping to production: execute large, multi-step projects directly in Snowsight.&lt;br&gt;
🔒 Enterprise-grade governance: built-in controls and observability for regulated environments.&lt;br&gt;
💸 Cost-aware automation: specialized skills for cost optimization and agentic ML workflows.&lt;br&gt;
🪟 Cross-platform CLI: native Windows support removes friction for engineering teams.&lt;/p&gt;

&lt;p&gt;🙌 My absolute new favorite in CLI: Agent Teams!&lt;/p&gt;

&lt;p&gt;Here's what I tried: "&lt;em&gt;Build a Streamlit chat app in a new folder that streams responses from the Cortex Agent. Use a team of 3 agents (client, UI, config) with a shared event contract defined upfront to avoid integration mismatches.&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;🤯 I'm still blown away by how well the Agent Teams handled that shared event contract. If you had a team of agents to automate your workflow today, what's the first project you'd assign them? Let's discuss in comments👇&lt;/p&gt;

&lt;p&gt;🔗 Get started in mins: &lt;a href="https://www.snowflake.com/en/developers/guides/getting-started-with-cortex-code-cli/" rel="noopener noreferrer"&gt;https://www.snowflake.com/en/developers/guides/getting-started-with-cortex-code-cli/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Let's learn together!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>snowflake</category>
    </item>
    <item>
      <title>[DYK with Dash] Want a policy enforcement layer over your AI coding assistant?</title>
      <dc:creator>Dash</dc:creator>
      <pubDate>Thu, 26 Mar 2026 00:51:02 +0000</pubDate>
      <link>https://forem.com/snowflake/dyk-with-dash-want-a-policy-enforcement-layer-over-your-ai-coding-assistant-5a65</link>
      <guid>https://forem.com/snowflake/dyk-with-dash-want-a-policy-enforcement-layer-over-your-ai-coding-assistant-5a65</guid>
      <description>&lt;p&gt;🙌 Snowflake Cortex Code CLI has a programmable hooks system that fires on 11 lifecycle events -- PreToolUse, PostToolUse, SessionStart, Stop, and more. You write a shell script, and if it returns exit code 2, the operation is HARD BLOCKED.&lt;/p&gt;

&lt;p&gt;↳ Validate every bash command before it runs&lt;br&gt;
↳ Block writes to protected files&lt;br&gt;
↳ Log every tool call for audit&lt;br&gt;
↳ Inject context at session start&lt;/p&gt;

&lt;p&gt;This is guardrails-as-code for AI-assisted development.&lt;/p&gt;

&lt;p&gt;Share this with your platform team -- they need to see this 👇&lt;/p&gt;

&lt;p&gt;📖 Get started: &lt;a href="https://www.snowflake.com/en/developers/guides/getting-started-with-cortex-code-cli/" rel="noopener noreferrer"&gt;https://www.snowflake.com/en/developers/guides/getting-started-with-cortex-code-cli/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Let's learn together!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>snowflake</category>
      <category>governance</category>
    </item>
    <item>
      <title>[DYK with Dash] Build your own AI sub-agents with... Markdown?!</title>
      <dc:creator>Dash</dc:creator>
      <pubDate>Tue, 24 Mar 2026 14:23:17 +0000</pubDate>
      <link>https://forem.com/snowflake/dyk-with-dash-build-your-own-ai-sub-agents-with-markdown-31o3</link>
      <guid>https://forem.com/snowflake/dyk-with-dash-build-your-own-ai-sub-agents-with-markdown-31o3</guid>
      <description>&lt;p&gt;🙌 Drop a Markdown file with YAML frontmatter into &lt;code&gt;.cortex/agents/&lt;/code&gt; and Snowflake Cortex Code turns it into a fully functional specialized sub-agent with scoped tool access.&lt;/p&gt;

&lt;p&gt;↳ Define a &lt;code&gt;code-reviewer&lt;/code&gt; agent that only has Read access&lt;br&gt;
↳ Create a &lt;code&gt;migration-checker&lt;/code&gt; with Bash + SQL&lt;br&gt;
↳ Share them with your team through version control&lt;/p&gt;

&lt;p&gt;That's it. Your team's best practices, encoded as agents.&lt;/p&gt;

&lt;p&gt;What custom agent would you build? 👇&lt;/p&gt;

&lt;p&gt;📖 Get started: &lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-cli" rel="noopener noreferrer"&gt;https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-cli&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Let's learn together!&lt;/p&gt;

&lt;h1&gt;
  
  
  CortexCode #Snowflake #AI #Developers #DataEngineering #DevTools
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>snowflake</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Data governance just became a conversation, not a workflow.</title>
      <dc:creator>Dash</dc:creator>
      <pubDate>Fri, 20 Mar 2026 14:22:04 +0000</pubDate>
      <link>https://forem.com/snowflake/data-governance-just-became-a-conversation-not-a-workflow-3998</link>
      <guid>https://forem.com/snowflake/data-governance-just-became-a-conversation-not-a-workflow-3998</guid>
      <description>&lt;p&gt;🤔 If you've ever tried to get a full picture of your governance posture, you know the drill -- run classification in one place, write masking policies&lt;br&gt;
 somewhere else, dig through access history six months ago, and still not really know what's covered.&lt;/p&gt;

&lt;p&gt;🙌 We built something to fix that. Data Governance Skills for Snowflake Cortex Code let you govern your data by just... asking.&lt;/p&gt;

&lt;p&gt;"What's my governance maturity score?" gives you a 0-5 score across classification, protection, and access monitoring. Per database. With the actual gaps called out.&lt;/p&gt;

&lt;p&gt;🤯 The thing I like most -- these aren't generic AI prompts hoping the SQL is right. There are 100+ verified query patterns under the hood, built&lt;br&gt;
specifically for governance views. &lt;/p&gt;

&lt;p&gt;Classification, masking, row access policies, data quality via DMFs, lineage with impact analysis -- all in natural language, all native to Snowflake Horizon Catalog. No external catalog to sync. No metadata that's hours behind.&lt;/p&gt;

&lt;p&gt;A data steward can now do in one conversation what used to be a sprint across multiple teams!&lt;/p&gt;

&lt;p&gt;Available now in Cortex Code CLI. Check it out and let me know what you think: &lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-cli" rel="noopener noreferrer"&gt;https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-cli&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>data</category>
      <category>database</category>
      <category>security</category>
    </item>
    <item>
      <title>[DYK with Dash] Git branching... but for AI conversations?!</title>
      <dc:creator>Dash</dc:creator>
      <pubDate>Thu, 19 Mar 2026 14:13:18 +0000</pubDate>
      <link>https://forem.com/snowflake/dyk-with-dash-git-branching-but-for-ai-conversations-55dk</link>
      <guid>https://forem.com/snowflake/dyk-with-dash-git-branching-but-for-ai-conversations-55dk</guid>
      <description>&lt;p&gt;🤯 Type '/fork' mid-conversation in Snowflake Cortex Code and it creates a branch of your session at any point you choose. Try a risky refactor, explore a wild idea -- and if it goes sideways, your original session is still right there waiting for you.&lt;/p&gt;

&lt;p&gt;↳ '/fork' -- branch from any message&lt;br&gt;
↳ '/fork my-experiment' -- name it for easy recall&lt;br&gt;
↳ '/rewind 3' -- or just roll back 3 messages&lt;/p&gt;

&lt;p&gt;This is git-branch thinking applied to your AI workflow. Experiment fearlessly!&lt;/p&gt;

&lt;p&gt;Try it: '/fork' your next risky experiment and tell me what you explored 👇&lt;/p&gt;

&lt;p&gt;Get started: &lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-cli" rel="noopener noreferrer"&gt;https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-cli&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Let's learn together!&lt;/p&gt;

&lt;h1&gt;
  
  
  CortexCode #Snowflake #AI #Developers #DataEngineering #Productivity
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>productivity</category>
      <category>tooling</category>
    </item>
    <item>
      <title>[DYK with Dash] Cortex Code has a secret weapon most people walk right past!</title>
      <dc:creator>Dash</dc:creator>
      <pubDate>Thu, 19 Mar 2026 00:34:54 +0000</pubDate>
      <link>https://forem.com/snowflake/dyk-with-dash-cortex-code-has-a-secret-weapon-most-people-walk-right-past-4al5</link>
      <guid>https://forem.com/snowflake/dyk-with-dash-cortex-code-has-a-secret-weapon-most-people-walk-right-past-4al5</guid>
      <description>&lt;p&gt;❄️ Type &lt;code&gt;#DB.SCHEMA.TABLE&lt;/code&gt; directly in your Snowflake Cortex Code prompt and BOOM -- it auto-injects the full column metadata, primary keys, row count, and sample rows into context. No more copy-pasting DESCRIBE output. No more guessing column names.&lt;/p&gt;

&lt;p&gt;👉 Just prefix any fully-qualified table name with &lt;code&gt;#&lt;/code&gt; and the agent instantly knows your schema&lt;br&gt;
👉 Autocomplete kicks in after you type &lt;code&gt;#&lt;/code&gt;&lt;br&gt;
👉 Works with any table in your Snowflake account&lt;/p&gt;

&lt;p&gt;Stop manually feeding context. Let the CLI do it for you!&lt;/p&gt;

&lt;p&gt;Try this right now: type &lt;code&gt;#&lt;/code&gt; and pick a table -- then drop your result in the comments 👇&lt;/p&gt;

&lt;p&gt;📖 Docs: &lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-cli" rel="noopener noreferrer"&gt;https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-cli&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
