<?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>DEV Community: Saif Ali</title>
    <description>The latest articles on DEV Community by Saif Ali (@sali_ac161a1b71406354896c).</description>
    <link>https://dev.to/sali_ac161a1b71406354896c</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%2F3780544%2F353acf11-059d-471c-a779-825d98da6c00.png</url>
      <title>DEV Community: Saif Ali</title>
      <link>https://dev.to/sali_ac161a1b71406354896c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sali_ac161a1b71406354896c"/>
    <language>en</language>
    <item>
      <title>Deploy Flixty in minutes with NEXUS AI</title>
      <dc:creator>Saif Ali</dc:creator>
      <pubDate>Thu, 09 Apr 2026 23:08:28 +0000</pubDate>
      <link>https://dev.to/sali_ac161a1b71406354896c/deploy-flixty-in-minutes-with-nexus-ai-2i21</link>
      <guid>https://dev.to/sali_ac161a1b71406354896c/deploy-flixty-in-minutes-with-nexus-ai-2i21</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;5 min read · Beginner friendly · April 2026&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Flixty&lt;/strong&gt; is an open-source, self-hosted social media creator studio that lets you publish to X, LinkedIn, Facebook, Instagram, TikTok, and YouTube from a single interface. NEXUS AI deploys it directly from source — no Dockerfile required — with a single MCP tool call.&lt;/p&gt;

&lt;p&gt;This guide walks you through deploying Flixty on NEXUS AI step by step — covering provider selection, environment variable setup, OAuth configuration for each platform, and ongoing management. By the end you'll have a live, self-hosted social posting studio running on your own cloud infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Flixty?
&lt;/h2&gt;

&lt;p&gt;Flixty (&lt;a href="https://github.com/nexusrun/flixty" rel="noopener noreferrer"&gt;github.com/nexusrun/flixty&lt;/a&gt;) is a Node.js 18+ Express application that serves as a unified control panel for social media publishing. It runs on port &lt;code&gt;3000&lt;/code&gt; and is started with &lt;code&gt;node server.js&lt;/code&gt; — no build step, no container image to maintain.&lt;/p&gt;

&lt;p&gt;Key capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-platform posting&lt;/strong&gt; — schedule and publish content to X, LinkedIn, Facebook, Instagram, TikTok, and YouTube from one dashboard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Assist&lt;/strong&gt; — optional Claude integration (via &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;) generates captions, hashtags, and post variations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post scheduler&lt;/strong&gt; — queue posts for optimal publish times across time zones&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live streaming support&lt;/strong&gt; — manage stream metadata and thumbnails alongside regular posts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OAuth per platform&lt;/strong&gt; — each social network authenticates independently; add only the platforms you need&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;NEXUS AI account&lt;/strong&gt; with at least one project configured&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;NEXUS AI MCP&lt;/strong&gt; connector enabled in Claude — or API access to &lt;code&gt;api.zollo.live/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A supported cloud provider account &lt;em&gt;(GCP, AWS, or Azure)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;OAuth credentials for each social platform you want to enable &lt;em&gt;(X, LinkedIn, Facebook/Instagram, TikTok, Google/YouTube)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; You can deploy Flixty without any platform credentials first to get the public URL, then add OAuth credentials in a redeploy. This is the recommended flow since most OAuth apps require a known redirect URI before you can obtain credentials.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Deploying Flixty — step by step
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1 — Choose your cloud provider
&lt;/h3&gt;

&lt;p&gt;Flixty is deployed as a source-based deployment — NEXUS AI clones the repo, installs dependencies, and runs &lt;code&gt;node server.js&lt;/code&gt; on your chosen provider. GCP Cloud Run is recommended for production: it handles auto-scaling and provides a stable HTTPS URL you can use for OAuth redirect URIs.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GCP Cloud Run&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Serverless, auto-scales to zero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS ECS Fargate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full AWS ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure Container Apps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enterprise &amp;amp; compliance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Environments map to: &lt;code&gt;PRODUCTION&lt;/code&gt; for live traffic (default), &lt;code&gt;STAGING&lt;/code&gt; for pre-production validation, and &lt;code&gt;DEVELOPMENT&lt;/code&gt; for local testing.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2 — Deploy with one MCP tool call
&lt;/h3&gt;

&lt;p&gt;Via the NEXUS AI MCP in Claude, call &lt;code&gt;nexusai_deploy_flixty&lt;/code&gt;. A minimal invocation — with no platform credentials yet — looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;nexusai_deploy_flixty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;provider:    &lt;/span&gt;&lt;span class="s2"&gt;"gcp_cloud_run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;environment: &lt;/span&gt;&lt;span class="s2"&gt;"PRODUCTION"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;name:        &lt;/span&gt;&lt;span class="s2"&gt;"flixty"&lt;/span&gt;  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="sr"&gt;/ optional
)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you don't supply a &lt;code&gt;sessionSecret&lt;/code&gt;, NEXUS AI auto-generates a cryptographically secure 64-character hex secret for your Express sessions. You can also pass platform OAuth credentials and an &lt;code&gt;anthropicApiKey&lt;/code&gt; at this stage if you have them ready.&lt;/p&gt;

&lt;p&gt;Or deploy from the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus deploy flixty &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--provider&lt;/span&gt; gcp_cloud_run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--wait&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 3 — Save your deployment credentials
&lt;/h3&gt;

&lt;p&gt;After a successful deploy call, NEXUS AI returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment UUID&lt;/td&gt;
&lt;td&gt;&lt;code&gt;7a2c91f0-…&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sessionSecret&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Express session signing key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4d8f1c3a9e…&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Current state&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;queued&lt;/code&gt; → &lt;code&gt;running&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Public HTTPS endpoint&lt;/td&gt;
&lt;td&gt;Available once live&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Copy your &lt;code&gt;sessionSecret&lt;/code&gt; immediately — it's returned once. Losing it means active user sessions will be invalidated on the next redeploy. Store it in NEXUS AI Secrets or your secrets manager.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Step 4 — Get the public URL and set BASE_URL
&lt;/h3&gt;

&lt;p&gt;Once the deployment is running, retrieve its public URL and redeploy with &lt;code&gt;BASE_URL&lt;/code&gt; set. This is required for OAuth redirect URIs to work correctly across all platforms.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;nexusai_deploy_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;deploymentId: &lt;/span&gt;&lt;span class="s2"&gt;"7a2c91f0-…"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="no"&gt;Once&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="no"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;redeploy&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="ss"&gt;baseUrl:
&lt;/span&gt;&lt;span class="n"&gt;nexusai_deploy_flixty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;provider:      &lt;/span&gt;&lt;span class="s2"&gt;"gcp_cloud_run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;baseUrl:       &lt;/span&gt;&lt;span class="s2"&gt;"https://flixty-abc123.run.app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;sessionSecret: &lt;/span&gt;&lt;span class="s2"&gt;"your-saved-session-secret"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;https://flixty.yourdomain.com/auth/&amp;lt;platform&amp;gt;/callback&lt;/code&gt; as the redirect URI when registering your OAuth apps on each platform.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 5 — Add platform OAuth credentials
&lt;/h3&gt;

&lt;p&gt;Redeploy with credentials for each platform you want to enable. You can add them all at once or one at a time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;nexusai_deploy_flixty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;provider:            &lt;/span&gt;&lt;span class="s2"&gt;"gcp_cloud_run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;baseUrl:             &lt;/span&gt;&lt;span class="s2"&gt;"https://flixty.yourdomain.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;sessionSecret:       &lt;/span&gt;&lt;span class="s2"&gt;"your-saved-session-secret"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;xClientId:           &lt;/span&gt;&lt;span class="s2"&gt;"x-oauth-client-id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;xClientSecret:       &lt;/span&gt;&lt;span class="s2"&gt;"x-oauth-client-secret"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;linkedinClientId:    &lt;/span&gt;&lt;span class="s2"&gt;"linkedin-client-id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;linkedinClientSecret&lt;/span&gt;&lt;span class="ss"&gt;:"linkedin-client-secret"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;fbAppId:             &lt;/span&gt;&lt;span class="s2"&gt;"facebook-app-id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;fbAppSecret:         &lt;/span&gt;&lt;span class="s2"&gt;"facebook-app-secret"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;googleClientId:      &lt;/span&gt;&lt;span class="s2"&gt;"google-client-id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;googleClientSecret:  &lt;/span&gt;&lt;span class="s2"&gt;"google-client-secret"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;anthropicApiKey:     &lt;/span&gt;&lt;span class="s2"&gt;"sk-ant-…"&lt;/span&gt;  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="sr"&gt;/ enables AI Assist
)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;fbAppId&lt;/code&gt; and &lt;code&gt;fbAppSecret&lt;/code&gt; enable both Facebook and Instagram. A single Facebook App handles both platforms via the Graph API.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Environment variables reference
&lt;/h2&gt;

&lt;p&gt;All variables are injected securely at runtime. None are baked into the image.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SESSION_SECRET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Express session signing key. Auto-generated (64-char hex) if not provided.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BASE_URL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes*&lt;/td&gt;
&lt;td&gt;Public HTTPS URL of your deployment. Required for OAuth redirect URIs. Set after first deploy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PORT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Auto-set&lt;/td&gt;
&lt;td&gt;Always &lt;code&gt;3000&lt;/code&gt;. Set automatically by NEXUS AI.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NODE_ENV&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Auto-set&lt;/td&gt;
&lt;td&gt;Always &lt;code&gt;production&lt;/code&gt; for PRODUCTION environment deployments.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Enables AI Assist (claude-sonnet-4-6) for caption generation and post variations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X_CLIENT_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;X/Twitter OAuth 2.0 Client ID. Required to enable X posting.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X_CLIENT_SECRET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;X/Twitter OAuth 2.0 Client Secret.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LINKEDIN_CLIENT_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;LinkedIn OAuth Client ID. Required to enable LinkedIn posting.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LINKEDIN_CLIENT_SECRET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;LinkedIn OAuth Client Secret.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FB_APP_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Facebook App ID. Enables both Facebook and Instagram via the Graph API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FB_APP_SECRET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Facebook App Secret.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TIKTOK_CLIENT_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;TikTok Client Key. Required to enable TikTok posting.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TIKTOK_CLIENT_SECRET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;TikTok Client Secret.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GOOGLE_CLIENT_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Google OAuth Client ID. Enables YouTube posting and Google Sign-In.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GOOGLE_CLIENT_SECRET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Google OAuth Client Secret.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;*&lt;code&gt;BASE_URL&lt;/code&gt; is technically optional on first deploy when the public URL is not yet known. Set it on the first redeploy once the deployment is running.&lt;/p&gt;




&lt;h2&gt;
  
  
  Managing your Flixty deployment
&lt;/h2&gt;

&lt;p&gt;NEXUS AI gives you full lifecycle control over every deployment. Here's a quick reference:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;MCP Tool&lt;/th&gt;
&lt;th&gt;When to use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Check status&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nexusai_deploy_status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;After deploying, or to get the public URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;View logs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nexusai_deploy_logs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Debug OAuth errors or startup failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redeploy&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nexusai_deploy_redeploy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Push updated env vars or a new code revision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stop studio&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nexusai_deploy_stop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pause to save compute costs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restart&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nexusai_deploy_start&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;After a stop, or after config changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rollback&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nexusai_deploy_rollback&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Revert to a previous working revision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nexusai_deploy_delete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Permanently tear down the deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Scaling your deployment
&lt;/h3&gt;

&lt;p&gt;Scale Flixty up to handle more concurrent users without redeploying:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;nexusai_deploy_scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;deploymentId: &lt;/span&gt;&lt;span class="s2"&gt;"7a2c91f0-…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;replicas:     &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or via the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus deploy scale flixty 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Custom domain
&lt;/h3&gt;

&lt;p&gt;Attach a custom domain so your OAuth redirect URIs stay stable across redeployments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;nexusai_domains_add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;deploymentId: &lt;/span&gt;&lt;span class="s2"&gt;"7a2c91f0-…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;domain:       &lt;/span&gt;&lt;span class="s2"&gt;"flixty.yourdomain.com"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Set up a custom domain before registering OAuth apps so your redirect URIs never change. Use &lt;code&gt;https://flixty.yourdomain.com/auth/&amp;lt;platform&amp;gt;/callback&lt;/code&gt; as the redirect URI template.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OAuth redirects fail after deploy
&lt;/h3&gt;

&lt;p&gt;This means &lt;code&gt;BASE_URL&lt;/code&gt; is not set or points to the wrong URL. Check the current value with &lt;code&gt;nexusai_deploy_status&lt;/code&gt; and redeploy with the correct public HTTPS URL. All OAuth callbacks are constructed from &lt;code&gt;BASE_URL&lt;/code&gt; at runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Posts fail for a specific platform
&lt;/h3&gt;

&lt;p&gt;The platform credentials for that network are missing or incorrect. Check that the relevant env vars (&lt;code&gt;X_CLIENT_ID&lt;/code&gt;, &lt;code&gt;FB_APP_ID&lt;/code&gt;, etc.) are set via &lt;code&gt;nexusai_deploy_status&lt;/code&gt;. Use &lt;code&gt;nexusai_deploy_logs&lt;/code&gt; to see the exact OAuth error returned by the platform's API.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Assist not working
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; is not set or the key is invalid. Redeploy with a valid Anthropic API key. Verify it starts with &lt;code&gt;sk-ant-&lt;/code&gt; and has not expired or been revoked in your Anthropic console.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployment stuck in "queued"
&lt;/h3&gt;

&lt;p&gt;Check that your cloud provider credentials are properly configured in NEXUS AI. For GCP, ensure your service account has Cloud Run developer permissions. Use &lt;code&gt;nexusai_deploy_logs&lt;/code&gt; to diagnose any build or startup failures — common causes are missing Node.js version compatibility or a &lt;code&gt;package.json&lt;/code&gt; install failure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Session errors after redeploy
&lt;/h3&gt;

&lt;p&gt;If you redeploy without passing the original &lt;code&gt;sessionSecret&lt;/code&gt;, a new secret is generated and all existing user sessions are invalidated. Always save and re-pass &lt;code&gt;sessionSecret&lt;/code&gt; on subsequent deploys to maintain session continuity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Flixty on NEXUS AI gives you a fully self-hosted social media publishing stack — no third-party SaaS dependencies, no per-seat pricing, no data leaving your cloud. You control the OAuth tokens, the session data, and the posting schedule.&lt;/p&gt;

&lt;p&gt;From here, explore attaching a custom domain for stable OAuth redirect URIs, enabling AI Assist with your Anthropic API key, or setting up a staging environment to test platform integrations before they go live.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try it now:&lt;/strong&gt; Head to &lt;a href="https://nexusai.run" rel="noopener noreferrer"&gt;nexusai.run&lt;/a&gt; and enable the NEXUS AI MCP connector in Claude to deploy Flixty with a single conversation in under 5 minutes.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;NEXUS AI — AI-native cloud infrastructure · &lt;a href="https://nexusai.run" rel="noopener noreferrer"&gt;nexusai.run&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>flixty</category>
      <category>devops</category>
      <category>nexusai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I replaced my entire GitHub Actions deploy pipeline with one command</title>
      <dc:creator>Saif Ali</dc:creator>
      <pubDate>Tue, 07 Apr 2026 16:56:29 +0000</pubDate>
      <link>https://dev.to/sali_ac161a1b71406354896c/i-replaced-my-entire-github-actions-deploy-pipeline-with-one-command-2o0j</link>
      <guid>https://dev.to/sali_ac161a1b71406354896c/i-replaced-my-entire-github-actions-deploy-pipeline-with-one-command-2o0j</guid>
      <description>&lt;p&gt;&lt;strong&gt;My GitHub Actions deploy workflow was 87 lines of YAML.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It had grown over 18 months from a clean 20-line file into something I was genuinely afraid to touch. It broke whenever a dependency updated. It had three hardcoded ARNs from an AWS account I was no longer using. It had a comment that said &lt;code&gt;# TODO: fix this&lt;/code&gt; that had been there for 11 months.&lt;/p&gt;

&lt;p&gt;Last month I deleted all 87 lines and replaced them with one command.&lt;/p&gt;

&lt;p&gt;Here's exactly how I did it — and what I learned along the way.&lt;/p&gt;




&lt;h2&gt;
  
  
  The YAML graveyard
&lt;/h2&gt;

&lt;p&gt;This was my deploy workflow. See if any of this feels familiar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to Production&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;20'&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;npm'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Configure AWS credentials&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/configure-aws-credentials@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;aws-access-key-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.AWS_ACCESS_KEY_ID }}&lt;/span&gt;
          &lt;span class="na"&gt;aws-secret-access-key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.AWS_SECRET_ACCESS_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;aws-region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Login to Amazon ECR&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;login-ecr&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/amazon-ecr-login@v1&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build Docker image&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ECR_REGISTRY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.login-ecr.outputs.registry }}&lt;/span&gt;
          &lt;span class="na"&gt;IMAGE_TAG&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.sha }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;docker build -t $ECR_REGISTRY/my-app:$IMAGE_TAG .&lt;/span&gt;
          &lt;span class="s"&gt;docker push $ECR_REGISTRY/my-app:$IMAGE_TAG&lt;/span&gt;
          &lt;span class="s"&gt;echo "IMAGE=$ECR_REGISTRY/my-app:$IMAGE_TAG" &amp;gt;&amp;gt; $GITHUB_ENV&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Download task definition&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;aws ecs describe-task-definition --task-definition my-app \&lt;/span&gt;
            &lt;span class="s"&gt;--query taskDefinition &amp;gt; task-definition.json&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Update ECS task definition&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;task-def&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/amazon-ecs-render-task-definition@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;task-definition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;task-definition.json&lt;/span&gt;
          &lt;span class="na"&gt;container-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.IMAGE }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to ECS&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/amazon-ecs-deploy-task-definition@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;task-definition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.task-def.outputs.task-definition }}&lt;/span&gt;
          &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app-service&lt;/span&gt;
          &lt;span class="na"&gt;cluster&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app-cluster&lt;/span&gt;
          &lt;span class="na"&gt;wait-for-service-stability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Notify on failure&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;failure()&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;curl -X POST ${{ secrets.SLACK_WEBHOOK_URL }} \&lt;/span&gt;
            &lt;span class="s"&gt;-H 'Content-type: application/json' \&lt;/span&gt;
            &lt;span class="s"&gt;--data '{"text":"Deploy failed! Check Actions."}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I wrote this. I'm not proud of it.&lt;/p&gt;

&lt;p&gt;The real problem wasn't the YAML itself. The problem was everything hidden &lt;em&gt;underneath&lt;/em&gt; the YAML:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An ECR repository I had to provision manually&lt;/li&gt;
&lt;li&gt;An ECS cluster, service, and task definition I had to set up in the console&lt;/li&gt;
&lt;li&gt;IAM roles with the exact right permissions (I guessed wrong twice)&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;Dockerfile&lt;/code&gt; I maintained separately&lt;/li&gt;
&lt;li&gt;AWS credentials rotated manually every 90 days&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pipeline was the visible part. The invisible part was 3 days of setup I did 18 months ago that I could no longer remember well enough to recreate.&lt;/p&gt;

&lt;p&gt;When a new teammate joined and asked "how does deploy work?" — I sent them the workflow file and said "it's complicated."&lt;/p&gt;

&lt;p&gt;That's not an answer. That's a warning sign.&lt;/p&gt;




&lt;h2&gt;
  
  
  The breaking point
&lt;/h2&gt;

&lt;p&gt;In February, I switched from Node 18 to Node 20. The Docker build broke because my base image was pinned to &lt;code&gt;node:18-alpine&lt;/code&gt; in three different places — the Dockerfile, the Actions workflow, and a &lt;code&gt;.nvmrc&lt;/code&gt; file I had forgotten existed.&lt;/p&gt;

&lt;p&gt;The fix took 45 minutes. The error message was not helpful. I fixed it by diffing my Dockerfile against a Stack Overflow answer from 2023.&lt;/p&gt;

&lt;p&gt;Two weeks later, AWS deprecated the &lt;code&gt;amazon-ecs-render-task-definition@v1&lt;/code&gt; action. The pipeline broke silently — it ran, reported success, but the new image never actually deployed. I found out because a user filed a bug for something I had &lt;em&gt;definitely&lt;/em&gt; already fixed.&lt;/p&gt;

&lt;p&gt;That was the moment I decided: the pipeline is not worth maintaining.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I tried first
&lt;/h2&gt;

&lt;p&gt;I looked at Render and Railway. Both are good products. Neither deploys into my own AWS account — they provision their own infrastructure. My company has a compliance requirement that customer data stays in a customer-owned AWS environment. So those were out.&lt;/p&gt;

&lt;p&gt;I looked at AWS CodePipeline. I wanted to solve complexity, not add more of it.&lt;/p&gt;

&lt;p&gt;Then a colleague mentioned &lt;a href="https://nexusai.run" rel="noopener noreferrer"&gt;NEXUS AI&lt;/a&gt;. He described it as "a CLI that handles all the ECS stuff so you don't have to." I was skeptical. That's what everyone says.&lt;/p&gt;




&lt;h2&gt;
  
  
  The initial deploy
&lt;/h2&gt;

&lt;p&gt;I installed the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @nexusai/cli
nexus login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I pointed it at my repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus deploy &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--repo&lt;/span&gt; https://github.com/myorg/my-app &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; my-app &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--provider&lt;/span&gt; aws_ecs_fargate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I expected this to fail immediately. My expectations for new DevOps tools are calibrated by years of experience.&lt;/p&gt;

&lt;p&gt;It didn't fail. Four and a half minutes later I got back a URL. The app was running. The same app. In my AWS account.&lt;/p&gt;

&lt;p&gt;I checked the AWS console out of habit. There was an ECS cluster. A task definition. A service. An ECR repository with the image in it. NEXUS AI had provisioned all of it.&lt;/p&gt;

&lt;p&gt;I had not written a Dockerfile. I had not configured any IAM roles. I had not touched the AWS console.&lt;/p&gt;

&lt;p&gt;I sat with that for a moment.&lt;/p&gt;




&lt;h2&gt;
  
  
  What actually happens under the hood
&lt;/h2&gt;

&lt;p&gt;Here's what &lt;code&gt;nexus deploy source&lt;/code&gt; does, in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reads your repo&lt;/strong&gt; — detects the runtime from &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;requirements.txt&lt;/code&gt;, &lt;code&gt;go.mod&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builds the container&lt;/strong&gt; on NEXUS AI's build infrastructure — not your machine, not a GitHub runner&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pushes the image&lt;/strong&gt; to an ECR repository it provisions in your account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creates (or updates) the ECS infrastructure&lt;/strong&gt; — cluster, task definition, service, load balancer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issues a TLS certificate&lt;/strong&gt; via ACM and wires it to the load balancer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Waits for health checks&lt;/strong&gt; to pass before returning the live URL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Steps 3–5 are the 3 days of manual work I did 18 months ago. They now run in parallel and take about 3 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The new GitHub Actions workflow
&lt;/h2&gt;

&lt;p&gt;Here's my deploy workflow today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to Production&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;20'&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;npm'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;

  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nexus deploy redeploy --deployment-id ${{ secrets.NEXUSAI_DEPLOYMENT_ID }}&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;NEXUSAI_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.NEXUSAI_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;24 lines, including &lt;code&gt;name:&lt;/code&gt; fields and blank lines.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;deploy&lt;/code&gt; job has one step. It calls &lt;code&gt;nexus deploy redeploy&lt;/code&gt;, which tells NEXUS AI to rebuild from the latest commit and roll it out with a rolling update. No Docker commands. No AWS credentials. No ECR. No ECS task definition wrangling.&lt;/p&gt;

&lt;p&gt;I kept the &lt;code&gt;test&lt;/code&gt; job. NEXUS AI doesn't replace your test suite — it replaces everything &lt;em&gt;after&lt;/em&gt; tests pass.&lt;/p&gt;




&lt;h2&gt;
  
  
  Secrets and environment variables
&lt;/h2&gt;

&lt;p&gt;Before, I had secrets in three places: GitHub Actions secrets (for the pipeline), AWS Secrets Manager (for the app), and a &lt;code&gt;.env.example&lt;/code&gt; file that was always slightly out of date.&lt;/p&gt;

&lt;p&gt;Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus secret &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgres://user:pass@host/db &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nv"&gt;STRIPE_SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk_live_... &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nv"&gt;NODE_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are encrypted at rest and injected as environment variables when the container starts. The pipeline only needs &lt;code&gt;NEXUSAI_TOKEN&lt;/code&gt; — one secret instead of seven.&lt;/p&gt;

&lt;p&gt;After updating secrets, one command applies them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus deploy redeploy &lt;span class="nt"&gt;--deployment-id&lt;/span&gt; &amp;lt;your-deployment-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Rollback
&lt;/h2&gt;

&lt;p&gt;Old workflow rollback: figure out the previous image SHA, manually update the ECS task definition, trigger a new deployment, hope the old image hasn't been cleaned up by the ECR lifecycle policy.&lt;/p&gt;

&lt;p&gt;New rollback:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus deploy rollback &lt;span class="nt"&gt;--deployment-id&lt;/span&gt; &amp;lt;your-deployment-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reverts to the previous container image. Health checks run. Done. I've used this twice. Both times took under 90 seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Redeployment speed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;First deploy:&lt;/strong&gt; ~4.5 minutes (infrastructure provisioning included).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subsequent deploys:&lt;/strong&gt; 60–90 seconds. Infrastructure is already provisioned, so it's just build → push → rolling update.&lt;/p&gt;

&lt;p&gt;My old pipeline took 10–12 minutes. Most of that was the Docker build running on GitHub's shared runners plus the ECS service stability wait.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I lost
&lt;/h2&gt;

&lt;p&gt;Every tool has trade-offs. These are the real ones:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Less visibility into the build environment.&lt;/strong&gt; With a Dockerfile I wrote, I knew exactly what was in the image. With source-based deployment, NEXUS AI generates the image. You can inspect it — &lt;code&gt;nexus deploy logs&lt;/code&gt; gives the full build output — but you're not authoring the Dockerfile. For most apps this is fine. If you have specific system dependencies (custom C extensions, obscure shared libraries), test carefully.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first deploy takes time.&lt;/strong&gt; Infrastructure provisioning isn't instant. If you need sub-30-second cold deploys for some reason, this isn't that. But once infrastructure exists, redeployments are fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're adding a dependency.&lt;/strong&gt; NEXUS AI is now in your deploy path. Worth knowing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Old workflow&lt;/th&gt;
&lt;th&gt;New workflow&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lines of YAML&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pipeline runtime&lt;/td&gt;
&lt;td&gt;10–12 min&lt;/td&gt;
&lt;td&gt;60–90 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS console setup&lt;/td&gt;
&lt;td&gt;~3 days (one-time)&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secrets locations&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rollback steps&lt;/td&gt;
&lt;td&gt;~6 manual steps&lt;/td&gt;
&lt;td&gt;1 command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last random breakage&lt;/td&gt;
&lt;td&gt;November&lt;/td&gt;
&lt;td&gt;Hasn't happened&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How to try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @nexusai/cli

&lt;span class="c"&gt;# Authenticate&lt;/span&gt;
nexus login

&lt;span class="c"&gt;# First deploy — detects Node/Python/Go automatically, no Dockerfile needed&lt;/span&gt;
nexus deploy &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--repo&lt;/span&gt; https://github.com/your/repo &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; my-app &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--provider&lt;/span&gt; aws_ecs_fargate   &lt;span class="c"&gt;# or gcp_cloud_run, azure_container_apps&lt;/span&gt;

&lt;span class="c"&gt;# Check status&lt;/span&gt;
nexus deploy status &lt;span class="nt"&gt;--deployment-id&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# Set environment variables&lt;/span&gt;
nexus secret &lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;value &lt;span class="nv"&gt;KEY2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;value2

&lt;span class="c"&gt;# Redeploy (use this in CI)&lt;/span&gt;
nexus deploy redeploy &lt;span class="nt"&gt;--deployment-id&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# Rollback&lt;/span&gt;
nexus deploy rollback &lt;span class="nt"&gt;--deployment-id&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For CI/CD: add &lt;code&gt;NEXUSAI_TOKEN&lt;/code&gt; and &lt;code&gt;NEXUSAI_DEPLOYMENT_ID&lt;/code&gt; as secrets in your GitHub repo settings, then replace your deploy steps with the one-liner from the workflow above.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;The 87-line YAML file wasn't the real cost. The real cost was the cognitive overhead of owning it — the 45-minute debugging session when Node versions drifted, the silent failure when an Action was deprecated, the "it's complicated" I sent to a new teammate.&lt;/p&gt;

&lt;p&gt;I don't miss any of that.&lt;/p&gt;

&lt;p&gt;If you're maintaining a pipeline like the one I had, it's worth spending 20 minutes to find out how much of it you can delete.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building something and want to compare notes? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I replaced my entire GitHub Actions deploy pipeline with one command</title>
      <dc:creator>Saif Ali</dc:creator>
      <pubDate>Sat, 04 Apr 2026 11:14:28 +0000</pubDate>
      <link>https://dev.to/sali_ac161a1b71406354896c/i-replaced-my-entire-github-actions-deploy-pipeline-with-one-command-2h95</link>
      <guid>https://dev.to/sali_ac161a1b71406354896c/i-replaced-my-entire-github-actions-deploy-pipeline-with-one-command-2h95</guid>
      <description>&lt;p&gt;My GitHub Actions deploy workflow was 87 lines of YAML.&lt;/p&gt;

&lt;p&gt;It had grown over 18 months from a clean 20-line file into something I was genuinely afraid to touch. It broke whenever a dependency updated. It had three hardcoded ARNs from an AWS account I was no longer using. It had a comment that said &lt;code&gt;# TODO: fix this&lt;/code&gt; that had been there for 11 months.&lt;/p&gt;

&lt;p&gt;Last month I deleted all 87 lines and replaced them with one command.&lt;/p&gt;

&lt;p&gt;Here's exactly how I did it — and what I learned along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The YAML graveyard
&lt;/h2&gt;

&lt;p&gt;This was my deploy workflow. See if any of this feels familiar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to Production&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;20'&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;npm'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Configure AWS credentials&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/configure-aws-credentials@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;aws-access-key-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.AWS_ACCESS_KEY_ID }}&lt;/span&gt;
          &lt;span class="na"&gt;aws-secret-access-key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.AWS_SECRET_ACCESS_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;aws-region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Login to Amazon ECR&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;login-ecr&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/amazon-ecr-login@v1&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build Docker image&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ECR_REGISTRY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.login-ecr.outputs.registry }}&lt;/span&gt;
          &lt;span class="na"&gt;IMAGE_TAG&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.sha }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;docker build -t $ECR_REGISTRY/my-app:$IMAGE_TAG .&lt;/span&gt;
          &lt;span class="s"&gt;docker push $ECR_REGISTRY/my-app:$IMAGE_TAG&lt;/span&gt;
          &lt;span class="s"&gt;echo "IMAGE=$ECR_REGISTRY/my-app:$IMAGE_TAG" &amp;gt;&amp;gt; $GITHUB_ENV&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Download task definition&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;aws ecs describe-task-definition --task-definition my-app \&lt;/span&gt;
            &lt;span class="s"&gt;--query taskDefinition &amp;gt; task-definition.json&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Update ECS task definition&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;task-def&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/amazon-ecs-render-task-definition@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;task-definition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;task-definition.json&lt;/span&gt;
          &lt;span class="na"&gt;container-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.IMAGE }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to ECS&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/amazon-ecs-deploy-task-definition@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;task-definition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.task-def.outputs.task-definition }}&lt;/span&gt;
          &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app-service&lt;/span&gt;
          &lt;span class="na"&gt;cluster&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app-cluster&lt;/span&gt;
          &lt;span class="na"&gt;wait-for-service-stability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Notify on failure&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;failure()&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;curl -X POST ${{ secrets.SLACK_WEBHOOK_URL }} \&lt;/span&gt;
            &lt;span class="s"&gt;-H 'Content-type: application/json' \&lt;/span&gt;
            &lt;span class="s"&gt;--data '{"text":"Deploy failed! Check Actions."}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I wrote this. I'm not proud of it.&lt;/p&gt;

&lt;p&gt;The real problem wasn't the YAML itself. The problem was everything hidden &lt;em&gt;underneath&lt;/em&gt; the YAML:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An ECR repository I had to provision manually&lt;/li&gt;
&lt;li&gt;An ECS cluster, service, and task definition I had to set up in the console&lt;/li&gt;
&lt;li&gt;IAM roles with the exact right permissions (I guessed wrong twice)&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;Dockerfile&lt;/code&gt; I maintained separately&lt;/li&gt;
&lt;li&gt;AWS credentials rotated manually every 90 days&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pipeline was the visible part. The invisible part was 3 days of setup I did 18 months ago that I could no longer remember well enough to recreate.&lt;/p&gt;

&lt;p&gt;When a new teammate joined and asked "how does deploy work?" — I sent them the workflow file and said "it's complicated."&lt;/p&gt;

&lt;p&gt;That's not an answer. That's a warning sign.&lt;/p&gt;




&lt;h2&gt;
  
  
  The breaking point
&lt;/h2&gt;

&lt;p&gt;In February, I switched from Node 18 to Node 20. The Docker build broke because my base image was pinned to &lt;code&gt;node:18-alpine&lt;/code&gt; in three different places — the Dockerfile, the Actions workflow, and a &lt;code&gt;.nvmrc&lt;/code&gt; file I had forgotten existed.&lt;/p&gt;

&lt;p&gt;The fix took 45 minutes. The error message was not helpful. I fixed it by diffing my Dockerfile against a Stack Overflow answer from 2023.&lt;/p&gt;

&lt;p&gt;Two weeks later, AWS deprecated the &lt;code&gt;amazon-ecs-render-task-definition@v1&lt;/code&gt; action. The pipeline broke silently — it ran, reported success, but the new image never actually deployed. I found out because a user filed a bug for something I had &lt;em&gt;definitely&lt;/em&gt; already fixed.&lt;/p&gt;

&lt;p&gt;That was the moment I decided: the pipeline is not worth maintaining.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I tried first
&lt;/h2&gt;

&lt;p&gt;I looked at Render and Railway. Both are good products. Neither deploys into my own AWS account — they provision their own infrastructure. My company has a compliance requirement that customer data stays in a customer-owned AWS environment. So those were out.&lt;/p&gt;

&lt;p&gt;I looked at AWS CodePipeline. I wanted to solve complexity, not add more of it.&lt;/p&gt;

&lt;p&gt;Then a colleague mentioned &lt;a href="https://nexusai.run" rel="noopener noreferrer"&gt;NEXUS AI&lt;/a&gt;. He described it as "a CLI that handles all the ECS stuff so you don't have to." I was skeptical. That's what everyone says.&lt;/p&gt;




&lt;h2&gt;
  
  
  The initial deploy
&lt;/h2&gt;

&lt;p&gt;I installed the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @nexusai/cli
nexus login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I pointed it at my repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus deploy &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--repo&lt;/span&gt; https://github.com/myorg/my-app &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; my-app &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--provider&lt;/span&gt; aws_ecs_fargate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I expected this to fail immediately. My expectations for new DevOps tools are calibrated by years of experience.&lt;/p&gt;

&lt;p&gt;It didn't fail. Four and a half minutes later I got back a URL. The app was running. The same app. In my AWS account.&lt;/p&gt;

&lt;p&gt;I checked the AWS console out of habit. There was an ECS cluster. A task definition. A service. An ECR repository with the image in it. NEXUS AI had provisioned all of it.&lt;/p&gt;

&lt;p&gt;I had not written a Dockerfile. I had not configured any IAM roles. I had not touched the AWS console.&lt;/p&gt;

&lt;p&gt;I sat with that for a moment.&lt;/p&gt;




&lt;h2&gt;
  
  
  What actually happens under the hood
&lt;/h2&gt;

&lt;p&gt;Here's what &lt;code&gt;nexus deploy source&lt;/code&gt; does, in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reads your repo&lt;/strong&gt; — detects the runtime from &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;requirements.txt&lt;/code&gt;, &lt;code&gt;go.mod&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builds the container&lt;/strong&gt; on NEXUS AI's build infrastructure — not your machine, not a GitHub runner&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pushes the image&lt;/strong&gt; to an ECR repository it provisions in your account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creates (or updates) the ECS infrastructure&lt;/strong&gt; — cluster, task definition, service, load balancer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issues a TLS certificate&lt;/strong&gt; via ACM and wires it to the load balancer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Waits for health checks&lt;/strong&gt; to pass before returning the live URL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Steps 3–5 are the 3 days of manual work I did 18 months ago. They now run in parallel and take about 3 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The new GitHub Actions workflow
&lt;/h2&gt;

&lt;p&gt;Here's my deploy workflow today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to Production&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;20'&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;npm'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;

  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nexus deploy redeploy --deployment-id ${{ secrets.NEXUSAI_DEPLOYMENT_ID }}&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;NEXUSAI_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.NEXUSAI_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;24 lines, including &lt;code&gt;name:&lt;/code&gt; fields and blank lines.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;deploy&lt;/code&gt; job has one step. It calls &lt;code&gt;nexus deploy redeploy&lt;/code&gt;, which tells NEXUS AI to rebuild from the latest commit and roll it out with a rolling update. No Docker commands. No AWS credentials. No ECR. No ECS task definition wrangling.&lt;/p&gt;

&lt;p&gt;I kept the &lt;code&gt;test&lt;/code&gt; job. NEXUS AI doesn't replace your test suite — it replaces everything &lt;em&gt;after&lt;/em&gt; tests pass.&lt;/p&gt;




&lt;h2&gt;
  
  
  Secrets and environment variables
&lt;/h2&gt;

&lt;p&gt;Before, I had secrets in three places: GitHub Actions secrets (for the pipeline), AWS Secrets Manager (for the app), and a &lt;code&gt;.env.example&lt;/code&gt; file that was always slightly out of date.&lt;/p&gt;

&lt;p&gt;Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus secret &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgres://user:pass@host/db &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nv"&gt;STRIPE_SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk_live_... &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nv"&gt;NODE_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are encrypted at rest and injected as environment variables when the container starts. The pipeline only needs &lt;code&gt;NEXUSAI_TOKEN&lt;/code&gt; — one secret instead of seven.&lt;/p&gt;

&lt;p&gt;After updating secrets, one command applies them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus deploy redeploy &lt;span class="nt"&gt;--deployment-id&lt;/span&gt; &amp;lt;your-deployment-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Rollback
&lt;/h2&gt;

&lt;p&gt;Old workflow rollback: figure out the previous image SHA, manually update the ECS task definition, trigger a new deployment, hope the old image hasn't been cleaned up by the ECR lifecycle policy.&lt;/p&gt;

&lt;p&gt;New rollback:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus deploy rollback &lt;span class="nt"&gt;--deployment-id&lt;/span&gt; &amp;lt;your-deployment-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reverts to the previous container image. Health checks run. Done. I've used this twice. Both times took under 90 seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Redeployment speed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;First deploy:&lt;/strong&gt; ~4.5 minutes (infrastructure provisioning included).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subsequent deploys:&lt;/strong&gt; 60–90 seconds. Infrastructure is already provisioned, so it's just build → push → rolling update.&lt;/p&gt;

&lt;p&gt;My old pipeline took 10–12 minutes. Most of that was the Docker build running on GitHub's shared runners plus the ECS service stability wait.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I lost
&lt;/h2&gt;

&lt;p&gt;Every tool has trade-offs. These are the real ones:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Less visibility into the build environment.&lt;/strong&gt; With a Dockerfile I wrote, I knew exactly what was in the image. With source-based deployment, NEXUS AI generates the image. You can inspect it — &lt;code&gt;nexus deploy logs&lt;/code&gt; gives the full build output — but you're not authoring the Dockerfile. For most apps this is fine. If you have specific system dependencies (custom C extensions, obscure shared libraries), test carefully.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first deploy takes time.&lt;/strong&gt; Infrastructure provisioning isn't instant. If you need sub-30-second cold deploys for some reason, this isn't that. But once infrastructure exists, redeployments are fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're adding a dependency.&lt;/strong&gt; NEXUS AI is now in your deploy path. Worth knowing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Old workflow&lt;/th&gt;
&lt;th&gt;New workflow&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lines of YAML&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pipeline runtime&lt;/td&gt;
&lt;td&gt;10–12 min&lt;/td&gt;
&lt;td&gt;60–90 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS console setup&lt;/td&gt;
&lt;td&gt;~3 days (one-time)&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secrets locations&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rollback steps&lt;/td&gt;
&lt;td&gt;~6 manual steps&lt;/td&gt;
&lt;td&gt;1 command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last random breakage&lt;/td&gt;
&lt;td&gt;November&lt;/td&gt;
&lt;td&gt;Hasn't happened&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How to try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @nexusai/cli

&lt;span class="c"&gt;# Authenticate&lt;/span&gt;
nexus login

&lt;span class="c"&gt;# First deploy — detects Node/Python/Go automatically, no Dockerfile needed&lt;/span&gt;
nexus deploy &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--repo&lt;/span&gt; https://github.com/your/repo &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; my-app &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--provider&lt;/span&gt; aws_ecs_fargate   &lt;span class="c"&gt;# or gcp_cloud_run, azure_container_apps&lt;/span&gt;

&lt;span class="c"&gt;# Check status&lt;/span&gt;
nexus deploy status &lt;span class="nt"&gt;--deployment-id&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# Set environment variables&lt;/span&gt;
nexus secret &lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;value &lt;span class="nv"&gt;KEY2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;value2

&lt;span class="c"&gt;# Redeploy (use this in CI)&lt;/span&gt;
nexus deploy redeploy &lt;span class="nt"&gt;--deployment-id&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# Rollback&lt;/span&gt;
nexus deploy rollback &lt;span class="nt"&gt;--deployment-id&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For CI/CD: add &lt;code&gt;NEXUSAI_TOKEN&lt;/code&gt; and &lt;code&gt;NEXUSAI_DEPLOYMENT_ID&lt;/code&gt; as secrets in your GitHub repo settings, then replace your deploy steps with the one-liner from the workflow above.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;The 87-line YAML file wasn't the real cost. The real cost was the cognitive overhead of owning it — the 45-minute debugging session when Node versions drifted, the silent failure when an Action was deprecated, the "it's complicated" I sent to a new teammate.&lt;/p&gt;

&lt;p&gt;I don't miss any of that.&lt;/p&gt;

&lt;p&gt;If you're maintaining a pipeline like the one I had, it's worth spending 20 minutes to find out how much of it you can delete.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building something and want to compare notes? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>github</category>
      <category>deployment</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Complete Claude Code Tutorial: Build and Deploy an AI App in an Afternoon</title>
      <dc:creator>Saif Ali</dc:creator>
      <pubDate>Sun, 29 Mar 2026 15:16:16 +0000</pubDate>
      <link>https://dev.to/sali_ac161a1b71406354896c/the-complete-claude-code-tutorial-build-and-deploy-an-ai-app-in-an-afternoon-4ij</link>
      <guid>https://dev.to/sali_ac161a1b71406354896c/the-complete-claude-code-tutorial-build-and-deploy-an-ai-app-in-an-afternoon-4ij</guid>
      <description>&lt;p&gt;Most Claude Code tutorials stop at "here's how to install it." That's like teaching someone to drive by showing them the ignition. This Claude Code tutorial goes further — you'll use it to build a real AI-powered app from scratch and deploy it to production, step by step.&lt;/p&gt;

&lt;p&gt;By the end you'll have a working document Q&amp;amp;A API and a live deployment URL. The whole thing takes about an afternoon.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Claude Code actually is (and why it's different)
&lt;/h2&gt;

&lt;p&gt;Claude Code is Anthropic's AI coding agent that runs in your terminal. Unlike copilot-style tools that suggest individual lines inside an editor, Claude Code operates at the project level — it reads your entire codebase, understands how files relate to each other, and makes multi-file changes with full context.&lt;/p&gt;

&lt;p&gt;The practical difference: you describe what you want to build, and Claude Code writes the code, runs commands, fixes errors, and iterates — without you switching between a chat window and your editor. It's AI-augmented development where the AI is a collaborator in your actual workflow, not a suggestion box beside it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it powerful for AI app development specifically:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It can generate boilerplate for FastAPI, Express, or any framework in seconds&lt;/li&gt;
&lt;li&gt;It writes tests alongside the code it generates&lt;/li&gt;
&lt;li&gt;It catches its own mistakes by running the code and reading error output&lt;/li&gt;
&lt;li&gt;It handles the tedious parts (CI config, requirements.txt, test scaffolding) while you focus on the actual problem&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Getting started: install and configure Claude Code
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Requires Node.js 18+. Verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Authenticate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On first run, Claude Code opens a browser window to authenticate with your Anthropic account. Once authenticated, it drops you into an interactive session in your current directory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Your first command
&lt;/h3&gt;

&lt;p&gt;Navigate to an empty project folder and try:&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;my-ai-app &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;my-ai-app
claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the Claude Code prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Scaffold a FastAPI project with a single /health endpoint, a requirements.txt, and a .gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code will create the files, show you what it's doing, and confirm. This is the core interaction pattern: describe the outcome, let it execute.&lt;/p&gt;




&lt;h2&gt;
  
  
  Build a real AI app with Claude Code
&lt;/h2&gt;

&lt;p&gt;We're building a &lt;strong&gt;document Q&amp;amp;A API&lt;/strong&gt; — you upload a text document, ask questions about it, and get answers grounded in the document's content. It's a practical RAG (retrieval-augmented generation) pattern used in real products.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 — Scaffold the project
&lt;/h3&gt;

&lt;p&gt;In your Claude Code session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Create a FastAPI app for document Q&amp;amp;A. The app should:
&amp;gt; - Accept a POST /upload endpoint that takes a text file and stores it in memory
&amp;gt; - Accept a POST /ask endpoint that takes a document_id and a question, then answers using OpenAI gpt-4o-mini
&amp;gt; - Return answers in JSON with the answer text and a confidence field
&amp;gt; - Include a requirements.txt with fastapi, uvicorn, openai, and python-multipart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code will generate the full project structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-ai-app/
├── main.py
├── requirements.txt
├── .gitignore
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It writes the entire &lt;code&gt;main.py&lt;/code&gt; — endpoints, in-memory document store, OpenAI call — in one pass.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 — Run it and fix errors
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Run the app locally with uvicorn and show me any errors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code executes &lt;code&gt;uvicorn main:app --reload&lt;/code&gt;, reads the output, and if there are import errors or missing packages it fixes them automatically. This loop — run, read error, fix — is where Claude Code earns its keep. You don't context-switch; it just handles it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 — Add real retrieval (not just stuffing the whole document)
&lt;/h3&gt;

&lt;p&gt;The naive version sends the entire document to the model on every question. That breaks on large files and wastes tokens. Ask Claude Code to improve it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; The current /ask endpoint sends the full document to OpenAI on every request.
&amp;gt; Refactor it to:
&amp;gt; - Split documents into 500-token chunks on upload
&amp;gt; - Use cosine similarity on TF-IDF vectors to find the top 3 relevant chunks
&amp;gt; - Only send those 3 chunks to OpenAI as context
&amp;gt; - Use numpy and sklearn for the vector operations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is multi-file, multi-concept work. Claude Code will update &lt;code&gt;main.py&lt;/code&gt;, add &lt;code&gt;sklearn&lt;/code&gt; and &lt;code&gt;numpy&lt;/code&gt; to &lt;code&gt;requirements.txt&lt;/code&gt;, and implement the chunking + retrieval logic coherently. It understands that changing the upload flow affects the query flow and handles both.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 — Write tests
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Write pytest tests for both endpoints. Include:
&amp;gt; - A test that uploads a sample document and verifies the document_id is returned
&amp;gt; - A test that uploads a document, then asks a question whose answer is clearly in the document
&amp;gt; - A test that asks about a document_id that doesn't exist and expects a 404
&amp;gt; Mock the OpenAI call so tests don't need a real API key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code generates &lt;code&gt;test_main.py&lt;/code&gt; with the exact structure you described, uses &lt;code&gt;pytest-mock&lt;/code&gt; for the OpenAI mock, and adds the test dependencies to &lt;code&gt;requirements.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Run them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Run the tests and fix any failures
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code runs &lt;code&gt;pytest&lt;/code&gt;, reads the output, and iterates until they pass. The critical detail: it doesn't just generate tests and hand them back — it runs them and closes the feedback loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  The CLAUDE.md file: your project's AI instruction layer
&lt;/h2&gt;

&lt;p&gt;One of the most underused Claude Code features is &lt;code&gt;CLAUDE.md&lt;/code&gt; — a file in your project root that Claude Code reads at the start of every session. Think of it as a permanent briefing document for your AI collaborator.&lt;/p&gt;

&lt;p&gt;Create one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Create a CLAUDE.md for this project that documents:
&amp;gt; - The tech stack (FastAPI, OpenAI, sklearn)
&amp;gt; - The coding conventions we used (snake_case, type hints everywhere, docstrings on public functions)
&amp;gt; - The test setup (pytest, mock OpenAI calls)
&amp;gt; - What the /upload and /ask endpoints do
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From this point on, any new Claude Code session on this project starts with full context. You don't re-explain the stack every time.&lt;/p&gt;

&lt;p&gt;A good &lt;code&gt;CLAUDE.md&lt;/code&gt; includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project: Document Q&amp;amp;A API&lt;/span&gt;

&lt;span class="gu"&gt;## Stack&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; FastAPI + Uvicorn (Python 3.11)
&lt;span class="p"&gt;-&lt;/span&gt; OpenAI gpt-4o-mini for generation
&lt;span class="p"&gt;-&lt;/span&gt; sklearn TF-IDF + cosine similarity for retrieval
&lt;span class="p"&gt;-&lt;/span&gt; pytest + pytest-mock for testing

&lt;span class="gu"&gt;## Conventions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Type hints on all function signatures
&lt;span class="p"&gt;-&lt;/span&gt; Snake_case everywhere
&lt;span class="p"&gt;-&lt;/span&gt; Docstrings on all public functions

&lt;span class="gu"&gt;## Architecture&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Documents stored in-memory (dict keyed by UUID)
&lt;span class="p"&gt;-&lt;/span&gt; Chunks: 500 tokens, 50-token overlap
&lt;span class="p"&gt;-&lt;/span&gt; Top 3 chunks retrieved per query

&lt;span class="gu"&gt;## Running locally&lt;/span&gt;
uvicorn main:app --reload --port 8000

&lt;span class="gu"&gt;## Running tests&lt;/span&gt;
pytest -v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Deploy to production with the NEXUS AI CLI
&lt;/h2&gt;

&lt;p&gt;Your app is built and tested. Now get it live — no Dockerfile required.&lt;/p&gt;

&lt;p&gt;NEXUS AI detects your framework, builds the container for you, and deploys it. You push source code; NEXUS AI handles everything from there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5 — Push source to GitHub
&lt;/h3&gt;

&lt;p&gt;Initialize a repo and push:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"initial: document Q&amp;amp;A API"&lt;/span&gt;
gh repo create my-ai-app &lt;span class="nt"&gt;--public&lt;/span&gt; &lt;span class="nt"&gt;--source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--push&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or push to an existing repo. The only requirement is that your &lt;code&gt;requirements.txt&lt;/code&gt; is at the project root — NEXUS AI uses it to detect that this is a Python app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6 — Install the NEXUS AI CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Linux&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://nexusai.run/install.sh | bash

&lt;span class="c"&gt;# macOS&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://nexusai.run/install-mac.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 7 — Deploy from source
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Log in to NEXUS AI&lt;/span&gt;
nexus auth login

&lt;span class="c"&gt;# Deploy directly from your GitHub repo — no Docker required&lt;/span&gt;
nexus deploy &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--repo&lt;/span&gt; https://github.com/your-org/my-ai-app &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; doc-qa-api &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 8000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--provider&lt;/span&gt; gcp_cloud_run

&lt;span class="c"&gt;# Add the OpenAI key as an encrypted secret&lt;/span&gt;
nexus secret create OPENAI_API_KEY &lt;span class="nt"&gt;--deployment&lt;/span&gt; doc-qa-api

&lt;span class="c"&gt;# Attach a custom domain&lt;/span&gt;
nexus domain add api.yourcompany.com &lt;span class="nt"&gt;--deployment&lt;/span&gt; doc-qa-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;NEXUS AI clones your repo, detects the Python/FastAPI framework, builds a production container image, and deploys it. Within 2–3 minutes you have a live URL with TLS and autoscaling. Stream logs to verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus deploy logs doc-qa-api &lt;span class="nt"&gt;--follow&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Automate deploys with GitHub Actions
&lt;/h3&gt;

&lt;p&gt;Ask Claude Code to write the CI/CD config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;Write&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;GitHub&lt;/span&gt; &lt;span class="err"&gt;Actions&lt;/span&gt; &lt;span class="err"&gt;workflow&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;redeploys&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;NEXUS&lt;/span&gt; &lt;span class="err"&gt;AI&lt;/span&gt; &lt;span class="err"&gt;deployment&lt;/span&gt; &lt;span class="err"&gt;on&lt;/span&gt; &lt;span class="err"&gt;every&lt;/span&gt; &lt;span class="err"&gt;push&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;main.&lt;/span&gt;
&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="s"&gt; Use NEXUSAI_TOKEN as a secret. The deployment name is doc-qa-api.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code generates a complete &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;. The workflow calls &lt;code&gt;nexus deploy redeploy doc-qa-api&lt;/code&gt; — NEXUS AI pulls the latest source, rebuilds the container, and rolls it out. Every push to &lt;code&gt;main&lt;/code&gt; goes to production automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Advanced Claude Code patterns for AI development
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Multi-file refactoring
&lt;/h3&gt;

&lt;p&gt;Claude Code handles refactors that would take hours manually. Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; The document store is currently an in-memory dict. Refactor it to use Redis so documents
&amp;gt; persist across server restarts. Update all references, add redis to requirements.txt,
&amp;gt; and update the CLAUDE.md architecture section.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It updates &lt;code&gt;main.py&lt;/code&gt;, &lt;code&gt;requirements.txt&lt;/code&gt;, and &lt;code&gt;CLAUDE.md&lt;/code&gt; in one coherent pass — and since NEXUS AI builds from source, you just push the changes and redeploy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Debugging without context-switching
&lt;/h3&gt;

&lt;p&gt;When something breaks in production:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus deploy logs doc-qa-api &lt;span class="nt"&gt;--tail&lt;/span&gt; 50
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy the error, paste it into Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Getting this error in production logs: [paste error]
&amp;gt; Find the root cause and fix it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code reads the relevant code, identifies the issue, and applies the fix — all without you manually tracing through stack traces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using Claude Code for code review
&lt;/h3&gt;

&lt;p&gt;Before opening a PR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gi"&gt;&amp;gt; Review the changes in git diff HEAD~1 for:
&amp;gt; - Security issues (injection, hardcoded secrets, unsafe deserialization)
&amp;gt; - Missing input validation on the API endpoints
&amp;gt; - Performance issues in the chunking logic
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code runs the diff and produces a structured review with specific line references.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Claude Code mistakes to avoid
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Giving vague prompts.&lt;/strong&gt; "Make this better" produces mediocre output. "Refactor the chunking function to reduce memory allocation by processing tokens in a streaming fashion instead of loading the full document" produces a specific, actionable change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not using CLAUDE.md.&lt;/strong&gt; Without it, you re-explain your stack every session. Ten minutes setting it up saves hours over the life of a project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accepting the first output blindly.&lt;/strong&gt; Claude Code is fast, not infallible. Run the tests after every significant change. When they fail, let Claude Code fix them — that feedback loop is what makes it reliable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Letting it over-engineer.&lt;/strong&gt; Claude Code will sometimes propose abstractions you don't need. If you asked for a simple endpoint and got a three-layer architecture with an abstract repository pattern, push back: "Simplify this — no abstraction layers, just the endpoint and direct database calls."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not scoping the context.&lt;/strong&gt; In very large codebases, &lt;code&gt;claude&lt;/code&gt; in the root directory gives it the whole repo. For a focused change, navigate to the relevant subdirectory first. Smaller context = more precise output.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does Claude Code work with languages other than Python?
&lt;/h3&gt;

&lt;p&gt;Yes. Claude Code works with any language — TypeScript, Go, Rust, Ruby, Java. The same patterns apply: scaffold with a prompt, run it, let Claude Code fix errors. The &lt;code&gt;CLAUDE.md&lt;/code&gt; approach works especially well in polyglot repos where you need to document which parts use which language.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Claude Code safe to run on production codebases?
&lt;/h3&gt;

&lt;p&gt;Claude Code asks for confirmation before writing files or running commands. You control what it executes. For sensitive production repos, review the proposed changes before confirming — Claude Code shows you a diff before applying it. Never give it credentials directly; use environment variables and secrets managers.&lt;/p&gt;

&lt;h3&gt;
  
  
  How is Claude Code different from GitHub Copilot?
&lt;/h3&gt;

&lt;p&gt;Copilot autocompletes individual lines and functions inside an editor. Claude Code operates at the project level in the terminal — it understands the full codebase, can run code, read test output, and make coordinated multi-file changes. They're complementary: Copilot for keystroke-level suggestions, Claude Code for larger tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use Claude Code without an Anthropic account?
&lt;/h3&gt;

&lt;p&gt;No. Claude Code requires an Anthropic API key or Claude.ai Pro/Max subscription. Usage via the API is billed based on token consumption. The claude.ai subscription tiers include a monthly usage allocation.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the best way to handle large codebases?
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;.claudeignore&lt;/code&gt; (same syntax as &lt;code&gt;.gitignore&lt;/code&gt;) to exclude directories that aren't relevant to your current task — &lt;code&gt;node_modules&lt;/code&gt;, &lt;code&gt;dist&lt;/code&gt;, &lt;code&gt;venv&lt;/code&gt;, build artifacts. This keeps Claude Code's context focused on what matters and reduces token usage.&lt;/p&gt;




&lt;h2&gt;
  
  
  What you built
&lt;/h2&gt;

&lt;p&gt;Start to finish: a document Q&amp;amp;A API scaffolded by Claude Code, with chunked retrieval, pytest coverage, and a live deployment on NEXUS AI — all without writing a Dockerfile or touching a browser.&lt;/p&gt;

&lt;p&gt;That's AI-augmented development in practice. Claude Code handled the scaffolding, boilerplate, tests, and debugging loop. You handled the architecture decisions and product requirements. The result ships faster and has better test coverage than the same work done manually.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://dev.to/docs"&gt;NEXUS AI CLI&lt;/a&gt; handles the deployment side of this workflow. Install it, run &lt;code&gt;nexus auth login&lt;/code&gt;, and your next Claude Code-built app is one command away from production.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>claudeai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Deploy OpenClaw in NEXUS AI</title>
      <dc:creator>Saif Ali</dc:creator>
      <pubDate>Sun, 29 Mar 2026 03:18:58 +0000</pubDate>
      <link>https://dev.to/sali_ac161a1b71406354896c/how-to-deploy-openclaw-in-nexus-ai-30j8</link>
      <guid>https://dev.to/sali_ac161a1b71406354896c/how-to-deploy-openclaw-in-nexus-ai-30j8</guid>
      <description>&lt;h2&gt;
  
  
  OpenClaw Personal AI Assistant Deployment
&lt;/h2&gt;

&lt;p&gt;OpenClaw&lt;br&gt;
is a lightweight AI coding gateway — Claude Code-compatible — exposes a secure token-authenticated endpoint. NEXUS AI makes deploying it entirely conversational: no YAML files, no Dockerfiles, no console wrestling. Just ask and it's live.&lt;/p&gt;

&lt;p&gt;This guide walks you through deploying OpenClaw on NEXUS AI step by step — covering provider selection, environment setup, connecting your CLI, and optional advanced configuration. By the end you'll have a live gateway you can connect Claude Code or any compatible AI coding tool to.&lt;/p&gt;
&lt;h2&gt;
  
  
  What is OpenClaw?
&lt;/h2&gt;

&lt;p&gt;OpenClaw (alpine/openclaw:latest) is a minimal, production-ready AI gateway service designed to work with Claude Code and compatible clients. It exposes a single authenticated endpoint on port 18789, identified by a gateway token that's either auto-generated or supplied by you at deploy time.&lt;/p&gt;

&lt;p&gt;Once deployed, any Claude Code-compatible tool can point at your OpenClaw instance and authenticate with the token — giving you a self-hosted, cloud-native AI coding backend.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;A NEXUS AI account with at least one project configured The NEXUS AI MCP connector enabled in Claude — or API access to api.zollo.live/mcp A supported cloud provider account (for GCP, AWS, or Azure deployments) The OpenClaw CLI installed locally to connect after deployment Tip: You can also deploy OpenClaw entirely from within a Claude chat session if you have the NEXUS AI MCP connector enabled. No terminal required for the deploy itself.&lt;/p&gt;
&lt;h2&gt;
  
  
  Deploying OpenClaw — step by step
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;01 Choose your provider &amp;amp; environment
NEXUS AI supports four deployment providers out of the box. For local development and testing, Docker is the fastest path. For production workloads, GCP Cloud Run offers the best cold-start performance and auto-scaling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🐳 Docker Best for local dev &amp;amp; CI&lt;/p&gt;

&lt;p&gt;☁️ GCP Cloud Run Serverless, auto-scales&lt;/p&gt;

&lt;p&gt;⚡ AWS ECS Fargate Full AWS ecosystem&lt;/p&gt;

&lt;p&gt;🔷 Azure Container Apps Enterprise &amp;amp; compliance&lt;/p&gt;

&lt;p&gt;Environments map to: DEVELOPMENT for local testing, STAGING for pre-production validation, and PRODUCTION for live traffic.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;02 Trigger the deployment
Via the NEXUS AI MCP in Claude, call nexusai_deploy_openclaw with your provider and environment. A minimal invocation looks like this:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;nexusai_deploy_openclaw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;provider:    &lt;/span&gt;&lt;span class="s2"&gt;"gcp_cloud_run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;environment: &lt;/span&gt;&lt;span class="s2"&gt;"PRODUCTION"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;name:        &lt;/span&gt;&lt;span class="s2"&gt;"openclaw-gateway"&lt;/span&gt;  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="sr"&gt;/ optional
)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you don't supply a gatewayToken, one is securely auto-generated for you. You can also pass in Claude API credentials (claudeApiKey, claudeWebCookie) if your gateway requires them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;03 Save your deployment credentials
After a successful deploy call, NEXUS AI returns:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Field Description Example id Deployment UUID 40693d12-… gatewayToken Auth token for CLI 6fb631a9d6… status Current state queued → running url Public endpoint Available once live Important: Copy your gatewayToken immediately — it's only returned once. Treat it like a password and store it in a secrets manager or your .env.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;04 Monitor deployment status
Deployments move from queued → provisioning → running. Check status anytime:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;nexusai_deploy_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;deploymentId: &lt;/span&gt;&lt;span class="s2"&gt;"40693d12-0839-4821-aa3c-3621f12c74f4"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Once status shows running, the url field will be populated with your public endpoint.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
- 05 Connect via the OpenClaw CLI
Point your local tooling at the gateway by setting two environment variables:

## Set your gateway token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
shell&lt;br&gt;
export OPENCLAW_GATEWAY_TOKEN="6fb631a9d6c66c45cb3f5890886b14dc"&lt;/p&gt;

&lt;p&gt;Point CLI at your deployment URL&lt;br&gt;
export OPENCLAW_GATEWAY_URL="&lt;a href="https://your-deployment-url" rel="noopener noreferrer"&gt;https://your-deployment-url&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## Verify the connection
openclaw status
You should see a confirmation that the gateway is reachable and authenticated. Claude Code and any compatible AI coding client will now route through your self-hosted OpenClaw instance.

* Tip: For persistent config, add these exports to your .zshrc / .bashrc, or use a .env file with direnv.
Advanced configuration
Custom gateway token
If you want a predictable, rotatable token instead of an auto-generated one, pass it explicitly at deploy time:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
NEXUS AI MCP&lt;br&gt;
nexusai_deploy_openclaw(&lt;br&gt;
  provider:      "gcp_cloud_run",&lt;br&gt;
  environment:   "PRODUCTION",&lt;br&gt;
  gatewayToken:  "my-secure-token-from-vault"&lt;br&gt;
)&lt;br&gt;
Passing Claude credentials&lt;br&gt;
If your OpenClaw instance needs to authenticate directly with Anthropic, you can pass your Claude session credentials at deploy time via claudeApiKey, claudeWebCookie, or claudeWebSessionKey. These are stored securely in NEXUS AI's secrets system and injected into the container at runtime.&lt;/p&gt;
&lt;h2&gt;
  
  
  Scaling your deployment
&lt;/h2&gt;

&lt;p&gt;Once your OpenClaw gateway is live, you can scale it up instantly via NEXUS AI without redeploying:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nexusai_deploy_scale(
  deploymentId: "40693d12-…",
  replicas:     3
)```


## Custom domain
Attach a custom domain to your OpenClaw gateway for a clean, branded endpoint:
NEXUS AI MCP nexusai_domains_add( deploymentId: "40693d12-…", domain: "openclaw.yourdomain.com" )

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Managing your OpenClaw deployment
&lt;/h1&gt;

&lt;p&gt;NEXUS AI gives you full lifecycle control over every deployment. Here's a quick reference:&lt;/p&gt;

&lt;p&gt;Action MCP Tool When to use Check status nexusai_deploy_status After deploying, or to verify health View logs nexusai_deploy_logs Debug connection or auth issues Stop gateway nexusai_deploy_stop Pause to save compute costs Restart nexusai_deploy_start After a stop, or after config changes Rollback nexusai_deploy_rollback Revert to a previous revision Delete nexusai_deploy_delete Permanently tear down&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;Gateway stuck in "queued" Check that your cloud provider credentials are properly configured in NEXUS AI. For GCP, ensure your service account has Cloud Run admin permissions. Use nexusai_deploy_logs to see what's happening inside the container.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;CLI returns 401 Unauthorized&lt;br&gt;
Double-check your OPENCLAW_GATEWAY_TOKEN environment variable. Tokens are case-sensitive. If you've lost the token, delete the deployment and redeploy with a custom gatewayToken you control.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connection refused on port 18789&lt;br&gt;
Verify the deployment status is running (not queued or stopped). Also confirm your OPENCLAW_GATEWAY_URL includes the correct port and protocol.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;OpenClaw on NEXUS AI gives you a fully managed, cloud-native AI coding gateway without any of the infrastructure overhead. You get auto-generated tokens, multi-cloud flexibility, instant scaling, and full lifecycle management — all through natural language or a single API call.&lt;/p&gt;

&lt;p&gt;From here, you can explore connecting multiple Claude Code clients to the same gateway, attaching a custom domain, or setting up a staging → production promotion workflow entirely within NEXUS AI.&lt;/p&gt;

&lt;p&gt;Try it now: Head to &lt;a href="https://nexusai.run/" rel="noopener noreferrer"&gt;https://nexusai.run/&lt;/a&gt;. and enable the NEXUS AI MCP connector in Claude to deploy your first OpenClaw gateway in under 2 minutes.&lt;/p&gt;

&lt;h1&gt;
  
  
  AI #Deployment #OpenClaw
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>openclaw</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Deploy OpenClaw in NEXUS AI</title>
      <dc:creator>Saif Ali</dc:creator>
      <pubDate>Sun, 29 Mar 2026 03:18:58 +0000</pubDate>
      <link>https://dev.to/sali_ac161a1b71406354896c/how-to-deploy-openclaw-in-nexus-ai-5648</link>
      <guid>https://dev.to/sali_ac161a1b71406354896c/how-to-deploy-openclaw-in-nexus-ai-5648</guid>
      <description>&lt;h2&gt;
  
  
  OpenClaw Personal AI Assistant Deployment
&lt;/h2&gt;

&lt;p&gt;OpenClaw&lt;br&gt;
is a lightweight AI coding gateway — Claude Code-compatible — exposes a secure token-authenticated endpoint. NEXUS AI makes deploying it entirely conversational: no YAML files, no Dockerfiles, no console wrestling. Just ask and it's live.&lt;/p&gt;

&lt;p&gt;This guide walks you through deploying OpenClaw on NEXUS AI step by step — covering provider selection, environment setup, connecting your CLI, and optional advanced configuration. By the end you'll have a live gateway you can connect Claude Code or any compatible AI coding tool to.&lt;/p&gt;
&lt;h2&gt;
  
  
  What is OpenClaw?
&lt;/h2&gt;

&lt;p&gt;OpenClaw (alpine/openclaw:latest) is a minimal, production-ready AI gateway service designed to work with Claude Code and compatible clients. It exposes a single authenticated endpoint on port 18789, identified by a gateway token that's either auto-generated or supplied by you at deploy time.&lt;/p&gt;

&lt;p&gt;Once deployed, any Claude Code-compatible tool can point at your OpenClaw instance and authenticate with the token — giving you a self-hosted, cloud-native AI coding backend.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;A NEXUS AI account with at least one project configured The NEXUS AI MCP connector enabled in Claude — or API access to api.zollo.live/mcp A supported cloud provider account (for GCP, AWS, or Azure deployments) The OpenClaw CLI installed locally to connect after deployment Tip: You can also deploy OpenClaw entirely from within a Claude chat session if you have the NEXUS AI MCP connector enabled. No terminal required for the deploy itself.&lt;/p&gt;
&lt;h2&gt;
  
  
  Deploying OpenClaw — step by step
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;01 Choose your provider &amp;amp; environment
NEXUS AI supports four deployment providers out of the box. For local development and testing, Docker is the fastest path. For production workloads, GCP Cloud Run offers the best cold-start performance and auto-scaling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🐳 Docker Best for local dev &amp;amp; CI&lt;/p&gt;

&lt;p&gt;☁️ GCP Cloud Run Serverless, auto-scales&lt;/p&gt;

&lt;p&gt;⚡ AWS ECS Fargate Full AWS ecosystem&lt;/p&gt;

&lt;p&gt;🔷 Azure Container Apps Enterprise &amp;amp; compliance&lt;/p&gt;

&lt;p&gt;Environments map to: DEVELOPMENT for local testing, STAGING for pre-production validation, and PRODUCTION for live traffic.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;02 Trigger the deployment
Via the NEXUS AI MCP in Claude, call nexusai_deploy_openclaw with your provider and environment. A minimal invocation looks like this:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;nexusai_deploy_openclaw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;provider:    &lt;/span&gt;&lt;span class="s2"&gt;"gcp_cloud_run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;environment: &lt;/span&gt;&lt;span class="s2"&gt;"PRODUCTION"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;name:        &lt;/span&gt;&lt;span class="s2"&gt;"openclaw-gateway"&lt;/span&gt;  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="sr"&gt;/ optional
)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you don't supply a gatewayToken, one is securely auto-generated for you. You can also pass in Claude API credentials (claudeApiKey, claudeWebCookie) if your gateway requires them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;03 Save your deployment credentials
After a successful deploy call, NEXUS AI returns:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Field Description Example id Deployment UUID 40693d12-… gatewayToken Auth token for CLI 6fb631a9d6… status Current state queued → running url Public endpoint Available once live Important: Copy your gatewayToken immediately — it's only returned once. Treat it like a password and store it in a secrets manager or your .env.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;04 Monitor deployment status
Deployments move from queued → provisioning → running. Check status anytime:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;nexusai_deploy_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;deploymentId: &lt;/span&gt;&lt;span class="s2"&gt;"40693d12-0839-4821-aa3c-3621f12c74f4"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Once status shows running, the url field will be populated with your public endpoint.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
- 05 Connect via the OpenClaw CLI
Point your local tooling at the gateway by setting two environment variables:

## Set your gateway token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
shell&lt;br&gt;
export OPENCLAW_GATEWAY_TOKEN="6fb631a9d6c66c45cb3f5890886b14dc"&lt;/p&gt;

&lt;p&gt;Point CLI at your deployment URL&lt;br&gt;
export OPENCLAW_GATEWAY_URL="&lt;a href="https://your-deployment-url" rel="noopener noreferrer"&gt;https://your-deployment-url&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## Verify the connection
openclaw status
You should see a confirmation that the gateway is reachable and authenticated. Claude Code and any compatible AI coding client will now route through your self-hosted OpenClaw instance.

* Tip: For persistent config, add these exports to your .zshrc / .bashrc, or use a .env file with direnv.
Advanced configuration
Custom gateway token
If you want a predictable, rotatable token instead of an auto-generated one, pass it explicitly at deploy time:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
NEXUS AI MCP&lt;br&gt;
nexusai_deploy_openclaw(&lt;br&gt;
  provider:      "gcp_cloud_run",&lt;br&gt;
  environment:   "PRODUCTION",&lt;br&gt;
  gatewayToken:  "my-secure-token-from-vault"&lt;br&gt;
)&lt;br&gt;
Passing Claude credentials&lt;br&gt;
If your OpenClaw instance needs to authenticate directly with Anthropic, you can pass your Claude session credentials at deploy time via claudeApiKey, claudeWebCookie, or claudeWebSessionKey. These are stored securely in NEXUS AI's secrets system and injected into the container at runtime.&lt;/p&gt;
&lt;h2&gt;
  
  
  Scaling your deployment
&lt;/h2&gt;

&lt;p&gt;Once your OpenClaw gateway is live, you can scale it up instantly via NEXUS AI without redeploying:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nexusai_deploy_scale(
  deploymentId: "40693d12-…",
  replicas:     3
)```


## Custom domain
Attach a custom domain to your OpenClaw gateway for a clean, branded endpoint:
NEXUS AI MCP nexusai_domains_add( deploymentId: "40693d12-…", domain: "openclaw.yourdomain.com" )

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Managing your OpenClaw deployment
&lt;/h1&gt;

&lt;p&gt;NEXUS AI gives you full lifecycle control over every deployment. Here's a quick reference:&lt;/p&gt;

&lt;p&gt;Action MCP Tool When to use Check status nexusai_deploy_status After deploying, or to verify health View logs nexusai_deploy_logs Debug connection or auth issues Stop gateway nexusai_deploy_stop Pause to save compute costs Restart nexusai_deploy_start After a stop, or after config changes Rollback nexusai_deploy_rollback Revert to a previous revision Delete nexusai_deploy_delete Permanently tear down&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;Gateway stuck in "queued" Check that your cloud provider credentials are properly configured in NEXUS AI. For GCP, ensure your service account has Cloud Run admin permissions. Use nexusai_deploy_logs to see what's happening inside the container.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;CLI returns 401 Unauthorized&lt;br&gt;
Double-check your OPENCLAW_GATEWAY_TOKEN environment variable. Tokens are case-sensitive. If you've lost the token, delete the deployment and redeploy with a custom gatewayToken you control.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connection refused on port 18789&lt;br&gt;
Verify the deployment status is running (not queued or stopped). Also confirm your OPENCLAW_GATEWAY_URL includes the correct port and protocol.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;OpenClaw on NEXUS AI gives you a fully managed, cloud-native AI coding gateway without any of the infrastructure overhead. You get auto-generated tokens, multi-cloud flexibility, instant scaling, and full lifecycle management — all through natural language or a single API call.&lt;/p&gt;

&lt;p&gt;From here, you can explore connecting multiple Claude Code clients to the same gateway, attaching a custom domain, or setting up a staging → production promotion workflow entirely within NEXUS AI.&lt;/p&gt;

&lt;p&gt;Try it now: Head to &lt;a href="https://nexusai.run/" rel="noopener noreferrer"&gt;https://nexusai.run/&lt;/a&gt;. and enable the NEXUS AI MCP connector in Claude to deploy your first OpenClaw gateway in under 2 minutes.&lt;/p&gt;

&lt;h1&gt;
  
  
  AI #Deployment #OpenClaw
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>openclaw</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Deploy an AI App in Production: The Complete 2026 Guide</title>
      <dc:creator>Saif Ali</dc:creator>
      <pubDate>Sun, 29 Mar 2026 02:25:42 +0000</pubDate>
      <link>https://dev.to/sali_ac161a1b71406354896c/how-to-deploy-an-ai-app-in-production-the-complete-2026-guide-3i0g</link>
      <guid>https://dev.to/sali_ac161a1b71406354896c/how-to-deploy-an-ai-app-in-production-the-complete-2026-guide-3i0g</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Deploying applications shouldn’t be this hard.&lt;/p&gt;

&lt;p&gt;If you’ve ever tried to deploy an app, you’ve probably dealt with:&lt;/p&gt;

&lt;p&gt;YAML configuration files&lt;/p&gt;

&lt;p&gt;CI/CD pipelines&lt;/p&gt;

&lt;p&gt;Infrastructure setup&lt;/p&gt;

&lt;p&gt;Debugging deployment failures&lt;/p&gt;

&lt;p&gt;What starts as “just a quick deploy” often turns into hours of frustration.&lt;/p&gt;

&lt;p&gt;But what if you could deploy an app using AI — just by describing what you want?&lt;/p&gt;

&lt;p&gt;That’s exactly what platforms like NEXUS AI are making possible.&lt;/p&gt;

&lt;p&gt;In this guide, you’ll learn how to deploy apps with AI step by step, and why this is becoming the future of software development.&lt;/p&gt;

&lt;h1&gt;
  
  
  🤖 What is AI-Powered Deployment?
&lt;/h1&gt;

&lt;p&gt;AI-powered deployment allows developers to:&lt;/p&gt;

&lt;p&gt;Deploy applications using natural language prompts&lt;/p&gt;

&lt;p&gt;Automate infrastructure setup&lt;/p&gt;

&lt;p&gt;Eliminate manual DevOps work&lt;/p&gt;

&lt;p&gt;Fix issues automatically using AI&lt;/p&gt;

&lt;p&gt;Instead of writing complex configuration files, you simply tell the system what you want.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@nexus ai deploy my Node.js app to production&lt;/code&gt;&lt;br&gt;
And the platform handles:&lt;/p&gt;

&lt;p&gt;Build&lt;/p&gt;

&lt;p&gt;Containerization&lt;/p&gt;

&lt;p&gt;Deployment&lt;/p&gt;

&lt;p&gt;Scaling&lt;/p&gt;

&lt;p&gt;😩 Why Traditional Deployment is So Difficult&lt;br&gt;
Before we dive into AI deployment, let’s understand the problem.&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Too Many Tools
&lt;/h1&gt;

&lt;p&gt;Developers often need:&lt;/p&gt;

&lt;p&gt;Docker&lt;/p&gt;

&lt;p&gt;Kubernetes&lt;/p&gt;

&lt;p&gt;CI/CD pipelines&lt;/p&gt;

&lt;p&gt;Cloud providers&lt;/p&gt;

&lt;h1&gt;
  
  
  2. YAML Complexity
&lt;/h1&gt;

&lt;p&gt;Even a small mistake in YAML can break your deployment.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;version: '3'&lt;br&gt;
services:&lt;br&gt;
 app:&lt;br&gt;
   build: .&lt;br&gt;
   ports:&lt;br&gt;
     - "3000:3000"&lt;/code&gt;&lt;br&gt;
One indentation error → everything fails.&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Debugging is Painful
&lt;/h1&gt;

&lt;p&gt;Common issues:&lt;/p&gt;

&lt;p&gt;Build failures&lt;/p&gt;

&lt;p&gt;Environment mismatches&lt;/p&gt;

&lt;p&gt;Missing dependencies&lt;/p&gt;

&lt;h1&gt;
  
  
  4. Requires DevOps Knowledge
&lt;/h1&gt;

&lt;p&gt;Not every developer is a DevOps expert.&lt;/p&gt;

&lt;h1&gt;
  
  
  🚀 How AI Changes Deployment
&lt;/h1&gt;

&lt;p&gt;AI removes complexity by handling everything automatically.&lt;/p&gt;

&lt;h1&gt;
  
  
  With NEXUS AI:
&lt;/h1&gt;

&lt;p&gt;👉 You don’t configure infrastructure&lt;br&gt;
👉 You don’t write YAML&lt;br&gt;
👉 You don’t debug pipelines manually&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;p&gt;Prompt → AI → Live App&lt;/p&gt;

&lt;h1&gt;
  
  
  ⚡ Step-by-Step: Deploy an App with AI
&lt;/h1&gt;

&lt;p&gt;Let’s walk through how it works.&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 1: Install NEXUS AI CLI
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;npm install -g nexusapp-cli&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 2: Login
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;nexus auth login&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 3: Deploy Your App
&lt;/h1&gt;

&lt;p&gt;Now the magic happens.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@nexus deploy my app&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@nexus deploy my Node.js API to production on gcp cloud provider&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 4: AI Handles Everything
&lt;/h1&gt;

&lt;p&gt;Behind the scenes, NEXUS AI:&lt;/p&gt;

&lt;p&gt;Detects your app type&lt;/p&gt;

&lt;p&gt;Builds your container&lt;/p&gt;

&lt;p&gt;Configures infrastructure&lt;/p&gt;

&lt;p&gt;Deploys to cloud&lt;/p&gt;

&lt;p&gt;Makes your app live&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 5: Your App is Live 🚀
&lt;/h1&gt;

&lt;p&gt;In minutes, your app is deployed — no manual setup required.&lt;/p&gt;

&lt;h1&gt;
  
  
  💬 Bonus: AI Support &amp;amp; Troubleshooting
&lt;/h1&gt;

&lt;p&gt;One of the biggest advantages is AI-powered support.&lt;/p&gt;

&lt;p&gt;If something breaks:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@nexus fix my deployment issue&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;NEXUS AI will:&lt;/p&gt;

&lt;p&gt;Diagnose the problem&lt;/p&gt;

&lt;p&gt;Suggest fixes&lt;/p&gt;

&lt;h1&gt;
  
  
  Apply solutions
&lt;/h1&gt;

&lt;h1&gt;
  
  
  🔥 Real Use Cases
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Indie Developers&lt;br&gt;
Launch projects quickly without DevOps knowledge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Startups&lt;br&gt;
Reduce time to production.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Teams&lt;br&gt;
Simplify deployment workflows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Beginners&lt;br&gt;
Deploy apps without learning complex tools.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  🧠 Why This is the Future
&lt;/h1&gt;

&lt;p&gt;We’ve already seen this shift:&lt;/p&gt;

&lt;p&gt;Writing code → AI-assisted coding&lt;/p&gt;

&lt;p&gt;Debugging → AI debugging&lt;/p&gt;

&lt;h1&gt;
  
  
  Now → Deployment is next
&lt;/h1&gt;

&lt;p&gt;AI is turning complex workflows into simple interactions.&lt;/p&gt;

&lt;h1&gt;
  
  
  🚀 Key Benefits of NexusAI
&lt;/h1&gt;

&lt;p&gt;Faster deployment&lt;/p&gt;

&lt;p&gt;Less complexity&lt;/p&gt;

&lt;p&gt;AI-powered troubleshooting&lt;/p&gt;

&lt;p&gt;Works with prompts, code, or Git&lt;/p&gt;

&lt;p&gt;No DevOps expertise required&lt;/p&gt;

&lt;h1&gt;
  
  
  💡 Pro Tips for Using AI Deployment
&lt;/h1&gt;

&lt;p&gt;Be clear in your prompts&lt;/p&gt;

&lt;p&gt;Use Git integration for real projects&lt;/p&gt;

&lt;p&gt;Let AI handle infrastructure&lt;/p&gt;

&lt;p&gt;Use CLI for faster workflows&lt;/p&gt;

&lt;h1&gt;
  
  
  🔮 Final Thoughts
&lt;/h1&gt;

&lt;p&gt;The way we deploy applications is changing.&lt;/p&gt;

&lt;p&gt;Instead of spending hours configuring infrastructure, developers can now:&lt;/p&gt;

&lt;p&gt;👉 Describe what they want&lt;br&gt;
👉 Let AI handle the rest&lt;/p&gt;

&lt;p&gt;NexusAI is helping lead this shift toward AI-native development workflows.&lt;/p&gt;

&lt;p&gt;👉 Get Started&lt;br&gt;
Try NEXUS AII and deploy your first app in minutes:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://nexusai.run" rel="noopener noreferrer"&gt;https://nexusai.run&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>automation</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Run your Docker container from AI prompts</title>
      <dc:creator>Saif Ali</dc:creator>
      <pubDate>Thu, 26 Feb 2026 15:22:00 +0000</pubDate>
      <link>https://dev.to/sali_ac161a1b71406354896c/run-your-docker-container-from-ai-prompts-188b</link>
      <guid>https://dev.to/sali_ac161a1b71406354896c/run-your-docker-container-from-ai-prompts-188b</guid>
      <description>&lt;h2&gt;
  
  
  What is NEXUS AI?
&lt;/h2&gt;

&lt;p&gt;If AI can write code and generate images, it can also manage infrastructure. &lt;/p&gt;

&lt;h2&gt;
  
  
  How it Works
&lt;/h2&gt;

&lt;p&gt;With NEXUS AI, infrastructure becomes conversational...&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>automation</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>🚀 Deploying an App Using Claude + NexusAI (No DevOps Required)</title>
      <dc:creator>Saif Ali</dc:creator>
      <pubDate>Thu, 19 Feb 2026 06:23:14 +0000</pubDate>
      <link>https://dev.to/sali_ac161a1b71406354896c/deploying-an-app-using-claude-nexusai-no-devops-required-8g2</link>
      <guid>https://dev.to/sali_ac161a1b71406354896c/deploying-an-app-using-claude-nexusai-no-devops-required-8g2</guid>
      <description>&lt;p&gt;Over the past decade, we’ve dramatically improved how software gets built. AI can now generate code, help design systems, and accelerate development workflows in ways that were unimaginable just a few years ago.&lt;/p&gt;

&lt;p&gt;But one part of the process still feels stuck: deploying and operating infrastructure.&lt;/p&gt;

&lt;p&gt;Even today, going from “working code” to “live application” often involves navigating cloud dashboards, configuring environments, managing permissions, and wiring together tools. That operational overhead slows down experimentation and adds unnecessary friction.&lt;/p&gt;

&lt;p&gt;Recently, I wanted to explore what deployment could look like if we treated infrastructure as something AI could reason about — not just something we configure manually.&lt;/p&gt;

&lt;p&gt;So I tried deploying an application using Claude together with NexusAI.&lt;/p&gt;

&lt;h1&gt;
  
  
  news #devto #hackathon #discuss
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>openai</category>
      <category>devto</category>
    </item>
    <item>
      <title>🚀 From ChatGPT Prompt to Live Deployment with NexusAI</title>
      <dc:creator>Saif Ali</dc:creator>
      <pubDate>Thu, 19 Feb 2026 06:19:36 +0000</pubDate>
      <link>https://dev.to/sali_ac161a1b71406354896c/deploying-an-app-using-claude-nexusai-no-devops-required-2khb</link>
      <guid>https://dev.to/sali_ac161a1b71406354896c/deploying-an-app-using-claude-nexusai-no-devops-required-2khb</guid>
      <description>&lt;p&gt;AI has dramatically changed how we write software. Tools like ChatGPT can now generate code, explain architecture decisions, and help developers move from idea to working prototype faster than ever.&lt;/p&gt;

&lt;p&gt;But there’s still a gap.&lt;/p&gt;

&lt;p&gt;Going from “working code” to “running in production” often means switching contexts — opening cloud dashboards, configuring environments, setting up deployments, and managing infrastructure.&lt;/p&gt;

&lt;p&gt;Recently, I wanted to see what would happen if we removed that gap entirely.&lt;/p&gt;

&lt;p&gt;So I tried building with ChatGPT and deploying using NexusAI.&lt;/p&gt;

&lt;h1&gt;
  
  
  news #devto #hackathon #discuss
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
