We have released RumiCar Simulator v7.4.0. The release notes below are also available on GitHub.
v7.4.0
Reduced how often the app asks GitHub at startup, so that community content keeps loading even where many people share one connection, such as a classroom. Until now every page load spent four GitHub API requests (listing official races, community courses, community programs and community car types). Unauthenticated, that API allows only 60 requests per hour per connection (IP address), and we measured that the ceiling is reached after 15 page loads. In a classroom where ten people open the page over the same venue Wi-Fi, a few loads each was enough to exhaust it, and community courses and programs would report “could not be retrieved” (the simulator itself never stops, so driving still worked). Three changes address this. (1) Listings are now read from an index.json inside each directory. That host (raw.githubusercontent.com) has no request-count limit; we confirmed by measurement that its responses carry no rate-limit headers. Once the upstream repository ships an index.json, listing community courses, programs and car types uses no API requests at all. Only the official race listing still uses the API, because it has to enumerate directories, which an index.json cannot stand in for; that one is covered by (3) below. (2) Repositories without an index.json (older clones and forks) keep using the API exactly as before, so nothing changes for them. (3) Retrieved listings are held in the browser for a while, and no request is made during that time. The hold time depends on where the listing came from: five minutes for the unlimited manifest, one hour for the scarce API and for “not created yet” (404) results. The races/ directory in particular does not exist yet, so until now every single load spent one request that was guaranteed to miss; that miss is now remembered too. Race entry listings go through the same path as well, because previously each event cost one API request, which meant four concurrent events would put startup back at four requests. We also tried conditional requests with ETag, but measured that even a 304 Not Modified consumes one request (remaining 57 to 56 to 55), so we did not adopt it. The reload buttons in both the Official Races and the Rankings dialogs discard the held listing before fetching, so pressing either always gives you the latest. Expect new submissions to take up to about ten minutes to appear: the five-minute browser hold sits on top of roughly five minutes of caching on the delivery side. On safety, filenames written in index.json are no longer trusted as-is: path separators and relative references (../) are rejected, and names containing symbols or non-ASCII characters are URL-encoded before being fetched (joined raw, “a#b.json” would point at a different file). Everything happens inside the browser; no server-side machinery was added, keeping this repository self-contained. Driving physics, the f0-f3 determinism hashes, the verifyHash of official records and share URLs are all unchanged.
Verifying this release yourself
cd Simulator
node wf_run_all.mjs # the full assertion-gate suiteThe suite runs from a fresh clone with no dependencies beyond Node.js.
The real-browser checks under Simulator/browser/ additionally need npm install and a display.
