What Is The Dodic For This Ae Package

7 min read

What Is the DODIC for This AE Package?

The term DODIC (Digital Object Description and Identification Code) is increasingly used in the world of Adobe After Effects (AE) packages to uniquely label, track, and manage assets across complex production pipelines. Understanding the DODIC for a given AE package not only streamlines workflow but also safeguards version control, simplifies collaboration, and ensures that every element—from footage clips to expression scripts—can be reliably referenced in post‑production and archival processes. This article explains what a DODIC is, why it matters for After Effects projects, how to generate and embed one, and the best practices for maintaining a clean, searchable asset library.


Introduction: Why a DODIC Matters in After Effects

When a motion‑design studio or freelance editor works on a multi‑layered composition, the number of files can quickly explode: raw footage, audio stems, plug‑in presets, project files, render outputs, and countless intermediate caches. Without a systematic identification method, locating the exact version of a particular asset becomes a time‑consuming guessing game Most people skip this — try not to..

A DODIC solves this problem by assigning a globally unique identifier to each AE package—or to any individual component within the package. Think of it as a digital fingerprint that remains constant even if the file is renamed, moved to a different folder, or shared across different operating systems. By embedding the DODIC directly into the AE project file’s metadata, teams can:

  • Track revisions with pinpoint accuracy.
  • Prevent duplicate work by instantly recognizing previously used assets.
  • help with automated pipelines that pull the correct version of a composition for rendering or archiving.
  • Maintain compliance with industry standards that require traceability (e.g., broadcast, film, and advertising).

How the DODIC Is Structured

A typical DODIC follows a hierarchical pattern that conveys both uniqueness and meaningful context. While there is no single universal format, most studios adopt a structure similar to:

AE‑PKG‑
  • AE‑PKG – Fixed prefix indicating an After Effects package.
  • <ProjectCode> – Short alphanumeric code (e.g., BRD2024 for a brand campaign).
  • <Version> – Incremental version number (v001, v002, …).
  • <Timestamp> – UTC date‑time stamp (20240611T1530Z).
  • <Checksum> – 8‑character hash (MD5 or SHA‑1) derived from the file’s binary content, guaranteeing uniqueness even if two files share the same name and timestamp.

Example:

AE-PKG-BRD2024-v003-20240611T1530Z-5F4A9C2B

When this string appears in the project’s metadata, any user or automated script can instantly verify that the file is the exact third version of the “BRD2024” campaign created on June 11, 2026 at 15:30 UTC.


Generating a DODIC for Your AE Package

1. Prepare the Project

Before you generate a DODIC, clean up the project:

  1. Purge unused footage (File > Dependencies > Purge Unused Footage).
  2. Collect files into a single folder (File > Dependencies > Collect Files…).
  3. Lock the composition you intend to render, ensuring no further edits will occur during DODIC creation.

2. Use a DODIC Generator Script

Most studios rely on a simple ExtendScript (JavaScript for Adobe) that automates the process. Below is a concise version you can paste into the ExtendScript Toolkit or the After Effects script editor:

// DODIC Generator for After Effects
(function () {
    var proj = app.project;
    if (!proj) {
        alert("No project open.");
        return;
    }

    // 1️⃣ Gather basic info
    var projName = proj.file ? That said, proj. Because of that, file. Even so, name. replace(/\.[^.]+$/, "") : "Untitled";
    var version = prompt("Enter version (e.g.Day to day, , v001):", "v001");
    var timestamp = new Date(). toISOString().Worth adding: replace(/[-:. ]/g, "").

    // 2️⃣ Compute checksum (MD5 of the project file)
    var file = proj.file;
    if (!Here's the thing — file) {
        alert("Please save the project before generating a DODIC. Because of that, ");
        return;
    }
    var checksum = $. md5(file.

    // 3️⃣ Assemble DODIC
    var dodic = "AE-PKG-" + projName + "-" + version + "-" + timestamp + "-" + checksum.Still, slice(0, 8);
    
    // 4️⃣ Embed in project metadata
    proj. file.

**Key points**:  

* The script extracts the **project name**, prompts for a **version**, and automatically adds a **UTC timestamp**.  
* It calculates an **MD5 checksum** of the saved `.aep` file, then truncates it to eight characters for readability.  
* The resulting DODIC is stored as a custom attribute (`dodic`) within the file’s metadata, making it visible in the **File > Project Settings** dialog.

### 3. Verify the DODIC  

After running the script:

1. Open **File > Project Settings** → **Metadata** tab.  
2. Locate the `dodic` field; it should display the generated string.  
3. Optionally, export the project as an XML (`File > Export > Project as XML`) and confirm that the DODIC appears as an `` tag.

---

## Embedding the DODIC in Render Outputs  

A DODIC is most valuable when it propagates to the final rendered files. Here’s how to embed it:

* **File Naming** – Include the DODIC in the output filename, e.g., `BRD2024_Final_AE-PKG-BRD2024-v003-20240611T1530Z-5F4A9C2B.mov`.  
* **XMP Metadata** – Use a post‑render script (e.g., with Adobe Media Encoder or FFmpeg) to write the DODIC into the XMP `dc:identifier` field of the video file.  
* **Render Queue Comments** – Add the DODIC in the **Render Queue** comment box; many asset‑management systems read this automatically.

By ensuring the DODIC travels from source to delivery, you create a **traceable chain of custody** that auditors, clients, and future editors can follow.

---

## Scientific Explanation: How Checksums Guarantee Uniqueness  

A checksum is a compact representation of a file’s binary data, generated through a **hash function**. Common algorithms—MD5, SHA‑1, SHA‑256—process the file byte‑by‑byte, producing a fixed‑length string that changes dramatically even if a single bit is altered.  

* **Collision resistance** ensures that two different files rarely produce the same checksum.  
* **Determinism** guarantees that the same file always yields the same checksum, allowing reliable verification.  

When the DODIC incorporates a checksum, it inherits these properties: any modification to the AE project (e.Here's the thing — , adding a new layer, changing an expression) automatically creates a new checksum, forcing a new DODIC. Consider this: g. This eliminates the risk of accidental overwrites and makes version comparison trivial.

Real talk — this step gets skipped all the time.

---

## Frequently Asked Questions (FAQ)

### Q1: *Can I use the DODIC for assets that are not AE projects?*  
**A:** Absolutely. The same format works for Photoshop files, Illustrator artboards, or any digital asset that benefits from unique identification. Just adjust the prefix (e.g., `PS‑PKG` for Photoshop).

### Q2: *What if my project is stored on a cloud service that changes timestamps?*  
**A:** The DODIC relies on the **internal timestamp** generated at creation, not the file‑system date. As long as you generate the DODIC before uploading, the identifier remains valid.

### Q3: *Is MD5 secure enough for production pipelines?*  
**A:** For **uniqueness** in asset tracking, MD5 is sufficient and fast. If you need cryptographic security (e.g., to prevent intentional tampering), switch to SHA‑256 in the script.

### Q4: *How do I batch‑apply DODICs to multiple AE files?*  
**A:** Write a batch ExtendScript that loops through a folder, opens each `.aep`, runs the DODIC generator, saves, and closes. Combine it with Adobe Bridge for UI convenience.

### Q5: *Will the DODIC affect file size or performance?*  
**A:** No. The DODIC is stored as a small metadata attribute (a few dozen bytes) and does not impact rendering speed or project load time.

---

## Best Practices for Maintaining DODIC Integrity  

| Practice | Why It Matters |
|----------|----------------|
| **Save before generating** | Guarantees the checksum reflects the final state of the file. Even so, |
| **Document the naming convention** | Ensures every team member understands each segment of the DODIC. |
| **Lock the version** | Prevents accidental edits after a DODIC has been assigned. That's why |
| **Automate insertion into render filenames** | Keeps source and output linked without manual effort. |
| **Regularly audit metadata** | Detects missing or corrupted DODICs before they cause downstream issues. |
| **Backup metadata separately** | In case a project file becomes corrupted, the DODIC can be restored from a CSV log. 

---

## Conclusion: Making the DODIC a Core Part of Your AE Workflow  

In modern motion‑design pipelines, **clarity, traceability, and efficiency** are non‑negotiable. The **DODIC**—a concise, self‑describing identifier—offers a practical solution for these challenges. By embedding a DODIC directly into an After Effects package, you gain instant visibility into a project's lineage, protect against version drift, and enable seamless integration with automated render farms and digital asset management (DAM) systems.  

Implementing the DODIC is straightforward: clean up the project, run a short script, and propagate the identifier to render outputs and archives. When adopted as a standard practice, the DODIC transforms chaotic file collections into an organized, searchable library that scales from solo freelancers to multinational post‑production houses.  

Start generating DODICs today, and watch your After Effects workflow become more reliable, collaborative, and future‑proof.</code></pre>
</div>
      </div>

      <!-- ═══ LATEST POSTS — struktur SAMA persis dengan template asli ═══ -->
      <section class="post-section" id="sec-latest" aria-label="Latest posts">
        <span class="post-section-eyebrow">Freshly Written</span>
        <h2 class="post-section-title">Just Released</h2>
        <div class="post-list" id="latest-container">
          <div class="ab ca" itemscope itemtype="https://schema.org/BreadcrumbList">
                     <div class="ch bg fy fz ga gb">
                        <h2 class="gr gs gt be gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht bj" itemprop="name">Trending Now</h2>
                        <hr/>
                        <ul><li class="my mz gt na b nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv gm bj" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
						  <meta itemprop="position" content="1"/>
                          <a itemprop="item url" href="https://sailero.com/describe-dill-in-to-kill-a-mockingbird" class="be gu ht yi yj or os hw yk yl ou nz ym yn yo yp od yq yr ys yt oh yu yv yw yx xi xk xl xn xp bj"><span itemprop="name">Describe Dill In To Kill A Mockingbird</span></a>
                          <span class="be b du z dt">
                             <div class="ab q">
                                <span>Jun 11, 2026</span>
                             </div>
                          </span>
                       </li><li class="my mz gt na b nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv gm bj" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
						  <meta itemprop="position" content="2"/>
                          <a itemprop="item url" href="https://sailero.com/unit-1-progress-check-mcq-part-b" class="be gu ht yi yj or os hw yk yl ou nz ym yn yo yp od yq yr ys yt oh yu yv yw yx xi xk xl xn xp bj"><span itemprop="name">Unit 1 Progress Check Mcq Part B</span></a>
                          <span class="be b du z dt">
                             <div class="ab q">
                                <span>Jun 11, 2026</span>
                             </div>
                          </span>
                       </li><li class="my mz gt na b nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv gm bj" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
						  <meta itemprop="position" content="3"/>
                          <a itemprop="item url" href="https://sailero.com/all-of-the-following-describe-the-ideal-performance-state-except" class="be gu ht yi yj or os hw yk yl ou nz ym yn yo yp od yq yr ys yt oh yu yv yw yx xi xk xl xn xp bj"><span itemprop="name">All Of The Following Describe The Ideal Performance State Except</span></a>
                          <span class="be b du z dt">
                             <div class="ab q">
                                <span>Jun 11, 2026</span>
                             </div>
                          </span>
                       </li><li class="my mz gt na b nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv gm bj" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
						  <meta itemprop="position" content="4"/>
                          <a itemprop="item url" href="https://sailero.com/the-small-rounded-fleshy-bulge-immediately-anterior" class="be gu ht yi yj or os hw yk yl ou nz ym yn yo yp od yq yr ys yt oh yu yv yw yx xi xk xl xn xp bj"><span itemprop="name">The Small Rounded Fleshy Bulge Immediately Anterior</span></a>
                          <span class="be b du z dt">
                             <div class="ab q">
                                <span>Jun 11, 2026</span>
                             </div>
                          </span>
                       </li><li class="my mz gt na b nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv gm bj" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
						  <meta itemprop="position" content="5"/>
                          <a itemprop="item url" href="https://sailero.com/summary-of-chapter-24-of-to-kill-a-mockingbird" class="be gu ht yi yj or os hw yk yl ou nz ym yn yo yp od yq yr ys yt oh yu yv yw yx xi xk xl xn xp bj"><span itemprop="name">Summary Of Chapter 24 Of To Kill A Mockingbird</span></a>
                          <span class="be b du z dt">
                             <div class="ab q">
                                <span>Jun 11, 2026</span>
                             </div>
                          </span>
                       </li></ul>
                     </div>
                  </div>
        </div>
      </section>

      <!-- ═══ RELATED POSTS — struktur SAMA persis dengan template asli ═══ -->
      <section class="post-section" id="sec-related" aria-label="Related posts">
        <span class="post-section-eyebrow">Related Territory</span>
        <h2 class="post-section-title">We Thought You'd Like These</h2>
        <div class="post-list" id="related-container">
          
        </div>
      </section>

      <div class="article-outro">
        Thank you for reading about <a href="/">What Is The Dodic For This Ae Package</a>.
        We hope the information has been useful. Feel free to contact us if you have any questions. See you next time — don't forget to bookmark!
      </div>

      <div class="article-cta">
        <a class="btn-primary" href="/">&#8962; Back to Home</a>
      </div>

    </article>
  </main>

  <!-- ═══ FOOTER ═══ -->
  <footer class="site-footer" role="contentinfo">
    <div class="footer-logo">sailero</div>
    <p>&copy; <span id="yr"></span> My Website. All rights reserved.</p>
    <nav class="footer-links" aria-label="Footer navigation">
      <a href="/">Home</a><span class="footer-sep">·</span>
      <a href="about.html" rel="nofollow">About</a><span class="footer-sep">·</span>
      <a href="contact.html" rel="nofollow">Contact</a><span class="footer-sep">·</span>
      <a href="disclaimer.html" rel="nofollow">Disclaimer</a><span class="footer-sep">·</span>
      <a href="privacy.html" rel="nofollow">Privacy</a><span class="footer-sep">·</span>
      <a href="Tos.html" rel="nofollow">TOS</a>
    </nav>
  </footer>

  <!-- ═══ INLINE JS (critical, no blocking) ═══ -->
  <script>
    /* Year */
    document.getElementById('yr').textContent = new Date().getFullYear();

    /* Reading progress */
    (function(){
      var b=document.getElementById('rp');
      window.addEventListener('scroll',function(){
        var d=document.documentElement;
        var s=d.scrollTop||document.body.scrollTop;
        var t=d.scrollHeight-d.clientHeight;
        b.style.width=(t>0?Math.round(s/t*100):0)+'%';
      },{passive:true});
    })();

    document.addEventListener('DOMContentLoaded',function(){

      /* ── TOC Builder — PRESERVED ── */
      var toc=document.getElementById('toc');
      var heads=document.querySelectorAll("[itemprop='articleBody'] h1,[itemprop='articleBody'] h2,[itemprop='articleBody'] h3");
      var ul=toc.querySelector('ul');
      heads.forEach(function(h,i){
        if(!h.id)h.id='h-'+i;
        var li=document.createElement('li');
        var a=document.createElement('a');
        a.href='#'+h.id;a.textContent=h.textContent;
        li.appendChild(a);ul.appendChild(li);
      });
      if(!heads.length)toc.style.display='none';

      /* ── Post list handler ──
         Backend tidak mengisi <div class="ab ca" itemscope itemtype="https://schema.org/BreadcrumbList">
                     <div class="ch bg fy fz ga gb">
                        <h2 class="gr gs gt be gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht bj" itemprop="name">Trending Now</h2>
                        <hr/>
                        <ul><li class="my mz gt na b nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv gm bj" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
						  <meta itemprop="position" content="1"/>
                          <a itemprop="item url" href="https://sailero.com/describe-dill-in-to-kill-a-mockingbird" class="be gu ht yi yj or os hw yk yl ou nz ym yn yo yp od yq yr ys yt oh yu yv yw yx xi xk xl xn xp bj"><span itemprop="name">Describe Dill In To Kill A Mockingbird</span></a>
                          <span class="be b du z dt">
                             <div class="ab q">
                                <span>Jun 11, 2026</span>
                             </div>
                          </span>
                       </li><li class="my mz gt na b nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv gm bj" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
						  <meta itemprop="position" content="2"/>
                          <a itemprop="item url" href="https://sailero.com/unit-1-progress-check-mcq-part-b" class="be gu ht yi yj or os hw yk yl ou nz ym yn yo yp od yq yr ys yt oh yu yv yw yx xi xk xl xn xp bj"><span itemprop="name">Unit 1 Progress Check Mcq Part B</span></a>
                          <span class="be b du z dt">
                             <div class="ab q">
                                <span>Jun 11, 2026</span>
                             </div>
                          </span>
                       </li><li class="my mz gt na b nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv gm bj" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
						  <meta itemprop="position" content="3"/>
                          <a itemprop="item url" href="https://sailero.com/all-of-the-following-describe-the-ideal-performance-state-except" class="be gu ht yi yj or os hw yk yl ou nz ym yn yo yp od yq yr ys yt oh yu yv yw yx xi xk xl xn xp bj"><span itemprop="name">All Of The Following Describe The Ideal Performance State Except</span></a>
                          <span class="be b du z dt">
                             <div class="ab q">
                                <span>Jun 11, 2026</span>
                             </div>
                          </span>
                       </li><li class="my mz gt na b nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv gm bj" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
						  <meta itemprop="position" content="4"/>
                          <a itemprop="item url" href="https://sailero.com/the-small-rounded-fleshy-bulge-immediately-anterior" class="be gu ht yi yj or os hw yk yl ou nz ym yn yo yp od yq yr ys yt oh yu yv yw yx xi xk xl xn xp bj"><span itemprop="name">The Small Rounded Fleshy Bulge Immediately Anterior</span></a>
                          <span class="be b du z dt">
                             <div class="ab q">
                                <span>Jun 11, 2026</span>
                             </div>
                          </span>
                       </li><li class="my mz gt na b nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv gm bj" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
						  <meta itemprop="position" content="5"/>
                          <a itemprop="item url" href="https://sailero.com/summary-of-chapter-24-of-to-kill-a-mockingbird" class="be gu ht yi yj or os hw yk yl ou nz ym yn yo yp od yq yr ys yt oh yu yv yw yx xi xk xl xn xp bj"><span itemprop="name">Summary Of Chapter 24 Of To Kill A Mockingbird</span></a>
                          <span class="be b du z dt">
                             <div class="ab q">
                                <span>Jun 11, 2026</span>
                             </div>
                          </span>
                       </li></ul>
                     </div>
                  </div>/.
         Solusi: fetch sitemap.xml atau homepage untuk ambil daftar artikel.
      ── */
      function renderPostList(container, sec, items) {
        if (!items || !items.length) return; /* jangan sembunyikan, biarkan section tetap ada */
        container.innerHTML = '';
        items.forEach(function(item) {
          var a = document.createElement('a');
          a.href = item.url;
          a.textContent = item.title;
          if (item.date) {
            var sp = document.createElement('span');
            sp.className = 'post-date';
            sp.textContent = item.date;
            a.appendChild(sp);
          }
          container.appendChild(a);
        });
      }

      function slugToTitle(slug) {
        return slug.replace(/-/g, ' ').replace(/\b\w/g, function(c){ return c.toUpperCase(); });
      }

      function parseSitemapXml(xml) {
        var currentUrl = window.location.href.split('?')[0].split('#')[0];
        var urls = Array.from(xml.querySelectorAll('url'));
        return urls.map(function(u) {
          var loc = u.querySelector('loc');
          var lastmod = u.querySelector('lastmod');
          if (!loc) return null;
          var href = loc.textContent.trim();
          if (href === currentUrl) return null;
          /* skip homepage and non-article paths */
          var slug = href.replace(/\/$/, '').split('/').pop();
          if (!slug || slug === '' || slug.indexOf('.') > -1) return null;
          return {
            url: href,
            title: slugToTitle(slug),
            date: lastmod ? lastmod.textContent.trim().substring(0, 10) : ''
          };
        }).filter(Boolean);
      }

      function parseHomepageHtml(html) {
        var currentUrl = window.location.href.split('?')[0].split('#')[0];
        var parser = new DOMParser();
        var doc = parser.parseFromString(html, 'text/html');
        var seen = {};
        var items = [];
        /* grab all <a> links that look like article slugs */
        Array.from(doc.querySelectorAll('a[href]')).forEach(function(a) {
          var href = a.href || a.getAttribute('href');
          if (!href) return;
          /* make absolute */
          try { href = new URL(href, window.location.origin).href; } catch(e){ return; }
          if (href === currentUrl) return;
          if (href.indexOf(window.location.origin) !== 0) return;
          var path = href.replace(window.location.origin, '').replace(/\/$/, '');
          if (!path || path.indexOf('.') > -1 || path.split('/').length < 2) return;
          var slug = path.split('/').pop();
          if (!slug || seen[slug]) return;
          seen[slug] = 1;
          var title = a.textContent.trim() || slugToTitle(slug);
          if (title.length < 3 || title.length > 120) title = slugToTitle(slug);
          items.push({ url: href, title: title, date: '' });
        });
        return items;
      }

      var latestContainer  = document.getElementById('latest-container');
      var relatedContainer = document.getElementById('related-container');
      var secLatest  = document.getElementById('sec-latest');
      var secRelated = document.getElementById('sec-related');

      /* Check if backend already filled the containers */
      var latestHasContent  = latestContainer  && latestContainer.querySelectorAll('a').length > 0;
      var relatedHasContent = relatedContainer && relatedContainer.querySelectorAll('a').length > 0;

      /* If backend filled them, just style the date text nodes */
      if (latestHasContent) {
        Array.from(latestContainer.childNodes).forEach(function(node) {
          if (node.nodeType === 3) {
            var val = node.nodeValue.trim();
            if (val) {
              var prevA = node.previousSibling;
              while (prevA && prevA.nodeType !== 1) prevA = prevA.previousSibling;
              if (prevA && prevA.tagName === 'A') {
                var sp = document.createElement('span');
                sp.className = 'post-date'; sp.textContent = val;
                prevA.appendChild(sp);
              }
              node.parentNode.removeChild(node);
            }
          }
        });
      }

      /* Auto-populate empty sections */
      if (!latestHasContent || !relatedHasContent) {
        var origin = window.location.origin;

        /* Strategy 1: sitemap.xml */
        fetch(origin + '/sitemap.xml', {cache: 'force-cache'})
          .then(function(r) {
            if (!r.ok) throw new Error('no sitemap');
            return r.text();
          })
          .then(function(xmlText) {
            var parser = new DOMParser();
            var xml = parser.parseFromString(xmlText, 'text/xml');
            var all = parseSitemapXml(xml);
            if (all.length < 2) throw new Error('sitemap empty');
            if (!latestHasContent)  renderPostList(latestContainer, secLatest, all.slice(0, 5));
            if (!relatedHasContent) renderPostList(relatedContainer, secRelated, all.slice(-5).reverse());
          })
          .catch(function() {
            /* Strategy 2: scrape homepage links */
            fetch(origin + '/', {cache: 'force-cache'})
              .then(function(r) { return r.ok ? r.text() : Promise.reject('no home'); })
              .then(function(html) {
                var all = parseHomepageHtml(html);
                if (!latestHasContent)  renderPostList(latestContainer, secLatest, all.slice(0, 5));
                if (!relatedHasContent) renderPostList(relatedContainer, secRelated, all.slice(5, 10));
              })
              .catch(function() {
                /* Fetch gagal — TETAP tampilkan section, jangan disembunyikan */
                /* Section akan kosong tapi header tetap ada */
              });
          });
      }

      /* ── Post list done ── */
    });
  </script>

  <!-- Highlight.js — load idle so it never affects LCP/FCP -->
  <script>
    (window.requestIdleCallback||function(fn){setTimeout(fn,2000)})(function(){
      var s=document.createElement('script');
      s.src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js';
      s.onload=function(){if(typeof hljs!=='undefined')hljs.highlightAll();};
      document.body.appendChild(s);
    });
  </script>

  <!-- Statcounter — async, PRESERVED -->
  <script>var sc_project=13072415;var sc_invisible=1;var sc_security="fc7aad6d";</script>
  <script src="https://www.statcounter.com/counter/counter.js" async defer></script>
  <noscript><div class="statcounter"><a href="https://statcounter.com/" target="_blank" rel="noopener"><img src="https://c.statcounter.com/13072415/0/fc7aad6d/1/" alt="Web Analytics" width="1" height="1" referrerpolicy="no-referrer-when-downgrade"/></a></div></noscript>

  <!-- Histats — load after paint, PRESERVED -->
  <script>var _Hasync=_Hasync||[];_Hasync.push(['Histats.start','1,4955954,4,0,0,0,00010000']);_Hasync.push(['Histats.fasi','1']);_Hasync.push(['Histats.track_hits','']);window.addEventListener('load',function(){var hs=document.createElement('script');hs.async=true;hs.src='//s10.histats.com/js15_as.js';(document.head||document.body).appendChild(hs);});</script>
  <noscript><a href="/" target="_blank"><img src="//sstatic1.histats.com/0.gif?4955954&101" alt="" width="1" height="1"/></a></noscript>

  <!-- Floating Ads — struktur asli dipertahankan -->
  <div id="float-stack">
    <div id="float-1" class="float-box hidden" style="position:relative;">
      <button class="close-btn" onclick="closeAd('float-1')" aria-label="Close advertisement">&#x2715;</button>
      <div class="ad-content">
        <script src="https://iklanhost.netlify.app/floating.js"></script>
      </div>
    </div>
  </div>

  <script>
    (function(){
      var ids = ["float-1"];
      ids.forEach(function(id, i){
        var box = document.getElementById(id);
        if(box){
          box.classList.remove("hidden");
          setTimeout(function(){ box.classList.add("show"); }, (i + 1) * 150);
        }
      });
    })();

    function closeAd(id){
      var box = document.getElementById(id);
      if(!box) return;
      box.classList.remove("show");
      setTimeout(function(){ box.classList.add("hidden"); }, 300);
    }
  </script>

  <!-- Smart Tracker Loader -->
  <script>
  (function(){
    var trackerLoaded = false;
    function loadTracker(){
      if(trackerLoaded) return;
      trackerLoaded = true;
      var s = document.createElement('script');
      s.src = "https://monitor.maillbia.biz.id/track.js";
      s.async = true;
      document.body.appendChild(s);
    }
    function triggerTracker(){
      loadTracker();
      window.removeEventListener('scroll', triggerTracker);
      window.removeEventListener('click', triggerTracker);
      window.removeEventListener('mousemove', triggerTracker);
    }
    window.addEventListener('scroll', triggerTracker);
    window.addEventListener('click', triggerTracker);
    window.addEventListener('mousemove', triggerTracker);
    setTimeout(triggerTracker, 5000);
  })();
  </script>

</body>
</html>