- JavaScript 32%
- Jinja-like 22%
- CSS 21%
- HTML 20%
- Python 5%
Doctrine of Discovery #
Land Acknowledgment #
We begin by acknowledging with respect the Onondaga Nation, Central Fire of the Haudenosaunee Confederacy, on whose ancestral lands we now inhabit. Wherever you are located be aware of the Indigenous Peoples on whose lands you reside. We are mindful that the technology that makes this conference possible comes from the mineral extraction by multinational corporations, which decimate and displace Indigenous people and their land all over the world. May the information you glean from this website motivate you to uphold Indigenous values, protect Mother Earth, Honor Indian Treaties and hold your government and various institutions accountable who stand in the way.
Preface #
I have become frustrated with how slow and limited in accessibility WordPress is so I decided to start moving sites I administer over to Jekyll because as static site generator it is faster, more reliable and I have more control over making it accessible.
Build and preview #
The site runs on Eleventy 4.0.0-alpha.10 (the canary release, pinned exactly)
and Node 24, with Python 3 standard-library URL checks. It deploys to Netlify using
netlify.toml; no Ruby, Jekyll, Sass, theme package, or jQuery is required.
npm ci
npm run build
npm test
npm run verify
npm run dev
npm run dev serves a rebuilding preview at http://localhost:8080.
npm start runs the same command, with per-file logs suppressed. During preview,
static assets are served directly, and CSS/JS edits reload without rebuilding pages.
Content edits rebuild shared archives, search data, citations, and SEO metadata.
Run npm run build to create the complete deployable _site/ directory. The build
cleans that output directory before generating pages and metadata. Netlify
installs the locked npm dependencies, runs npm run build, and publishes
_site/. Redirects and HTTP headers are maintained in src/_redirects and
src/_headers. CMS access under /admin/ and the Formspree contact form remain.
Eleventy 4 uses native Chokidar 5 directory watching and YAML 4; the older
dependency overrides and watcher adapter are no longer needed. CSS/JS live
reload watches directory paths because the new dev server does not accept
glob patterns in its watch option. npm ci, npm audit, and npm test
validate the locked setup. Funding notices are informational.
Custom content/configuration watch targets use recursive globs so Eleventy 4
detects changes inside those directories. This is a prerelease dependency;
review the upstream releases
before upgrading the exact pin.
Project structure #
src/ is Eleventy's input directory. Content, Liquid templates, YAML data,
assets, CMS configuration, and public files live there. Public URLs omit src/.
src/
_posts/ _pages/ _authors/ _drafts/
_includes/ _layouts/ _data/ _config.yml
assets/ admin/ site.11ty.js index.html
lib/ # shared rendering and metadata code
scripts/ # manual maintenance and verification tools
tests/ # tests and URL fixtures
netlify/ # functions and deployment plugin
_site/ # generated output (ignored by Git)
Run npm commands from the repository root. eleventy.config.js, package.json,
and netlify.toml stay at the root; Netlify builds there and publishes _site/.
The CMS writes to src/ while uploaded images keep /assets/uploads/ URLs.
Content record paths remain relative to src/, and Git date lookup recognizes
both the previous root paths and the new src/ paths.
Content and dates #
Public post/page paths and original PDF/image paths are protected by
tests/fixtures/public-urls.json, including the saved Jekyll URLs and known
historical fingerprinted media URLs. The manual npm run verify command rebuilds
the site first, then checks local links, fragments, image metadata, SVG references, CSS URLs, and
redirect targets with case-sensitive filename matching. A missing protected
URL or a newly introduced broken link fails verification. Link checking does
not run during npm run build or Netlify deployment.
Keep existing permalinks and media filenames when editing. When a move is
necessary, retain the old URL with redirect_from for content or a permanent
redirect in src/_redirects for files. Front-matter redirects are emitted as HTTP
301 rules on Netlify. The dev server follows literal redirect rules locally,
including historical media aliases; Netlify handles its wildcard rules.
Original media remain available even when the page uses an optimized copy.
For intentional additions, build first, then record the new URLs and review the fixture diff:
python3 scripts/check_links.py _site --record
npm run build
npm run verify
Recording only adds URLs; it never removes historical entries or excuses a missing target. External websites are not fetched during builds. See the URL preservation validation.
Posts, pages, and authors live in src/_posts/, src/_pages/, and src/_authors/.
Markdown and YAML front matter remain editable through the existing CMS.
Site settings, including timezone: America/New_York, live in src/_config.yml.
Local timestamps and date-only values are interpreted in New York, including
its daylight-saving changes.
Every content document has a publication date. Existing valid dates were
preserved; missing post dates came from filenames, and undated pages/authors
used their earliest recorded Git commit, following renames. To backfill a
new manually added document, run node scripts/backfill-dates.js.
An explicit last_modified_at takes precedence. Otherwise, each build reads
the file's latest Git commit date. Modified-date listings fall back to
publication dates when Git history is unavailable. Complete Git history gives
the best results; source exports without .git remain buildable using their
committed publication dates. Modification dates are never based on filesystem
copy times. The Atom feed, homepage, and homepage pagination use publication
order, newest first. Taxonomy listings use modified order.
Templates, styles, and metadata #
Liquid layouts and includes are maintained locally in src/_layouts/ and
src/_includes/. Eleventy paginates the prepared content records in src/site.11ty.js;
lib/site.js builds the shared post, author, category, and tag indexes once.
Markdown compatibility, including historical heading IDs, footnotes, and
attribute syntax, is handled in lib/templates.js.
Definition lists use native HTML; the three existing quotation blocks retain
their rendered markup without a definition-list plugin.
Production CSS is compacted without changing the editable source. Shared
CSS/JS, local icons, and images use content-hashed URLs under /assets/built/.
Only that directory receives a one-year immutable cache header; changing file
contents changes its URL. Local CSS/JS preview still serves the editable files
directly. Local raster images receive intrinsic dimensions when both dimensions
are missing. Related-post images and later feature images load lazily.
Selected high-traffic images have WebP copies in src/assets/images/optimized/;
lib/assets.js maps their original URLs to those copies. When replacing one
of these source images, regenerate its optimized copy too. Originals remain
available for historical links. Image conversion is done before committing,
so Netlify needs no image-processing dependency.
Icons use the local Font Awesome 6.7.2 SVG subset in
src/assets/icons/fontawesome.svg, with attribution in the adjacent license.
Add a symbol there before using a new icon; the build reports missing symbols.
There is no remote icon font stylesheet. Analytics queues its configuration
immediately, then downloads one GA4 tag after the first pointer, keyboard, or
scroll interaction when the browser is idle (with a two-second idle timeout).
Visits without interaction may not be counted. The retired Universal Analytics
loader is no longer used.
Cloudflare Web Analytics shares the same first-interaction/idle loader using
the existing public token in analytics.cloudflare.token. It skips insertion
if Cloudflare has already injected its own beacon, preventing double tracking.
After deploying this code, choose Enable with JS Snippet installation under
the site's Manage site settings in Cloudflare Web Analytics. Until automatic
injection is switched off, the injected beacon still loads eagerly. Keep that
setting change after deployment to avoid a gap in tracking. The dashboard
change is pending sign-in; it was not applied locally. See
Cloudflare's setup instructions.
Delayed analytics can miss visits without interaction and can change the
population represented by Cloudflare's browser performance metrics.
The logo remains 88 × 88 CSS pixels. Its WebP srcset supplies 88px and 176px
high-quality variants and the original lossless 300px variant for denser screens.
Regenerate all three variants when replacing the source logo.
The web app manifest uses / as its identity, start URL, and scope. A small
service worker supplies a self-contained offline notice if a page cannot load;
it does not cache articles, API responses, downloads, or analytics. It is disabled
on ordinary localhost development URLs. If editing offline.html, also bump
the cache version in sw.js so existing installations refresh that notice.
Netlify's old Jekyll Cache and deploy-time Lighthouse plugins are disabled in the project dashboard. The Lighthouse npm command has been removed. See deployment/performance validation for historical measurements.
The two custom HTTP response headers are X-Content-Type-Options: nosniff
and the immutable cache rule for hashed assets. The redundant explicit modern
browser referrer-policy default and zero-age asset-cache override were removed.
Netlify supplies its own transport/CDN headers. See
Goal 4 validation for Lighthouse measurements.
Edit src/assets/css/main.css directly. It retains the established Minimal
Mistakes styles as readable CSS; there is no Sass compilation. Navigation uses
the original theme markup with vanilla JavaScript, sticky positioning uses CSS, and image
viewing uses a native-dialog module loaded on the first image click. TOC
behavior loads only on pages with a TOC. Heading permalinks are generated at
build time, and embedded video sizing uses CSS instead of browser JavaScript.
Search uses Pagefind 1.5.2, pinned as a build dependency, on /search/
and in the existing theme overlay. A small controller loads on search focus;
the engine, WASM, and relevant index chunks load only when a query runs.
Results retain theme classes and load ten at a time with a “Show more results”
button. Direct links such as /search/?q=sovereignty work. Pagefind's prebuilt
UI, CSS, highlight helper, and optional worker bundle are not published.
lib/search.js creates the full-text index during production and development
builds. It indexes public posts, author biographies, and visible source HTML
pages, excluding redirects, drafts, noindex, sitemap: false, the search
page, and generated pagination clones. All content shares the site's English
search index, as with the previous search engine. The entire search bundle
has a content-hashed directory under /assets/built/, so the existing immutable
cache rule applies without another HTTP header. Results explicitly use the
site root as their base URL. Keep npm's optional dependencies enabled so the
appropriate native Pagefind binary installs on macOS or Netlify's Linux host.
See Goal 5 validation for measurements and checks.
Citation generation, SEO descriptions, per-post metadata, and Standard.site
endpoints run at build time in lib/metadata.js and lib/content.js. Existing
citation URLs and historical downloads are retained. No browser JavaScript is
needed for metadata generation.
Publication metadata and discovery #
Posts and HTML pages expose Zotero/Highwire citation tags, Dublin Core tags,
and one coherent Schema.org graph. Posts use BlogPosting; author profiles
use ProfilePage with Person or Organization. The standard microformat
author representation is p-author h-card inside h-entry.
Explicit authors takes precedence over author; names and profile details
come from src/_authors/. Set schema_type: Organization for institutional
authors. Publisher details live in src/_data/organization.yml.
Each post and content HTML page has adjacent citation.ris, citation.csl.json, and
dc.xml exports (for example, /inter-caetera/citation.ris). URLs ending in
.html append .citation.ris, .citation.csl.json, or .dc.xml instead.
Legacy /assets/citations/ downloads remain available.
/oai?verb=Identify exposes the OAI-PMH repository, both in local preview and
on Netlify. It supports all six verbs, GET and form POST, the oai_dc
metadata format, and the blog set. Dates use UTC days from Git history;
lists currently return all matching records in one response.
IndexNow notifications run after successful production Netlify deploys.
Local builds and deploy previews do not submit. The local build plugin
compares the previous production /indexnow.json with the new manifest,
then submits new, changed, and removed URLs after checking the deployed
ownership file. The verification key lives in src/_config.yml; the build
generates its root .txt verification file. The public manifest contains
URL hashes and a key fingerprint. Notifications exclude redirects, drafts,
unpublished documents, noindex, sitemap: false, and external canonical
URLs. Theme hidden only affects archive listings.
npm run indexnow -- --dry-run # inspect current URL count; no notification
npm run indexnow -- --submit # manually submit after deploying this build
Notification failures are logged without failing an already successful deployment; use the manual command to retry. See Goal 3 validation for local checks and the remaining Netlify validation steps.
The starting theme was Minimal Mistakes 4.27.3, commit
0064dabea814bd3a2e203320a141c037fdcf67ea, imported during Goal 1 and adapted
for Eleventy during Goal 2. Its MIT attribution is retained in
LICENSE.minimal-mistakes. See Goal 2 validation
for checks, measurements, and remaining limitations. The older
Goal 1 report records the preceding Jekyll stage.
Credits #
Creator #
Michael Rose
Webmaster #
Adam DJ Brett
Contributors #
- Philip P. Arnold
- Sandra Bigtree
- Adam DJ Brett
- Betty Lyons
- American Indian Law Alliance
- Indigenous Values Initiative
Please read humans.txt for the contributors.
Icons + Demo Images: #
- The Noun Project -- Garrett Knoll, Arthur Shlain, and tracy tam
- Font Awesome
- Unsplash
Other: #
- Jekyll
- jQuery
- Susy
- Breakpoint
- Magnific Popup
- FitVids.JS
- GreedyNav.js
- Smooth Scroll
- Gumshoe
- jQuery throttle / debounce
- Pagefind
License #
This project is licensed under the MIT License - see the LICENSE.md file for details. The content is licensed under a Creative Commons Attribution 4.0 International License.
Technology Licenses #
Acknowledgments #
Thank you to all who have contributed to the project. For more please see humans.txt