<?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>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>
