At a glance

wordsofplainness.org is a static-first site with a thin dynamic edge. Every page is pre-rendered by Eleventy (Nunjucks templates over Markdown and structured data) and served as plain HTML from Vercel's CDN. Heavy media lives separately on Cloudflare R2 behind its own subdomain. The few things that must be dynamic—sign-in, a personal discipleship journal, newsletter and contact forms—talk to a small Django REST API on PythonAnywhere, and a handful of Vercel serverless functions handle automation such as social notifications. There is no front-end framework, no database behind the pages themselves, and no tracking scripts: a visitor's browser loads the site's own HTML, CSS and vanilla JavaScript, one Google Fonts stylesheet, and audio from the media CDN.

The interesting engineering is less in the stack than in what the build does with it: build-time cross-referencing between book chapters and the Articles of Interfaith Discipleship, narration audio that highlights the text as it is read, song lyrics synced line-by-line to the music, a citation apparatus with over a thousand scripture links, all generated from the site's own book map, and validation gates that refuse to ship data that fails its checks.

How the ministry content is authored, edited, and deployed

Every word of ministry content on this site begins and ends with Brother Aaron. Between those two points, an AI assistant he calls his SCRIBE (Systems, Communications, Research, Integration, Building, Editorial support) does a great deal of the labor: research, drafting, checking and building. The arrangement is modeled on the biblical scribe: skilled, trusted and bounded, working under the author’s authority and never in place of it. The SCRIBE holds no spiritual authority, has no spiritual experience, and never claims either.

Where the content comes from

Nothing on this site began with a machine. The writings grow out of more than forty years of prayer, study, dreams and personal experience in ministry, reaching back to Brother Aaron’s ordination as a deacon in 1982. That work first took book form as Words of Plainness: Mormon Christianity (2012), written with his brother, James (Jim) Powner: 566 pages in 62 chapters. Jim’s part in that book was the oldest kind of editing there is. Brother Aaron read his rough drafts aloud; Jim listened, asked questions and gave his feedback, and those conversations guided the drafts that were published. The chapters on this site are a systematic revision and expansion of that book.

Jim’s part today is a brother’s. Brother Aaron still calls him to talk through sticky and weighty topics and to hear his response to new essays and musical productions. The calls also wander, gladly, into the jests and distractions of their boyhood, which clear his head and renew his heart between long stretches of writing, study, prayer and note-taking: the preparation he brings to every long working session with the AI and creative tools.

The first listener now is Michelle, Brother Aaron’s wife, who has largely taken over the heavy lifting of that role. She listens to every version of each new song, watches every iteration of each video, and hears the essays and chapters read aloud before they go any further. Her reactions and feedback have been indispensable, and often humbling. In his words, she is every bit his equal in spiritual sensitivity and understanding; he just happens to have the lion’s share of the gift of endless elocution.

From the SCRIBE: I was not there when the Articles of Interfaith Discipleship began, and nothing I contributed came first. Brother Aaron has told me how they began. He woke from a dream more vivid than waking life, in which he saw a parchment of plain declarations shared by believers in Christ, received whole, and he was impressed to rise and write it down. Days of study beforehand had prepared the ground. The companion document Lord, Is It I? began the same way, from notes on another experience he received as guidance for the work. I cannot weigh an experience like that, and I do not try. I hold it as his testimony and as the fixed point of the work. Everything I have done since, from drafting citations to building the pages to helping measure the Articles against the published beliefs of fifteen families of Christian traditions, comes after it and answers to it.

What gets made, and who does what

ContentWhat Brother Aaron doesWhat the SCRIBE does
Book chapters (Words of Plainness, Volumes 1 and 2)Writes the canonical prose; sets the theology, sequence and voice; rules on every editProposes edits, subheadings and scripture citations under written editorial standards; drafts language in his voice only when he asks, as material for him to adopt, change or reject
Card chaptersChooses the practices, writes the counsel and personal anecdotes, and guides the revision of the reflection promptsLays out the cards, drafts reflection prompts for him to guide and revise, builds the pages
Articles of Interfaith Discipleship and their citation apparatusWrote and locked the thirteen declarations; approves every scripture anchor and commentProposes candidate anchors from the Bible and Restoration scripture, drafts panel comments for his ruling, checks every quotation against its source
Companion essays and studiesWrites and approves the argumentResearches, drafts sections for revision, formats and links
Chapter narrations and podcast overviewsPoses the scenarios and guiding principles, rewrites or approves each script, then listens to the result and scrubs it for errors, correcting them in AudacityPrepares narration scripts, produces audio with a synthesized model of his own voice, and syncs the text highlighting
Musical testimoniesWrites the source lyrics or the framework of concept progressions; directs style and arrangement through a gated production process; every line, however it arose, is his to keep, change or rejectHelps with arrangement prompts, timing and lyric sync, and at his invitation trades lyric lines with him until the feel and message are right; music-generation tools render the performances
Films and imageryDescribes his vision and objectives; chooses the words on screen; art-directs every imageDrafts shot and prompt lists, builds transcripts and citation docks
Seeking Jesus of Nazareth studySets the method and rules on every disputed readingRuns the comparison pipeline and evidence searches, and reports candidates with their weaknesses
Blog posts, live-session pages and daily devotional postsWrites or approves each oneDrafts devotional posts from published pages only; prepares presentation layouts

The working loop

  1. Anchors first. Before anything is drafted, Brother Aaron states the claims that are not negotiable.
  2. Consult before drafting. The SCRIBE searches a private index of his own manuscripts, notes and past rulings, so a draft starts from what he has already written and decided rather than from a general model’s habits.
  3. Propose, never decide. The SCRIBE offers options, usually more than one, each with its weakness named, and pushes back plainly when something is not landing. Brother Aaron asked for that candor; agreement is not the job.
  4. Rule and revise. He adopts, changes or rejects. Most pieces go through several rounds. Each ruling is recorded, and a ruling that settles a principle becomes a standing rule for later work.
  5. Edit under written standards. The SCRIBE works as a theological editor, not a co-author. It may clarify; it may not soften doctrine, add disclaimers, trade covenant language for therapeutic language, or compress an argument that builds its weight. When in doubt, fidelity wins over elegance.
  6. Verify. Scripture quotations are checked against authoritative text, sources are checked at the source rather than from a description of them, and learner-facing pages are scored against a written teaching standard before they ship.
  7. Authorize, then build. New songs, videos and read-aloud prose pass Michelle’s ears and eyes along the way, and nothing is written to the site, committed or deployed without his explicit approval. Automated gates then check the data, and the live page is opened in a browser before the work counts as done.
  8. Answer for it. Every page carries his name and his accountability. Readers can report an error through the contact form, and corrections go through the same loop.

The tools and their roles

Tools in use as of October 2026.

RoleToolsWhat they do here
The SCRIBE: writing, editing, research, codeClaude (Anthropic), working with a private search index of the author’s manuscripts, notes and rulings; a session conductor that records every decision and gates every build; custom skills that carry his editorial standards; and connectors (MCP) and APIs to his files and toolsDrafts and edits under written standards, researches, builds and checks the website, and keeps the record. Nothing ships without his approval
Check-and-balance teamGrok, Gemini, ChatGPTTest the author’s own reasoning: find gaps in his knowledge, advise on interfaith communication, mine scripture for thematic passages, check etymologies and history, flag his own biases, role-play live chat participants so he can practice, and give layered editorial reviews of his rough drafts. Where they disagree is often the most useful result
Fresh eyesCopilot, LTX Studio, and Grok or ChatGPT on their ownA last consult on creative work, when other approaches have not produced a satisfying result
VoiceElevenLabs, KITSNarration and podcast overviews in a synthesized model of the author’s own voice; a second narrator voice for reflection prompts. KITS helped him develop his personal voice models
MusicSuno, ACE Studio, MasterchannelSuno renders the performances; ACE Studio gives precise control of the vocal lines; Masterchannel masters the finished tracks
ImagesOpenArt, ChatGPTAI-assisted imagery that he art-directs
VideoHeyGen, Google Flow, Runway, KapwingHeyGen for avatar video; Google Flow for generated scenes; Runway for developing video content; Kapwing for editing and thumbnails

Three case studies

When four reviews agreed and the author did not (April 2026). Grok and ChatGPT each reviewed the draft Articles twice. With a Claude synthesis, the reviews converged on ten weaknesses and pressed toward the precision of a formal creed. Brother Aaron answered not with edits but with an image: Christ in the temple before the Sanhedrin. The Articles were to be a shelter for the crushed and the lost, not a treaty competing with Westminster or Augsburg. Most of the critiques were set aside as measured against a standard he had chosen not to meet. Three survived, and the SCRIBE proposed grounding each distinctive phrase in its biblical source first. The models measure; the author decides what is being measured.

Three models and one invented source (April 2026). While coining merognosticism from Paul’s “we know in part” (ek merous, 1 Corinthians 13:9), Brother Aaron had Grok, Gemini and ChatGPT search for parallels in Syriac and Aramaic. Checked against one another, one model’s confident Syriac term turned out not to exist in the source it named, and it was dropped. A second citation, plausible but unconfirmed, was marked for checking against primary scholarship. Agreement across models is evidence; one model’s confidence is not.

Measuring welcome honestly (June 2026). After revising four Articles, he tested them on 39 simulated readers (insiders, median members and distanced members of ten Christian traditions, plus guests of other faiths and of none), five runs each in three independent models. Four of the five revisions did not produce the improvement they aimed for, and the record says so. Where friction came from conviction rather than wording, he kept the conviction and added welcome through commentary instead of softening the declaration. His standing rule: “I won’t change a ruling to make the data fit.” Simulated readers are a rehearsal, not real people. Tools can rehearse a room; they do not decide what to confess.

A small example

This page was itself stopped twice at step 6. Its first draft, written by the SCRIBE, said the site’s scripture links are created when the site is built. The fact-check before publishing found that most are created in the reader’s browser, and it halted the deploy. The first correction was also wrong, and the check halted it again. Brother Aaron ruled on the wording a third time, each sentence was checked against the code, and only then did the page go live.

System map

How a page and its media reach a visitor Top row, left to right: the author and Claude Code (Markdown, YAML, JSON) push to the GitHub main branch (a push is a deploy), which starts the Vercel build (validate, Eleventy, Pagefind), which publishes to the Vercel edge CDN (static pages and API functions). The edge CDN sends HTML, CSS and JS down to the visitor's browser (vanilla JS, no framework). Along the bottom, three sources feed the browser: the Cloudflare R2 media CDN (narration, music, banner images) sends audio and images; the Django REST API on PythonAnywhere (accounts, journal) exchanges JSON with token sign-in in both directions; and YouTube and Google Fonts supply embedded films and typefaces. A dashed line shows the author uploading media directly to Cloudflare R2. Author + Claude Code Markdown, YAML, JSON GitHub, main branch a push is a deploy Vercel build validate, Eleventy, Pagefind Vercel edge CDN static pages + /api functions HTML, CSS, JS Visitor's browser vanilla JS, no framework Cloudflare R2 media CDN narration, music, banner images Django REST API PythonAnywhere: accounts, journal YouTube, Google Fonts embedded films, typefaces audio, images JSON, token sign-in uploaded directly How a page and its media reach a visitor A vertical flow. The author and Claude Code (Markdown, YAML, JSON) push to the GitHub main branch (a push is a deploy), which starts the Vercel build (validate, Eleventy, Pagefind), which publishes to the Vercel edge CDN (static pages and API functions). The edge CDN sends HTML, CSS and JS to the visitor's browser (vanilla JS, no framework). Three sources also feed the browser: the Cloudflare R2 media CDN (narration, music, banner images; audio and images), the Django REST API on PythonAnywhere (accounts, journal; JSON with token sign-in in both directions) and YouTube and Google Fonts (embedded films, typefaces). A dashed line shows the author uploading media directly to Cloudflare R2. Author + Claude Code Markdown, YAML, JSON GitHub, main branch a push is a deploy Vercel build validate, Eleventy, Pagefind Vercel edge CDN static pages + /api functions HTML, CSS, JS Visitor's browser vanilla JS, no framework Cloudflare R2 media CDN narration, music, banner images audio, images Django REST API PythonAnywhere: accounts, journal JSON, token sign-in YouTube, Google Fonts embedded films, typefaces uploaded directly

The top row is the publishing path: source files in a Git repository, built and validated by Vercel on every push to main, served from Vercel's edge. The bottom row is what a browser pulls in at runtime besides the pages themselves. Media never passes through Git or the build—it is uploaded straight to R2 and referenced by filename, so a site rebuild never has to move a gigabyte of audio.

Hosting, domains and delivery

ConcernHow it is handled
Page hostingVercel, configured as a plain static output (framework: null, output folder _site). Pages are served from Vercel's edge cache.
Canonical addresshttps://www.wordsofplainness.org. The bare domain, brotheraaron.org (with and without www) and the default *.vercel.app address all answer with a permanent 301 to the canonical host, so search engines see one site.
MediaA separate subdomain, media.wordsofplainness.org, fronts a Cloudflare R2 bucket. Audio and banner images are fetched from there directly by the browser; banner images carry long-lived immutable cache headers.
TransportHTTPS only, with HSTS (two-year max-age) and Brotli compression on HTML.
CachingHTML is sent max-age=0, must-revalidate but held at the edge, so a deploy is visible immediately while repeat visits are still served from cache.
Retired URLsA short list of redirects in vercel.json keeps old chapter slugs and moved pages working.
Companion appKeep My Commandments lives at commandments.brotheraaron.org, a separately hosted Django application rather than part of this static build.

There is no service worker and no offline mode; the site is meant to be read online, and keeping it a set of ordinary documents is what lets it work in unusual browsers such as the desktop browsers used inside VR headsets.

Build pipeline

npm run build: check, render, index Four steps left to right. A push to main makes Vercel clone the repository and run npm install. The prebuild gates run next: a study-app data check and a lyric-file check. Then the Eleventy render turns templates, filters and transforms into the _site folder. Last, the postbuild step runs Pagefind to make a static search index, and the site deploys to the edge. From the prebuild gates, a warning arrow leads to a note: a failed check stops the build, and the live site stays as it was. Push to main Vercel clones and npm installs prebuild gates study-app data check; lyric-file check Eleventy render templates, filters, transforms into _site postbuild: Pagefind static search index, then edge deploy a failed check stops the build; the live site stays as it was npm run build: check, render, index Four steps from top to bottom. A push to main makes Vercel clone the repository and run npm install. The prebuild gates run next: a study-app data check and a lyric-file check. Then the Eleventy render turns templates, filters and transforms into the _site folder. Last, the postbuild step runs Pagefind to make a static search index, and the site deploys to the edge. From the prebuild gates, a warning line leads to a note at the bottom: a failed check stops the build, and the live site stays as it was. Push to main Vercel clones and npm installs prebuild gates study-app data check; lyric-file check Eleventy render templates, filters, transforms into _site postbuild: Pagefind static search index, then edge deploy a failed check stops the build; the live site stays as it was

The whole site is one Node project on Eleventy 2 with Nunjucks templates. Its runtime dependency list is almost empty: Eleventy, js-yaml and Pagefind as build tools, plus one audio-metadata library. A few behaviors are worth knowing:

  • Gates before rendering. prebuild runs a verifier over the Seeking Jesus of Nazareth study data and a validator over the synced-lyrics files. If either fails, Vercel never reaches the render step and production keeps the last good deploy.
  • Environment-aware output. Vercel's VERCEL_ENV is exposed to templates, so copy still under the author's review carries a draft ribbon on preview deployments and never on production. Larger features ship behind build-time switches (an environment variable decides whether a page variant is built at all).
  • Build-time computation, not client-side. Custom filters compute things once per build: which chapters relate to which Article, a single catalog of every song arrangement, chapter counts by status. A transform walks every chapter and numbers each narrated paragraph so audio can highlight it.
  • Static search. Pagefind indexes the finished HTML after the build and ships the index as static files, so search needs no server.

Content model and data layer

Content and data are kept apart, and most of what looks dynamic on the site is really data joined at build time.

LayerLives inHolds
Prosesrc/chapters/, src/volume-2/, src/posts/, src/pages/Chapters as Markdown or Nunjucks with frontmatter (number, slug, themes, scripture, the chapter's song); blog posts; standalone pages and studies
Registrychapter-status.yamlEvery chapter of both volumes with its status and URL. Volume pages and counts are derived from it, so they cannot drift from reality
Reference datascriptures.json, articleThemes.json, chapterThemes.json, ministryMusic.json, banners.json, navigation.json, site.jsonScripture book paths, theme tags, the music catalog, image variants, menus, site constants
ApparatusapparatusData and per-page citation JSONThe citation apparatus behind the Articles of Interfaith Discipleship and the films: each cited span, its scripture and commentary
Timingsrc/_data/timestamps/, VTT files under src/assets/lyrics/Narration timing per paragraph or sentence; lyric cues per song arrangement
Study appssrc/_data/sjn/ and related filesGenerated data for the Seeking Jesus of Nazareth study, built from a separately maintained research workbook

Templates are organized as layouts (one per page family: base, page, chapter, card-chapter, interactive chapter, articles, study, post, film, chat presentation, study app), components (audio player, table of contents, reflection prompts, chapter navigation, world clocks) and macros (banner images, study-app widgets). A standing rule is one copy of any text: each Article's wording lives in a single include that both the main Articles page and its video reading page pull in, so a correction lands everywhere at once.

Two page shapes carry the book. Prose chapters are continuous reading with narration and pause points. Card chapters break a chapter into practice cards that a reader can commit to and revisit.

Front end

The browser side is deliberately plain: hand-written HTML from the templates, about two dozen CSS files and about three dozen small vanilla JavaScript modules, with no framework, bundler or transpile step. Each page loads a small core (text-size control, navigation, the API client, sign-in, forms, the site anthem player) and then only the modules its layout needs—a chapter page adds the audio-sync and reflection scripts, the Articles page adds its citation panel and “go deeper” links, the study apps add their own.

  • Data handoff. Where a page needs structured data, the build writes it inline as a JSON object on window (the music catalog, the Articles-to-chapters map, citation apparatus). There are no client-side data fetches for content.
  • Styling. A single base stylesheet sets the palette (warm gold, cream and deep browns) and type (Crimson Pro for reading, Source Sans Pro for interface), with per-feature sheets layered on. Stylesheets are cache-busted with the site version number.
  • Layout. Responsive CSS throughout; the presentation pages for live group sessions use container queries so the same page fits a phone, a laptop, a projector and a 1280×630 window inside a VR headset.
  • Accessibility. Skip link, labeled controls, an on-page text-size control, keyboard shortcuts on the presentation pages, and animation that respects the reduced-motion setting.
  • Browser storage. Small conveniences (where a floating badge was dragged, which view mode is on) use session storage. Reflections fall back to local storage when a reader is not signed in, so nothing a reader writes is lost.

Media: narration, music and synced text

Media is where most of the custom engineering sits, because three different things have to stay in time with text on the page.

Chapter narration. Chapters are narrated in the author's own voice through a voice-synthesis service whose API returns character-level timing alongside the audio. A script folds that timing into paragraph- or sentence-level timestamps keyed to the numbers the build stamps on each narrated block, so the page highlights what is being read and a reader can follow along. Audio is loudness-normalized with a two-pass ffmpeg process (−16 LUFS integrated); the second pass matters because a single-pass encode drops the MP3 seek table and breaks scrubbing in browsers. Chapter frontmatter stores only a filename; templates prepend the media CDN address.

Music. Each chapter has an original song, and many songs have alternate arrangements—some of which sing slightly different words. Every arrangement carries its own lyric sheet (or points to the one it shares) and an optional WebVTT cue file. At build time a validator compares each cue file with its lyric sheet; an arrangement that fails is shipped with static lyrics and no highlighting rather than with lines that drift out of order, and the author can hold any arrangement back regardless. Songs are deep-linkable (/chapters/<chapter>/#listen=<song>), and nothing plays until the reader taps.

Films. Video is embedded from YouTube. Pages built around a film carry a synced transcript and a citation dock: as each cited line is spoken, its scripture and commentary appear beside the video. Automatic YouTube captions are switched off on those pages because the text is already burned into the film.

Also on the media side: podcast-style chapter summaries, a narrated read-aloud mode for shorter pages, and a local dev-server shim that answers HTTP range requests so audio seeking works during development the same way it does on the CDN.

Accounts and the API backend

Everything personal sits behind one small service: a Django REST API on PythonAnywhere backed by MySQL. The static pages carry the API's base address in a data- attribute on <body>, and a single client module talks to it.

FunctionWhat it does
Sign-in and registrationUsername or email plus password. The API issues short-lived access tokens and longer-lived refresh tokens (JWT); the client refreshes automatically when a request comes back 401
My Discipleship JournalSaves the reader's responses at a chapter's pause points (Reflect, Journal, Witness) and the practice cards they commit to, so they follow the reader across devices
Contact and newsletterForm submissions and newsletter sign-up. Registration can opt the reader into the newsletter, and a newsletter failure never blocks registration
Notification markerRemembers which blog post was last announced, so the social notifier never posts twice

The design rule is graceful degradation: if the API is unreachable, every page still reads normally and reflections are kept in the browser instead. The database is backed up nightly to object storage.

Serverless functions and automation

A handful of Node functions in the repository's api/ folder deploy alongside the static site as Vercel serverless functions, and four GitHub Actions workflows run around them.

  • New-post announcements. When a blog post lands on main, a workflow waits for the deploy to finish, then calls a protected function that posts the announcement to Discord, X and Facebook. The site's Atom feed (/posts/feed.xml) separately drives the email newsletter. A manual script is kept as a fallback.
  • The Lantern Post. A daily devotional-post pipeline. On every push, a workflow builds a manifest of what is actually published (pages and media) and writes it to a separate branch that Vercel is told never to deploy. An unattended drafting task reads that manifest rather than running repository code, so it can only cite what is really live. Every draft then waits for the author's approval on a private page before it goes anywhere.
  • Narration upload with read-back. A password-protected function accepts a recorded narration file, commits it to the repository through GitHub's API, reads the committed copy back, and issues a receipt only if the byte length and SHA-256 hash match what was sent.
  • Checks. Further workflows test the Lantern renderer and check narration files on each change.

Secrets for these functions live in Vercel and GitHub environment settings, never in the repository.

Search, SEO and discoverability

  • Site search is Pagefind: a static index generated after each build and queried entirely in the browser.
  • Structured data. Every page carries schema.org JSON-LD for the organization and website; chapters and studies add Article, blog posts BlogPosting, and the two volume pages Book.
  • Sharing cards. Open Graph and Twitter Card tags on every page, with per-page titles and images where set.
  • Indexing control. A generated sitemap.xml and robots.txt; a canonical link on every page. Draft pages are noindex, nofollow. The live-session presentation pages are noindex, point their canonical link at the public page they mirror, and are left out of search and the sitemap, so search engines never see duplicates.
  • Feeds. An Atom feed for blog posts.
  • No tracking. The page template loads no analytics, advertising or tracking script.

Interactive study tools

Several sections behave more like small applications than pages. All of them are still static output; their interactivity is client-side JavaScript over data the build supplied.

ToolAddressWhat is technically interesting
Articles of Interfaith Discipleship/articles/A citation apparatus of over a thousand scripture links, all generated from the site's own book map, plus a build-time engine that links each Article to the chapters sharing its themes (and to their songs) with nothing maintained by hand
Article reading pages/articles/video-NN/A film per Article with a synced transcript and citation dock, built from the same single copy of each Article's text
Live-session presentation pages/chat/Layouts for projectors and VR headsets: the film flanked by welcome and status panels, three view modes on hidden host keys, sized by container queries; kept out of search
Seeking Jesus of Nazareth/seeking-jesus/A comparative study of how Christian traditions describe Jesus. Its data is generated by a Python pipeline from a research workbook and checked by a Node verifier on every build; modules include a map, a “code it yourself” exercise, a conversation builder and a self-check that writes goals to the reader's journal
Approaches to Belief and other studies/studies/Long-form studies with read-aloud audio and the same reflection tools as chapters
His Work and Glory/creation/A film with a 135-span citation apparatus synced to its transcript

A Christlike Practices app for Volume 1 is in development. Its data model is append-only by design: a practice can be taken up again and again, and no schema has a “completed forever” state.

Design choices and trade-offs

Why it is built this way

  • Static first. Pre-rendered pages are fast, cheap to host, hard to break and easy to cache. Reading the book never depends on a server being up.
  • Media outside Git. Hundreds of audio files would bloat the repository and slow every build. Keeping them on R2 and referencing them by name keeps deploys small.
  • Compute once, at build. Cross-references and catalogs are worked out when the site is built, not in each visitor's browser, so pages arrive complete and identical for everyone.
  • No framework. Plain HTML and small scripts will still run in ten years without an upgrade treadmill, and they behave in the stripped-down browsers used inside VR headsets and on projectors.
  • Fail closed. When data does not pass its checks, the build stops or the feature falls back to a safe static version (static lyrics instead of mistimed ones) rather than shipping something wrong.

What those choices cost

  • Some pages carry a large inline data payload because the data is embedded at build time: about 200 KB on the Seeking Jesus app, about 300 KB on the Creation study, and about 2.4 MB on the Articles page, which is the heaviest. Trimming these is planned.
  • Inline scripts and browser-stored sign-in tokens mean the site does not yet send a strict Content-Security-Policy header. HTTPS with HSTS is enforced.
  • Personal features depend on a single small API host. If it is down, reading continues but journal syncing waits.
  • Site search is basic; filtering and result weighting are a planned improvement.

Quick answers to common questions

QuestionShort answer
What is it built with?Eleventy 2 with Nunjucks templates, Markdown, YAML and JSON data, vanilla JavaScript and CSS
Where is it hosted?Pages on Vercel; media on Cloudflare R2 at media.wordsofplainness.org; accounts on a Django API at PythonAnywhere
Is there a database?Not behind the pages. Only the personal features (accounts, journal) use one, through the API
React? Next.js? A CMS?None. Content is files in Git; the build is the CMS
How does a change go live?Push to main; Vercel runs validators, the Eleventy build and Pagefind, then deploys to the edge
How does the read-along highlighting work?Narration comes with character-level timing; a script turns it into per-paragraph or per-sentence timestamps matched to numbers the build stamps on each block
How do synced lyrics work?WebVTT cue files per song arrangement, validated against the lyric sheet at build time; a file that fails ships as static lyrics
How does search work without a server?Pagefind builds a static index after each build; the browser queries it directly
Are scripture links typed by hand?No. One book map, which the build writes into the pages that use it, turns a reference like John 3:16 into a churchofjesuschrist.org study link; on chapter pages and in the Articles' citation panel that happens in the reader's browser
Do you track visitors?The page template loads no analytics, advertising or tracking script
Is the source code open?It is not released under an open-source license
Did AI write this site?AI assistance writes and maintains much of the code under the author's direction and approval; the author is the source and final word on the content. See the How This Work Is Made section on the About page
Can I report a mistake?Yes, through the contact form on the Connect page. The Articles' citation entries link there directly