<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[AEM From Scratch: Complete Roadmap]]></title><description><![CDATA[AEM From Scratch: Complete Roadmap]]></description><link>https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Fri, 19 Jun 2026 19:00:26 GMT</lastBuildDate><atom:link href="https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[AEM Project Structure — Complete Folder Guide 🗂️]]></title><description><![CDATA[Covers: Maven Archetype • Module Structure • Build & Deploy • Package Manager

How the Project Was Created ⚙️
Using Adobe’s official Maven archetype:
mvn -B org.apache.maven.plugins:maven-archetype-plugin:3.3.1:generate \
 -D archetypeGroupId=com.ado...]]></description><link>https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/aem-project-structure-complete-folder-guide</link><guid isPermaLink="true">https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/aem-project-structure-complete-folder-guide</guid><category><![CDATA[AEM]]></category><category><![CDATA[adobe experience manager]]></category><category><![CDATA[aem development]]></category><category><![CDATA[AEM Tutorial]]></category><category><![CDATA[maven]]></category><category><![CDATA[Java]]></category><category><![CDATA[project structure]]></category><category><![CDATA[software architecture]]></category><dc:creator><![CDATA[Siddharth Pamnath]]></dc:creator><pubDate>Sun, 15 Feb 2026 20:13:35 GMT</pubDate><content:encoded><![CDATA[<p><strong>Covers:</strong> Maven Archetype • Module Structure • Build &amp; Deploy • Package Manager</p>
<hr />
<h1 id="heading-how-the-project-was-created">How the Project Was Created ⚙️</h1>
<p>Using Adobe’s official Maven archetype:</p>
<pre><code class="lang-plaintext">mvn -B org.apache.maven.plugins:maven-archetype-plugin:3.3.1:generate \
 -D archetypeGroupId=com.adobe.aem \
 -D archetypeArtifactId=aem-project-archetype \
 -D archetypeVersion=56 \
 -D appTitle="My Site" \
 -D appId="mysite" \
 -D groupId="com.mysite"
</code></pre>
<hr />
<h1 id="heading-top-level-project-structure">Top-Level Project Structure 🏗️</h1>
<pre><code class="lang-plaintext">myaemsite/                          ← Root project (Parent POM)
│
├── pom.xml                         ← Parent POM (controls all modules)
│
├── core/                           ← MODULE 1: Java Backend Code
├── ui.apps/                        ← MODULE 2: Components, Dialogs, HTL
├── ui.content/                     ← MODULE 3: Pages, Templates, Content
├── ui.frontend/                    ← MODULE 4: Frontend (CSS, JS, Webpack)
├── ui.apps.structure/              ← MODULE 5: Repository skeleton
├── ui.config/                      ← MODULE 6: OSGi Configurations
├── ui.tests/                       ← MODULE 7: UI Tests
├── it.tests/                       ← MODULE 8: Integration Tests
├── dispatcher/                     ← MODULE 9: Dispatcher Config
└── all/                            ← MODULE 10: Full Package
</code></pre>
<hr />
<h1 id="heading-module-1-core-java-backend-code">Module 1: <code>core/</code> — Java Backend Code ☕</h1>
<pre><code class="lang-plaintext">core/
├── pom.xml
└── src/main/java/com/myaemsite/core/
    ├── models/
    ├── servlets/
    ├── services/
    ├── filters/
    ├── listeners/
    └── schedulers/
</code></pre>
<p><strong>Role:</strong> All Java backend logic.</p>
<p>📦 Compiles into an <strong>OSGi bundle (JAR)</strong><br />📍 Deploys to: <code>/apps/myaemsite/install/</code></p>
<p>👉 Think: Django backend or Spring Boot services.</p>
<hr />
<h1 id="heading-module-2-uiapps-components-amp-htl">Module 2: <code>ui.apps/</code> — Components &amp; HTL 🧩</h1>
<pre><code class="lang-plaintext">ui.apps/src/main/content/jcr_root/apps/myaemsite/
├── components/
├── clientlibs/
└── i18n/
</code></pre>
<p>Contains:</p>
<ul>
<li><p>HTL templates</p>
</li>
<li><p>Author dialogs</p>
</li>
<li><p>Clientlibs</p>
</li>
<li><p>Component configs</p>
</li>
</ul>
<p>📍 Deploys to: <code>/apps/myaemsite/</code></p>
<h3 id="heading-golden-rule">Golden Rule ✨</h3>
<pre><code class="lang-plaintext">File system path  =  Repository path

jcr_root/apps/mysite/  →  /apps/mysite/
</code></pre>
<hr />
<h1 id="heading-module-3-uicontent-pages-amp-templates">Module 3: <code>ui.content/</code> — Pages &amp; Templates 📄</h1>
<pre><code class="lang-plaintext">ui.content/src/main/content/jcr_root/
├── content/myaemsite/
└── conf/myaemsite/
</code></pre>
<p>Contains:</p>
<ul>
<li><p>Website pages</p>
</li>
<li><p>Editable templates</p>
</li>
<li><p>Component policies</p>
</li>
</ul>
<p>📍 Deploys to:</p>
<ul>
<li><p><code>/content/</code></p>
</li>
<li><p><code>/conf/</code></p>
</li>
</ul>
<hr />
<h1 id="heading-module-4-uifrontend-modern-frontend">Module 4: <code>ui.frontend/</code> — Modern Frontend 🎨</h1>
<pre><code class="lang-plaintext">ui.frontend/
├── package.json
├── webpack configs
└── src/main/webpack/
</code></pre>
<p>Uses:</p>
<ul>
<li><p>Webpack</p>
</li>
<li><p>TypeScript</p>
</li>
<li><p>SASS</p>
</li>
</ul>
<p>👉 Output goes into <strong>ui.apps/clientlibs/</strong></p>
<hr />
<h1 id="heading-module-5-uiappsstructure">Module 5: <code>ui.apps.structure/</code> 🏗️</h1>
<p>Creates empty folder structure in AEM before other packages install.</p>
<p>Small module, but very important.</p>
<hr />
<h1 id="heading-module-6-uiconfig-osgi-configs">Module 6: <code>ui.config/</code> — OSGi Configs ⚙️</h1>
<pre><code class="lang-plaintext">config/
config.author/
config.publish/
config.dev/
config.stage/
config.prod/
</code></pre>
<p>Environment-specific configs.</p>
<p>💡 Remember Run Modes from previous chapter.</p>
<hr />
<h1 id="heading-testing-modules">Testing Modules 🧪</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Module</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><code>ui.tests</code></td><td>UI / Selenium / Cypress tests</td></tr>
<tr>
<td><code>it.tests</code></td><td>Java integration tests</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-module-9-dispatcher">Module 9: Dispatcher 🚀</h1>
<p>Production caching &amp; security.</p>
<p>Contains:</p>
<ul>
<li><p>Cache rules</p>
</li>
<li><p>Filters</p>
</li>
<li><p>URL rewrites</p>
</li>
</ul>
<p>👉 Not required for local dev.</p>
<hr />
<h1 id="heading-module-10-all-the-final-package">Module 10: <code>all/</code> — The Final Package 📦</h1>
<p>Combines everything into one deployable package.</p>
<pre><code class="lang-plaintext">myaemsite.all-1.0-SNAPSHOT.zip
</code></pre>
<p>This is what gets deployed to AEM.</p>
<hr />
<h1 id="heading-how-everything-connects">How Everything Connects 🔗</h1>
<p>Developer writes:</p>
<ul>
<li><p>Java → <code>core/</code></p>
</li>
<li><p>Components → <code>ui.apps/</code></p>
</li>
<li><p>CSS/JS → <code>ui.frontend/</code></p>
</li>
<li><p>Configs → <code>ui.config/</code></p>
</li>
<li><p>Content → <code>ui.content/</code></p>
</li>
</ul>
<p>Maven builds → <code>all/</code> package → Deploy to AEM 🎉</p>
<hr />
<h1 id="heading-important-maven-commands">Important Maven Commands 💻</h1>
<h2 id="heading-build-amp-deploy">Build &amp; Deploy</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Command</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><code>mvn clean install</code></td><td>Build only</td></tr>
<tr>
<td><code>-PautoInstallSinglePackage</code></td><td>Deploy to Author (4502)</td></tr>
<tr>
<td><code>-PautoInstallSinglePackagePublish</code></td><td>Deploy to Publish (4503)</td></tr>
</tbody>
</table>
</div><h2 id="heading-deploy-specific-modules">Deploy Specific Modules</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Command</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td>Deploy Java</td><td><code>-PautoInstallBundle -pl core</code></td></tr>
<tr>
<td>Deploy Components</td><td><code>-PautoInstallPackage -pl ui.apps</code></td></tr>
<tr>
<td>Deploy Content</td><td><code>-PautoInstallPackage -pl ui.content</code></td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-frontend-commands">Frontend Commands 🎨</h1>
<p>Run inside <code>ui.frontend/</code></p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Command</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><code>npm install</code></td><td>Install deps</td></tr>
<tr>
<td><code>npm run build</code></td><td>Compile assets</td></tr>
<tr>
<td><code>npm run dev</code></td><td>Dev server</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-useful-aem-urls">Useful AEM URLs 🔗</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>URL</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><code>/crx/de</code></td><td>Repository browser</td></tr>
<tr>
<td><code>/crx/packmgr</code></td><td>Package Manager</td></tr>
<tr>
<td><code>/system/console/bundles</code></td><td>OSGi bundles</td></tr>
<tr>
<td><code>/system/console/configMgr</code></td><td>OSGi configs</td></tr>
<tr>
<td><code>/sites.html</code></td><td>Sites console</td></tr>
<tr>
<td><code>/assets.html</code></td><td>DAM console</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-daily-development-workflow">Daily Development Workflow 🧑‍💻</h1>
<pre><code class="lang-plaintext">Java change?
→ mvn clean install -PautoInstallBundle -pl core

HTL change?
→ mvn clean install -PautoInstallPackage -pl ui.apps

Everything changed?
→ mvn clean install -PautoInstallSinglePackage
</code></pre>
<p>Add <code>-DskipTests</code> for faster builds ⚡</p>
<hr />
<h1 id="heading-interview-questions">Interview Questions 🎤</h1>
<h3 id="heading-top-questions">Top Questions</h3>
<p><strong>What archetype creates AEM projects?</strong><br />→ <code>com.adobe.aem:aem-project-archetype</code></p>
<p><strong>What is core module?</strong><br />→ Java backend (Sling Models, Services, Servlets)</p>
<p><strong>ui.apps vs ui.content?</strong><br />→ ui.apps = code<br />→ ui.content = content</p>
<p><strong>What is CRX Package?</strong><br />→ ZIP file installed via Package Manager.</p>
<hr />
<h1 id="heading-things-to-remember">Things to Remember 🧠</h1>
<pre><code class="lang-plaintext">core          → Java backend
ui.apps       → Components &amp; HTL
ui.content    → Pages &amp; Templates
ui.frontend   → CSS &amp; JS
ui.config     → OSGi configs
all           → Everything combined
dispatcher    → Caching &amp; security
</code></pre>
<h3 id="heading-daily-commands">Daily Commands</h3>
<pre><code class="lang-plaintext">Full deploy:
mvn clean install -PautoInstallSinglePackage

Java only:
mvn clean install -PautoInstallBundle -pl core

Components only:
mvn clean install -PautoInstallPackage -pl ui.apps
</code></pre>
]]></content:encoded></item><item><title><![CDATA[AEM Maven Archetype Explained (Beginner Friendly)]]></title><description><![CDATA[URL slug: aem-maven-archetype-explainedTags: AEM, Adobe Experience Manager, Maven, Java, Web Development

What is Maven?
Before understanding the archetype, you need to know Maven.
Maven is a build tool for Java projects.It does for Java what npm doe...]]></description><link>https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/aem-maven-archetype-explained-beginner-friendly</link><guid isPermaLink="true">https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/aem-maven-archetype-explained-beginner-friendly</guid><category><![CDATA[AEM Tutorial]]></category><category><![CDATA[AEM]]></category><category><![CDATA[adobe experience manager]]></category><category><![CDATA[maven]]></category><category><![CDATA[Java]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Build Tools]]></category><category><![CDATA[Beginner-friendly]]></category><dc:creator><![CDATA[Siddharth Pamnath]]></dc:creator><pubDate>Sun, 15 Feb 2026 19:23:13 GMT</pubDate><content:encoded><![CDATA[<p><strong>URL slug:</strong> <code>aem-maven-archetype-explained</code><br /><strong>Tags:</strong> AEM, Adobe Experience Manager, Maven, Java, Web Development</p>
<hr />
<h1 id="heading-what-is-maven">What is Maven?</h1>
<p>Before understanding the archetype, you need to know Maven.</p>
<p><strong>Maven is a build tool for Java projects.</strong><br />It does for Java what npm does for Node.js or pip does for Python.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Tool</td><td>Language</td><td>Config File</td><td>What It Does</td></tr>
</thead>
<tbody>
<tr>
<td>npm</td><td>JavaScript</td><td><code>package.json</code></td><td>Install packages, run scripts, build</td></tr>
<tr>
<td>pip</td><td>Python</td><td><code>requirements.txt</code></td><td>Install packages</td></tr>
<tr>
<td><strong>Maven</strong></td><td><strong>Java (AEM)</strong></td><td><strong>pom.xml</strong></td><td>Download dependencies, compile, test, package, deploy</td></tr>
</tbody>
</table>
</div><h3 id="heading-the-heart-of-maven-pomxml">The Heart of Maven → <code>pom.xml</code></h3>
<p>Every AEM project contains a <strong>pom.xml (Project Object Model)</strong>.<br />This file defines:</p>
<ul>
<li><p>Project name &amp; version</p>
</li>
<li><p>Dependencies (libraries)</p>
</li>
<li><p>Build plugins</p>
</li>
<li><p>Deployment profiles</p>
</li>
</ul>
<p>Think of <code>pom.xml</code> as the <strong>brain of the project</strong>.</p>
<hr />
<h1 id="heading-what-is-an-archetype">What is an Archetype?</h1>
<p>An <strong>archetype</strong> is a <strong>project template generator</strong>.</p>
<p>Instead of starting with an empty folder, it creates a ready-made project with best practices.</p>
<p>Every framework has one:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Framework</td><td>Command</td><td>What It Creates</td></tr>
</thead>
<tbody>
<tr>
<td>Django</td><td><code>django-admin startproject</code></td><td>Full Django project</td></tr>
<tr>
<td>React</td><td><code>create-react-app</code></td><td>React app with configs</td></tr>
<tr>
<td>Angular</td><td><code>ng new</code></td><td>Angular app structure</td></tr>
<tr>
<td><strong>AEM</strong></td><td><code>mvn archetype:generate</code></td><td>Full AEM project (10 modules)</td></tr>
</tbody>
</table>
</div><p>👉 All of them do the same thing: <strong>Generate a project structure.</strong></p>
<hr />
<h1 id="heading-what-is-aem-maven-archetype">What is AEM Maven Archetype?</h1>
<p>The <strong>AEM Maven Archetype</strong> is Adobe’s official starter template for AEM projects.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Detail</td><td>Value</td></tr>
</thead>
<tbody>
<tr>
<td>Created by</td><td>Adobe</td></tr>
<tr>
<td>Source</td><td><a target="_blank" href="https://github.com/adobe/aem-project-archetype">https://github.com/adobe/aem-project-archetype</a></td></tr>
<tr>
<td>Latest version</td><td><strong>56</strong></td></tr>
<tr>
<td>Output</td><td>Complete AEM project</td></tr>
<tr>
<td>Used by</td><td>Every enterprise AEM project</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-the-command-explained-word-by-word">The Command — Explained Word by Word</h1>
<pre><code class="lang-plaintext">mvn -B org.apache.maven.plugins:maven-archetype-plugin:3.3.1:generate \
  -D archetypeGroupId=com.adobe.aem \
  -D archetypeArtifactId=aem-project-archetype \
  -D archetypeVersion=56 \
  -D appTitle="My Site" \
  -D appId="mysite" \
  -D groupId="com.mysite"
</code></pre>
<h3 id="heading-breakdown">Breakdown</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Part</td><td>Meaning</td></tr>
</thead>
<tbody>
<tr>
<td><code>mvn</code></td><td>Run Maven</td></tr>
<tr>
<td><code>-B</code></td><td>Batch mode (no prompts)</td></tr>
<tr>
<td><code>maven-archetype-plugin</code></td><td>Plugin used to generate projects</td></tr>
<tr>
<td><code>archetypeGroupId</code></td><td>Who created the template → Adobe</td></tr>
<tr>
<td><code>archetypeArtifactId</code></td><td>Which template → AEM project</td></tr>
<tr>
<td><code>archetypeVersion</code></td><td>Template version</td></tr>
<tr>
<td><code>appTitle</code></td><td>Display name of site</td></tr>
<tr>
<td><code>appId</code></td><td>Technical project ID</td></tr>
<tr>
<td><code>groupId</code></td><td>Java package name</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-required-parameters">Required Parameters</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Parameter</td><td>Example</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><code>appTitle</code></td><td>MyAEMSite</td><td>Display name in AEM</td></tr>
<tr>
<td><code>appId</code></td><td>myaemsite</td><td>Folder &amp; module naming</td></tr>
<tr>
<td><code>groupId</code></td><td>com.myaemsite</td><td>Java package</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-optional-parameters-with-defaults">Optional Parameters (with Defaults)</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Parameter</td><td>Default</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td>artifactId</td><td>appId</td><td>Maven project name</td></tr>
<tr>
<td>version</td><td>1.0-SNAPSHOT</td><td>Project version</td></tr>
<tr>
<td>package</td><td>groupId</td><td>Java source package</td></tr>
<tr>
<td>aemVersion</td><td>cloud</td><td>Cloud or 6.5</td></tr>
<tr>
<td>language</td><td>en</td><td>Site language</td></tr>
<tr>
<td>country</td><td>us</td><td>Country code</td></tr>
<tr>
<td>includeExamples</td><td>n</td><td>Sample components</td></tr>
<tr>
<td>includeErrorHandler</td><td>n</td><td>Custom 404 page</td></tr>
<tr>
<td>frontendModule</td><td>general</td><td>Frontend type</td></tr>
<tr>
<td>includeDispatcherConfig</td><td>y</td><td>Dispatcher setup</td></tr>
<tr>
<td>singleCountry</td><td>y</td><td>Content structure</td></tr>
<tr>
<td>datalayer</td><td>y</td><td>Adobe Data Layer</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-the-most-important-parameter-appid">The Most Important Parameter → <code>appId</code></h1>
<p>This <strong>single value controls the entire project naming</strong>.</p>
<p>If you set:</p>
<pre><code class="lang-plaintext">appId = myaemsite
</code></pre>
<p>It automatically generates:</p>
<h3 id="heading-repository-paths">Repository Paths</h3>
<pre><code class="lang-plaintext">/apps/myaemsite/
/content/myaemsite/
/conf/myaemsite/
</code></pre>
<h3 id="heading-java-packages">Java Packages</h3>
<pre><code class="lang-plaintext">com.myaemsite.core
com.myaemsite.core.models
com.myaemsite.core.servlets
</code></pre>
<h3 id="heading-maven-packages">Maven Packages</h3>
<pre><code class="lang-plaintext">myaemsite.ui.apps
myaemsite.ui.content
myaemsite.all
</code></pre>
<h3 id="heading-client-libraries">Client Libraries</h3>
<pre><code class="lang-plaintext">clientlib-myaemsite-base
</code></pre>
<p>👉 <strong>One value → controls EVERYTHING.</strong></p>
<hr />
<h1 id="heading-before-vs-after-running-the-archetype">Before vs After Running the Archetype</h1>
<h3 id="heading-before">Before</h3>
<pre><code class="lang-plaintext">D:\AEM\Projects\
(empty)
</code></pre>
<h3 id="heading-after">After</h3>
<pre><code class="lang-plaintext">myaemsite/
├── pom.xml
├── core/
├── ui.apps/
├── ui.content/
├── ui.frontend/
├── ui.config/
├── ui.apps.structure/
├── ui.tests/
├── it.tests/
├── dispatcher/
└── all/
</code></pre>
<p><strong>10 modules generated in seconds.</strong></p>
<hr />
<h1 id="heading-what-happens-internally">What Happens Internally?</h1>
<ol>
<li><p>Maven downloads the archetype template from the internet</p>
</li>
<li><p>Reads your parameters (<code>appId</code>, <code>groupId</code>, etc.)</p>
</li>
<li><p>Replaces placeholders in template files</p>
</li>
<li><p>Generates project folders</p>
</li>
<li><p>Runs cleanup scripts</p>
</li>
<li><p>Project ready 🎉</p>
</li>
</ol>
<p>Think of it as <strong>Mail Merge for code.</strong></p>
<hr />
<h1 id="heading-generated-modules-explained">Generated Modules Explained</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Module</td><td>Contains</td><td>Deploys To</td></tr>
</thead>
<tbody>
<tr>
<td>core</td><td>Java backend</td><td><code>/apps/.../install/</code></td></tr>
<tr>
<td>ui.apps</td><td>Components &amp; HTL</td><td><code>/apps/</code></td></tr>
<tr>
<td>ui.content</td><td>Pages &amp; templates</td><td><code>/content</code></td></tr>
<tr>
<td>ui.frontend</td><td>CSS/JS build</td><td>Clientlibs</td></tr>
<tr>
<td>ui.config</td><td>OSGi configs</td><td><code>/apps/.../osgiconfig</code></td></tr>
<tr>
<td>ui.apps.structure</td><td>Repo skeleton</td><td><code>/apps/</code></td></tr>
<tr>
<td>ui.tests</td><td>UI tests</td><td>Test only</td></tr>
<tr>
<td>it.tests</td><td>Integration tests</td><td>Test only</td></tr>
<tr>
<td>dispatcher</td><td>Cache &amp; security</td><td>Apache server</td></tr>
<tr>
<td>all</td><td>Combined package</td><td>Everything</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-build-commands-after-generation">Build Commands After Generation</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Command</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><code>mvn clean install</code></td><td>Build only</td></tr>
<tr>
<td><code>mvn clean install -PautoInstallSinglePackage</code></td><td>Build + deploy</td></tr>
<tr>
<td><code>-PautoInstallBundle -pl core</code></td><td>Deploy Java only</td></tr>
<tr>
<td><code>-PautoInstallPackage -pl ui.apps</code></td><td>Deploy components only</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-aemversion-cloud-vs-on-prem">aemVersion — Cloud vs On-Prem</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Value</td><td>Target</td></tr>
</thead>
<tbody>
<tr>
<td>cloud</td><td>AEM as a Cloud Service</td></tr>
<tr>
<td>6.5.0</td><td>AEM 6.5 On-Prem</td></tr>
</tbody>
</table>
</div><p>For local learning:</p>
<ul>
<li><p>AEM SDK → <code>cloud</code></p>
</li>
<li><p>AEM 6.5 JAR → <code>6.5.0</code></p>
</li>
</ul>
<hr />
<h1 id="heading-archetype-version-history">Archetype Version History</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Version</td><td>Year</td><td>Notes</td></tr>
</thead>
<tbody>
<tr>
<td><strong>56</strong></td><td>2025</td><td>Latest</td></tr>
<tr>
<td>49</td><td>2024</td><td>Frontend improvements</td></tr>
<tr>
<td>47</td><td>2023</td><td>Stable</td></tr>
<tr>
<td>41</td><td>2022</td><td>ui.config added</td></tr>
<tr>
<td>35</td><td>2021</td><td>Editable templates</td></tr>
<tr>
<td>27</td><td>2020</td><td>Frontend module</td></tr>
</tbody>
</table>
</div><p>👉 Always use the <strong>latest version</strong>.</p>
<hr />
<h1 id="heading-real-world-analogy">Real-World Analogy</h1>
<p>Without archetype → build restaurant from scratch 🍽️<br />With archetype → buy franchise starter kit 🏪</p>
<p>Everything is ready — you just customize your brand.</p>
<hr />
<h1 id="heading-common-mistakes-to-avoid">Common Mistakes to Avoid</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Mistake</td><td>Fix</td></tr>
</thead>
<tbody>
<tr>
<td>Using old version</td><td>Use latest</td></tr>
<tr>
<td>Spaces in path</td><td>Avoid spaces</td></tr>
<tr>
<td>Using Eclipse wizard</td><td>Use CLI</td></tr>
<tr>
<td>Forgetting <code>-B</code></td><td>Always use it</td></tr>
<tr>
<td>Wrong aemVersion</td><td>Match your AEM</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-summary">Summary</h1>
<p><strong>AEM Maven Archetype = Adobe’s official starter kit.</strong></p>
<p>It generates a <strong>complete AEM project in seconds.</strong></p>
<h3 id="heading-command">Command</h3>
<pre><code class="lang-plaintext">mvn -B org.apache.maven.plugins:maven-archetype-plugin:3.3.1:generate \
  -D archetypeGroupId=com.adobe.aem \
  -D archetypeArtifactId=aem-project-archetype \
  -D archetypeVersion=56 \
  -D appTitle="My Site" \
  -D appId="mysite" \
  -D groupId="com.mysite"
</code></pre>
<h3 id="heading-first-command-after-generation">First command after generation</h3>
<pre><code class="lang-plaintext">mvn clean install -PautoInstallSinglePackage
</code></pre>
]]></content:encoded></item><item><title><![CDATA[⚙️ AEM Run Modes Explained — Author vs Publish vs Dev vs Prod]]></title><description><![CDATA[Chapter 5 of AEM Learning Series — How AEM behaves differently across environments without changing code.


🎯 What Are Run Modes?

Run modes allow AEM to behave differently depending on where it is running.

The same codebase runs across:

Author (c...]]></description><link>https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/aem-run-modes-explained-author-vs-publish-vs-dev-vs-prod</link><guid isPermaLink="true">https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/aem-run-modes-explained-author-vs-publish-vs-dev-vs-prod</guid><category><![CDATA[ Run Modes]]></category><category><![CDATA[AEM]]></category><category><![CDATA[adobe experience manager]]></category><category><![CDATA[Java]]></category><category><![CDATA[cms]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[backend]]></category><dc:creator><![CDATA[Siddharth Pamnath]]></dc:creator><pubDate>Sat, 14 Feb 2026 09:00:05 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>Chapter 5 of AEM Learning Series — How AEM behaves differently across environments without changing code.</p>
</blockquote>
<hr />
<h1 id="heading-what-are-run-modes">🎯 What Are Run Modes?</h1>
<blockquote>
<p><strong>Run modes allow AEM to behave differently depending on where it is running.</strong></p>
</blockquote>
<p>The <strong>same codebase</strong> runs across:</p>
<ul>
<li><p>Author (content editing)</p>
</li>
<li><p>Publish (live website)</p>
</li>
<li><p>Dev (development)</p>
</li>
<li><p>Stage (testing)</p>
</li>
<li><p>Prod (production)</p>
</li>
</ul>
<p>Each environment needs <strong>different configurations</strong>.</p>
<p>Run modes make this possible <strong>without changing code</strong>.</p>
<hr />
<h1 id="heading-two-categories-of-run-modes">🧩 Two Categories of Run Modes</h1>
<h2 id="heading-1-instance-type-set-once-at-startup">1️⃣ Instance Type (Set Once at Startup)</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Run Mode</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><strong>author</strong></td><td>Content editing instance</td></tr>
<tr>
<td><strong>publish</strong></td><td>Live website instance</td></tr>
</tbody>
</table>
</div><p>Cannot be changed at runtime.</p>
<hr />
<h2 id="heading-2-environment-run-modes-custom">2️⃣ Environment Run Modes (Custom)</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Run Mode</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><strong>dev</strong></td><td>Development</td></tr>
<tr>
<td><strong>stage</strong></td><td>Staging / QA</td></tr>
<tr>
<td><strong>prod</strong></td><td>Production</td></tr>
</tbody>
</table>
</div><p>Also set at startup via JVM parameter.</p>
<hr />
<h1 id="heading-how-to-set-run-modes">🔧 How to Set Run Modes</h1>
<h3 id="heading-method-1-jar-naming">Method 1 — JAR Naming</h3>
<pre><code class="lang-plaintext">aem-author-p4502.jar
aem-publish-p4503.jar
</code></pre>
<hr />
<h3 id="heading-method-2-jvm-parameter">Method 2 — JVM Parameter</h3>
<pre><code class="lang-plaintext">-Dsling.run.modes=author,dev
</code></pre>
<hr />
<h3 id="heading-method-3-slingpropertieshttpslingproperties">Method 3 — <a target="_blank" href="http://sling.properties">sling.properties</a></h3>
<pre><code class="lang-plaintext">crx-quickstart/conf/sling.properties
sling.run.modes=author,dev
</code></pre>
<p>👉 Multiple run modes can be active together:</p>
<pre><code class="lang-plaintext">author + dev
publish + prod
</code></pre>
<hr />
<h1 id="heading-run-modes-amp-osgi-configurations">📁 Run Modes &amp; OSGi Configurations</h1>
<p>Inside your project:</p>
<pre><code class="lang-plaintext">osgiconfig/
├── config/                 → All instances
├── config.author/          → Author only
├── config.publish/         → Publish only
├── config.dev/             → Dev only
├── config.stage/           → Stage only
├── config.prod/            → Prod only
├── config.author.dev/      → Author + Dev
└── config.publish.prod/    → Publish + Prod
</code></pre>
<h3 id="heading-priority-rule-must-remember">Priority Rule (Must Remember)</h3>
<pre><code class="lang-plaintext">config.publish.prod
      ↓
config.prod
      ↓
config.publish
      ↓
config
</code></pre>
<p>👉 <strong>More specific folder wins.</strong></p>
<hr />
<h1 id="heading-real-world-examples">🌍 Real-World Examples</h1>
<h2 id="heading-logging">Logging</h2>
<pre><code class="lang-plaintext">config.dev     → DEBUG
config.prod    → ERROR
</code></pre>
<h2 id="heading-email-service">Email Service</h2>
<pre><code class="lang-plaintext">config.author          → disabled
config.publish.dev     → test SMTP
config.publish.prod    → real SMTP
</code></pre>
<h2 id="heading-analytics-tracking">Analytics Tracking</h2>
<pre><code class="lang-plaintext">config.author          → OFF
config.publish.prod    → ON
</code></pre>
<hr />
<h1 id="heading-how-to-check-active-run-modes">🔍 How to Check Active Run Modes</h1>
<p>Open:</p>
<pre><code class="lang-plaintext">/system/console/status-slingsettings
</code></pre>
<p>Example output:</p>
<pre><code class="lang-plaintext">Run Modes = [author, dev, crx3, crx3tar]
</code></pre>
<hr />
<h1 id="heading-critical-rules">🚨 Critical Rules</h1>
<pre><code class="lang-plaintext">Always use nosamplecontent in production
Use combined run mode configs for clarity
Check run modes when service works on Author but not Publish
Run modes cannot be changed without restart
Never use samplecontent in production
</code></pre>
<hr />
<h1 id="heading-quick-recap">🧠 Quick Recap</h1>
<ul>
<li><p>Run modes = environment-specific behavior</p>
</li>
<li><p>Types:</p>
<ul>
<li><p>author / publish (instance)</p>
</li>
<li><p>dev / stage / prod (environment)</p>
</li>
</ul>
</li>
<li><p>Set via:</p>
<ul>
<li><p>JAR name</p>
</li>
<li><p>JVM parameter</p>
</li>
<li><p><a target="_blank" href="http://sling.properties">sling.properties</a></p>
</li>
</ul>
</li>
<li><p>Cannot change at runtime</p>
</li>
<li><p>More specific config folder wins</p>
</li>
</ul>
<hr />
<h1 id="heading-interview-questions-run-modes-15-qampa">🎯 Interview Questions — Run Modes (15 Q&amp;A)</h1>
<hr />
<p><strong>Q1. What are run modes?</strong><br />Environment-based configuration mechanism.</p>
<p><strong>Q2. Types of run modes?</strong><br />Installation (author/publish) + custom (dev/stage/prod).</p>
<p><strong>Q3. How to set run modes?</strong><br />JAR name, JVM parameter, <a target="_blank" href="http://sling.properties">sling.properties</a>.</p>
<p><strong>Q4. How do run modes affect configs?</strong><br />AEM loads matching config folders.</p>
<p><strong>Q5. Run mode priority?</strong><br /><a target="_blank" href="http://config.publish.prod"><code>config.publish.prod</code></a> <code>&gt;</code> <a target="_blank" href="http://config.prod"><code>config.prod</code></a> <code>&gt; config.publish &gt; config</code>.</p>
<p><strong>Q6. Change run modes at runtime?</strong><br />No — restart required.</p>
<p><strong>Q7. Where to check active run modes?</strong><br /><code>/system/console/status-slingsettings</code>.</p>
<p><strong>Q8. Run modes in AEM Cloud?</strong><br />author, publish, dev, stage, prod, rde.</p>
<p><strong>Q9. Real-world example?</strong><br />Different SMTP per environment.</p>
<p><strong>Q10. Multiple run modes active?</strong><br />Yes.</p>
<p><strong>Q11. Config conflict resolution?</strong><br />Use combined run mode folder.</p>
<p><strong>Q12. samplecontent run mode?</strong><br />Installs demo content.</p>
<p><strong>Q13. Why nosamplecontent?</strong><br />Production best practice.</p>
<p><strong>Q14. Config folder naming?</strong><br /><code>config.&lt;runmode&gt;</code>.</p>
<p><strong>Q15. Service works on Author not Publish?</strong><br />Check run modes, replication, permissions, dispatcher.</p>
<hr />
<h1 id="heading-final-summary">🎉 Final Summary</h1>
<p>Run Modes = <strong>environment awareness in AEM</strong>.</p>
<p>They allow the same code to behave differently in Dev, Stage, and Production — safely and cleanly.</p>
]]></content:encoded></item><item><title><![CDATA[🔗 Apache Sling in AEM — Request Processing & URL Resolution Explained]]></title><description><![CDATA[Chapter 4 of AEM Learning Series — How AEM turns URLs into HTML pages.


⚡ What Sling Does (In One Line)

Apache Sling maps a URL → to a JCR node → then finds the script that renders it.

This is the core engine of request processing in AEM.

🆚 Slin...]]></description><link>https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/apache-sling-in-aem-request-processing-and-url-resolution-explained</link><guid isPermaLink="true">https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/apache-sling-in-aem-request-processing-and-url-resolution-explained</guid><category><![CDATA[AEM]]></category><category><![CDATA[adobe experience manager]]></category><category><![CDATA[Apache Sling]]></category><category><![CDATA[Java]]></category><category><![CDATA[cms]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[backend]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[Devops]]></category><dc:creator><![CDATA[Siddharth Pamnath]]></dc:creator><pubDate>Sat, 14 Feb 2026 08:57:10 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>Chapter 4 of AEM Learning Series — How AEM turns URLs into HTML pages.</p>
</blockquote>
<hr />
<h1 id="heading-what-sling-does-in-one-line">⚡ What Sling Does (In One Line)</h1>
<blockquote>
<p><strong>Apache Sling maps a URL → to a JCR node → then finds the script that renders it.</strong></p>
</blockquote>
<p>This is the <strong>core engine of request processing in AEM</strong>.</p>
<hr />
<h1 id="heading-sling-vs-traditional-web-frameworks">🆚 Sling vs Traditional Web Frameworks</h1>
<h3 id="heading-traditional-mvc-django-express">Traditional MVC (Django / Express)</h3>
<pre><code class="lang-plaintext">URL → Route → Controller → Fetch Data → Template → HTML
Code decides what to render
</code></pre>
<h3 id="heading-apache-sling-aem">Apache Sling (AEM)</h3>
<pre><code class="lang-plaintext">URL → JCR Node → sling:resourceType → Script → HTML
Content decides what to render
</code></pre>
<p>👉 This is called <strong>Content-Driven Rendering</strong>.</p>
<hr />
<h1 id="heading-url-anatomy-in-sling-must-memorize">🧩 URL Anatomy in Sling (Must Memorize)</h1>
<pre><code class="lang-plaintext">http://localhost:4502/content/mysite/en/home.selector1.selector2.html/suffix?key=value
                     ──────────────────────  ─────────  ─────────  ────  ──────  ─────────
                          RESOURCE PATH       SELECTOR   SELECTOR   EXT   SUFFIX  QUERY
</code></pre>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Part</td><td>Meaning</td></tr>
</thead>
<tbody>
<tr>
<td>Resource Path</td><td><code>/content/mysite/en/home</code> → JCR node</td></tr>
<tr>
<td>Selectors</td><td><code>selector1.selector2</code> → optional</td></tr>
<tr>
<td>Extension</td><td><code>html</code>, <code>json</code>, <code>xml</code></td></tr>
<tr>
<td>Suffix</td><td>extra path info</td></tr>
<tr>
<td>Query Params</td><td>normal URL params</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-sling-request-processing-flow-must-know">🔄 Sling Request Processing Flow (Must Know)</h1>
<p>User requests:</p>
<pre><code class="lang-plaintext">http://localhost:4502/content/mysite/en/home.html
</code></pre>
<h3 id="heading-step-by-step">Step-by-step</h3>
<p>1️⃣ <strong>URL Decomposition</strong></p>
<pre><code class="lang-plaintext">/content/mysite/en/home + .html
</code></pre>
<p>2️⃣ <strong>Find JCR Node</strong></p>
<p>Sling looks up resource in repository.</p>
<p>3️⃣ <strong>Read sling:resourceType</strong></p>
<pre><code class="lang-plaintext">mysite/components/page
</code></pre>
<p>4️⃣ <strong>Find Rendering Script</strong></p>
<pre><code class="lang-plaintext">/apps/mysite/components/page/page.html
</code></pre>
<p>5️⃣ <strong>Execute Script</strong></p>
<p>HTL renders HTML.</p>
<p>6️⃣ <strong>Return Response</strong></p>
<p>Browser receives page.</p>
<hr />
<h1 id="heading-what-are-selectors">🎯 What Are Selectors?</h1>
<p>Selectors allow <strong>multiple representations of same content</strong>.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>URL</td><td>Script Used</td></tr>
</thead>
<tbody>
<tr>
<td><code>/home.html</code></td><td><code>page.html</code></td></tr>
<tr>
<td><code>/</code><a target="_blank" href="http://home.mobile"><code>home.mobile</code></a><code>.html</code></td><td><a target="_blank" href="http://page.mobile"><code>page.mobile</code></a><code>.html</code></td></tr>
<tr>
<td><code>/</code><a target="_blank" href="http://home.data"><code>home.data</code></a><code>.json</code></td><td><code>page.json</code></td></tr>
</tbody>
</table>
</div><p>Same content → different output.</p>
<hr />
<h1 id="heading-sling-script-resolution-order">🔎 Sling Script Resolution Order</h1>
<p>Example:</p>
<pre><code class="lang-plaintext">resourceType = mysite/components/page
selector = mobile
extension = html
</code></pre>
<p>Sling searches in this order:</p>
<pre><code class="lang-plaintext">1. /apps/.../mobile.html
2. /apps/.../page.mobile.html
3. /apps/.../page.html
4. /libs/.../page.html
5. sling:resourceSuperType chain
6. Default servlet
</code></pre>
<hr />
<h1 id="heading-apps-vs-libs-overlay-mechanism">📁 <code>/apps</code> vs <code>/libs</code> (Overlay Mechanism)</h1>
<p>When Sling searches for a component:</p>
<pre><code class="lang-plaintext">1️⃣ /apps/mysite/components/page   ← YOUR CODE
2️⃣ /libs/mysite/components/page   ← AEM CORE
</code></pre>
<p>👉 <code>/apps</code> <strong>overrides</strong> <code>/libs</code>.</p>
<p>Never edit <code>/libs</code>.</p>
<hr />
<h1 id="heading-key-sling-concepts">🧠 Key Sling Concepts</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Concept</td><td>Meaning</td></tr>
</thead>
<tbody>
<tr>
<td>Resource</td><td>Abstraction of JCR node</td></tr>
<tr>
<td>ResourceResolver</td><td>API to access resources</td></tr>
<tr>
<td>ResourceType</td><td>Component used for rendering</td></tr>
<tr>
<td>Overlay</td><td><code>/apps</code> overrides <code>/libs</code></td></tr>
<tr>
<td>Selectors</td><td>Change rendering</td></tr>
<tr>
<td>Adaptation</td><td><code>resource.adaptTo(Model.class)</code></td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-sling-servlets-two-types">🧑‍💻 Sling Servlets (Two Types)</h1>
<h3 id="heading-resource-bound-servlet-recommended">✅ Resource-Bound Servlet (Recommended)</h3>
<ul>
<li><p>Based on resourceType</p>
</li>
<li><p>Respects permissions</p>
</li>
<li><p>Follows Sling architecture</p>
</li>
</ul>
<h3 id="heading-path-bound-servlet-avoid">❌ Path-Bound Servlet (Avoid)</h3>
<ul>
<li><p>Hardcoded path <code>/bin/xyz</code></p>
</li>
<li><p>Bypasses permissions</p>
</li>
<li><p>Security risk</p>
</li>
</ul>
<hr />
<h1 id="heading-critical-rules">🚨 Critical Rules</h1>
<pre><code class="lang-plaintext">Always close ResourceResolver
Always use /apps (not /libs)
Prefer resource-bound servlets
Never leave sessions open
</code></pre>
<p>Unclosed ResourceResolver → <strong>AEM crash</strong>.</p>
<hr />
<h1 id="heading-quick-recap">🧠 Quick Recap</h1>
<pre><code class="lang-plaintext">Sling = URL → JCR Node → resourceType → Script → HTML
Content-driven rendering
Selectors change output
/apps overlays /libs
Always close ResourceResolver
</code></pre>
<hr />
<h1 id="heading-interview-questions-apache-sling-25-qampa">🎯 Interview Questions — Apache Sling (25 Q&amp;A)</h1>
<hr />
<h2 id="heading-basics">🟢 Basics</h2>
<p><strong>Q1. What is Apache Sling?</strong><br />Content-centric web framework mapping URLs to JCR resources.</p>
<p><strong>Q2. Sling request flow?</strong><br />URL → Resolve resource → resourceType → script → response.</p>
<p><strong>Q3. sling:resourceType?</strong><br />Component responsible for rendering content.</p>
<p><strong>Q4. URL anatomy?</strong><br /><code>/path.selector.extension/suffix?params</code></p>
<p><strong>Q5. Selector?</strong><br />Changes rendering script.</p>
<p><strong>Q6. Sling Resource?</strong><br />Abstraction of content node.</p>
<p><strong>Q7. ResourceResolver?</strong><br />API to access resources.</p>
<hr />
<h2 id="heading-intermediate">🔵 Intermediate</h2>
<p><strong>Q8. Script resolution?</strong><br />resourceType → selectors → extension → <code>/apps</code> → <code>/libs</code>.</p>
<p><strong>Q9. Sling vs MVC?</strong><br />Content-driven vs route-driven.</p>
<p><strong>Q10. Overlay mechanism?</strong><br /><code>/apps</code> overrides <code>/libs</code>.</p>
<p><strong>Q11. sling:resourceSuperType?</strong><br />Component inheritance.</p>
<p><strong>Q12. resourceType vs superType?</strong><br />Direct mapping vs fallback.</p>
<p><strong>Q13. Sling Servlet?</strong><br />Java request handler.</p>
<p><strong>Q14. Path vs resource servlet?</strong><br />Resource-bound preferred.</p>
<p><strong>Q15. Resource not found?</strong><br /><code>sling:nonexisting</code> → 404.</p>
<p><strong>Q16. SlingHttpServletRequest?</strong><br />Extended request object.</p>
<p><strong>Q17. Resource adaptation?</strong><br /><code>resource.adaptTo()</code> → Sling Model.</p>
<hr />
<h2 id="heading-advanced">🔴 Advanced</h2>
<p><strong>Q18. Script resolution order?</strong><br />Selector → component → <code>/apps</code> → <code>/libs</code> → superType.</p>
<p><strong>Q19. SlingMainServlet?</strong><br />Entry point for requests.</p>
<p><strong>Q20. request vs resolver resource?</strong><br />Current vs any path.</p>
<p><strong>Q21. Sling mappings?</strong><br />URL rewriting via <code>/etc/map</code>.</p>
<p><strong>Q22. Sling Exporter?</strong><br />Sling Models → JSON.</p>
<p><strong>Q23. POST handling?</strong><br />SlingDefaultPostServlet.</p>
<p><strong>Q24. Safe vs AllMethodsServlet?</strong><br />Read vs read/write.</p>
<p><strong>Q25. Why close ResourceResolver?</strong><br />Prevent session leaks.</p>
<hr />
<h1 id="heading-final-summary">🎉 Final Summary</h1>
<p>If JCR stores content and OSGi runs AEM…<br />👉 <strong>Sling is what actually serves pages.</strong></p>
]]></content:encoded></item><item><title><![CDATA[🌳 JCR Repository in AEM Explained (Apache Jackrabbit Oak)]]></title><description><![CDATA[Chapter 3 of AEM Learning Series — Understanding how AEM stores EVERYTHING.


📚 What is JCR?

JCR = Java Content Repository

JCR is a Java specification (JSR-170 & JSR-283) that defines how content should be stored and accessed.
JCR Specification   ...]]></description><link>https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/jcr-repository-in-aem-explained-apache-jackrabbit-oak</link><guid isPermaLink="true">https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/jcr-repository-in-aem-explained-apache-jackrabbit-oak</guid><category><![CDATA[Apache Jackrabbit Oak]]></category><category><![CDATA[AEM]]></category><category><![CDATA[adobe experience manager]]></category><category><![CDATA[JCR]]></category><category><![CDATA[Java]]></category><category><![CDATA[cms]]></category><category><![CDATA[backend]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[Siddharth Pamnath]]></dc:creator><pubDate>Sat, 14 Feb 2026 08:54:48 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>Chapter 3 of AEM Learning Series — Understanding how AEM stores EVERYTHING.</p>
</blockquote>
<hr />
<h1 id="heading-what-is-jcr">📚 What is JCR?</h1>
<blockquote>
<p><strong>JCR = Java Content Repository</strong></p>
</blockquote>
<p>JCR is a <strong>Java specification (JSR-170 &amp; JSR-283)</strong> that defines how content should be stored and accessed.</p>
<pre><code class="lang-plaintext">JCR Specification      → Rulebook
Apache Jackrabbit Oak  → Implementation
AEM                    → Uses Oak to store all content
</code></pre>
<p>AEM does NOT use MySQL/Postgres like traditional apps.</p>
<p>It uses a <strong>hierarchical content repository</strong>.</p>
<hr />
<h1 id="heading-aem-does-not-use-tables-it-uses-a-tree">🌲 AEM Does NOT Use Tables — It Uses a Tree</h1>
<h3 id="heading-traditional-db-vs-jcr">Traditional DB vs JCR</h3>
<pre><code class="lang-plaintext">RELATIONAL DATABASE:
Table: employees
id | name  | age
1  | Shubh | 24
2  | Rahul | 28

JCR REPOSITORY:
/
└── content/
    └── mysite/
        └── en/
            └── home (NODE)
                ├── jcr:title = "Home Page" (PROPERTY)
                └── jcr:content (CHILD NODE)
</code></pre>
<p>👉 Think of JCR like a <strong>file system with superpowers</strong>.</p>
<hr />
<h1 id="heading-two-building-blocks-of-jcr">🧩 Two Building Blocks of JCR</h1>
<hr />
<h2 id="heading-1-node">1️⃣ Node</h2>
<p>A <strong>Node = Container (folder-like)</strong></p>
<ul>
<li><p>Has name + type (<code>jcr:primaryType</code>)</p>
</li>
<li><p>Can contain child nodes</p>
</li>
<li><p>Can contain properties</p>
</li>
<li><p>Has a unique path</p>
</li>
</ul>
<p>Example path:</p>
<pre><code class="lang-plaintext">/content/mysite/en/home
</code></pre>
<hr />
<h2 id="heading-2-property">2️⃣ Property</h2>
<p>A <strong>Property = Key–Value pair</strong></p>
<p>Supported data types:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Type</td><td>Example</td></tr>
</thead>
<tbody>
<tr>
<td>STRING</td><td>"Hello World"</td></tr>
<tr>
<td>LONG</td><td>123</td></tr>
<tr>
<td>DOUBLE</td><td>3.14</td></tr>
<tr>
<td>BOOLEAN</td><td>true</td></tr>
<tr>
<td>DATE</td><td>2026-02-12</td></tr>
<tr>
<td>BINARY</td><td>Images/PDF</td></tr>
<tr>
<td>PATH</td><td>/content/dam/img.jpg</td></tr>
<tr>
<td>REFERENCE</td><td>UUID reference</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-complete-aem-page-node-structure">🏠 Complete AEM Page Node Structure</h1>
<pre><code class="lang-plaintext">/content/mysite/en/about (cq:Page)
└── jcr:content (cq:PageContent)
    ├── jcr:title = "About Us"
    ├── sling:resourceType = "mysite/components/page"
    ├── cq:template = "/conf/.../template"
    └── root/container
        ├── text component
        └── image component
</code></pre>
<p>👉 Pages are just <strong>nodes in the repository</strong>.</p>
<hr />
<h1 id="heading-important-node-types">🧠 Important Node Types</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Node Type</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><code>cq:Page</code></td><td>AEM page</td></tr>
<tr>
<td><code>cq:PageContent</code></td><td>Page content</td></tr>
<tr>
<td><code>nt:unstructured</code></td><td>Flexible node</td></tr>
<tr>
<td><code>sling:Folder</code></td><td>Sling folder</td></tr>
<tr>
<td><code>dam:Asset</code></td><td>Digital asset</td></tr>
<tr>
<td><code>rep:User</code></td><td>User account</td></tr>
<tr>
<td><code>rep:Group</code></td><td>User group</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-namespaces-in-jcr">🏷️ Namespaces in JCR</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Prefix</td><td>Owner</td></tr>
</thead>
<tbody>
<tr>
<td><code>jcr:</code></td><td>JCR spec</td></tr>
<tr>
<td><code>nt:</code></td><td>Node types</td></tr>
<tr>
<td><code>sling:</code></td><td>Apache Sling</td></tr>
<tr>
<td><code>cq:</code></td><td>Adobe (Day CQ legacy)</td></tr>
<tr>
<td><code>dam:</code></td><td>Assets</td></tr>
<tr>
<td><code>rep:</code></td><td>Users &amp; permissions</td></tr>
</tbody>
</table>
</div><p>Fun fact: AEM was originally <strong>Day CQ5</strong> → hence <code>cq:</code>.</p>
<hr />
<h1 id="heading-most-important-properties-memorize">⭐ Most Important Properties (Memorize!)</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Property</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><code>jcr:primaryType</code></td><td>Node type</td></tr>
<tr>
<td><code>jcr:title</code></td><td>Page title</td></tr>
<tr>
<td><code>cq:lastModified</code></td><td>Last edit</td></tr>
<tr>
<td><code>sling:resourceType</code></td><td>Component renderer</td></tr>
<tr>
<td><code>cq:template</code></td><td>Page template</td></tr>
<tr>
<td><code>fileReference</code></td><td>DAM asset path</td></tr>
<tr>
<td><code>cq:tags</code></td><td>Page tags</td></tr>
</tbody>
</table>
</div><p>👉 <strong>Most important property:</strong> <code>sling:resourceType</code></p>
<p>This tells AEM <strong>which component renders content</strong>.</p>
<hr />
<h1 id="heading-storage-backend-oak">💾 Storage Backend (Oak)</h1>
<p>AEM uses <strong>Apache Jackrabbit Oak</strong>.</p>
<pre><code class="lang-plaintext">TarMK  → Default, file-based, fast
MongoMK → Clustered Author, MongoDB-backed
</code></pre>
<hr />
<h2 id="heading-node-store-vs-data-store">Node Store vs Data Store</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Store</td><td>What it stores</td></tr>
</thead>
<tbody>
<tr>
<td>Node Store</td><td>Structure + small properties</td></tr>
<tr>
<td>Data Store</td><td>Images, videos, PDFs</td></tr>
</tbody>
</table>
</div><p>Locations:</p>
<pre><code class="lang-plaintext">crx-quickstart/repository/segmentstore/
crx-quickstart/repository/datastore/
</code></pre>
<hr />
<h1 id="heading-querying-jcr">🔍 Querying JCR</h1>
<h3 id="heading-1-querybuilder-most-used">1️⃣ QueryBuilder (Most Used)</h3>
<pre><code class="lang-plaintext">path=/content/mysite
type=cq:Page
property=jcr:content/jcr:title
property.value=About Us
</code></pre>
<p>Test here:</p>
<pre><code class="lang-plaintext">/libs/cq/search/content/querydebug.html
</code></pre>
<hr />
<h3 id="heading-2-jcr-sql2">2️⃣ JCR-SQL2</h3>
<pre><code class="lang-plaintext">SELECT * FROM [cq:Page]
WHERE ISDESCENDANTNODE('/content/mysite')
</code></pre>
<hr />
<h3 id="heading-3-xpath-legacy">3️⃣ XPath (Legacy)</h3>
<pre><code class="lang-plaintext">/jcr:root/content/mysite//element(*, cq:Page)
</code></pre>
<hr />
<h1 id="heading-important-repository-paths">📂 Important Repository Paths</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Path</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><code>/content/</code></td><td>Website pages</td></tr>
<tr>
<td><code>/content/dam/</code></td><td>Assets</td></tr>
<tr>
<td><code>/apps/</code></td><td>Custom code</td></tr>
<tr>
<td><code>/libs/</code></td><td>AEM core (never modify)</td></tr>
<tr>
<td><code>/conf/</code></td><td>Templates</td></tr>
<tr>
<td><code>/home/users/</code></td><td>Users</td></tr>
<tr>
<td><code>/var/</code></td><td>Workflows</td></tr>
<tr>
<td><code>/oak:index/</code></td><td>Search indexes</td></tr>
</tbody>
</table>
</div><p>🚨 <strong>Never modify</strong> <code>/libs/</code></p>
<hr />
<h1 id="heading-things-to-remember">🧠 Things to Remember</h1>
<ul>
<li><p>JCR = specification, Oak = implementation</p>
</li>
<li><p>Everything = Nodes + Properties</p>
</li>
<li><p><code>sling:resourceType</code> = rendering component</p>
</li>
<li><p>TarMK = default storage</p>
</li>
<li><p>QueryBuilder = most common query method</p>
</li>
<li><p><code>/apps/</code> overlays <code>/libs/</code></p>
</li>
<li><p><code>resolver.commit()</code> persists changes</p>
</li>
</ul>
<hr />
<h1 id="heading-aem-interview-questions-jcr-35-qampa">🎯 AEM Interview Questions — JCR (35 Q&amp;A)</h1>
<hr />
<h2 id="heading-basics">🟢 Basics</h2>
<p><strong>Q1. What is JCR?</strong><br />Java Content Repository specification.</p>
<p><strong>Q2. JCR vs Oak?</strong><br />Spec vs implementation.</p>
<p><strong>Q3. JCR building blocks?</strong><br />Nodes and Properties.</p>
<p><strong>Q4. JCR vs relational DB?</strong><br />Tree vs tables.</p>
<p><strong>Q5. JCR vs file system?</strong><br />Rich metadata + querying.</p>
<p><strong>Q6. Property types?</strong><br />STRING, DATE, BINARY, PATH, etc.</p>
<p><strong>Q7. Multi-value properties?</strong><br />Yes (<code>cq:tags</code>).</p>
<p><strong>Q8. Root node?</strong><br /><code>/</code></p>
<p><strong>Q9. Node path example?</strong><br /><code>/content/mysite/en/home</code></p>
<p><strong>Q10. JCR browser?</strong><br />CRX DE Lite.</p>
<hr />
<h2 id="heading-node-types">🔵 Node Types</h2>
<p><strong>Q11.</strong> <code>jcr:primaryType</code>?<br />Defines node type.</p>
<p><strong>Q12.</strong> <code>cq:Page</code> vs <code>cq:PageContent</code>?<br />Page vs page content.</p>
<p><strong>Q13.</strong> <code>nt:unstructured</code>?<br />Flexible node.</p>
<p><strong>Q14.</strong> <code>nt:folder</code> vs <code>sling:Folder</code>?<br />Basic vs Sling-aware.</p>
<p><strong>Q15. Namespaces?</strong><br />Prefixes preventing conflicts.</p>
<p><strong>Q16. Why</strong> <code>cq:</code> prefix?<br />Legacy Day CQ.</p>
<p><strong>Q17.</strong> <code>jcr:mixinTypes</code>?<br />Extra node capabilities.</p>
<hr />
<h2 id="heading-structure">🟣 Structure</h2>
<p><strong>Q18.</strong> <code>sling:resourceType</code>?<br />Component renderer.</p>
<p><strong>Q19.</strong> <code>sling:resourceSuperType</code>?<br />Component inheritance.</p>
<p><strong>Q20.</strong> <code>jcr:content</code>?<br />Page content node.</p>
<p><strong>Q21. Page structure?</strong><br />cq:Page → jcr:content → components.</p>
<p><strong>Q22. Key paths?</strong><br />/content, /apps, /libs, /conf.</p>
<hr />
<h2 id="heading-storage">🟠 Storage</h2>
<p><strong>Q23. TarMK?</strong><br />Default storage.</p>
<p><strong>Q24. MongoMK?</strong><br />Clustered storage.</p>
<p><strong>Q25. Node vs Data Store?</strong><br />Structure vs binaries.</p>
<p><strong>Q26. Physical storage?</strong><br />segmentstore + datastore folders.</p>
<hr />
<h2 id="heading-queries">🔴 Queries</h2>
<p><strong>Q27. Query methods?</strong><br />QueryBuilder, SQL2, XPath.</p>
<p><strong>Q28. QueryBuilder test URL?</strong><br />querydebug.html.</p>
<p><strong>Q29. SQL2 query example?</strong><br />Find pages under path.</p>
<p><strong>Q30. Query performance risk?</strong><br />Traversal without indexes.</p>
<hr />
<h2 id="heading-advanced">⚫ Advanced</h2>
<p><strong>Q31. JCR Observation?</strong><br />Event listeners.</p>
<p><strong>Q32. Versioning?</strong><br />mix:versionable nodes.</p>
<p><strong>Q33. JCR Session?</strong><br />Repository connection.</p>
<p><strong>Q34.</strong> <a target="_blank" href="http://session.save"><code>session.save</code></a><code>()</code> vs <code>resolver.commit()</code>?<br />JCR vs Sling API.</p>
<p><strong>Q35. Modify</strong> <code>/libs/</code>?<br />Never — use overlays.</p>
<hr />
<h1 id="heading-final-summary">🎉 Final Summary</h1>
<p>Understanding JCR = Understanding <strong>how AEM stores content</strong>.</p>
<p>AEM is basically:</p>
<ul>
<li><p>Sling → renders</p>
</li>
<li><p>OSGi → runs</p>
</li>
<li><p>JCR → stores</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[⚙️ OSGi Framework in AEM Explained (Apache Felix) — Complete Beginner Guide]]></title><description><![CDATA[Chapter 2 of AEM Learning Series — Understanding the engine that runs AEM.
🚀 What is OSGi?

OSGi = The engine that runs AEM

AEM is not a single huge Java application.It is made of hundreds of small modules called Bundles.
OSGi is the framework that...]]></description><link>https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/osgi-framework-in-aem-explained-apache-felix-complete-beginner-guide</link><guid isPermaLink="true">https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/osgi-framework-in-aem-explained-apache-felix-complete-beginner-guide</guid><category><![CDATA[Apache Felix]]></category><category><![CDATA[AEM]]></category><category><![CDATA[adobe experience manager]]></category><category><![CDATA[Java]]></category><category><![CDATA[OSGi]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[cms]]></category><category><![CDATA[backend]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[Siddharth Pamnath]]></dc:creator><pubDate>Sat, 14 Feb 2026 08:52:10 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>Chapter 2 of AEM Learning Series — Understanding the engine that runs AEM.</p>
<h1 id="heading-what-is-osgi">🚀 What is OSGi?</h1>
<blockquote>
<p><strong>OSGi = The engine that runs AEM</strong></p>
</blockquote>
<p>AEM is not a single huge Java application.<br />It is made of <strong>hundreds of small modules</strong> called <strong>Bundles</strong>.</p>
<p>OSGi is the framework that:</p>
<ul>
<li><p>Loads bundles</p>
</li>
<li><p>Starts bundles</p>
</li>
<li><p>Stops bundles</p>
</li>
<li><p>Connects bundles together</p>
</li>
</ul>
<p>AEM uses the <strong>Apache Felix</strong> implementation of OSGi.</p>
<h2 id="heading-smartphone-analogy">📱 Smartphone Analogy</h2>
<pre><code class="lang-plaintext">Phone OS        → OSGi
Mobile Apps     → Bundles

• Install/uninstall apps without restart
• Apps talk to each other
• OS manages lifecycle
</code></pre>
<h1 id="heading-why-aem-uses-osgi">🤯 Why AEM Uses OSGi</h1>
<h3 id="heading-without-osgi-traditional-java-app">Without OSGi (Traditional Java App)</h3>
</blockquote>
<pre><code class="lang-plaintext">ONE BIG APPLICATION
Change one thing → Redeploy everything
Restart → 15+ min downtime 😬
</code></pre>
<h3 id="heading-with-osgi-aem">With OSGi (AEM)</h3>
<pre><code class="lang-plaintext">Bundle A (Assets)
Bundle B (Workflow)
Bundle C (Search)
Bundle D (Auth)
Bundle E (Editor)
Your Custom Bundle
</code></pre>
<p>👉 Update one bundle → <strong>No restart required</strong></p>
<p>This is called <strong>Hot Deployment</strong> 🔥  </p>
<p>🧩 Key OSGi Concepts</p>
<hr />
<h1 id="heading-1-bundle-the-deployment-unit">1️⃣ Bundle (The Deployment Unit)</h1>
<p>A <strong>Bundle = JAR file + OSGi metadata</strong></p>
<p>Each bundle contains:</p>
<pre><code class="lang-plaintext">META-INF/MANIFEST.MF
</code></pre>
<p>This file tells OSGi:</p>
<ul>
<li><p>Bundle name</p>
</li>
<li><p>Version</p>
</li>
<li><p>Exported packages</p>
</li>
<li><p>Imported packages</p>
</li>
<li><p>Dependencies</p>
</li>
</ul>
<p>👉 Smallest deployable unit in AEM.</p>
<h1 id="heading-2-bundle-lifecycle">2️⃣ Bundle Lifecycle</h1>
<pre><code class="lang-plaintext">INSTALLED → RESOLVED → STARTING → ACTIVE
                                     │
                                     ▼
                                  STOPPING → UNINSTALLED
</code></pre>
<div class="hn-table">
<table>
<thead>
<tr>
<td>State</td><td>Meaning</td></tr>
</thead>
<tbody>
<tr>
<td>INSTALLED</td><td>Bundle added but dependencies not checked</td></tr>
<tr>
<td>RESOLVED</td><td>Dependencies satisfied</td></tr>
<tr>
<td>ACTIVE</td><td>Running and providing services</td></tr>
<tr>
<td>STOPPING</td><td>Shutting down</td></tr>
<tr>
<td>UNINSTALLED</td><td>Removed</td></tr>
</tbody>
</table>
</div><p>💡 <strong>Most common AEM issue:</strong><br />Bundle stuck in <strong>INSTALLED</strong> → Missing dependencies.</p>
<hr />
<h1 id="heading-3-osgi-services-plug-amp-socket-model">3️⃣ OSGi Services (Plug &amp; Socket Model)</h1>
<p>Service = <strong>Interface + Implementation</strong></p>
<pre><code class="lang-plaintext">Interface  → Socket
Implementation → Plug
</code></pre>
<p>Any bundle can request a service, and OSGi injects it automatically.</p>
<h3 id="heading-example-code">Example Code</h3>
<pre><code class="lang-plaintext">// Interface
public interface GreetingService {
    String getGreeting(String name);
}

// Implementation
@Component(service = GreetingService.class)
public class GreetingServiceImpl implements GreetingService {
    public String getGreeting(String name) {
        return "Hello " + name;
    }
}

// Injecting in Sling Model
@Model(adaptables = Resource.class)
public class HeaderModel {
    @OSGiService
    private GreetingService greetingService;
}
</code></pre>
<hr />
<h1 id="heading-4-osgi-configurations-no-hardcoding">4️⃣ OSGi Configurations (No Hardcoding!)</h1>
<p>Instead of hardcoding values:</p>
<pre><code class="lang-plaintext">smtp.gmail.com
</code></pre>
<p>Use configuration:</p>
<pre><code class="lang-plaintext">mail.smtp.host = smtp.gmail.com
mail.smtp.port = 587
</code></pre>
<p>Different environments can have different configs:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Environment</td><td>SMTP</td></tr>
</thead>
<tbody>
<tr>
<td>Author</td><td><a target="_blank" href="http://smtp.internal.company.com">smtp.internal.company.com</a></td></tr>
<tr>
<td>Publish</td><td><a target="_blank" href="http://smtp.external.company.com">smtp.external.company.com</a></td></tr>
</tbody>
</table>
</div><p>👉 No code changes required.</p>
<hr />
<h1 id="heading-where-to-see-osgi-in-aem">🔎 Where to See OSGi in AEM</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Console URL</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><code>/system/console/bundles</code></td><td>All bundles</td></tr>
<tr>
<td><code>/system/console/components</code></td><td>All services</td></tr>
<tr>
<td><code>/system/console/configMgr</code></td><td>OSGi configs</td></tr>
<tr>
<td><code>/system/console/status-slingmodels</code></td><td>Sling Models</td></tr>
</tbody>
</table>
</div><p>This is called the <strong>Felix Web Console</strong>.</p>
<hr />
<h1 id="heading-osgi-in-aem-architecture">🧠 OSGi in AEM Architecture</h1>
<pre><code class="lang-plaintext">AEM
 └── OSGi (Felix)
      ├── Sling Bundles
      ├── Oak Bundles
      ├── Workflow Bundles
      └── Your Custom Bundles
</code></pre>
<p>All communicate via <strong>OSGi Service Registry</strong>.</p>
<hr />
<h1 id="heading-things-to-remember">📝 Things to Remember</h1>
<ul>
<li><p>OSGi = modular runtime used by AEM</p>
</li>
<li><p>Bundle = deployable JAR</p>
</li>
<li><p>Service = interface + implementation</p>
</li>
<li><p>Hot deployment = no restart required</p>
</li>
<li><p>Felix Console = <code>/system/console</code></p>
</li>
<li><p>Bundle not ACTIVE? → Dependency issue</p>
</li>
</ul>
<hr />
<h1 id="heading-aem-interview-questions-osgi-30-qampa">🎯 AEM Interview Questions — OSGi (30 Q&amp;A)</h1>
<hr />
<h2 id="heading-section-a-basics">🟢 Section A — Basics</h2>
<p><strong>Q1. What is OSGi?</strong><br />Modular Java framework used by AEM.</p>
<p><strong>Q2. OSGi implementation in AEM?</strong><br />Apache Felix.</p>
<p><strong>Q3. Why OSGi?</strong><br />Modularity • Hot deployment • Dependency management.</p>
<p><strong>Q4. What is a Bundle?</strong><br />JAR with OSGi metadata.</p>
<p><strong>Q5. What is MANIFEST.MF?</strong><br />Bundle metadata file.</p>
<p><strong>Q6. Felix Web Console?</strong><br />Admin UI at <code>/system/console</code>.</p>
<p><strong>Q7. Default credentials?</strong><br />admin/admin (dev only).</p>
<p><strong>Q8. Bundles console URL?</strong><br /><code>/system/console/bundles</code></p>
<p><strong>Q9. Configurations console URL?</strong><br /><code>/system/console/configMgr</code></p>
<p><strong>Q10. Components console URL?</strong><br /><code>/system/console/components</code></p>
<hr />
<h2 id="heading-section-b-lifecycle">🔵 Section B — Lifecycle</h2>
<p><strong>Q11. Bundle states?</strong><br />Installed → Resolved → Active → Stopping → Uninstalled.</p>
<p><strong>Q12. Bundle stuck in INSTALLED?</strong><br />Missing dependencies.</p>
<p><strong>Q13. Debug steps?</strong><br />Check bundle → imported packages → install dependency.</p>
<p><strong>Q14. ACTIVE → RESOLVED?</strong><br />Yes, when stopped or dependency removed.</p>
<p><strong>Q15. Fragment bundle?</strong><br />Extends another bundle.</p>
<hr />
<h2 id="heading-section-c-services">🟣 Section C — Services</h2>
<p><strong>Q16. OSGi Service?</strong><br />Java object registered in Service Registry.</p>
<p><strong>Q17. Component vs Service?</strong><br />Service = component exposed via interface.</p>
<p><strong>Q18. Register service annotation?</strong><br /><code>@Component(service=MyInterface.class)</code></p>
<p><strong>Q19.</strong> <code>@Reference</code>?<br />Inject service in OSGi component.</p>
<p><strong>Q20.</strong> <code>@Reference</code> vs <code>@OSGiService</code>?<br />Component vs Sling Model injection.</p>
<p><strong>Q21. Service Registry?</strong><br />Runtime service lookup system.</p>
<p><strong>Q22. service.ranking?</strong><br />Priority for multiple implementations.</p>
<hr />
<h2 id="heading-section-d-configuration">🟠 Section D — Configuration</h2>
<p><strong>Q23. OSGi Config?</strong><br />Externalized properties.</p>
<p><strong>Q24. Create configs?</strong><br />Console or repository config files.</p>
<p><strong>Q25. Run-mode configs?</strong><br /><a target="_blank" href="http://config.author"><code>config.author</code></a>, <code>config.publish</code>.</p>
<p><strong>Q26. Factory config?</strong><br />Multiple instances of same component.</p>
<p><strong>Q27. PID?</strong><br />Unique config identifier.</p>
<hr />
<h2 id="heading-section-e-scenarios">🔴 Section E — Scenarios</h2>
<p><strong>Q28. Sling Model not working?</strong><br />Check bundle, components, Sling Models console.</p>
<p><strong>Q29. DS vs SCR?</strong><br />DS = modern, SCR = deprecated.</p>
<p><strong>Q30. Two bundles exporting same package?</strong><br />Yes — version resolution.</p>
<hr />
<h1 id="heading-final-summary">🎉 Final Summary</h1>
<p>Understanding OSGi = Understanding <strong>how AEM actually runs</strong>.</p>
<p>Everything you build in AEM becomes an <strong>OSGi bundle</strong>.</p>
]]></content:encoded></item><item><title><![CDATA[🧠 AEM Architecture Explained — Author, Publish & Dispatcher (Beginner Guide)]]></title><description><![CDATA[Chapter 1 of AEM Learning Series — Understanding the core architecture used in every production AEM setup.
🌍 The Big Picture
Every production AEM setup runs on a 3-tier architecture.


These 3 layers work together to deliver fast, secure, and scalab...]]></description><link>https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/aem-architecture-explained-author-publish-and-dispatcher-beginner-guide</link><guid isPermaLink="true">https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/aem-architecture-explained-author-publish-and-dispatcher-beginner-guide</guid><category><![CDATA[AEM]]></category><category><![CDATA[adobe experience manager implementation]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Java]]></category><category><![CDATA[cms]]></category><category><![CDATA[Apache Sling]]></category><category><![CDATA[OSGi]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[Devops]]></category><dc:creator><![CDATA[Siddharth Pamnath]]></dc:creator><pubDate>Sat, 14 Feb 2026 08:34:56 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>Chapter 1 of AEM Learning Series — Understanding the core architecture used in every production AEM setup.</p>
<h1 id="heading-the-big-picture">🌍 The Big Picture</h1>
<p>Every production AEM setup runs on a <strong>3-tier architecture</strong>.</p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1771057836551/da24e11b-006e-4135-a0ef-697cf9044628.png" alt class="image--center mx-auto" /></p>
<p>These 3 layers work together to deliver <strong>fast, secure, and scalable websites</strong>.</p>
<h1 id="heading-1-author-instance">✍️ 1. AUTHOR Instance</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Aspect</td><td>Detail</td></tr>
</thead>
<tbody>
<tr>
<td><strong>Users</strong></td><td>Authors, marketers, developers</td></tr>
<tr>
<td><strong>Purpose</strong></td><td>Create, edit, approve content</td></tr>
<tr>
<td><strong>Default URL</strong></td><td><a target="_blank" href="http://localhost:4502"><code>http://localhost:4502</code></a></td></tr>
<tr>
<td><strong>Public Access</strong></td><td>❌ Never exposed</td></tr>
</tbody>
</table>
</div><h3 id="heading-what-happens-on-author">What happens on Author?</h3>
<ul>
<li><p>Drag &amp; drop page building</p>
</li>
<li><p>Upload images/videos to DAM</p>
</li>
<li><p>Preview content before publishing</p>
</li>
<li><p>Run workflows (review → approve → publish)</p>
</li>
<li><p>Developers deploy code here first</p>
</li>
</ul>
<p>Think of Author as the <strong>content factory</strong> 🏭</p>
<h1 id="heading-2-publish-instance">🌐 2. PUBLISH Instance</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Aspect</td><td>Detail</td></tr>
</thead>
<tbody>
<tr>
<td><strong>Users</strong></td><td>Website visitors</td></tr>
<tr>
<td><strong>Purpose</strong></td><td>Serve live website</td></tr>
<tr>
<td><strong>Default URL</strong></td><td><a target="_blank" href="http://localhost:4503"><code>http://localhost:4503</code></a></td></tr>
<tr>
<td><strong>Public Access</strong></td><td>✅ Yes</td></tr>
</tbody>
</table>
</div><h3 id="heading-what-happens-on-publish">What happens on Publish?</h3>
<ul>
<li><p>Serves final HTML pages</p>
</li>
<li><p>Contains only <strong>activated content</strong></p>
</li>
<li><p>No editing interface</p>
</li>
<li><p>Multiple instances used for scaling</p>
</li>
</ul>
<h3 id="heading-publishing-flow">Publishing Flow</h3>
<h1 id="heading-3-dispatcher-most-important-layer">⚡ 3. DISPATCHER (Most Important Layer)</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Aspect</td><td>Detail</td></tr>
</thead>
<tbody>
<tr>
<td><strong>What is it?</strong></td><td>Apache HTTP module</td></tr>
<tr>
<td><strong>Purpose</strong></td><td>Caching + Security + Load balancing</td></tr>
<tr>
<td><strong>Position</strong></td><td>Between browser and Publish</td></tr>
</tbody>
</table>
</div><h3 id="heading-how-dispatcher-works">How Dispatcher Works</h3>
<pre><code class="lang-plaintext">User requests a page
        │
        ▼
Dispatcher checks cache
   ┌────┴────┐
   YES       NO
   │         │
   │         ▼
   │     Ask Publish
   │     Render HTML
   │     Cache result
   ▼
Return page fast 🚀
</code></pre>
<h3 id="heading-dispatchers-3-superpowers">Dispatcher’s 3 Superpowers</h3>
<p>1️⃣ <strong>Caching</strong> → Stores rendered HTML<br />2️⃣ <strong>Security</strong> → Blocks malicious URLs<br />3️⃣ <strong>Load Balancing</strong> → Distributes traffic</p>
<p>👉 Dispatcher is <strong>NOT part of AEM</strong> — it runs on Apache/IIS.</p>
<h1 id="heading-real-world-flow-example">🔄 Real-World Flow Example</h1>
<p>Imagine Coca-Cola launches a <strong>Summer Sale Page</strong>:</p>
<ol>
<li><p>Author creates page on Author</p>
</li>
<li><p>Clicks <strong>Publish</strong></p>
</li>
<li><p>Content replicates to Publish</p>
</li>
<li><p>User visits website</p>
</li>
<li><p>Dispatcher checks cache</p>
</li>
<li><p>First user → page generated &amp; cached</p>
</li>
<li><p>Next 10,000 users → cached version ⚡</p>
</li>
</ol>
<p>This is how AEM handles <strong>massive traffic</strong>.</p>
<h1 id="heading-production-setup-enterprise-scale">🏭 Production Setup (Enterprise Scale)</h1>
<pre><code class="lang-plaintext">                         ┌──────────┐
                         │  AUTHOR  │
                         └────┬─────┘
                              │ Replication
           ┌──────────┬──────────┬──────────┐
           ▼          ▼          ▼
      PUBLISH1   PUBLISH2   PUBLISH3
           │          │          │
      DISPATCHER1 DISPATCHER2 DISPATCHER3
                └──────┬──────┘
                       ▼
                 LOAD BALANCER
                       ▼
                    Users
</code></pre>
<p>Large enterprises run <strong>multiple publish + dispatcher nodes</strong> for high availability.</p>
<hr />
<h1 id="heading-key-things-to-remember">🧾 Key Things to Remember</h1>
<ul>
<li><p><strong>Author</strong> → Content creation (private)</p>
</li>
<li><p><strong>Publish</strong> → Live website (public)</p>
</li>
<li><p><strong>Dispatcher</strong> → Cache + Security layer</p>
</li>
<li><p>Content flows <strong>Author → Publish</strong></p>
</li>
<li><p>Users NEVER access Author directly</p>
</li>
</ul>
<hr />
<h1 id="heading-aem-interview-questions-30-qampa">🎯 AEM Interview Questions (30 Q&amp;A)</h1>
<hr />
<h2 id="heading-section-a-basics">🟢 Section A — Basics</h2>
<p><strong>Q1. What is AEM?</strong><br />AEM is an enterprise CMS used to create, manage and deliver digital experiences.</p>
<p><strong>Q2. AEM technology stack?</strong><br />OSGi • JCR • Sling • HTL • Java</p>
<p><strong>Q3. Three tiers of AEM?</strong><br />Author • Publish • Dispatcher</p>
<p><strong>Q4. Author instance?</strong><br />Content creation environment (port 4502).</p>
<p><strong>Q5. Publish instance?</strong><br />Live website server (port 4503).</p>
<p><strong>Q6. Dispatcher?</strong><br />Apache module for caching, security, load balancing.</p>
<p><strong>Q7. Default ports?</strong><br />Author → 4502 | Publish → 4503</p>
<p><strong>Q8. Author users?</strong><br />Authors, marketers, developers.</p>
<p><strong>Q9. Publish users?</strong><br />Website visitors.</p>
<p><strong>Q10. AEM language?</strong><br />Java.</p>
<hr />
<h2 id="heading-section-b-replication">🔵 Section B — Replication</h2>
<p><strong>Q11. Replication?</strong><br />Author → Publish content transfer.</p>
<p><strong>Q12. Activation vs Deactivation?</strong><br />Publish vs Unpublish.</p>
<p><strong>Q13. Reverse replication?</strong><br />Publish → Author data flow.</p>
<p><strong>Q14. Replication agent?</strong><br />Configuration controlling replication.</p>
<p><strong>Q15. Publish → Author publishing?</strong><br />Not directly (only reverse replication).</p>
<hr />
<h2 id="heading-section-c-dispatcher">🟣 Section C — Dispatcher</h2>
<p><strong>Q16. Dispatcher functions?</strong><br />Caching • Security • Load balancing.</p>
<p><strong>Q17. Where installed?</strong><br />Apache HTTP / IIS server.</p>
<p><strong>Q18. Cache miss?</strong><br />Request sent to Publish → cached.</p>
<p><strong>Q19. Cache invalidation?</strong><br />Flush agent clears cache.</p>
<p><strong>Q20. Personalized content caching?</strong><br />No — use AJAX/client-side.</p>
<hr />
<h2 id="heading-section-d-production">🟠 Section D — Production</h2>
<p><strong>Q21. Author instances in prod?</strong><br />Usually 1 (or primary + standby).</p>
<p><strong>Q22. Publish instances?</strong><br />3–10+ depending on traffic.</p>
<p><strong>Q23. In front of Dispatcher?</strong><br />Load balancer or CDN.</p>
<p><strong>Q24. Hosting types?</strong><br />On-Prem • AMS • Cloud Service.</p>
<p><strong>Q25. Full request flow?</strong><br />Browser → LB → Dispatcher → Publish → Response.</p>
<hr />
<h2 id="heading-section-e-scenarios">🔴 Section E — Scenarios</h2>
<p><strong>Q26. Users see old content?</strong><br />Check dispatcher/CDN cache or replication.</p>
<p><strong>Q27. Author down — website works?</strong><br />Yes.</p>
<p><strong>Q28. Publish down — website works?</strong><br />Cached pages still load.</p>
<p><strong>Q29. Wrong content published?</strong><br />Republish or deactivate.</p>
<p><strong>Q30. Why Author behind VPN?</strong><br />Security &amp; protection.</p>
<hr />
<h1 id="heading-summary">🎉 Summary</h1>
<p>If you understand this architecture, you understand <strong>the foundation of AEM</strong>.</p>
<p>Everything else in AEM builds on this.</p>
]]></content:encoded></item><item><title><![CDATA[🚀 AEM Engineer Complete Learning Roadmap (2026)]]></title><description><![CDATA[A structured path from beginner → industry-ready Adobe Experience Manager Engineer

🌍 What is AEM?




AspectDetail



Full NameAdobe Experience Manager

TypeEnterprise Web Content Management System (CMS/WCM)

Built OnJava • OSGi (Apache Felix) • JC...]]></description><link>https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/aem-engineer-complete-learning-roadmap-2026</link><guid isPermaLink="true">https://aem-from-scratch-what-is-aem-complete-roadmap.hashnode.dev/aem-engineer-complete-learning-roadmap-2026</guid><category><![CDATA[AEM]]></category><category><![CDATA[adobe experience manager implementation]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Java]]></category><category><![CDATA[cms]]></category><dc:creator><![CDATA[Siddharth Pamnath]]></dc:creator><pubDate>Sat, 14 Feb 2026 08:24:54 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>A structured path from beginner → industry-ready <strong>Adobe Experience Manager Engineer</strong></p>
</blockquote>
<h1 id="heading-what-is-aem">🌍 What is AEM?</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Aspect</td><td>Detail</td></tr>
</thead>
<tbody>
<tr>
<td><strong>Full Name</strong></td><td>Adobe Experience Manager</td></tr>
<tr>
<td><strong>Type</strong></td><td>Enterprise Web Content Management System (CMS/WCM)</td></tr>
<tr>
<td><strong>Built On</strong></td><td>Java • OSGi (Apache Felix) • JCR (Apache Oak) • Apache Sling</td></tr>
<tr>
<td><strong>Used By</strong></td><td>Fortune 500 companies (Banking, Retail, Healthcare, Media)</td></tr>
<tr>
<td><strong>Key Strength</strong></td><td>Author-friendly content + developer extensibility</td></tr>
<tr>
<td><strong>Deployment</strong></td><td>On-Premise • Adobe Managed Services • AEM as a Cloud Service</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-why-aem-instead-of-django-react-node">🤔 Why AEM instead of Django / React / Node?</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Feature</td><td>Python / React / Node</td><td>AEM</td></tr>
</thead>
<tbody>
<tr>
<td>Who builds pages?</td><td>Developers write code</td><td>Authors drag &amp; drop</td></tr>
<tr>
<td>Add new page</td><td>Requires deployment</td><td>Click → Create → Publish</td></tr>
<tr>
<td>Change text/image</td><td>Developer edits code</td><td>Author edits visually</td></tr>
<tr>
<td>Multi-language</td><td>Build from scratch</td><td>Built-in translation</td></tr>
<tr>
<td>10,000+ pages</td><td>Hard to manage</td><td>Built-in hierarchy &amp; tagging</td></tr>
<tr>
<td>Digital Asset Management</td><td>External tools</td><td>Built-in DAM</td></tr>
<tr>
<td>Workflows &amp; approvals</td><td>Custom build</td><td>Built-in</td></tr>
<tr>
<td>Personalization</td><td>Custom build</td><td>Adobe Target integration</td></tr>
<tr>
<td>Analytics</td><td>Google Analytics etc</td><td>Adobe Analytics native</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-the-restaurant-analogy">🍽️ The Restaurant Analogy</h2>
<ul>
<li><p><strong>Django/React</strong> → Hire a chef. Every new dish requires coding.</p>
</li>
<li><p><strong>AEM</strong> → Build a full kitchen. Non-chefs (marketers) can cook using templates.</p>
</li>
</ul>
<p>Developers create the <strong>recipes (components/templates)</strong>.<br />Authors create the <strong>content (pages/assets)</strong>.</p>
<hr />
<h1 id="heading-advantages-of-aem">✅ Advantages of AEM</h1>
<ul>
<li><p>Drag-and-drop visual authoring</p>
</li>
<li><p>Enterprise permissions &amp; workflows</p>
</li>
<li><p>Adobe ecosystem integrations</p>
</li>
<li><p>Multi-site &amp; multi-language ready</p>
</li>
<li><p>Built-in Digital Asset Manager</p>
</li>
<li><p>Content reusability (Fragments)</p>
</li>
<li><p>Headless + traditional CMS</p>
</li>
<li><p>Cloud-native option</p>
</li>
</ul>
<hr />
<h1 id="heading-disadvantages-of-aem">❌ Disadvantages of AEM</h1>
<ul>
<li><p>Extremely expensive 💸</p>
</li>
<li><p>Steep learning curve</p>
</li>
<li><p>Heavy &amp; complex</p>
</li>
<li><p>Java ecosystem dependency</p>
</li>
<li><p>Vendor lock-in</p>
</li>
<li><p>Slower development cycle</p>
</li>
</ul>
<hr />
<h1 id="heading-when-should-you-use-aem">🎯 When Should You Use AEM?</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Scenario</td><td>Best Choice</td></tr>
</thead>
<tbody>
<tr>
<td>Startup SaaS / Blog</td><td>Django / React</td></tr>
<tr>
<td>Small business website</td><td>WordPress</td></tr>
<tr>
<td>Enterprise with many marketers</td><td><strong>AEM</strong></td></tr>
<tr>
<td>E-commerce startup</td><td>Shopify / Next</td></tr>
<tr>
<td>Fortune 500 websites</td><td><strong>AEM</strong></td></tr>
<tr>
<td>Backend microservices</td><td>Go / Python / Node</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-the-complete-aem-roadmap-62-topics">🗺️ The Complete AEM Roadmap (62 Topics)</h1>
<hr />
<h1 id="heading-phase-1-aem-foundation-amp-architecture">Phase 1 — AEM Foundation &amp; Architecture</h1>
<h3 id="heading-goal-understand-the-aem-ecosystem">🎯 Goal: Understand the AEM ecosystem</h3>
<ol>
<li><p><strong>AEM Architecture</strong></p>
<ul>
<li><p>Author vs Publish instances</p>
</li>
<li><p>Dispatcher &amp; replication</p>
</li>
<li><p>Production topology</p>
</li>
</ul>
</li>
<li><p><strong>OSGi Framework</strong></p>
<ul>
<li><p>Apache Felix runtime</p>
</li>
<li><p>Bundles &amp; lifecycle</p>
</li>
<li><p>Service registry</p>
</li>
<li><p>Hot deployment</p>
</li>
</ul>
</li>
<li><p><strong>JCR Repository</strong></p>
<ul>
<li><p>Apache Jackrabbit Oak</p>
</li>
<li><p>Nodes &amp; properties</p>
</li>
<li><p>TarMK vs MongoMK</p>
</li>
</ul>
</li>
<li><p><strong>Apache Sling</strong></p>
<ul>
<li><p>Request processing</p>
</li>
<li><p>Script resolution</p>
</li>
<li><p>Resource resolution</p>
</li>
<li><p>URL anatomy</p>
</li>
</ul>
</li>
<li><p><strong>AEM Run Modes</strong></p>
<ul>
<li><p>author / publish</p>
</li>
<li><p>dev / stage / prod</p>
</li>
<li><p>Run-mode configurations</p>
</li>
</ul>
</li>
</ol>
<hr />
<h1 id="heading-phase-2-repository-amp-node-structure">Phase 2 — Repository &amp; Node Structure</h1>
<h3 id="heading-goal-learn-aem-filesystem-amp-crx">🎯 Goal: Learn AEM filesystem &amp; CRX</h3>
<ol start="6">
<li><p>CRX DE Lite navigation</p>
</li>
<li><p>Repository structure:</p>
<ul>
<li><p><code>/content</code></p>
</li>
<li><p><code>/apps</code></p>
</li>
<li><p><code>/conf</code></p>
</li>
<li><p><code>/libs</code></p>
</li>
<li><p><code>/var</code></p>
</li>
<li><p><code>/home</code></p>
</li>
<li><p><code>/oak:index</code></p>
</li>
</ul>
</li>
<li><p>Node types &amp; properties</p>
</li>
<li><p><code>/apps</code> vs <code>/libs</code> overlay concept</p>
</li>
</ol>
<hr />
<h1 id="heading-phase-3-aem-project-setup-first-hands-on">Phase 3 — AEM Project Setup (First Hands-On)</h1>
<h3 id="heading-goal-create-amp-deploy-your-first-aem-project">🎯 Goal: Create &amp; deploy your first AEM project</h3>
<ol start="10">
<li><p>AEM Maven Archetype</p>
</li>
<li><p>Project modules:</p>
</li>
</ol>
<ul>
<li><p><code>core</code></p>
</li>
<li><p><code>ui.apps</code></p>
</li>
<li><p><code>ui.content</code></p>
</li>
<li><p><code>ui.frontend</code></p>
</li>
<li><p><code>all</code></p>
</li>
</ul>
<ol start="12">
<li><p>Build &amp; deploy using Maven</p>
</li>
<li><p>Package Manager usage</p>
</li>
</ol>
<hr />
<h1 id="heading-phase-4-component-development-core-aem-skill">Phase 4 — Component Development (Core AEM Skill)</h1>
<h3 id="heading-goal-become-an-aem-component-developer">🎯 Goal: Become an AEM Component Developer</h3>
<ol start="14">
<li><p>Component structure</p>
</li>
<li><p>HTL (Sightly templating)</p>
</li>
</ol>
<ul>
<li><p>data-sly-use</p>
</li>
<li><p>data-sly-list</p>
</li>
<li><p>data-sly-test</p>
</li>
<li><p>data-sly-resource</p>
</li>
</ul>
<ol start="16">
<li><p>Touch UI dialogs (Granite UI)</p>
</li>
<li><p>Sling Models</p>
</li>
<li><p>Core Components &amp; proxy pattern</p>
</li>
<li><p>Component inheritance</p>
</li>
</ol>
<hr />
<h1 id="heading-phase-5-templates-amp-pages">Phase 5 — Templates &amp; Pages</h1>
<h3 id="heading-goal-how-pages-are-built-in-aem">🎯 Goal: How pages are built in AEM</h3>
<ol start="20">
<li><p>Editable templates</p>
</li>
<li><p>Page component</p>
</li>
<li><p>Template structure</p>
</li>
<li><p>Responsive grid &amp; layout container</p>
</li>
</ol>
<hr />
<h1 id="heading-phase-6-client-libraries-frontend-in-aem">Phase 6 — Client Libraries (Frontend in AEM)</h1>
<h3 id="heading-goal-manage-cssjs-in-aem">🎯 Goal: Manage CSS/JS in AEM</h3>
<ol start="24">
<li><p>Client Libraries (clientlibs)</p>
</li>
<li><p>Categories, dependencies &amp; embedding</p>
</li>
<li><p><code>ui.frontend</code> + Webpack pipeline</p>
</li>
</ol>
<hr />
<h1 id="heading-phase-7-authoring-features">Phase 7 — Authoring Features</h1>
<h3 id="heading-goal-features-used-by-content-authors">🎯 Goal: Features used by content authors</h3>
<ol start="27">
<li><p>Page creation &amp; publishing</p>
</li>
<li><p>Content Fragments (Headless CMS)</p>
</li>
<li><p>Experience Fragments</p>
</li>
<li><p>Digital Asset Management (DAM)</p>
</li>
<li><p>Tags &amp; taxonomy</p>
</li>
</ol>
<hr />
<h1 id="heading-phase-8-osgi-backend-development">Phase 8 — OSGi Backend Development</h1>
<h3 id="heading-goal-become-aem-backend-developer">🎯 Goal: Become AEM backend developer</h3>
<ol start="32">
<li><p>OSGi services</p>
</li>
<li><p>OSGi configurations</p>
</li>
<li><p>Sling servlets</p>
</li>
<li><p>Schedulers &amp; jobs</p>
</li>
<li><p>Event handlers &amp; listeners</p>
</li>
<li><p>Sling filters</p>
</li>
</ol>
<hr />
<h1 id="heading-phase-9-sling-deep-dive">Phase 9 — Sling Deep Dive</h1>
<ol start="38">
<li><p>ResourceResolver &amp; Service users</p>
</li>
<li><p>Sling mappings &amp; vanity URLs</p>
</li>
<li><p>Selectors &amp; extensions</p>
</li>
<li><p>Sling exporter (.model.json)</p>
</li>
</ol>
<hr />
<h1 id="heading-phase-10-workflows-amp-replication">Phase 10 — Workflows &amp; Replication</h1>
<ol start="42">
<li><p>Workflows &amp; custom steps</p>
</li>
<li><p>Replication &amp; activation</p>
</li>
<li><p>Replication agents</p>
</li>
</ol>
<hr />
<h1 id="heading-phase-11-dispatcher-most-important-for-interviews">Phase 11 — Dispatcher (🔥 Most Important for Interviews)</h1>
<ol start="45">
<li><p>Dispatcher caching basics</p>
</li>
<li><p>Dispatcher rules &amp; filters</p>
</li>
<li><p>Cache invalidation &amp; flush</p>
</li>
</ol>
<hr />
<h1 id="heading-phase-12-users-amp-permissions">Phase 12 — Users &amp; Permissions</h1>
<ol start="48">
<li><p>Users &amp; groups</p>
</li>
<li><p>ACL permissions</p>
</li>
<li><p>Closed User Groups (CUG)</p>
</li>
</ol>
<hr />
<h1 id="heading-phase-13-apis-amp-integrations">Phase 13 — APIs &amp; Integrations</h1>
<ol start="51">
<li><p>Sling vs JCR vs WCM APIs</p>
</li>
<li><p>Content Services APIs</p>
</li>
<li><p>GraphQL API (Headless AEM)</p>
</li>
<li><p>Adobe integrations (Analytics, Target, Campaign)</p>
</li>
</ol>
<hr />
<h1 id="heading-phase-14-aem-as-a-cloud-service">Phase 14 — AEM as a Cloud Service</h1>
<ol start="55">
<li><p>Cloud vs AMS vs On-Premise</p>
</li>
<li><p>Cloud Manager CI/CD</p>
</li>
<li><p>Rapid Development Environment (RDE)</p>
</li>
<li><p>Cloud best practices</p>
</li>
</ol>
<hr />
<h1 id="heading-phase-15-testing-performance-amp-security">Phase 15 — Testing, Performance &amp; Security</h1>
<ol start="59">
<li><p>Unit testing (AEM Mocks)</p>
</li>
<li><p>Code quality &amp; BPA</p>
</li>
<li><p>Performance &amp; Oak indexes</p>
</li>
<li><p>Security (XSS, CSRF, CORS)</p>
</li>
</ol>
<hr />
<h1 id="heading-final-outcome">🎉 Final Outcome</h1>
<p>After completing this roadmap you will be able to:</p>
<p>✅ Build enterprise AEM projects<br />✅ Develop components &amp; templates<br />✅ Work with Dispatcher &amp; Cloud Manager<br />✅ Build headless AEM APIs<br />✅ Become <strong>industry-ready AEM Engineer</strong></p>
]]></content:encoded></item></channel></rss>