This repository is two things:
The site is the board’s first customer: it is being brought to WCAG 2.1 AA (the standard adopted by the ADA Title II web rule) one claimed task at a time, in public. The retro 1990s look is deliberate and stays; the accessibility problems that come with it are the tasks.
data/projects.json public repositories <- tools/fetch-projects.js (GitHub API, public repos only)
data/board.json tasks + leaderboard <- .github/kos/leaderboard.js (this repo's issues)
src/ layout, pages, templates, styles, search
|
v tools/build.js (no dependencies, no network)
_site/ the published site (not committed)
The KOS site workflow refreshes both data files, builds, and deploys to GitHub Pages on every push to main, nightly, and whenever a task changes state. The nightly run commits the refreshed data so the repository records what was published.
Only public repositories are ever read or published: the fetcher asks GitHub for public repositories and re-checks every entry, and the test suite fails if the committed data contains anything else (content/no-private-repos).
To fix what a project page says, change the repository on GitHub (its description, topics, or README). Research areas are assigned from GitHub topics; the mapping is in src/site.json.
npm ci
npm run build # _site/ from the committed data
npm run serve # build, then serve at http://127.0.0.1:4173/
npm run fetch # refresh data/ from GitHub (set GITHUB_TOKEN to avoid rate limits)
npx playwright install --with-deps chromium # once
npm test # acceptance suite: WCAG 2.1 A/AA, HTML validity, links, motion, reflow, content
npm run test:unit # board bots and site builder
npm test builds the site into _site-test/ from frozen fixtures in tests/fixtures/, not from the nightly data, so test results change only when the site’s code changes. Every test has a stable ID; tests/known-failures.json lists the ones expected to fail today, and it shrinks as tasks are completed.
| Command | What it does |
|---|---|
npm run report |
Turn the last run’s reports/playwright.json into reports/kos-results.json (what the PR gate reads) |
npm run baseline |
Regenerate tests/known-failures.json from the last run (maintainers only) |
node tools/make-fixture.js |
Re-freeze tests/fixtures/projects.json from data/ (maintainers only; regenerate the baseline with it) |
Open the bounty board or the claimable issues, comment /claim, and follow the volunteer guide. Coding agents get their instructions from AGENTS.md.
Use the KOS task issue template. A task needs a problem statement, a scope, and the IDs of tests that fail now and must pass when it is done. If no test exists yet, that is the first thing to write.
src/layout.html page shell: head, banner, navigation, footer (every page)
src/pages/*.html hand-written pages (home, about)
src/templates/*.js data-driven pages (project directory, project pages, bounty board, leaderboard)
src/templates/crawlers.js robots.txt, sitemap.xml, and llms.txt (open tasks, for AI agents)
src/styles.css, search.js the stylesheet and the project search
src/claim.js the bounty board's task dialog (copyable agent prompt)
src/claim-prompt.txt the wording of that prompt; {{placeholders}} are filled per task
src/site.json navigation, research areas, site settings
tools/ build.js, fetch-projects.js, markdown.js, template.js
data/ nightly snapshots (generated; do not edit by hand)
tests/ acceptance suite, fixtures, and the known-failures baseline
.github/workflows/ site build/deploy, board commands, lease expiry, PR state, acceptance gate
.github/kos/ the board bots (plain Node, unit-tested), config, seed tasks, bootstrap
docs/KOS-TASK-BOARD.md the protocol
Imported from gh:Kentucky-Open-Science/kentucky-open-science.github.io. Source last updated 2026-10-07. Synced 2026-10-07.
Source code on GitHub.