New WebHarbor mirror of kaggle.com on port 40015 (16th site).
- sites/kaggle/: Flask + SQLAlchemy app (competitions, datasets, code/
notebooks, models, learn/courses, discussions, rankings, accounts),
27 Jinja2 templates, scored token-overlap search across all listings.
- Idempotent seeding (function-level gates) with benchmark users
(alice.j@test.com et al.); byte-identical reset verified.
- 20 WebVoyager tasks in sites/kaggle/tasks.jsonl.
- Registered in websyn_start.sh, control_server.py, Dockerfile (EXPOSE
...40015).
- Fix .gitignore: scraped_data/ and instance/ patterns had inline
comments, which gitignore treats as part of the pattern, so they never
matched. Comments moved to their own lines.
Heavy assets (instance_seed/kaggle.db, static/images/) ship via the
ChilleD/WebHarbor HF dataset, not this repo.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Mirrored site
Kaggle — https://www.kaggle.com/
Added as the 16th WebHarbor site, served on port 40015.
What's included
sites/kaggle/— Flask + SQLAlchemy app: competitions, datasets, code/notebooks, models, learn/courses, discussions, rankings, accounts. 27 Jinja2 templates. Scored token-overlap search on every listing route plus a global/search.alice.j@test.comet al.).sites/kaggle/tasks.jsonl.websyn_start.sh,control_server.py,Dockerfile(EXPOSE … 40015)..gitignorebug: thescraped_data/andinstance/patterns carried inline#comments, which gitignore treats as part of the pattern, so they never matched. Comments moved to their own lines.Seeded rows per major model
Tasks
20 tasks in
sites/kaggle/tasks.jsonl(WebVoyager schema), covering search, browse, competition join, dataset upvote, notebook/model lookup, account management, and multi-step authenticated flows.Byte-identical reset
After reset,
md5sumofinstance/kaggle.dbmatchesinstance_seed/kaggle.db(131cdab6ed840e4e74324ab5bd24dda4) — the strict reset invariant holds.Visual fidelity vs. the real site
Mirror rendered at
localhost:40015(compare against https://www.kaggle.com/).More (competition detail, rankings)
Paired HuggingFace assets PR
https://huggingface.co/datasets/ChilleD/WebHarbor/discussions/37 — uploads
kaggle.tar.gz(instance_seed/kaggle.db + static/images) to theChilleD/WebHarbordataset..assets-revisionalready pinsrevision: main, so no bump is needed; once the dataset PR merges,scripts/fetch_assets.shpulls the kaggle assets automatically. Merge the HF dataset PR before this one so a clean-clone build can fetch the assets.Cover-image fidelity (fixed)
The original scrape mis-bound cover images: kaggle's
ListCompetitionsAPI returnsthumbnailImageUrls/headerImageUrlsas dicts keyed by competition id, but the scraper paired them to competitions positionally — scrambling every cover (Titanic showed handwritten digits, the LLM competition showed pill packaging, Home Credit showed a Mercedes logo, etc.). Fixed by re-binding each image via…ImageUrls[str(comp["id"])], re-fetching the correctly-bound real kaggle images, and mapping each seeded slug to the most topical real entity (Titanic → the ship, Digit Recognizer → digits, leaf-disease → foliage, medical → medical, …). Covers are downscaled to ≤600px. The scraper bug itself is also patched inscraped_data/scrape_api.py.🤖 Generated with Claude Code