<?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: Saurabh Sharma</title>
    <description>The latest articles on DEV Community by Saurabh Sharma (@coder11).</description>
    <link>https://dev.to/coder11</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F335997%2Fe64c8b51-af07-403f-9fd6-3bb9b4eab253.webp</url>
      <title>DEV Community: Saurabh Sharma</title>
      <link>https://dev.to/coder11</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/coder11"/>
    <language>en</language>
    <item>
      <title>How I Stopped Hitting AI Coding Quota Limits with 9Router (Local Proxy Setup Guide)</title>
      <dc:creator>Saurabh Sharma</dc:creator>
      <pubDate>Fri, 17 Jul 2026 11:28:37 +0000</pubDate>
      <link>https://dev.to/coder11/how-i-stopped-hitting-ai-coding-quota-limits-with-9router-local-proxy-setup-guide-4lc3</link>
      <guid>https://dev.to/coder11/how-i-stopped-hitting-ai-coding-quota-limits-with-9router-local-proxy-setup-guide-4lc3</guid>
      <description>&lt;p&gt;If you use AI coding assistants daily Claude Code, Codex, Antigravity, OpenCode, whatever your CLI or GUI of choice is you've almost certainly hit the dreaded &lt;strong&gt;"Quota Limit Reached"&lt;/strong&gt; screen mid-task.&lt;/p&gt;

&lt;p&gt;It's the worst possible time for a rate limit: you're in flow, three files deep into a refactor, and suddenly your assistant goes silent.&lt;/p&gt;

&lt;p&gt;I've been running a fix for this for a while now: &lt;strong&gt;&lt;a href="https://9router.com" rel="noopener noreferrer"&gt;9Router&lt;/a&gt;&lt;/strong&gt;, a free, open-source local AI proxy. Here's the breakdown of what it does and how to wire it up.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is 9Router?
&lt;/h2&gt;

&lt;p&gt;9Router is a local proxy server that sits between your AI coding tools and the actual model providers (OpenAI, Anthropic, Gemini, etc).&lt;/p&gt;

&lt;p&gt;Instead of pointing Claude Code, Cursor, or Codex directly at a provider, you point them at 9Router. It runs on your machine and exposes a standard &lt;strong&gt;OpenAI-compatible API&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:20128/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since almost every modern AI tool lets you override the base API URL, this means near-universal compatibility no forking, no custom SDKs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Smart 3-Tier Fallback
&lt;/h3&gt;

&lt;p&gt;This is the actual quota-killer feature. You pool multiple accounts/providers into three tiers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tier 1 — Subscription/Premium&lt;/strong&gt;: your paid Claude Pro, ChatGPT Plus, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier 2 — Cheap API&lt;/strong&gt;: pay-as-you-go keys (Haiku, GPT-4o-mini) as backup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier 3 — Free Tier&lt;/strong&gt;: free models or local models on your own hardware&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When Tier 1 rate-limits or drops, 9Router falls through to Tier 2, then Tier 3, automatically. No manual key-swapping, no restarting your session.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. RTK (Rust Token Killer) Token Saver
&lt;/h3&gt;

&lt;p&gt;AI coding tools are chatty running &lt;code&gt;git diff&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, or reading files sends a ton of whitespace, comments, and redundant metadata to the model.&lt;/p&gt;

&lt;p&gt;RTK strips that bloat losslessly before the request goes out, cutting input tokens by &lt;strong&gt;20–40%&lt;/strong&gt; with no measurable hit to output quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Caveman Mode
&lt;/h3&gt;

&lt;p&gt;Exactly what it sounds like forces terse, no-fluff, code-only output. Good for when you don't need the model explaining itself. Can cut output tokens by up to &lt;strong&gt;65%&lt;/strong&gt;.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  CLI tools
&lt;/h3&gt;

&lt;p&gt;Point the base URL at your local 9Router instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:20128/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I've personally tested this with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Codex&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Antigravity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenCode&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GUI tools
&lt;/h3&gt;

&lt;p&gt;Same idea - open the app's API/connection settings and swap the default endpoint for the 9Router URL. Tested and working with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Codex (ChatGPT Desktop App)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Antigravity GUI&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenCode GUI&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since it's a drop-in OpenAI-compatible endpoint, this also extends to editors like &lt;strong&gt;Cursor&lt;/strong&gt;, &lt;strong&gt;VS Code&lt;/strong&gt;, and &lt;strong&gt;Cline&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verifying it's working
&lt;/h3&gt;

&lt;p&gt;Two ways to confirm the integration is live:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Terminal logs&lt;/strong&gt; — the 9Router process outputs real-time request logs, status codes, and routing decisions as your tool queries it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard quota tracker&lt;/strong&gt; — open the local dashboard (&lt;code&gt;http://localhost:20128/dashboard&lt;/code&gt;) and watch token usage and request stats update live.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Pooling Multiple Accounts
&lt;/h2&gt;

&lt;p&gt;You're not limited to one key per provider. If you've got two ChatGPT Codex accounts, add both 9Router will round-robin between them or auto-switch when one hits its hourly limit. Effectively doubles your daily throughput on that provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inside the Dashboard
&lt;/h2&gt;

&lt;p&gt;The local dashboard (&lt;code&gt;localhost:20128/dashboard&lt;/code&gt;) gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Provider connections&lt;/strong&gt; — manage keys across 40+ providers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combo routing&lt;/strong&gt; — build fallback sequences without touching config files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time quota tracking&lt;/strong&gt; — see how close each account is to its limit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combined usage metrics&lt;/strong&gt; — live graphs of token consumption, requests, and cost savings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RTK / Caveman toggles&lt;/strong&gt; — one-click switches&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  9Router vs Omnirouter
&lt;/h2&gt;

&lt;p&gt;Worth knowing if you're evaluating both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Omnirouter (OmniRoute)&lt;/strong&gt; is actually a fork/rewrite of 9Router.&lt;/li&gt;
&lt;li&gt;9Router is GUI-first and optimized for a fast, simple dashboard experience.&lt;/li&gt;
&lt;li&gt;OmniRoute is rewritten in TypeScript, aimed at larger-scale integrations, and wraps 9Router's processes internally better suited for power users needing deeper system-level control.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most individual devs, 9Router's simplicity wins. For teams building on top of it, OmniRoute might be the better base.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;If you're burning through quotas or eating unnecessary token costs on your AI coding workflow, a local proxy like 9Router is a pretty low-effort fix pool your accounts, compress your tokens, and stop losing flow state to rate limits.&lt;/p&gt;

&lt;p&gt;Full original write-up with screenshots of the dashboard and routing setup is &lt;a href="https://www.saurabhsharma.dev/blogs/how-to-use-9router-local-ai-proxy-bypass-quotas/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Have you run into quota walls with your own AI coding setup? What's your workaround curious what others are doing.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>code-review-graph vs Graphify vs codebase-memory-mcp: The Best Code Intelligence MCP Tools for AI Coding Agents (2026)</title>
      <dc:creator>Saurabh Sharma</dc:creator>
      <pubDate>Thu, 02 Jul 2026 11:02:08 +0000</pubDate>
      <link>https://dev.to/coder11/code-review-graph-vs-graphify-vs-codebase-memory-mcp-the-best-code-intelligence-mcp-tools-for-ai-3ea</link>
      <guid>https://dev.to/coder11/code-review-graph-vs-graphify-vs-codebase-memory-mcp-the-best-code-intelligence-mcp-tools-for-ai-3ea</guid>
      <description>&lt;p&gt;If you've spent real time pairing with Claude Code, Cursor, or Codex on a mid-to-large repository, you've probably hit the same wall I did: the agent keeps re-reading files it already saw an hour ago, burns half your context window on a routine PR review, and still misses the one caller three modules away that actually breaks. That's not a prompting problem - it's an &lt;strong&gt;architecture&lt;/strong&gt; problem. LLMs are stateless, and grep-based exploration doesn't scale past a few hundred files.&lt;/p&gt;

&lt;p&gt;Over the last few months, a new category of tooling has emerged to fix exactly this: &lt;strong&gt;local, persistent code knowledge graphs exposed over the Model Context Protocol (MCP)&lt;/strong&gt;. Instead of your AI assistant re-reading the whole repo on every task, these tools parse your codebase once with Tree-sitter (and sometimes LSP-grade type resolution), store it as a queryable graph, and hand your agent a structural map - callers, dependents, blast radius, architecture - in a single tool call.&lt;/p&gt;

&lt;p&gt;I dug into three of the most relevant open-source projects in this space: &lt;strong&gt;code-review-graph&lt;/strong&gt;, &lt;strong&gt;Graphify&lt;/strong&gt;, and &lt;strong&gt;codebase-memory-mcp&lt;/strong&gt; - GitHub stars, architecture differences, benchmark numbers, and which one actually fits your stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Every one of these tools solves the same underlying problem in a slightly different way: an AI coding agent asked "what calls &lt;code&gt;ProcessOrder&lt;/code&gt;?" or "what's the blast radius of this change?" shouldn't have to grep-and-read its way through your entire repository. A pre-built graph of functions, classes, imports, and call chains answers that in a single, cheap query instead of dozens of expensive file reads.&lt;/p&gt;

&lt;p&gt;The payoff shows up directly in your API bill and your context budget - for a React/Node monorepo doing daily PR reviews, that's the difference between a review that costs a few thousand tokens and one that quietly eats your whole context window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Comparison
&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;code-review-graph&lt;/th&gt;
&lt;th&gt;Graphify&lt;/th&gt;
&lt;th&gt;codebase-memory-mcp&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Stars&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~16k ⭐&lt;/td&gt;
&lt;td&gt;~75.2k ⭐&lt;/td&gt;
&lt;td&gt;~22k ⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Forks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.8k&lt;/td&gt;
&lt;td&gt;7.5k&lt;/td&gt;
&lt;td&gt;1.6k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;C (pure, zero deps)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;License&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip install code-review-graph&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uv tool install graphifyy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Single static binary (curl installer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Language Coverage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;24 languages + Jupyter&lt;/td&gt;
&lt;td&gt;36 tree-sitter grammars + docs/PDF/images/video&lt;/td&gt;
&lt;td&gt;158 languages (vendored grammars)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Core Differentiator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Blast-radius analysis for PR review&lt;/td&gt;
&lt;td&gt;Multi-modal graph (code + docs + papers + meetings)&lt;/td&gt;
&lt;td&gt;Hybrid LSP-grade type resolution, extreme indexing speed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Token Reduction (claimed)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8.2x average (up to 49x on monorepos)&lt;/td&gt;
&lt;td&gt;~71.5x reported by third-party benchmark&lt;/td&gt;
&lt;td&gt;~120x (99.2% reduction)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP Tools Exposed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;Served via &lt;code&gt;python -m graphify.serve&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backed By&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Independent maintainer&lt;/td&gt;
&lt;td&gt;Y Combinator (S26 batch)&lt;/td&gt;
&lt;td&gt;DeusData&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(Star counts move fast in this category - check each repo live before you quote them elsewhere.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  code-review-graph
&lt;/h2&gt;

&lt;p&gt;GitHub: &lt;code&gt;tirth8205/code-review-graph&lt;/code&gt; - ~16k ⭐, 1.8k forks, MIT&lt;/p&gt;

&lt;p&gt;The most review-focused of the three. It builds a structural map of your code with Tree-sitter, storing nodes (functions, classes, imports) and edges (calls, inheritance, test coverage) in a local SQLite database under &lt;code&gt;.code-review-graph/&lt;/code&gt;. Its signature feature is &lt;strong&gt;blast-radius analysis&lt;/strong&gt;: when a file changes, the graph traces every caller, dependent, and test that could be affected, so your AI assistant reviews only the files that actually matter instead of the whole diff's neighborhood.&lt;/p&gt;

&lt;p&gt;For React/Node developers specifically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One command (&lt;code&gt;code-review-graph install&lt;/code&gt;) auto-detects and configures Claude Code, Cursor, Codex, Windsurf, Zed, GitHub Copilot, and more.&lt;/li&gt;
&lt;li&gt;Covers the full JS/TS stack - JavaScript, TypeScript, TSX, Vue, Svelte - alongside Python, Go, Rust, Java, and 24 languages total.&lt;/li&gt;
&lt;li&gt;On a 27,700+ file Next.js monorepo, the graph funneled review context down to roughly 15 files.&lt;/li&gt;
&lt;li&gt;Ships 28 MCP tools, including hub/bridge detection (architectural chokepoints) and auto-generated review questions - useful for onboarding onto an unfamiliar codebase, not just reviewing diffs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Worth knowing before install: the project's own benchmarks are honest about limits - small single-file changes can see structural metadata &lt;em&gt;exceed&lt;/em&gt; a raw file read, and flow detection currently favors Python frameworks over JS/Go.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;code-review-graph
code-review-graph &lt;span class="nb"&gt;install
&lt;/span&gt;code-review-graph build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Graphify
&lt;/h2&gt;

&lt;p&gt;GitHub: &lt;code&gt;safishamsi/graphify&lt;/code&gt; — ~75.2k ⭐, 7.5k forks, MIT, Y Combinator S26&lt;/p&gt;

&lt;p&gt;The biggest project of the three by a wide margin, and it plays a different game. Where the other two are scoped to "index my code," Graphify's pitch is &lt;strong&gt;any input, one graph&lt;/strong&gt;: point it at a folder and it pulls source code (36 tree-sitter grammars), SQL schemas, Terraform/HCL, Markdown, PDFs, Office docs, and even video/meeting transcripts into a single queryable NetworkX graph with Leiden community clustering.&lt;/p&gt;

&lt;p&gt;What stands out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Invoked as a slash command (&lt;code&gt;/graphify .&lt;/code&gt;) inside 20+ AI coding assistants — Claude Code, Codex, Cursor, Gemini CLI, OpenCode, Kilo Code, Aider — rather than requiring a persistent server.&lt;/li&gt;
&lt;li&gt;Output is genuinely inspectable: &lt;code&gt;graph.html&lt;/code&gt; (interactive visualization), &lt;code&gt;GRAPH_REPORT.md&lt;/code&gt; (god-nodes, cross-module connections, suggested questions), and &lt;code&gt;graph.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Supports pushing to Neo4j or FalkorDB, exporting Obsidian vaults, and a global cross-project graph for multi-repo orgs.&lt;/li&gt;
&lt;li&gt;Also exposes an MCP server for teams who want persistent tool-call access instead of the slash-command flow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trade-off: the sheer surface area means non-code extraction depends on an LLM API call for semantic relationships — code-only graphs are fully local and free, but docs/PDFs/images route through your assistant's model API unless you point it at a local Ollama backend.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv tool &lt;span class="nb"&gt;install &lt;/span&gt;graphifyy
graphify &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="c"&gt;# then inside your AI assistant:&lt;/span&gt;
/graphify &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  codebase-memory-mcp
&lt;/h2&gt;

&lt;p&gt;GitHub: &lt;code&gt;DeusData/codebase-memory-mcp&lt;/code&gt; — ~22k ⭐, 1.6k forks, MIT&lt;/p&gt;

&lt;p&gt;The odd one out architecturally, in a good way: written in &lt;strong&gt;pure C&lt;/strong&gt;, ships as a single static binary with &lt;strong&gt;zero runtime dependencies&lt;/strong&gt;, and built for raw indexing speed. The headline number is stark - it indexed the &lt;strong&gt;Linux kernel (28M LOC, 75,000 files) in about 3 minutes&lt;/strong&gt;, producing 4.81M nodes and 7.72M edges, with sub-millisecond query latency afterward.&lt;/p&gt;

&lt;p&gt;What sets it apart:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;158 vendored tree-sitter grammars&lt;/strong&gt; compiled directly into the binary - nothing to install, nothing that breaks on a fresh machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid LSP semantic type resolution&lt;/strong&gt; for Python, TypeScript/JavaScript/JSX/TSX, PHP, C#, Go, C/C++, Java, Kotlin, and Rust - refines call edges with actual type information rather than stopping at syntax.&lt;/li&gt;
&lt;li&gt;Documented in a research preprint (arXiv:2603.27277), evaluated across 31 real-world repositories: 83% answer quality, 10x fewer tokens, 2.1x fewer tool calls versus file-by-file exploration.&lt;/li&gt;
&lt;li&gt;Cross-service linking for backend/microservices teams - detects HTTP, gRPC, GraphQL, tRPC call sites, and pub-sub patterns across 8 languages.&lt;/li&gt;
&lt;li&gt;A team-shared graph artifact can be committed to the repo so teammates skip a full reindex on clone.&lt;/li&gt;
&lt;li&gt;Every release is SLSA Level 3 attested and Sigstore-signed - a level of supply-chain rigor the other two don't advertise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trade-off: no built-in LLM - it's a structural backend that relies entirely on your MCP client to translate natural language into graph queries, and Windows support currently needs WSL2 for building from source.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/DeusData/codebase-memory-mcp/main/install.sh | bash
&lt;span class="c"&gt;# then in your agent:&lt;/span&gt;
&lt;span class="s2"&gt;"Index this project"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Head-to-Head
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Token efficiency:&lt;/strong&gt; all three publish impressive numbers, but they're measuring slightly different things. code-review-graph's 8.2x is an &lt;em&gt;average including worst cases&lt;/em&gt; (small diffs can dip below 1x); Graphify's ~71.5x and codebase-memory-mcp's ~120x are best-case structural queries against an already-built graph. Treat them as directionally useful, not directly comparable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Language coverage:&lt;/strong&gt; if your stack is primarily JavaScript/TypeScript/React/Node, all three cover it well, but codebase-memory-mcp's Hybrid LSP layer gives noticeably richer type resolution for TS/JSX than pure Tree-sitter parsing alone. Graphify wins if your repo also includes Terraform, SQL schemas, or architecture docs you want in the same graph as the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture philosophy:&lt;/strong&gt; code-review-graph optimizes for the PR review loop specifically. Graphify optimizes for breadth of input (code + everything else). codebase-memory-mcp optimizes for raw performance and correctness at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best of the Best - Which One Should You Actually Install
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Heavy PR review on a React/Node/TypeScript monorepo →&lt;/strong&gt; code-review-graph. The blast-radius model and monorepo funnel are purpose-built for this, and install auto-detects Cursor/Claude Code/Copilot with no manual config.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One graph spanning code, architecture docs, RFCs, and meeting notes →&lt;/strong&gt; Graphify. Multi-modal ingestion and Obsidian/Neo4j export are unmatched among the three.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large, polyglot, performance-sensitive codebase (microservices, enterprise monorepo) →&lt;/strong&gt; codebase-memory-mcp. Zero dependencies, sub-millisecond queries, and Hybrid LSP-grade accuracy make it the most "production infrastructure" feeling of the three.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They're not mutually exclusive - several teams run code-review-graph for the PR workflow and codebase-memory-mcp as the always-on structural backend, since neither one gatekeeps the other's MCP tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Similar Tools Worth Knowing About
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sourcegraph Cody&lt;/strong&gt; - commercial code-intelligence and search platform, more IDE/enterprise-oriented than a pure MCP server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aider's repo map&lt;/strong&gt; - a lighter-weight, built-in Tree-sitter-based repo summarization feature inside the Aider CLI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor's built-in codebase indexing&lt;/strong&gt; - proprietary, cloud-assisted embedding index baked into the Cursor IDE, convenient but not portable across other agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot workspace context&lt;/strong&gt; - GitHub's own evolving context system for Copilot, tightly coupled to the GitHub ecosystem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Are these tools free and open-source?&lt;/strong&gt;&lt;br&gt;
Yes - all three are MIT-licensed. Graphify's parent, graphifylabs.ai, layers an optional paid enterprise tier (unlimited scale, team graphs, SSO) on top of the open-source core; the other two have no paid tier as of writing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do these tools send my code to the cloud?&lt;/strong&gt;&lt;br&gt;
All three are local-first for code parsing - Tree-sitter/AST extraction runs on your machine, no API calls. Graphify's non-code ingestion (docs, PDFs, images, video) does route through your configured LLM backend unless you point it at a local Ollama instance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which works best with Claude Code specifically?&lt;/strong&gt;&lt;br&gt;
All three ship first-class Claude Code integration. code-review-graph and codebase-memory-mcp both install hooks that nudge Claude Code toward graph queries instead of Grep/Glob; Graphify uses a &lt;code&gt;/graphify&lt;/code&gt; slash-command plus an optional MCP server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need to pick just one?&lt;/strong&gt;&lt;br&gt;
No - they expose different MCP tool names and don't conflict.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Verdict
&lt;/h2&gt;

&lt;p&gt;If you're optimizing an AI-assisted workflow around a &lt;strong&gt;JavaScript/React/Node&lt;/strong&gt; stack, my honest recommendation is to start with &lt;strong&gt;code-review-graph&lt;/strong&gt; for the PR review loop, and evaluate &lt;strong&gt;codebase-memory-mcp&lt;/strong&gt; if you outgrow it on a larger, more polyglot codebase where indexing speed and type-aware resolution start to matter. &lt;strong&gt;Graphify&lt;/strong&gt; earns its spot if your team's real pain point is scattered documentation and tribal knowledge, not just source code.&lt;/p&gt;

&lt;p&gt;All three are moving fast, all three are MIT-licensed, and all three solve something generic RAG and grep-based context can't: giving your AI coding agent a persistent, structural memory of your codebase instead of making it rediscover your architecture every session.&lt;/p&gt;

&lt;p&gt;Checkout Full Blog - &lt;a href="https://www.saurabhsharma.dev/blogs/code-graph-mcp-tools-comparison" rel="noopener noreferrer"&gt;https://www.saurabhsharma.dev/blogs/code-graph-mcp-tools-comparison&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>react</category>
      <category>node</category>
    </item>
    <item>
      <title>The Rise of GCCs in India: Why Global Companies Are Hiring Directly While Traditional IT Struggles</title>
      <dc:creator>Saurabh Sharma</dc:creator>
      <pubDate>Fri, 26 Jun 2026 04:43:31 +0000</pubDate>
      <link>https://dev.to/coder11/the-rise-of-gccs-in-india-why-global-companies-are-hiring-directly-while-traditional-it-struggles-9p0</link>
      <guid>https://dev.to/coder11/the-rise-of-gccs-in-india-why-global-companies-are-hiring-directly-while-traditional-it-struggles-9p0</guid>
      <description>&lt;p&gt;🚨 &lt;strong&gt;A silent shift is happening in India's tech industry.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While headlines focus on hiring freezes at traditional IT companies, another ecosystem is expanding rapidly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Global Capability Centers (GCCs).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Over &lt;strong&gt;2.5 million professionals&lt;/strong&gt; are already working in GCCs across India, and new centers are opening every quarter.&lt;/p&gt;

&lt;p&gt;So, what's different?&lt;/p&gt;

&lt;p&gt;Traditional IT companies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build solutions for external clients&lt;/li&gt;
&lt;li&gt;Bill by the hour or project&lt;/li&gt;
&lt;li&gt;Clients own the product and IP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GCCs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are owned by global MNCs&lt;/li&gt;
&lt;li&gt;Build the company's own products and platforms&lt;/li&gt;
&lt;li&gt;Own the IP, engineering, and long-term innovation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why are more companies choosing this model?&lt;/p&gt;

&lt;p&gt;🤖 &lt;strong&gt;AI has changed the economics.&lt;/strong&gt; Companies no longer need hundreds of engineers to justify setting up an India office. Smaller, highly productive AI-enabled teams make it viable.&lt;/p&gt;

&lt;p&gt;🌍 &lt;strong&gt;India has become a global engineering hub.&lt;/strong&gt; World-class talent, mature tech ecosystems, and cost efficiency make India an obvious choice for long-term investment.&lt;/p&gt;

&lt;p&gt;The result?&lt;/p&gt;

&lt;p&gt;📈 GCCs continue expanding.&lt;br&gt;
💰 Many offer 20–25% higher compensation than traditional IT services.&lt;br&gt;
🚀 Engineers get more opportunities to work on core products instead of outsourced projects.&lt;/p&gt;

&lt;p&gt;This isn't the end of India's IT services industry.&lt;/p&gt;

&lt;p&gt;But it is a signal that the future of software engineering is evolving—from service delivery to product ownership, AI, and innovation.&lt;/p&gt;

&lt;p&gt;I explored this shift in detail, including why it matters for software engineers planning their careers.&lt;/p&gt;

&lt;p&gt;📖 &lt;strong&gt;Read the full article here:&lt;/strong&gt;&lt;br&gt;
👉 &lt;a href="https://www.saurabhsharma.dev/blogs/rise-of-gccs-india-ai-jobs" rel="noopener noreferrer"&gt;https://www.saurabhsharma.dev/blogs/rise-of-gccs-india-ai-jobs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you think GCCs will become the preferred career destination for software engineers over traditional IT companies?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>gcc</category>
      <category>computerscience</category>
      <category>software</category>
      <category>ai</category>
    </item>
    <item>
      <title>Is FAANG Becoming MANGO in the AI Era?</title>
      <dc:creator>Saurabh Sharma</dc:creator>
      <pubDate>Tue, 16 Jun 2026 06:13:21 +0000</pubDate>
      <link>https://dev.to/coder11/is-faang-becoming-mango-in-the-ai-era-31me</link>
      <guid>https://dev.to/coder11/is-faang-becoming-mango-in-the-ai-era-31me</guid>
      <description>&lt;h2&gt;
  
  
  Is FAANG Becoming MANGO in the AI Era?
&lt;/h2&gt;

&lt;p&gt;For years, &lt;strong&gt;FAANG&lt;/strong&gt; was the gold standard for innovation and engineering excellence.&lt;/p&gt;

&lt;p&gt;If you were a developer, working at companies like Facebook (Meta), Apple, Amazon, Netflix, or Google was often seen as the ultimate career goal.&lt;/p&gt;

&lt;p&gt;But the AI revolution is changing the conversation.&lt;/p&gt;

&lt;p&gt;Today, some of the most influential companies aren't just building products—they're building intelligence. The spotlight is increasingly shifting toward AI-native organizations such as &lt;strong&gt;OpenAI&lt;/strong&gt;, &lt;strong&gt;Anthropic&lt;/strong&gt;, &lt;strong&gt;NVIDIA&lt;/strong&gt;, and others that are shaping the future of software.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Shift
&lt;/h2&gt;

&lt;p&gt;This isn't really about replacing FAANG with another acronym.&lt;/p&gt;

&lt;p&gt;It's about a fundamental shift in technology:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search → Answers&lt;/li&gt;
&lt;li&gt;Automation → Agents&lt;/li&gt;
&lt;li&gt;Software → Intelligence&lt;/li&gt;
&lt;li&gt;Features → Capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As developers, we're entering an era where understanding AI is becoming as important as understanding frameworks, databases, and system design.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for Engineers
&lt;/h2&gt;

&lt;p&gt;The most valuable engineers of the next decade will likely combine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strong software engineering fundamentals&lt;/li&gt;
&lt;li&gt;AI-assisted development skills&lt;/li&gt;
&lt;li&gt;Prompt engineering&lt;/li&gt;
&lt;li&gt;LLM and agent integration&lt;/li&gt;
&lt;li&gt;AI-powered product thinking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't to compete with AI.&lt;/p&gt;

&lt;p&gt;The goal is to learn how to build with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the Full Article
&lt;/h2&gt;

&lt;p&gt;This post was inspired by a thought-provoking article that explores the FAANG-to-MANGO idea in much greater detail.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Read the complete article here:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.saurabhsharma.dev/blogs/mangos-vs-faang-ai-era/" rel="noopener noreferrer"&gt;https://www.saurabhsharma.dev/blogs/mangos-vs-faang-ai-era/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What do you think?&lt;/p&gt;

&lt;p&gt;Are we witnessing the rise of a new generation of AI-first companies, or will traditional tech giants continue to lead the next wave of innovation?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>machinelearning</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Deploy Angular 16/17/18/19 on cPanel - The Version-Specific Guide ⚡</title>
      <dc:creator>Saurabh Sharma</dc:creator>
      <pubDate>Wed, 13 May 2026 06:13:30 +0000</pubDate>
      <link>https://dev.to/coder11/deploy-angular-16171819-on-cpanel-the-version-specific-guide-12em</link>
      <guid>https://dev.to/coder11/deploy-angular-16171819-on-cpanel-the-version-specific-guide-12em</guid>
      <description>&lt;p&gt;Most Angular deployment guides are written for one version, then quietly become outdated. You follow the steps, something breaks, and you have no idea why — because the guide was for Angular 17 and you're on Angular 19.&lt;/p&gt;

&lt;p&gt;This guide is split by version. Find your path. Follow only that section.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Full deep-dive with all details at &lt;a href="https://www.saurabhsharma.dev/blogs/how-to-deploy-angular-18-and-19-applications-on-cpanel-hosting-complete-developer-guide/" rel="noopener noreferrer"&gt;saurabhsharma.dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Step 0 — Check Your Angular &amp;amp; Node.js Versions First&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sh&lt;br&gt;
ng version&lt;br&gt;
node --version&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Note the Angular version number. You'll need it to pick the right path below.&lt;/p&gt;

&lt;p&gt;Step 1 — Node.js Compatibility (Read Before Building)&lt;/p&gt;

&lt;p&gt;Your local Node.js &lt;strong&gt;must match&lt;/strong&gt; what's available on your cPanel server. Mismatches silently fail &lt;code&gt;npm install&lt;/code&gt; on the server.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;| Angular Version | Minimum Node.js | Recommended |&lt;br&gt;
|---|---|---|&lt;br&gt;
| Angular 16 | 16.14.x | 18.x LTS |&lt;br&gt;
| Angular 17 | 18.13.x | 18.x or 20.x LTS |&lt;br&gt;
| Angular 18 | 18.19.x | 20.x LTS |&lt;br&gt;
| Angular 19 | 20.11.x | 20.x or 22.x LTS |&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check what your cPanel supports:&lt;/strong&gt;&lt;br&gt;
cPanel → Setup Node.js App → + CREATE APPLICATION → Node.js version dropdown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mismatch? Use nvm to switch locally:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;install &lt;/span&gt;20
nvm use 20
node &lt;span class="nt"&gt;--version&lt;/span&gt;  &lt;span class="c"&gt;# confirm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Choose Your Path
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Does your project use SSR?
│
├─ NO  → Path A — CSR (all versions)
│
└─ YES → Which version?
         ├─ Angular 16  → Path B
         ├─ Angular 17/18 → Path C
         └─ Angular 19  → Path D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How to check if your project uses SSR:&lt;/strong&gt;&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;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'"@angular/ssr|@nguniversal'&lt;/span&gt; package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Line returned = SSR. Nothing = CSR.&lt;/p&gt;




&lt;h2&gt;
  
  
  Path A — CSR (Static) — All Angular Versions
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;No Node.js server needed. Just static files + &lt;code&gt;.htaccess&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. Build
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Important — the output folder changed in Angular 17:&lt;/strong&gt;&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;# Angular 16 and below — upload from here:&lt;/span&gt;
dist/your-app-name/

&lt;span class="gh"&gt;# Angular 17 and above — upload from HERE (the browser subfolder):&lt;/span&gt;
dist/your-app-name/browser/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uploading the wrong folder = blank page with no obvious error.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Upload to cPanel
&lt;/h3&gt;

&lt;p&gt;Upload the &lt;strong&gt;contents&lt;/strong&gt; of your build folder (not the folder itself) to &lt;code&gt;public_html/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Via File Manager: Zip the folder → upload → right-click → Extract.&lt;/p&gt;

&lt;p&gt;Do NOT upload: &lt;code&gt;node_modules/&lt;/code&gt;, &lt;code&gt;.git/&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt;, source &lt;code&gt;.ts&lt;/code&gt; files.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Create &lt;code&gt;.htaccess&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This is the step most people miss. Without it, every route except &lt;code&gt;/&lt;/code&gt; returns 404.&lt;/p&gt;

&lt;p&gt;In cPanel File Manager → Settings → enable &lt;strong&gt;Show Hidden Files&lt;/strong&gt; → create &lt;code&gt;.htaccess&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="nc"&gt;RewriteEngine&lt;/span&gt; &lt;span class="ss"&gt;On&lt;/span&gt;
&lt;span class="nc"&gt;RewriteBase&lt;/span&gt; /
&lt;span class="nc"&gt;RewriteRule&lt;/span&gt; ^index\.html$ - [L]
&lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-f
&lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-d
&lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-l
&lt;span class="nc"&gt;RewriteRule&lt;/span&gt; . /index.html [L]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;App in a subfolder&lt;/strong&gt; (e.g. &lt;code&gt;yourdomain.com/myapp/&lt;/code&gt;)? Change &lt;code&gt;RewriteBase /&lt;/code&gt; to &lt;code&gt;RewriteBase /myapp/&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Test
&lt;/h3&gt;

&lt;p&gt;Visit your domain. Then try a deep route like &lt;code&gt;/about&lt;/code&gt; directly in the URL bar. If it loads — you're done.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;CSR deployment complete.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Path B — SSR: Angular 16 (Universal)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Angular 16 uses &lt;code&gt;@nguniversal&lt;/code&gt; and needs a &lt;code&gt;server.ts&lt;/code&gt; modification to work on Apache Passenger.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. Modify &lt;code&gt;server.ts&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Replace this:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PORT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Node Express server listening on http://localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;With this:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isRunningOnApachePassenger&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;moduleFilename&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lsnode.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isRunningOnApachePassenger&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Node Express listening to Passenger Apache&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PORT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Node Express server listening on http://localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also update the conditional at the bottom of the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;moduleFilename&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;__filename&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
  &lt;span class="nx"&gt;moduleFilename&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;iisnode&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;moduleFilename&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;__filename&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
  &lt;span class="nx"&gt;moduleFilename&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;iisnode&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
  &lt;span class="nf"&gt;isRunningOnApachePassenger&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Build
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build:ssr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dist/your-app-name/
├── browser/
└── server/
    └── main.js   ← this is your startup file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Upload
&lt;/h3&gt;

&lt;p&gt;Create a directory &lt;strong&gt;outside&lt;/strong&gt; &lt;code&gt;public_html/&lt;/code&gt; — e.g. &lt;code&gt;/home/username/my-angular-app/&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ SSR apps cannot run from &lt;code&gt;public_html/&lt;/code&gt; on Namecheap shared hosting. This is a cPanel/Passenger constraint.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zip your project (excluding &lt;code&gt;node_modules/&lt;/code&gt;, &lt;code&gt;.git/&lt;/code&gt;, &lt;code&gt;README.md&lt;/code&gt;, &lt;code&gt;.gitignore&lt;/code&gt;), upload there, extract.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. cPanel Node.js App Setup
&lt;/h3&gt;

&lt;p&gt;Setup Node.js App → + CREATE APPLICATION:&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;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Node.js version&lt;/td&gt;
&lt;td&gt;Match your local (e.g. 18.x)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application mode&lt;/td&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application root&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/home/username/my-angular-app/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application URL&lt;/td&gt;
&lt;td&gt;Your domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application startup file&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dist/your-app-name/server/main.js&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then: Stop → Run NPM Install → Start App.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Angular 16 SSR complete.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Path C — SSR: Angular 17 &amp;amp; 18
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;No &lt;code&gt;server.ts&lt;/code&gt; changes needed. Build command is &lt;code&gt;ng build&lt;/code&gt;. Startup file is &lt;code&gt;server.mjs&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. Build
&lt;/h3&gt;



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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dist/your-app-name/
├── browser/
└── server/
    └── server.mjs   ← startup file (NOT main.js)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Upload
&lt;/h3&gt;

&lt;p&gt;Same as Path B — directory &lt;strong&gt;outside&lt;/strong&gt; &lt;code&gt;public_html/&lt;/code&gt;. Zip without &lt;code&gt;node_modules/&lt;/code&gt;, upload, extract.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. cPanel Node.js App Setup
&lt;/h3&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;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Node.js version&lt;/td&gt;
&lt;td&gt;18.x or 20.x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application mode&lt;/td&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application root&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/home/username/my-angular-app/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application URL&lt;/td&gt;
&lt;td&gt;Your domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application startup file&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dist/your-app-name/server/server.mjs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then: Stop → Run NPM Install → Start App.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Angular 17/18 SSR complete.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Path D — SSR: Angular 19
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;SSR is built-in. ES Modules by default. Same &lt;code&gt;server.mjs&lt;/code&gt; startup file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. Add SSR (if not already set up)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng add @angular/ssr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Add ES Module support to &lt;code&gt;package.json&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-angular-app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ng build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"serve:ssr"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node dist/my-angular-app/server/server.mjs"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Build
&lt;/h3&gt;



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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dist/your-app-name/
├── browser/
│   ├── index.html
│   └── main.abc123.js
└── server/
    └── server.mjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Upload
&lt;/h3&gt;

&lt;p&gt;Directory &lt;strong&gt;outside&lt;/strong&gt; &lt;code&gt;public_html/&lt;/code&gt;. Zip, upload, extract.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. cPanel Node.js App Setup
&lt;/h3&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;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Node.js version&lt;/td&gt;
&lt;td&gt;20.x or 22.x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application mode&lt;/td&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application root&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/home/username/my-angular-app/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application URL&lt;/td&gt;
&lt;td&gt;Your domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application startup file&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dist/your-app-name/server/server.mjs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Stop → Run NPM Install → Start App.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Angular 19 SSR complete.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Startup File Quick Reference
&lt;/h2&gt;

&lt;p&gt;The single most common cPanel mistake — pointing to the wrong file:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Angular Version&lt;/th&gt;
&lt;th&gt;Startup File&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Angular 16 (SSR)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dist/your-app-name/server/main.js&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Angular 17 (SSR)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dist/your-app-name/server/server.mjs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Angular 18 (SSR)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dist/your-app-name/server/server.mjs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Angular 19 (SSR)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dist/your-app-name/server/server.mjs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Performance: &lt;code&gt;.htaccess&lt;/code&gt; With Caching + Compression
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="nc"&gt;RewriteEngine&lt;/span&gt; &lt;span class="ss"&gt;On&lt;/span&gt;
&lt;span class="nc"&gt;RewriteBase&lt;/span&gt; /
&lt;span class="nc"&gt;RewriteRule&lt;/span&gt; ^index\.html$ - [L]
&lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-f
&lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-d
&lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-l
&lt;span class="nc"&gt;RewriteRule&lt;/span&gt; . /index.html [L]

&lt;span class="c"&gt;# GZIP compression&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;IfModule&lt;/span&gt;&lt;span class="sr"&gt; mod_deflate.c&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="nc"&gt;AddOutputFilterByType&lt;/span&gt; DEFLATE text/html text/plain text/css
  &lt;span class="nc"&gt;AddOutputFilterByType&lt;/span&gt; DEFLATE application/javascript application/json
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;IfModule&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="c"&gt;# Cache hashed JS/CSS forever&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="sr"&gt; "\.(js|css)$"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; Cache-Control "public, max-age=31536000, immutable"
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="c"&gt;# Cache images 1 year&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="sr"&gt; "\.(jpg|jpeg|png|gif|ico|svg|webp|woff2)$"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; Cache-Control "public, max-age=31536000"
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="c"&gt;# Always revalidate HTML&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="sr"&gt; "\.html$"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="ss"&gt;set&lt;/span&gt; Cache-Control "public, max-age=3600, must-revalidate"
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;FilesMatch&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;&lt;strong&gt;404 on all routes except &lt;code&gt;/&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
→ &lt;code&gt;.htaccess&lt;/code&gt; missing. Go to File Manager → Settings → enable Show Hidden Files → create it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App looks unstyled (no CSS/images)&lt;/strong&gt;&lt;br&gt;
→ Wrong &lt;code&gt;baseHref&lt;/code&gt; in &lt;code&gt;angular.json&lt;/code&gt;. Set &lt;code&gt;"baseHref": "/"&lt;/code&gt; and rebuild.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;cPanel shows "Application is down"&lt;/strong&gt;&lt;br&gt;
→ Check Detected Configuration Files in the Node.js App panel for error output. Common causes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wrong startup file path (check the table above)&lt;/li&gt;
&lt;li&gt;Wrong Node.js version (stop → change → NPM Install → start)&lt;/li&gt;
&lt;li&gt;Missing dependencies (stop → NPM Install → start)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;npm install&lt;/code&gt; fails on server&lt;/strong&gt;&lt;br&gt;
→ Local Node.js doesn't match cPanel. Use &lt;code&gt;nvm use 20&lt;/code&gt; locally, rebuild, re-upload.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Routes break on page refresh (SSR)&lt;/strong&gt;&lt;br&gt;
→ Missing catch-all route in your server file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../browser/index.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;app.server.module&lt;/code&gt; not found (Angular 16)&lt;/strong&gt;&lt;br&gt;
→ &lt;code&gt;@nguniversal&lt;/code&gt; not installed:&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; @nguniversal/express-engine
npm run build:ssr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Version Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Angular 16&lt;/th&gt;
&lt;th&gt;Angular 17&lt;/th&gt;
&lt;th&gt;Angular 18&lt;/th&gt;
&lt;th&gt;Angular 19&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Min Node.js&lt;/td&gt;
&lt;td&gt;16.14&lt;/td&gt;
&lt;td&gt;18.13&lt;/td&gt;
&lt;td&gt;18.19&lt;/td&gt;
&lt;td&gt;20.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSR package&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@nguniversal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@angular/ssr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@angular/ssr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build command&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm run build:ssr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ng build&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ng build&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ng build&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Startup file&lt;/td&gt;
&lt;td&gt;&lt;code&gt;server/main.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;server/server.mjs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;server/server.mjs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;server/server.mjs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;server.ts change needed&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ES Modules default&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Pre-Launch Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Local &lt;code&gt;node --version&lt;/code&gt; matches cPanel&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;ng build&lt;/code&gt; completes with zero errors&lt;/li&gt;
&lt;li&gt;[ ] Uploaded correct folder (&lt;code&gt;browser/&lt;/code&gt; for Angular 17+, root dist for Angular 16 CSR)&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;.htaccess&lt;/code&gt; in domain root (CSR deployments)&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;node_modules/&lt;/code&gt; NOT uploaded — ran NPM Install in cPanel instead&lt;/li&gt;
&lt;li&gt;[ ] Startup file path matches your version (see table above)&lt;/li&gt;
&lt;li&gt;[ ] All routes work including direct URL access&lt;/li&gt;
&lt;li&gt;[ ] Styles and images load&lt;/li&gt;
&lt;li&gt;[ ] HTTPS enabled (free Let's Encrypt in cPanel)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Found this useful? The full guide with every detail, decision tree, FAQ, and subfolder configs is at &lt;strong&gt;&lt;a href="https://www.saurabhsharma.dev/blogs/how-to-deploy-angular-18-and-19-applications-on-cpanel-hosting-complete-developer-guide/" rel="noopener noreferrer"&gt;saurabhsharma.dev&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Drop a comment with your Angular version and deployment type — happy to help debug.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>cpanel</category>
    </item>
  </channel>
</rss>
