Antora Architecture Reference
This reference explains how the Domus documentation system works - what each file does, how navigation is structured, and the rules for writing content.
The Three Layers
Antora documentation has three distinct layers:
| Layer | What It Provides | Defined By |
|---|---|---|
Playbook |
Site aggregation, component sources, UI bundle |
|
Component |
Content, attributes, left navigation |
|
UI Bundle |
Right-side TOC, styling, layout, search |
domus-antora-ui (Handlebars templates) |
File Responsibilities
antora-playbook.yml (Site Level)
Location: domus-docs/antora-playbook.yml
Defines:
-
Site title and URL
-
Which components to aggregate
-
UI bundle location
-
Global AsciiDoc extensions
site:
title: Domus Digitalis
url: https://docs.domusdigitalis.dev
start_page: home::index.adoc
content:
sources:
- url: https://github.com/EvanusModestus/domus-ise-linux
branches: main
start_path: docs/asciidoc
ui:
bundle:
url: ./ui-bundle.zip # domus-antora-ui output
antora.yml (Component Level)
Location: Each repo at docs/asciidoc/antora.yml
Defines:
-
Component name (used in URLs and xrefs)
-
Version
-
Navigation file reference
-
AsciiDoc attributes
name: ise-linux # URL: /ise-linux/...
title: ISE Linux 802.1X # Display name
version: '2026' # URL: /ise-linux/2026/...
nav:
- modules/ROOT/nav.adoc # Left sidebar navigation
asciidoc:
attributes:
ad-dc-ip: 10.50.1.50 # Use as \{ad-dc-ip} in pages
port-kerberos: 88
nav.adoc (Left Navigation)
Location: modules/ROOT/nav.adoc
Defines: Left sidebar navigation tree for this component only.
* xref:index.adoc[Overview]
* Runbooks
** xref:runbooks/linux-ad-auth-dacl.adoc[Linux AD Auth dACL]
** xref:runbooks/vault-pki.adoc[Vault PKI]
* Architecture
** xref:architecture/network.adoc[Network Design]
UI Bundle (Right TOC + Styling)
Location: domus-antora-ui/ (separate repo)
Provides:
-
Right-side page TOC - auto-generated from
==headings -
Site header and footer
-
Component selector dropdown
-
Search (Lunr integration)
-
Dark/light theme
-
All CSS styling
The UI bundle is built with npx gulp bundle and outputs ui-bundle.zip.
The Two TOCs
This is critical to understand:
| TOC | Source | Purpose |
|---|---|---|
Left Navigation |
|
Navigate between pages in this component |
Right Page TOC |
UI bundle (automatic from headings) |
Jump to sections within current page |
Why NO :toc: in Pages
Adding :toc: attributes in individual .adoc files creates a third TOC in the content area:
// WRONG - creates duplicate TOC
= My Page
== Section 1
...
This creates three TOCs instead of two - the inline TOC is redundant and clutters the content area.
Correct page header:
= My Page
:description: Brief description
:navtitle: Short Nav Title
:icons: font
== Section 1
...
URL to File Mapping
URLs map predictably to file paths:
https://docs.domusdigitalis.dev/ise-linux/2026/runbooks/linux-ad-auth-dacl.html
│ │ │ └── pages/runbooks/linux-ad-auth-dacl.adoc
│ │ └── pages/runbooks/
│ └── version (antora.yml)
└── name (antora.yml)
Formula:
{site-url}/{component-name}/{version}/{page-path}.html
↓ ↓ ↓ ↓
playbook antora.yml antora.yml modules/ROOT/pages/\{path}.adoc
name: version:
Finding source from URL:
# URL: https://docs.domusdigitalis.dev/ise-linux/2026/runbooks/linux-ad-auth-dacl.html
# File: domus-ise-linux/docs/asciidoc/modules/ROOT/pages/runbooks/linux-ad-auth-dacl.adoc
# Pattern:
# domus-\{component}/docs/asciidoc/modules/ROOT/pages/\{url-path}.adoc
Attributes: Define Once, Use Everywhere
Where Attributes Are Defined
| Location | Scope | Example |
|---|---|---|
|
All components (global) |
|
|
This component only |
|
Page header |
This page only (avoid) |
|
Cross-Component References
Same Component (single colon or none)
xref:runbooks/vault-pki.adoc[Vault PKI]
xref:architecture/network.adoc[Network Design]
Directory Structure
Standard Antora component layout:
domus-ise-linux/
├── docs/asciidoc/ # Antora start_path
│ ├── antora.yml # Component descriptor
│ └── modules/
│ └── ROOT/ # Default module
│ ├── nav.adoc # Left navigation
│ ├── pages/ # Content (becomes HTML)
│ │ ├── index.adoc
│ │ └── runbooks/
│ │ └── linux-ad-auth-dacl.adoc
│ ├── partials/ # Reusable fragments
│ │ └── common-prereqs.adoc
│ ├── examples/ # Code includes
│ │ └── script.sh
│ ├── images/ # Static images
│ │ └── diagram.svg
│ └── attachments/ # Downloadable files
│ └── template.xlsx
Attribute Conversion Process
When auditing or creating documentation, follow this process to ensure no hardcoded values slip through.
What MUST Be Attributes
| Category | Examples | Attribute Pattern |
|---|---|---|
IP Addresses |
|
|
Hostnames |
|
|
MAC Addresses |
|
|
Domain Names |
|
|
Port Numbers |
|
|
Usernames |
|
|
Policy Names |
|
|
VLAN Names/IDs |
|
|
File Paths |
|
|
Audit Process (Per Page)
Step 1: Identify hardcoded values
# Search for IP addresses
grep -E '\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b' page.adoc
# Search for MAC addresses
grep -Ei '[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}' page.adoc
# Search for known hostnames
grep -E 'modestus-|home-dc|ise-0' page.adoc
# Search for domain names
grep -i 'domusdigitalis\|inside\.' page.adoc
Step 2: Check if attribute exists
Look in the component’s antora.yml under asciidoc.attributes.
Step 3: Add missing attributes to antora.yml
asciidoc:
attributes:
new-attribute: value-here
Step 4: Replace hardcoded values in page
-
In prose:
The DC is at {ad-dc-ip} -
In code blocks: Add
subs=attributes+to the block
Step 5: Verify rendering
Build the site and confirm attributes expand correctly.
Code Block Attribute Substitution
Attributes in code blocks require explicit opt-in:
[source,bash,subs=attributes+]
----
ping {ad-dc-ip}
DC_IP="{ad-dc-ip}"
----
Without subs=attributes+, the literal {ad-dc-ip} appears in output.
Shell Variables + Attributes Pattern
For runbooks where the same value is used repeatedly, combine shell variables with attributes:
[source,bash,subs=attributes+]
----
# Set once at top
DACL_NAME="{dacl-ad-auth}"
DC_IP="{ad-dc-ip}"
# Use throughout
netapi ise get-dacl "$DACL_NAME"
ping $DC_IP
----
This pattern:
-
Attribute expands at render time (
{dacl-ad-auth}→Linux-Research-AD-Auth) -
Shell variable holds the value for the session
-
Subsequent commands use
$DACL_NAME(shorter, cleaner)
Site-Wide Audit Checklist
| Repo | Audit Status | Notes |
|---|---|---|
domus-ise-linux |
|
Other pages need audit |
domus-infra-ops |
Not audited |
Runbooks likely have hardcoded values |
domus-netapi-docs |
Not audited |
CLI examples may have IPs |
domus-linux-ops |
Not audited |
Scripts may have hardcoded paths |
domus-secrets-ops |
Not audited |
Vault paths/IPs likely hardcoded |
Quick Reference
| Task | How |
|---|---|
Find source from URL |
|
Add left nav entry |
Edit |
Use attribute |
|
Link same component |
|
Link other component |
|
Include partial |
|
Include example |
|