An independent, trilingual satire publication and AI Ideology Atlas, framed as a pirate broadcast hosted by a vain yeti.
Live at agentevil.com, with six articles in English, Simplified Chinese and French, 25 trilingual Atlas entries, four themes and a working Reality Console. GitHub Actions deploys the validated static artifact to Cloudflare Pages. Live GitHub comments remain optional and disconnected. See the progress handoff, verification record, source record and project brief.
Use Bun 1.4.2 and Node.js 24. Node remains available for tools that require its runtime; dependency management and scripts use Bun.
bun install --frozen-lockfile
bun run dev
bun run check
bun run build
bun run audit:static
bun run preview
bun run test:browser
bun run test:state
bun run test:a11y
bun run test:lighthouseDevelopment runs at http://localhost:4321/, with Chinese at /zh/ and French at /fr/. This installed Astro version starts a background development server; bunx astro dev status, bunx astro dev logs and bunx astro dev stop manage it. If the initial cold start times out, inspect the logs before retrying. bun run preview --port 4322 serves the production build for verification; stop it with bunx astro preview stop.
audit:static checks all generated page links and anchors, required routes, collection references, RSS counts, canonical/hreflang metadata, Article structured data and a conservative JavaScript budget that includes inline code. Browser scripts use Chromium at /usr/bin/google-chrome; adapt the executable path for your machine. They default to http://localhost:4322 and accept TEST_URL. Build first, then run them against a stable preview: rebuilding while tests are running temporarily removes dist and invalidates the results. Screenshots and JSON reports are written to ignored test-results/.
Settings and achievements are optional and stored only under evil:passenger:v1. Alt+E opens the console. Article completion requires 15 seconds of visible-page dwell plus the content end in view; Atlas entries require 4 seconds plus the end in view. Neither opens a modal automatically. All six articles have full bodies in each language.
The top bar has icon-only language, light/dark, GitHub and Reality Console controls. Language links preserve the current page and work without JavaScript. The GitHub icon links to https://github.com/agent-evil/agentevil; PUBLIC_GITHUB_URL can override it. Remaining settings, including system lighting, are available in the console.
Social images are generated by scripts/og.ts as part of the build: seven images per language, 21 in total. The build host needs Fontconfig, DejaVu Sans and Noto Sans CJK SC (Ubuntu: sudo apt-get install fontconfig fonts-dejavu-core fonts-noto-cjk); CI installs them. These are build dependencies, not additional browser fonts. Titles come from the same translations used on the article pages. Existing legacy image URLs are retained for old shares.
The shared head includes localized Open Graph and Twitter cards, image alternative text, canonical/hreflang links and indexing policy. Article metadata uses the actual body language. All three error pages use noindex; the sitemap excludes them. /llms.txt is generated from the content collections, with publication context, source limitations and language coverage. Modification times and social account handles are not fabricated.
test:a11y checks WCAG A/AA rules, keyboard focus visibility, skip links, language menus, complete forward/reverse dialog traversal, Escape, mobile notes and search across three languages and two viewport sizes. test:lighthouse runs 12 representative mobile pages sequentially and requires at least 95 in performance, accessibility, best practices and SEO. Keep performance runs separate from other browser tests to avoid CPU contention. Reports are saved under test-results/.
Comments are disconnected until configured; follow SETUP-GISCUS.md. Extend themes using the theme guide.
The workflow in .github/workflows/cloudflare-pages.yml validates pull requests to main. Pushes to main and manual runs on main deploy only after type checking, building, static validation, browser/state/keyboard/accessibility checks and Lighthouse pass. Pull requests do not receive deployment secrets or publish production. The exact validated dist artifact is uploaded, rather than rebuilt during deployment. Verification reports are retained even when a check fails. The first successful release passed all gates and deployed on September 22, 2026; see the progress handoff for the production commit and deployment ID.
The current site fits Cloudflare Pages Free: it exports static files and does not invoke Pages Functions. The static audit enforces the Free plan's 20,000-file and 25 MiB-per-file limits. Static requests are free and unlimited under the current Pages pricing; see the platform limits for build and asset allowances. Domain registration/renewal and any separately enabled services are outside static hosting. The configured workflow builds in GitHub Actions and uses Direct Upload.
- Create a Cloudflare Pages Direct Upload project named
agentevil, withmainas the production branch. Alternatively, create it usingbunx wrangler pages project create agentevil --production-branch main --forceafter authentication. If your project has a different name, updatewrangler.tomland thedeploy:productionscript inpackage.json. - In the GitHub repository or its
productionenvironment, addCLOUDFLARE_ACCOUNT_IDandCLOUDFLARE_API_TOKEN. The token needs Account → Cloudflare Pages → Edit for the relevant account. Do not commit credentials. - Push the finished application to
main, or run the workflow manually onmain. Configureagentevil.comin the project's Custom Domains settings and follow Cloudflare's DNS instructions. Creating a deployment does not automatically connect the domain.
GitHub Actions handles builds in this configuration; avoid enabling a second automatic build integration for the same project. Optional GitHub environment protection rules may be configured by the owner.
For a manual upload of an already validated build:
bun run deploy:productionThis requires Cloudflare authentication or the same two environment variables. The production project, both GitHub deployment secrets and the custom domain are configured. The steps above document setup for a new installation; the deployed site has passed live route, metadata, header and 404 checks. In Wrangler 4.135, --force during new project creation explicitly selects Pages instead of the default Workers delegation; it is not needed for uploads to this existing project.
Official references: Cloudflare Direct Upload with CI and Bun in GitHub Actions.
src/content/posts/: six articles, each with a complete English, Simplified Chinese and French MDX body.src/content/atlas/: 25 substantive trilingual entries with sources and explicit editorial commentary.src/content.config.ts: typed post and trilingual Atlas schemas.src/lib/i18n.ts: typed English, Chinese and French product copy.src/assets/yeti-broadcast-neutral.png: active fictional editorial artwork, edited with AI assistance to remove the colored sun/disc; original artwork is retained unused.public/images/yeti-broadcast-neutral*.webp: active optimized image variants.docs/DESIGN.md: four-theme art direction and asset provenance.../PROMPT.mdin the owner workspace: detailed Chinese implementation brief, stored outside this repository. A root-levelPROMPT.mdis also gitignored; clean clones use docs/PROJECT-BRIEF.md.
The articles and translations have not been independently reviewed by a human editor. The About page discloses AI-assisted production, and articles distinguish fictional satire from sourced commentary. The source record documents the checks performed and their limits. The progress handoff records the deployed commit and completed verification.