Matt Isenhower 19d1fb5d3d Move updaters onto public and private storage
Updaters take a storage object instead of touching the filesystem: a
publicStorage (what the site serves: data/, assets/) and a privateStorage
(updater state). Two implementations share one small interface
(exists / readJson / writeJson / readBytes / writeText / writeBytes):

- FilesystemStorage over a directory, used by npm run splatnet, so dist/
  and storage/ end up exactly as they always have and the S3 sync is
  untouched;
- BucketStorage over an R2 bucket binding (MemoryBucket in tests), with a
  thin per-run cache: exists() lists a directory once and answers from
  memory, readJson() parses a document once, and writeJson() skips the put
  when the content is unchanged.

The updater base class and localization processor keep their original
structure with awaits added; the processor reads its document lazily and
writes once per update, as splatoon3.ink's does. Objects written to a
bucket carry the content type and cache-control the S3 sync used to apply.

Tests cover the storage contract (run against both implementations), the
BucketStorage cache behaviour, MemoryBucket's R2-style listing, the
localization processor, the updater base, and each concrete updater.
scripts/compare-data.mjs compares two data directories ignoring SplatNet's
random ordering and ICS timestamps.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 09:50:14 -07:00
2024-11-12 21:09:09 -08:00
2026-08-30 18:56:38 -07:00
2024-11-16 21:51:58 -08:00
2024-11-08 08:26:28 -08:00
2026-08-30 18:56:38 -07:00
2017-08-02 09:58:58 -07:00
2018-07-31 12:14:27 -07:00
2017-08-15 16:50:29 -07:00
2026-09-04 19:58:35 -07:00
2026-09-04 19:58:35 -07:00
2026-08-30 18:56:38 -07:00
2026-09-02 20:22:18 -07:00

Splatoon2.ink

Note

Check out Splatoon3.ink as well!

Splatoon2.ink shows the current and upcoming map schedules for Splatoon 2.

This site was built with Vue.js and Bulma. All data comes from the SplatNet 2 API.

More information about Nintendo's API can be found here.

Getting Started

Clone this repo:

git clone git@github.com:misenhower/splatoon2.ink.git

Next, copy .env.example to .env and update its values.

cp .env.example .env

You can retrieve your iksm_session ID value (NINTENDO_SESSION_ID inside .env) using Fiddler or a similar tool. See here for further instructions.

npm install      # Install dependencies
npm run splatnet # Retrieve updates from Splatnet and the Salmon Run calendar
npm run serve    # Start the webpack dev server

Data retrieved from Splatnet is stored in the dist/data directory.

One image, src/common/cdn/images/skill/53c62995f9d2dc4a60f3850c5dbdd2323f1eef87.png, is no longer served by SplatNet's CDN. It is already in production storage; if you ever start from an empty dist/, copy it to dist/assets/splatnet/images/skill/ by hand (or run npm run sync:download).

By default, the dev server will run on port 8080. When running npm run serve you can access the site by going to http://localhost:8080.

Production

Build minified assets for production:

npm run build

Retrieve updates from Splatnet every hour via node-cron:

npm run cron
Description
🦑 Current and upcoming map schedules for Splatoon 2
Readme 20 MiB
Languages
JavaScript 44.1%
Vue 43.5%
SCSS 11.1%
HTML 0.9%
Dockerfile 0.4%