{"id":51286787,"url":"https://github.com/minagishl/s3s-next","last_synced_at":"2026-06-30T06:30:32.135Z","repository":{"id":367372693,"uuid":"1280505577","full_name":"minagishl/s3s-next","owner":"minagishl","description":"Modern TypeScript implementation of s3s for SplatNet 3 exports, usable as both a CLI and JavaScript module.","archived":false,"fork":false,"pushed_at":"2026-06-25T19:01:42.000Z","size":89,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-25T19:07:41.897Z","etag":null,"topics":["cli","graphql","monorepo","nintendo-switch","nodejs","s3s","splatnet","splatoon3","statink","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/minagishl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"custom":"https://minagishl.com/amazon-wishlist"}},"created_at":"2026-06-25T16:46:53.000Z","updated_at":"2026-06-25T19:01:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/minagishl/s3s-next","commit_stats":null,"previous_names":["minagishl/s3s-next"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/minagishl/s3s-next","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/minagishl%2Fs3s-next","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/minagishl%2Fs3s-next/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/minagishl%2Fs3s-next/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/minagishl%2Fs3s-next/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/minagishl","download_url":"https://codeload.github.com/minagishl/s3s-next/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/minagishl%2Fs3s-next/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34955984,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-30T02:00:05.919Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","graphql","monorepo","nintendo-switch","nodejs","s3s","splatnet","splatoon3","statink","typescript"],"created_at":"2026-06-30T06:30:30.385Z","updated_at":"2026-06-30T06:30:32.128Z","avatar_url":"https://github.com/minagishl.png","language":"TypeScript","funding_links":["https://minagishl.com/amazon-wishlist"],"categories":[],"sub_categories":[],"readme":"# S3S Next\n\nModern TypeScript implementation of s3s-compatible SplatNet 3 exporting tools. Provides both a command-line interface and reusable JavaScript APIs for authentication, SplatNet data fetching, and stat.ink uploading.\n\nSuccessor to the broken [s3s](https://github.com/frozenpandaman/s3s) / [s3si.ts](https://github.com/spacemeowx2/s3si.ts) workflow, with NSO 3.0.1+ encrypted Coral API support.\n\n## Monorepo packages\n\n| Package              | Description                                 |\n| -------------------- | ------------------------------------------- |\n| `s3s-next`           | CLI binary                                  |\n| `@s3s-next/core`     | High-level `S3SNextClient`                  |\n| `@s3s-next/auth`     | Nintendo Account / Coral / bulletToken auth |\n| `@s3s-next/splatnet` | SplatNet 3 GraphQL client                   |\n| `@s3s-next/statink`  | stat.ink upload + mapper                    |\n| `@s3s-next/storage`  | profile.json, cache, migration              |\n\n## Setup\n\n```bash\npnpm install\npnpm build\n```\n\n## Quick start\n\nNSO 3.4+ requires the public [nxapi-znca-api](https://github.com/samuelthomas2774/nxapi-znca-api) for encrypted Coral requests. **One-time nxapi registration** is the recommended path for most users.\n\n```bash\n# 1. Configure profile (nxapi OAuth + optional stat.ink key)\npnpm exec s3s-next setup\n\n# 2. Log in to Nintendo Account and refresh tokens\npnpm exec s3s-next auth\n\n# 3. Upload missing battles (s3s -r equivalent)\npnpm exec s3s-next -r\n```\n\nCopy [`profile.json.example`](profile.json.example) to `profile.json` if you prefer editing by hand.\n\n### nxapi registration (one-time)\n\nNSO 3.4+ needs a personal nxapi-auth OAuth client. Use **Register** to create your own — do not reuse a client that was already listed on the page before you registered.\n\n#### Step-by-step\n\n1. Open https://nxapi-auth.fancy.org.uk/oauth/clients\n2. Sign in with **Discord** or a **passkey** if prompted\n3. Click **Register** to create a **new** client (do **not** open an existing client row)\n4. Enable these scopes (all three required):\n\n| Scope   | Purpose                     |\n| ------- | --------------------------- |\n| `ca:gf` | f-parameter generation      |\n| `ca:er` | Encrypt Coral API requests  |\n| `ca:dr` | Decrypt Coral API responses |\n\n5. Finish registration and copy **your** new Client ID\n6. Run `s3s-next setup` and paste that Client ID; **leave clientSecret blank** (registered clients are usually public)\n\n#### Common mistakes\n\n| Do not use                                         | Why                                                     |\n| -------------------------------------------------- | ------------------------------------------------------- |\n| Client ID from an existing row on the clients page | Only clients you create via Register work with s3s-next |\n| “Shared secret” under Client authentication        | JWT assertion only — s3s-next does not use it           |\n| Missing “Client secrets” section                   | Normal for public clients — secret is not required      |\n\nOr add to `profile.json` manually (no `clientSecret` needed for public clients):\n\n```json\n{\n\t\"fGen\": {\n\t\t\"provider\": \"nxapi\",\n\t\t\"url\": \"https://nxapi-znca-api.fancy.org.uk/api/znca\",\n\t\t\"clientId\": \"your-client-id-from-register\"\n\t},\n\t\"statInkApiKey\": \"your-43-character-key\"\n}\n```\n\nDo not commit `profile.json` or secrets to git.\n\n## s3s-compatible flags\n\n```bash\ns3s-next -r                 # upload missing\ns3s-next -M [seconds]       # monitor (default 300s)\ns3s-next -r -M              # both\ns3s-next -nsr               # skip Salmon Run\ns3s-next -osr               # Salmon Run only\ns3s-next --blackout         # mask other player names\n```\n\n## Commands\n\n```bash\ns3s-next setup              # interactive profile setup (recommended first step)\ns3s-next auth               # Nintendo login + token refresh\ns3s-next tokens             # refresh gToken / bulletToken only\ns3s-next import-tokens \u003cgtoken\u003e   # manual token import (advanced)\ns3s-next upload\ns3s-next run\ns3s-next monitor [seconds]\ns3s-next fetch --json\ns3s-next export\ns3s-next migrate-s3s ./config.txt\ns3s-next migrate-s3si ./profile.json\n```\n\n## Library usage\n\n```typescript\nimport { S3SNextClient } from '@s3s-next/core';\n\nconst client = new S3SNextClient({\n\tprofilePath: './profile.json',\n\tstatInkApiKey: process.env.STATINK_API_KEY,\n});\n\nawait client.login();\nawait client.uploadMissing();\n```\n\nLow-level APIs:\n\n```typescript\nimport { createNintendoAuthClient } from '@s3s-next/auth';\nimport { createSplatNetClient } from '@s3s-next/splatnet';\nimport { createStatInkClient } from '@s3s-next/statink';\n```\n\n## Migrate from s3s / s3si.ts\n\n```bash\ns3s-next migrate-s3s ./config.txt -o ./profile.json\ns3s-next migrate-s3si ./profile.json\n```\n\n## Manual token import (advanced)\n\nIf automatic token generation is not an option, import gToken (and optionally bulletToken) captured via mitmproxy or similar:\n\n```bash\ns3s-next import-tokens \"\u003cgtoken\u003e\" --bullet \"\u003cbulletToken\u003e\"\n```\n\nThis sets `fGen.provider` to `manual`. Tokens expire sooner than the nxapi flow; re-import when uploads fail. See [s3s mitmproxy wiki](https://github.com/frozenpandaman/s3s/wiki/mitmproxy-instructions) for capture methods (environment-dependent).\n\n## Privacy\n\nUsing nxapi f-generation sends your Nintendo Account `id_token` to a third-party server (same trade-off as s3s). See [s3s token generation](https://github.com/frozenpandaman/s3s#token-generation-).\n\n## Release\n\nPush a semver tag to publish `s3s-next` to npm (OIDC trusted publishing via `.github/workflows/release.yml`):\n\n```bash\n# optional: bump packages/cli/package.json to match the tag\ngit tag v1.0.0\ngit push origin v1.0.0\n```\n\nThe workflow sets `packages/cli/package.json` version from the tag, runs checks, builds, and publishes.\n\n## Development\n\n```bash\npnpm install\npnpm build\npnpm test\npnpm typecheck\n```\n\n## Credits\n\n- [s3s](https://github.com/frozenpandaman/s3s) by frozenpandaman\n- [s3si.ts](https://github.com/spacemeowx2/s3si.ts)\n- [nxapi](https://github.com/samuelthomas2774/nxapi) for encrypted Coral API reference\n\n## License\n\nGPL-3.0 — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fminagishl%2Fs3s-next","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fminagishl%2Fs3s-next","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fminagishl%2Fs3s-next/lists"}