Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
4735b15
fix(healthline): rebase onto main, register as site 25 (port 40024), …
JeremyJC67 Sep 11, 2026
1772bc1
fix(healthline): hide drug_class from search cards (T16 anti-shortcut)
JeremyJC67 Jul 4, 2026
64d8423
fix(healthline): nav fidelity + history section + required full name
JeremyJC67 Jul 4, 2026
648674a
Add Healthline task verifiers and judge rubrics
DEM1TASSE Jul 4, 2026
835351a
tasks.jsonl: fix stale web port (40015->40016) and enrich two rubrics
DEM1TASSE Jul 4, 2026
f7d8925
chore(healthline): integrate as site 25 — tasks on port 40024, docs s…
JeremyJC67 Sep 11, 2026
a784a50
chore(healthline): pin runtime dependencies to the image versions
JeremyJC67 Sep 12, 2026
6ace057
fix(healthline): meet WCAG AA on interactive colour, focus and narrow…
JeremyJC67 Sep 12, 2026
fb465a5
fix(healthline): add branded 404/500/413 pages and a site favicon
JeremyJC67 Sep 12, 2026
ecfdf2f
fix(healthline): harden the app and stop read-only routes writing
JeremyJC67 Sep 12, 2026
015dfb3
test(healthline): bind verifier evidence and enforce read-only state
JeremyJC67 Sep 12, 2026
ad476bb
fix(healthline): make task 14 robust to the agent's own reading history
JeremyJC67 Sep 12, 2026
437f78e
chore(healthline): merge the 26-site main and re-slot to site 27 (por…
JeremyJC67 Sep 13, 2026
79e03ce
chore(healthline): re-pin assets to HF PR #70 after the merge
JeremyJC67 Sep 13, 2026
247098b
review(healthline): accurate verifier predicates from the second revi…
TabsPhasers Sep 13, 2026
6f47188
chore(healthline): pin assets to the merged HF revision
JeremyJC67 Sep 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .assets-revision
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
# is a git revision (branch name like `main`, a tag, or a specific commit
# sha). Override at runtime with the ASSETS_REVISION env var.
repo: ChilleD/WebHarbor
revision: ad6f424f72cada9e6f5c09a58093d0ceeab9c52b
revision: 805e6938232f4fbf7447688faf91c9c02aca3b75
10 changes: 5 additions & 5 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,17 +48,17 @@ Inside the image, sites live at `/opt/WebSyn/<site>/`. The path predates the ren
# fresh clone
./scripts/fetch_assets.sh # pulls assets from HF
./scripts/build.sh # docker build -t webharbor:dev .
docker run -d -p 8101:8101 -p 40000-40025:40000-40025 webharbor:dev
docker run -d -p 8101:8101 -p 40000-40026:40000-40026 webharbor:dev
```

Or use the published image directly:

```bash
docker run -d -p 8101:8101 -p 40000-40025:40000-40025 \
docker run -d -p 8101:8101 -p 40000-40026:40000-40026 \
battalion7244/webharbor:latest
```

Sites are on `40000`-`40025` in the order declared by `SITES=( ... )` in `websyn_start.sh`. Control plane:
Sites are on `40000`-`40026` in the order declared by `SITES=( ... )` in `websyn_start.sh`. Control plane:

| Method | Path | Purpose |
|--------|---------------------|-------------------------------------------|
Expand Down Expand Up @@ -136,13 +136,13 @@ python3 -m py_compile sites/<site>/app.py

# 3. run on alt ports (don't collide with anything you already have running)
docker run -d --rm --name wh-test \
-p 8201:8101 -p 41000-41025:40000-40025 webharbor:dev
-p 8201:8101 -p 41000-41026:40000-40026 webharbor:dev

# 4. control plane healthy, all sites alive
curl -s http://localhost:8201/health | python3 -m json.tool | head

# 5. every site renders 200
for p in $(seq 41000 41025); do
for p in $(seq 41000 41026); do
curl -so /dev/null -w "$p:%{http_code}\n" http://localhost:$p/
done

Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ The full agent guide is loaded above via `@AGENTS.md`. The notes below apply onl

## Existing containers

If a container is already running on `:8101` / `:40000-40025`, treat it as the user's working environment — don't `docker stop` or `docker rm` it without explicit confirmation. Spin up your test container under a different name on alt ports (`:8201`, `:41000-41025`).
If a container is already running on `:8101` / `:40000-40026`, treat it as the user's working environment — don't `docker stop` or `docker rm` it without explicit confirmation. Spin up your test container under a different name on alt ports (`:8201`, `:41000-41026`).
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ git clone https://github.com/<you>/webharbor && cd webharbor
./scripts/fetch_assets.sh # pull current assets
./scripts/new_site.py mywebsite # OR edit an existing site
./scripts/build.sh && docker run -d --rm \
-p 8101:8101 -p 40000-40025:40000-40025 webharbor:dev
-p 8101:8101 -p 40000-40026:40000-40026 webharbor:dev
# iterate locally...

./scripts/extract_assets.sh ../webharbor-static-pr/ # split assets out
Expand Down
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# WebHarbor — slim, self-contained image.
# 26 Flask mirror sites + control plane on :8101.
# 27 Flask mirror sites + control plane on :8101.

FROM python:3.12-slim-bookworm

Expand Down Expand Up @@ -86,6 +86,6 @@ os.makedirs('instance_seed', exist_ok=True); \
shutil.copy2('instance/rotten_tomatoes.db', 'instance_seed/rotten_tomatoes.db'); \
print('Rotten Tomatoes seed DB generated at build time.')" && rm -rf /opt/WebSyn/rotten_tomatoes/instance

EXPOSE 8101 40000-40025
EXPOSE 8101 40000-40026

CMD ["/opt/websyn_start.sh"]
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,17 @@ WebHarbor takes a different approach. We leverage coding agent (e.g., Claude Cod
- **Deep features unlocked** — carts, checkouts, accounts, all fully testable
- **Evolving** — harder tasks drive richer mirrors; the environment grows with agents
- **RL-ready** — sub-second database resets between rollouts
- **Community-driven** — 26 sites today, scaling to 100+ together
- **Community-driven** — 27 sites today, scaling to 100+ together

## 🚀 Quickstart

One command to run all web environments:

```bash
docker run -p 8101:8101 -p 40000-40025:40000-40025 battalion7244/webharbor:latest
docker run -p 8101:8101 -p 40000-40026:40000-40026 battalion7244/webharbor:latest
```

Then point your agent at `http://localhost:40000` through `http://localhost:40025` to explore 26 local mirrors of WebVoyager sites: `Allrecipes, Amazon, Apple, ArXiv, BBC News, Booking, GitHub, Google Flights, Google Maps, Google Search, Hugging Face, Wolfram Alpha, Cambridge Dictionary, Coursera, ESPN, Merriam-Webster, IKEA, Phys.org, Target, TED, Ohio State University, Rotten Tomatoes, Compass, Walmart Careers, FedEx, and WebMD Doctor`.
Then point your agent at `http://localhost:40000` through `http://localhost:40025` to explore 27 local mirrors of WebVoyager sites: `Allrecipes, Amazon, Apple, ArXiv, BBC News, Booking, GitHub, Google Flights, Google Maps, Google Search, Hugging Face, Wolfram Alpha, Cambridge Dictionary, Coursera, ESPN, Merriam-Webster, IKEA, Phys.org, Target, TED, Ohio State University, Rotten Tomatoes, Compass, Walmart Careers, FedEx, WebMD Doctor, and Healthline`.

For sub-second reset between rollouts, expose the control plane and call `/reset/<site>`:

Expand Down
2 changes: 1 addition & 1 deletion agent_demo/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export OPENAI_BASE_URL=https://api.openai.com/v1 # or your Azure / vLLM endpoi

## Run a task

WebHarbor must already be running locally (`docker run -p 8101:8101 -p 40000-40025:40000-40025 battalion7244/webharbor:latest`).
WebHarbor must already be running locally (`docker run -p 8101:8101 -p 40000-40026:40000-40026 battalion7244/webharbor:latest`).

Run a single task from a site's `tasks.jsonl`:

Expand Down
1 change: 1 addition & 0 deletions control_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
'coursera', 'espn', 'merriam_webster', 'ikea', 'phys_org', 'target',
'ted', 'osu', 'rotten_tomatoes', 'compass', 'walmart_careers', 'fedex',
'webmd_doctor',
'healthline',
]
BASE_PORT = 40000
WEBSYN_DIR = '/opt/WebSyn'
Expand Down
10 changes: 10 additions & 0 deletions sites/healthline/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Build-time scrape intermediate — never shipped (runtime data lives in
# instance_seed/healthline.db). The repo-root .gitignore intends to ignore
# this but its trailing inline comment defeats the pattern, so re-assert it
# locally to keep the heavy harvested HTML/images out of the GitHub PR.
scraped_data/

# Recreated from instance_seed/ on every boot; not committed.
instance/
__pycache__/
*.pyc
3 changes: 3 additions & 0 deletions sites/healthline/_health.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
"""Per-site health probe (optional, called by control_server)."""
def health():
return {"ok": True, "site": "healthline"}
Loading