Shoe Forge
Pick any part of a real 3D sneaker, give it real leather, suede, knit or patent, and make the pair nobody else has.
翻译准备中
尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
Ohmlot — daily collector for personal-robot list prices and FCC equipment grants
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗The collector behind ohmlot.com — a daily record of what personal robots (humanoids, robot dogs, desktop robots) cost in the US, whether they are actually in stock, and what their FCC authorization status is.
Every snapshot is committed to this repository the day it is taken, by GitHub Actions. That is the point of the repo being public: the site alone cannot prove that a price history is real, because a JSON file can be written at any time with any date in it. Commit timestamps cannot be backdated, so the git log is the evidence.
Collection started 2026-09-22.
| What | Where it lands | How often |
|---|---|---|
| Manufacturer list prices, per variant, pinned to the US market | data/prices/YYYY-MM-DD.jsonl | daily |
| Raw store responses, kept verbatim | data/prices/raw/<date>/ | daily |
| A 6-hourly sample of three high-churn sources | data/prices/intraday/ | every 6h |
| FCC conditional-approval records | data/fcc/ | weekly |
| Changes derived by diffing consecutive snapshots | data/events.jsonl | daily |
| Catalog of 32 robots, 15 of them price-tracked | data/models.json | manual |
The 17 robots that are not price-tracked are real, currently-sold products whose price is quote-only or behind a contact-sales form. They are listed with the reason rather than left blank or dropped.
Prices (src/prices.ts) read each store's own product endpoint — Shopify .js/.json for most
sellers, an HTML parse for 1X — with ?country=US so the market is pinned. Collection is per
variant, so a product with 15 variants produces 15 rows, each with its own price, availability and
SKU. Sources are configured in config/price-sources.json, not hardcoded.
FCC (src/fcc.ts) reads the PSHSB public notices listed in config/fcc-notices.json as PDFs
from docs.fcc.gov, keeps the PDF bytes verbatim under data/fcc/raw/, and extracts all three
columns of Appendix B using a coordinate-based reader (src/lib/pdf.ts) that works off each text
item's x/y position. The flattened .txt rendering that FCC also publishes merges the columns
irrecoverably, which is why the PDF is parsed directly.
apps.fcc.gov — the host that serves the equipment-authorization API — is Akamai-blocked from CI
runners and from every other origin tried. That is recorded in context/fcc-api-notes.md and no
workaround was used: no proxy service, no scraping-bypass tool. The result is that this repo has
less FCC data than a bypass would produce, and says so.
Events (src/events.ts) are generated by comparing each day's snapshot to the previous one.
Nothing is hand-entered.
These are not aspirations; they are why several things here are missing or marked unknown.
null or unknown. There is no
"reasonable estimate" anywhere in data/.observation_started, not as a change. Those events carry observation_change: true
and are shown separately on the site. The first 20 events in this repo are all of that kind.primary_observation. Three changes found in the Internet Archive from before collection started
are kept in data/historical-findings.jsonl and deliberately never merged into events.jsonl.apps.fcc.gov.A Wayback Machine study (context/recoverability.md, run 2026-09-25) measured whether this data
could just be recovered later instead of collected. The finding was the opposite of the starting
assumption: where the Internet Archive has a capture, most fields come back fine — price recovered
in 26 of 26 sampled snapshots, stock in 23 of 26.
The gap is coverage, not readability. DEEP Robotics' Lite3 product page has never been crawled by the Internet Archive, not once, while two other products from the same store were. KEYi's Loona product URL has never been captured either; its store appears in the archive only inside a five-week window in May–June 2026 — and inside that narrow window its price changed three times. For some of these products there is no "look it up later."
npm install
npm test
npm run collect:prices # same as the daily workflow
npm run collect:fcc # same as the weekly workflow
npm run collect:intraday # the 6-hourly sample
Failed sources are written to data/logs/<date>.log; a failure never silently produces a row.
That directory does not exist in a clean checkout, because it is only created when something
fails — which is also how a CI bug once went unnoticed for three days (git add on a path that
only exists on error exits non-zero, and silently skipped the commit step after it).
Scheduling lives in .github/workflows/ (daily.yml, fcc.yml, intraday.yml). Note that the
cron times in those files are requests, not start times. GitHub's scheduler delays these runs,
and the delay is neither small nor predictable: measured starts have landed between roughly two and
six hours after the requested time, varying run to run and workflow to workflow. Changing the cron
value does not help, because the delay is queue-side. This is why the site displays the collection
time read from the data itself rather than the time the workflow asked for.
The site in web/ is a Next.js app that reads data/ at build time.
Model metadata draws on Robot Price Index and humanoidrecord.com, both CC BY 4.0; attribution is in
data/SOURCES.md. Prices come from manufacturer and official-reseller stores. FCC material is US
government public record.
Ohmlot is independent and not affiliated with any manufacturer or store.
Working notes in context/ are written in Korean. They are the actual instructions the work was
done from, including the ones that record mistakes and corrections.