Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
bdce2ef
feat: add Rotten Tomatoes mirror site
derenlei May 14, 2026
2290a79
Add Rotten Tomatoes mirror site
derenlei May 16, 2026
69f364d
chore(rotten-tomatoes): integrate current main and reserve site slot
jackjin1997 Sep 7, 2026
6cee8aa
fix(rotten-tomatoes): rebuild sourced catalog and review task contracts
jackjin1997 Sep 7, 2026
7374b4a
fix(rotten-tomatoes): accept valid review paths and publish regressio…
Sep 7, 2026
a091db1
fix(rotten-tomatoes): restore sourced homepage sections and navigation
Sep 7, 2026
abb7023
chore: integrate current main and assign Rotten Tomatoes port 40020
Sep 7, 2026
6a4bf4d
fix(rotten-tomatoes): bound streaming comparison and pin restored assets
Sep 7, 2026
17a4d76
fix(rotten-tomatoes): accept evidenced producer filmography comparisons
Sep 7, 2026
80b9c1c
fix(rotten-tomatoes): parse Chinese shared-producer answers
Sep 7, 2026
b5e8a55
docs(rotten-tomatoes): publish restored UI and task verification evid…
Sep 7, 2026
3a4cefb
fix(rotten-tomatoes): pair Chinese personal-rating clauses
Sep 8, 2026
ca36e5b
fix(rotten-tomatoes): reject contradictory personal rating claims
Sep 8, 2026
201324a
chore: integrate OSU main alongside Rotten Tomatoes
Sep 8, 2026
876e261
docs(rotten-tomatoes): publish account runs and current integration e…
Sep 8, 2026
b61936f
docs(review): reconcile frozen Rotten Tomatoes execution judgments
Sep 8, 2026
7d3131c
docs(review): record owner acceptance of repaired homepage
Sep 8, 2026
5587422
fix: harden and validate Rotten Tomatoes mirror
Raibows Sep 8, 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: db9c73e62d853ed91f6152b5b7105571502b7e07
revision: 8f06eba81b2d1cdf62c8c17c9036850d9a6b9c32
12 changes: 6 additions & 6 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ A coding agent (Claude Code, Cursor, Aider, Codex, ...) is reading this. Read on

## What it is

21 Flask mirror websites (Amazon, GitHub, BBC News, ...) packaged into one Docker image, plus a control plane on `:8101` for resetting per-site state. Used as a deterministic offline environment for web-agent benchmarks. ~3 GB image.
22 Flask mirror websites (Amazon, GitHub, BBC News, ...) packaged into one Docker image, plus a control plane on `:8101` for resetting per-site state. Used as a deterministic offline environment for web-agent benchmarks. ~3 GB image.

Two repos:
- **code** (this one) — Flask apps, control plane, scripts.
Expand Down 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-40020:40000-40020 webharbor:dev
docker run -d -p 8101:8101 -p 40000-40021:40000-40021 webharbor:dev
```

Or use the published image directly:

```bash
docker run -d -p 8101:8101 -p 40000-40020:40000-40020 \
docker run -d -p 8101:8101 -p 40000-40021:40000-40021 \
battalion7244/webharbor:latest
```

Sites are on `40000`-`40020` in the order declared by `SITES=( ... )` in `websyn_start.sh`. Control plane:
Sites are on `40000`-`40021` 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-41020:40000-40020 webharbor:dev
-p 8201:8101 -p 41000-41021:40000-40021 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 41020); do
for p in $(seq 41000 41021); 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-40020`, 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-41020`).
If a container is already running on `:8101` / `:40000-40021`, 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-41021`).
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-40020:40000-40020 webharbor:dev
-p 8101:8101 -p 40000-40021:40000-40021 webharbor:dev
# iterate locally...

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

FROM python:3.12-slim-bookworm

Expand All @@ -14,6 +14,7 @@ RUN pip3 install --no-cache-dir \
Flask-Login==0.6.3 \
Flask-WTF==1.2.2 \
Flask-Bcrypt==1.0.1 \
bcrypt==5.0.0 \
Werkzeug==3.1.3 \
Jinja2==3.1.4 \
SQLAlchemy==2.0.36 \
Expand Down Expand Up @@ -51,6 +52,17 @@ os.makedirs('instance_seed', exist_ok=True); \
shutil.copy2('instance/osu.db', 'instance_seed/osu.db'); \
print('osu seed DB generated at build time.')" && rm -rf /opt/WebSyn/osu/instance

EXPOSE 8101 40000-40020
# Rotten Tomatoes keeps source-backed media in the asset bundle and rebuilds
# its deterministic SQLite seed from tracked, validated source documents.
RUN test -n "$(ls -A /opt/WebSyn/rotten_tomatoes/static/images)" && \
test -n "$(ls -A /opt/WebSyn/rotten_tomatoes/static/external_cache)"
RUN cd /opt/WebSyn/rotten_tomatoes && rm -rf instance instance_seed && python3 -c "\
import app; \
import os, shutil; \
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-40021

CMD ["/opt/websyn_start.sh"]
8 changes: 4 additions & 4 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** — 21 sites today, scaling to 100+ together
- **Community-driven** — 22 sites today, scaling to 100+ together

## 🚀 Quickstart

One command to run all web environments:

```bash
docker run -p 8101:8101 -p 40000-40020:40000-40020 battalion7244/webharbor:latest
docker run -p 8101:8101 -p 40000-40021:40000-40021 battalion7244/webharbor:latest
```

Then point your agent at `http://localhost:40000` through `http://localhost:40020` to explore 21 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, and Ohio State University`.
Then point your agent at `http://localhost:40000` through `http://localhost:40021` to explore 22 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, and Rotten Tomatoes`.

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

Expand All @@ -65,7 +65,7 @@ git clone https://github.com/aiming-lab/WebHarbor && cd WebHarbor

## 🤝 Contribute

We have built 21 high-quality mirrors covering the [WebVoyager](https://github.com/MinorJerry/WebVoyager) benchmark. The next goal is **100+ sites**, covering everything in [Online-Mind2Web](https://huggingface.co/datasets/osunlp/Online-Mind2Web). We are inviting the community to build this together.
We have built 22 high-quality mirrors covering the [WebVoyager](https://github.com/MinorJerry/WebVoyager) benchmark. The next goal is **100+ sites**, covering everything in [Online-Mind2Web](https://huggingface.co/datasets/osunlp/Online-Mind2Web). We are inviting the community to build this together.

There are two ways to join the author list:

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-40020:40000-40020 battalion7244/webharbor:latest`).
WebHarbor must already be running locally (`docker run -p 8101:8101 -p 40000-40021:40000-40021 battalion7244/webharbor:latest`).

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

Expand Down
1 change: 1 addition & 0 deletions agent_demo/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ description = "Minimal browser-use ReAct agent + LLM-as-judge demo for WebHarbor
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"bcrypt==5.0.0",
"browser-use>=0.10.1",
"openai>=1.50.0",
"playwright>=1.56.0",
Expand Down
Loading