尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Who does your interface work for? Wayford runs an agent through your web app within capability limits enforced in code, and shows where each persona gets stuck.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Wayford walks a web application within the limits of a declared capability profile, and shows where that profile got stuck.
The question is not "does it work". The question is who does it work for.
The persona is a filter, not a prompt. The Actor must be our own loop. Claim less than you'd like to.
Quick start · Usage · What next · How it works · Development · Documentation
Give Wayford an application URL, a goal in one sentence ("you want to see what you ordered three months ago") and one or more capability profiles. It runs an agent on that goal once per persona and seed, and reports at what capability level the goal stops being reachable, with evidence a developer can reproduce.
| Wayford is | Wayford is not |
|---|---|
| A boundary measurement: the threshold from which fewer than half of a persona's runs get through | A prediction of how real people behave |
| A hypothesis generator about wayfinding, with every finding linked to its evidence | A replacement for user research |
| A filter in code between the browser and the model, the same for every run with the same seed | A prompt that asks a model to pretend |
| A tool for product teams, UX designers and accessibility specialists | A pass/fail regression suite, a CI gate or an API tester |
Out of scope: pass/fail regression, a CI gate, API testing and MCP as the foundation. Not planned: accounts, export, native mobile apps (Milo is a phone viewport in Chromium), more than one project, a profile builder, running in a CI pipeline and a thin MCP layer on top.
Five personas ship with Wayford. Each one is a bundle of thresholds, not a character to play, and its initial names the dimension it is defined by.
| Persona | In one line | |
|---|---|---|
| AdaAll clear, the control | Sees everything, knows every pattern, nothing capped. If Ada fails a goal, the Actor or the app is broken, not the filter. | |
| KaiKnowledge | Sees the page clearly on a desktop, but does not know several common interface patterns or shop jargon, takes in a handful of things at a time and keeps only the last couple of steps in mind. | |
| MiloMobile and motor | Proficient and in a hurry, on a phone. Controls smaller than 44 px are cut from what Milo is shown. | |
| VeraVision | Weak sight and little practice with interfaces, on a desktop. Faint text, small print and small targets reach Vera partly masked or not at all. | |
| ZoyaThe far end | Every dimension at once: strict sight, no interface vocabulary, five things of attention and two steps of memory. |
Each avatar is drawn from its profile: glasses for a contrast threshold, a phone for a mobile device, an hourglass for the time budget.
Their full bundles, the loop and the claim Wayford makes are in How it works.
Wayford runs on your own machine, and nothing is hosted. One command starts three local processes: the web UI you work in; io, the API behind it, which drives the browser and calls the models; and Quillmere, a small demo shop for the personas to try.
node -v.npm install -g pnpm.git clone https://github.com/CShark-Hub/wayford.git
cd wayford
pnpm install
pnpm --filter @wayford/agent exec playwright install --only-shell chromium
cp .env.example .env
The fourth command downloads the Chromium that the personas browse with. The last one creates .env, your local settings file.
pnpm seed:demo --fake
This fills the local database with the demo's runs, reports and sweeps, using a fake model, in about a minute. While it runs it serves the demo shop on port 5174, so run it while Wayford is stopped. Add --reset to start over.
Open .env and set LLM_API_KEY. Use your key, or any placeholder such as demo if you only want to browse the demo data: io does not start without a value. Then run:
pnpm dev
Keep this terminal open. Ctrl+C stops all three processes.
| Process | Address | What it is |
|---|---|---|
| web | http://localhost:5173 | The UI. Open this one. |
| io | http://localhost:3000 | The API behind the UI. It drives Chromium and calls the models. |
| Quillmere | http://localhost:5174 | The demo shop the personas try to use. |
Open http://localhost:5173:
/deliveries with Vera.The Target screen and the Race call a model, so they need a real key.
Put your key in .env as LLM_API_KEY, restart pnpm dev, and follow Usage from the Target screen. Every live run is billed, so check the key's balance first. Every setting .env takes is in Configuration.
To redo the demo data on a real model, stop pnpm dev first, then run:
pnpm --filter @wayford/agent scout
pnpm seed:demo --reset
| You see | Do this |
|---|---|
LLM_API_KEY: missing | Set LLM_API_KEY in .env. Any value works for the demo data. |
the target app could not be served on 5174 | Stop pnpm dev, then run seed:demo again. |
Chromium did not launch | Run the playwright install command from step 1. |
EADDRINUSE or "port already in use" | Another program holds 5173, 3000 or 5174. Stop it. |
Checking a goal, Scout, the runs and the report call a model, so this needs a real key in .env. Start with pnpm dev and open http://localhost:5173/target.
Describe the target on the Target screen:
**/orders/*) or an element on the page (a CSS selector such as #order-history). You write it; the model never does.Check the goal. io's Extractor takes screen names and clicks out of the sentence, shows what it took out, and stores the goal under an id. Code, not the model, refuses words such as "click", "menu", "go to" and "then", and on the target app the names of the controls on the three routes to its hard goal. The model alone finds every other screen name, on the target app too, so read the goal it kept. From then on the nav carries the target: Lens, Race and Report open on it, and the nav shows its host.
Look before you run. Open in the Lens shows the start page as each persona's filter leaves it. Race on this goal runs three to five personas live, with their screenshots and narration.
Run Scout. Scout walks the goal three times with every element in view. Run it before the run set, so the report can tell a broken goal from one a persona did not find.
Run and report. Pick the cast and 3 or 10 seeds, the same for every persona, and start the set. Keep the page open: when every run has ended, the Analyst writes the report, and Open the report leads to it.
Find the boundary from the command line, since the UI starts no sweep. Use the goal id the Target screen shows; the Boundary screen opens the stored sweep by its id.
pnpm --filter @wayford/io sweep -- --task <id> --persona prof_vera --axis contrast --from 1.5 --to 4.5 --step 0.5 --seeds 1-3
Off the target app, every run is on the LLM (io refuses Jev there), the report shows no route-open number, and a run set of three seeds is the default. Logins, goals that write (a form that saves, a purchase), cookie banners, bot challenges, iframes and shadow DOM are out of scope: a site that needs any of them is swapped for another (ADR 0003).
On the target app, pnpm seed:demo stores the demo's two goals with their runs, reports and sweeps, so the Report, the Boundary and Runs open with data and no form to fill. Every other command is in Commands.
None of this is built yet. What next holds every idea, with its source and its limits.
wayford CLI that AI agents and people can drive: JSON output, stable exit codes, no prompts.| Guide | What it holds |
|---|---|
| How it works | The claim, the loop, the filter pipeline, the personas and their provenance, the screens |
| Development | Configuration, every command, the packages, checks, CI and the determinism rules |
| Contributing | How work is organised, and how a change gets from an issue to main |
| Security | Where to run Wayford, what a run touches, and how to report a vulnerability |
| What next | Ideas for after the hackathon, each with its source and its limits |
| About | Project status, the name, prior art and acknowledgements |
The plan, the rules, the design system and every decision behind them are indexed in docs/. Start with AGENTS.md, whether you are a person or an agent.
Wayford is a hackathon project, built in September and October 2026 by a team of four; AI coding agents write most of the code, and humans direct and review it. Every change starts from an issue and lands as one reviewed pull request. CONTRIBUTING.md has the steps.
| Name | GitHub |
|---|---|
| Marcin Kotas | @marcinkotas |
| Tomasz Nowakowski | @tnowakowski-cshark |
| Grzegorz Stysiak | @gstysiak-cshark |
| Dawid Trznadel | @dawidtheshark |
Copyright (c) 2026 CSHARK Commit Hackathon Contributors
The contributors are the team above: Marcin Kotas, Tomasz Nowakowski, Grzegorz Stysiak and Dawid Trznadel.
Wayford is licensed under the Apache License, Version 2.0. The licence covers the whole project from the repository's first commit (e5b08aa, 2026-09-17), including every commit made before the LICENSE file was added. The copyright notice and the team are also in NOTICE, which a redistribution must carry, as section 4 of the licence asks.
Third-party files keep their own licences: the Inter typeface in packages/target-app/public/fonts/ is under the SIL Open Font License 1.1, with its licence beside it, and every dependency installed by pnpm is under its own.