7.4 KiB
NalulunaModAssistant Source and Install Notes
This note records how NalulunaModAssistant behaves when used to install
Patreon-only Naluluna mods. It is intended to guide future plugin-helper
support for private/local payloads without checking private artifacts,
session-specific URLs, or account data into the repo.
Observed run:
- Date: 2026-06-29
- Assistant path:
C:\Users\pleb\Apps\Naluluna\NalulunaModAssistant.exe - Assistant version:
1.5.1 - Runtime UI: WebView2
149.0.4022.80 - Log path:
C:\Users\pleb\Apps\Naluluna\Logs\NalulunaModAssistant\_latest.log
High-Level Flow
NalulunaModAssistant is a WebView2 desktop app. It authenticates the user through an embedded browser, fetches a versioned mod catalog, then downloads selected plugin archives into a temporary working directory before extracting them into the configured Beat Saber directory.
The observed Patreon flow was:
- Initialize WebView2 and a temporary working directory.
- Load the initial catalog JSON named
start. - Navigate to Patreon at
https://www.patreon.com/c/naluluna/posts. - Resolve the NalulunaModAssistant files post:
https://www.patreon.com/naluluna/posts/nalulunamodassis-74489236. - Confirm the logged-in Patreon account has access.
- Detect Beat Saber version
1.44.1. - Select mod list version
1.42.0. - Fetch the catalog JSON named
1-42-0. - Download selected archives and extract their payloads into the configured Beat Saber tree.
The assistant binary also contains a GetJsonFromGoogleSiteAsync code path and
Fanbox login/status paths. Those appear to be alternate or older source flows.
The 2026-06-29 run used Patreon, not Google Sites, GitHub, BeatMods, or Fanbox.
Source Model
Naluluna plugin artifacts are not normal public GitHub or BeatMods releases. For Patreon installs, the authoritative source is the private NalulunaModAssistant Patreon post and its attachment metadata.
The assistant downloads files through two forms:
- Relative catalog paths such as
nma/files/NalulunaUtils-5.7.0-bs1.44.0.zipandnma/imgs/NalulunaCounters.jpg. - Patreon file endpoints such as
https://www.patreon.com/file?..., which resolve to tokenizedpatreonusercontent.comCDN URLs after authentication.
Do not record tokenized CDN URLs, cookies, WebView profile data, or private account identifiers in repo files. They are session-specific and may grant access to paid artifacts. For lockfile-style notes, record the Patreon post, the assistant-visible archive name, the mod version, the Beat Saber target string, the installed paths, and local file hashes when available.
Catalog Versioning
In the observed run, the game was 1.44.1 but the assistant selected
modListVersion: 1.42.0 and fetched catalog node 1-42-0.
That means the assistant's catalog version should not be assumed to exactly match the game version. Treat it as an upstream compatibility bucket. For documentation and locks, record both values:
- actual game version reported by the assistant
- mod list version selected by the assistant
Install Target
The assistant reads and writes a configured Beat Saber directory, not a
BSManager instance root chosen by plugin-helper.
Observed config:
- Beat Saber directory:
C:\Program Files (x86)\Steam\steamapps\common\Beat Saber - Working directory:
C:\Users\pleb\AppData\Local\Temp\tmp97E.tmp
This matters because the observed run installed into the Steam Beat Saber tree,
not the BSManager 1.44.1 instance at
C:\Users\pleb\BSManager\BSInstances\1.44.1.
Before using NalulunaModAssistant as a source for a BSManager instance, either:
- point the assistant at the intended BSManager instance root, if the UI allows it, or
- treat the Steam install as a staging source and copy exact installed files into
the target instance through a
plugin-helperlocal/private payload workflow.
Do not manually copy files into the live instance as a substitute for
plugin-helper state tracking unless this is an explicit one-off recovery step.
Extraction Behavior
Archives are extracted relative to the Beat Saber directory. The observed payloads wrote to these top-level areas:
Plugins/Libs/Native/UserData/NalulunaUtils/UserData/NalulunaSkybox/NalulunaAvatars/
Examples from the observed run:
Plugins/NalulunaUtils.dllPlugins/NalulunaAvatars.dllPlugins/NalulunaSkybox.dllPlugins/NalulunaSkyboxSamples.manifestLibs/Native/OVRLipSync.dllUserData/NalulunaUtils/OpenVRHelper/OpenVRHelper.exeUserData/NalulunaSkybox/*.jpgxNalulunaAvatars/AliciaSolid.vrm
Some packages install manifests or data assets instead of a plugin DLL. A
plugin-helper implementation should record every extracted file, not just the
primary DLL.
Observed Install Batch
The 2026-06-29 run installed the following selected packages:
NalulunaShaders2.1.3, archiveNalulunaShaders-2.1.3-bs1.39.1.zipNalulunaUtils5.7.0, archiveNalulunaUtils-5.7.0-bs1.44.0.zipAliciaSolid1.10.0, archiveAliciaSolid-1.10.0-bs1.26.0.zipNalulunaAvatars1.10.0NalulunaSkybox2.0.0OpenVRHelper0.2.3NalulunaRewinder1.2.0NalulunaCounters1.3.2NalulunaEnergy1.1.0NalulunaLevelDetail2.0.0NalulunaSongPreview1.0.1NalulunaSkyboxSamples1.1.0
The first NalulunaUtils attempt downloaded successfully but failed extraction
with a Windows file-lock error:
The process cannot access the file
'C:\Users\pleb\AppData\Local\Temp\tmp97E.tmp\NalulunaUtils-5.7.0-bs1.44.0.zip'
because it is being used by another process.
A later retry succeeded and extracted Plugins/NalulunaUtils.dll.
Several downloads log download interrupted: FileSecurityCheckFailed after a
successful install. In the observed run, those messages did not necessarily mean
the mod failed; the assistant logged Installed: ... first. Treat this message
as a warning to cross-check against extracted files and the assistant's final
success/failure count.
Implications for plugin-helper
Private Naluluna payloads should be modeled as local/private artifacts rather than first-class remote fetches until there is an explicit supported way to authenticate and download them safely.
Recommended near-term workflow:
- Use NalulunaModAssistant to download/install into a staging Beat Saber tree.
- Inspect the assistant log for selected package names, versions, archive names, and extracted paths.
- Hash the installed files or preserved archives.
- Add a
plugin-helperlocal/private payload entry for each package. - Apply that payload to the intended BSManager instance with normal install state recording.
- Smoketest the BSManager instance and record results in
docs/notes/install-and-verify-plugins-1.44.1.md.
Longer term, plugin-helper could add a "local archive import" command that
accepts a zip from the assistant's working directory or a saved local cache,
normalizes the extracted paths, computes hashes, and creates an auditable
install plan without needing to understand Patreon authentication.
What Not To Commit
Do not commit:
- downloaded private plugin archives
- tokenized
patreonusercontent.comURLs - WebView2 profile data
- Patreon or Fanbox cookies
- full
_patreon.log/_fanbox.logcaptures - account identifiers from logs
Safe to commit:
- assistant version
- Patreon post URL
- package names and versions
- non-tokenized archive names shown by the assistant
- extracted relative paths
- hashes of local artifacts or installed files
- compatibility and smoketest notes