A publishing compiler, not a theme
content/*.org
→ Emacs + ox-html
→ deterministic article ESM
→ Eliscript React application
→ static Vite bundle
The Org adapter is optional and lives outside the language compiler. Direct export needs only Emacs; Vite and React enter when the data module becomes a browser application.
The output is ordinary data and HTML. Layout, navigation, interaction, typography, and deployment remain application decisions.
Article metadata
#+TITLE: The Compiler Is the Publishing System
#+DATE: 2026-08-28
#+SLUG: compiler-publishing
#+DESCRIPTION: One programmable path from Org to React.
#+FILETAGS: :emacs:compiler:react:
#+DRAFT: false
* A stable section
The body is ordinary Org.
| Field | Contract |
|---|---|
TITLE | Required, non-empty display title |
DATE | Required real date in YYYY-MM-DD form |
SLUG | Optional stable identity; filename is the fallback |
DESCRIPTION | Optional summary for article lists |
FILETAGS | Optional normalized, deduplicated tags |
DRAFT | Optional publication filter |
Missing heading IDs are assigned deterministically. Explicit Org CUSTOM_ID properties stay untouched.
Export a data module
./bin/eliscript-org \
--output dist/articles.mjs \
content/
The generated module exports one date-sorted articles array containing the slug, title, date, description, tags, draft state, source path, and exported HTML. Repeated builds from the same inputs are byte-identical.
Org HTML is trusted build output and is rendered directly by the example. Content from untrusted authors needs a separate sanitization boundary.
Use Org as a Vite module
import { eliscriptOrg } from "./tools/org/vite-plugin.mjs";
export default {
plugins: [
eliscriptOrg({ contentDirectory: "content" })
]
};
Application code imports virtual:eliscript-org. The adapter recursively watches Org sources, rebuilds the deterministic module, and invalidates it when content changes.
Run the custom site
bun run dev:org-site
bun run build:org-site
The example application is written in Eliscript and compiles through the same React and Vite path as any other browser program. It implements responsive article navigation, hash routes, tags, and trusted Org HTML rendering. Navigation uses portable sequence, text, and immutable object source modules for mapping, hash-prefix removal, browser options, and a prebuilt slug index with direct lookups. Drafts do not enter the production bundle.
Dogfood hybrid blog design
The planned examples/dogfood project separates two Eliscript programs. A build program runs in Actions and normalizes local Markdown, authorized GitHub Issues, and authorized Discussions into static blog and comment data. A browser program renders the resulting site after compilation to standard JavaScript.
Sources can be enabled independently or together. By default, only the repository owner may publish an Issue or Discussion as an article; a configured author list can extend that authority. Other participants may comment on an existing article or use a configured external comment provider, but cannot silently promote their content into a blog post.
Comment events are coalesced before rebuilding so bursts do not consume one Actions run per reply. Static output remains the fallback, while optional dynamic enhancement can refresh comments without changing core language semantics.
Dogfood is currently a complete design package, not an implemented or production-accepted application. Its status never contributes to the Eliscript core percentage.