Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ All notable changes to this project are listed here. Versions follow [Semantic V
over the command line (commands, options, exit statuses and `--json` reports), the configuration keys, the JSON
schemas in `nnnotes.schemas` and the documented Python API. Before 1.0 a minor version can change any of them.

## Unreleased

### Features

- Build named sites through depot product, player read-set, asset and index tasks.
- Retain unselected regional topics, publish immutable product dependencies in order, and restore complete sites from their saved depot layouts.
- Offer Live variant products from chart manifests and select story UI/font languages explicitly.

## [0.2.1](https://github.com/MetaSekaiLab/nnnotes/compare/v0.2.0...v0.2.1) - 2026-10-13

### Build
Expand Down
24 changes: 9 additions & 15 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,21 +34,15 @@ The catalog (`nnnotes.source.catalog.Catalog`) resolves an addressable key to it
dependency closure, takes a bundle from the APK when the APK has it and from the CDN otherwise, and keeps fetched and
decrypted bundles in the depot's `downloads/` directory.

## Two ways to export

- **One subject.** `export episode`, `export story`, `export shader`, `export audio`, `export ui`, `site build`
and `music-data` read what one subject needs through the Session and write their output directory directly
([Export stories and lives](export.md)). `export live`, `export live2d`, `export spot` and `export room` ask the
pipeline below for the products of one subject ([products](products.md)).
- **Every asset.** `export assets` splits the work into stages ([stages](stages.md)). A task is one stage applied to
one subject (a bundle, a content id, a view); its key covers exactly what its output depends on: the stage and
converter versions, the input contents and the options ([contracts](contracts.md)). Results and their files are
stored once by content hash in the depot, and the output directory is laid out from the depot. A second run finds
every unchanged result in the depot and only lays out what changed; `depot plan` says what would run and why
([asset export](assets.md)).

Both ways use the same readers below the pipeline layer, so a texture, shader, mesh or audio stream is converted by
one implementation whichever command asks for it.
## Product and asset requests

`export assets` runs stages whose tasks are keyed by their input contents, options, stage versions and converter identities. Results and files are stored in the depot; layouts place their content into output directories. `depot plan` reports which tasks and placements would change.

`export live`, `export story`, `export live2d`, `export spot`, `export room` and `export ui` request the products of selected subjects through that same pipeline. Stories first produce an episode, then request its referenced products. Shared objects and unchanged products reuse committed tasks.

`site build` uses the same product requests, then runs player read-set, asset, document and index tasks. A named catalog retains unselected topics and references immutable products. Publication writes dependencies before entry manifests and indexes. The successful run stores the complete layout so a new output directory can be restored through the depot.

`export episode`, `export shader`, `export audio` and `music-data` expose subject-specific data and conversions through the Session. All commands use the readers and converters below the pipeline layer.

## Outputs

Expand Down
18 changes: 9 additions & 9 deletions docs/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -445,32 +445,32 @@ live charts, Live2D models and stories -> static site for ournotes-player (share
| Argument | Description |
| --- | --- |
| `-o`, `--out` `SITE` | site directory (required) |
| `--name` `NAME` | persistent site name in the depot (default: default) |
| `--player` `PLAYER` | ournotes-player checkout (built) or installed package ([paths] player) |
| `--pair` `PAIR` | <musicId>:<difficulty> (repeatable) |
| `--all` | every MasterLiveMusic x difficulty |
| `--player-only` | rewrite the player files, charts.json and models.json only |
| `--reingest-json` | store every chart's and model's JSON files again |
| `--player-only` | publish the saved catalog with current player pages |
| `--live2d` `MODEL` | Live2D model id or key Character/Live2D/<group>/<name>/model/<name> (repeatable) |
| `--all-live2d` | every Live2D model of the catalog |
| `--format` `FORMAT` | audio format of the charts and stories (default aac) (one of `aac`, `opus`, `vorbis`, `mp3`, `flac`) |
| `--no-audio` | export no audio files |
| `--compress` `COMPRESS` | encoding of the compressible assets (JSON, shaders, moc3, ...) where it makes them smaller: gzip (default), br (brotli) or none (one of `gzip`, `br`, `none`) |
| `--force` | rebuild charts, models and stories whose manifest exists (stories: also their models) |
| `--tmp` `TMP` | directory for the temporary live and model builds (default <site>.tmp) |
| `--workers` `N` | parallel music / story / model processes (default a quarter of the CPUs, up to 8; models up to 4; 0: this process) |
| `--read-workers` `N` | chart read sets run at a time (default half the CPUs, up to 16) |
| `--workers` `N` | product task worker processes; 0: this process |
| `--memory` `GiB` | product task memory budget |
| `--fetch-workers` `N` | parallel source downloads |
| `--stored-catalog` `LABEL\|SHA` | a stored catalog version of the depot |
| `--story` `ADV_ID` | story episode: its MasterAdv id (repeatable) |
| `--all-stories` | every story episode (MasterAdv) of the master data |
| `--story-languages` `LANGS` | languages of the stories' text, comma-separated (default: ja,en,zh-Hant,zh-Hans,ko) |
| `--story-languages` `LANGS` | languages of the stories' text, comma-separated (default: the catalog language) |
| `--font` `LANG=PATH` | font file the story text of a language is drawn with (repeatable; [paths] fonts.<lang>); emoji=PATH: the colour emoji font the emoji sprites are drawn from ([paths] fonts.emoji) |
| `--site-region` `REGION` | a region the site serves: a [servers.<region>] table (repeatable; the first is the base; default: [catalog] region) |
| `--all-regions` | every configured region |
| `--fonts` `FONTS` | text of the start canvas and the stories: open (default): the start canvas has layout and style only, the stories glyphs from your font files (--font); game: the game's TMP fonts (needs the 'fonts' extra) (one of `open`, `game`) |
| `--fonts` `FONTS` | text of the start canvas and stories: open (default): glyphs from your font files (--font); game: the game's TMP fonts (needs the 'fonts' extra) (one of `open`, `game`) |
| `--band` `BAND` | band of the LightWeight background and start timeline (default: band of the music's first vocal character) |
| `--leader-card` `LEADER_CARD` | deck centre MasterMemberCard id (its character's band) |
| `--live-option` `OPTION[=VALUES]` | also export the files of a Live option's variants (repeatable): MirrorChart, MeasureLineDisplay, NoteDesignId, NoteEffectId, LiveQuality, NoteSePatternId (every value of the master data, or =v,v...), defaults (the option defaults and ranges only) or all |

At most one of `--pair`, `--all`, `--player-only`, `--reingest-json`.
At most one of `--pair`, `--all`, `--player-only`.

At most one of `--live2d`, `--all-live2d`.

Expand Down
Loading
Loading