Releases: NekoSuneProjects/KitsuNexus
Release list
v1.0.77
Changed
- OBS Overlay moved server-side. The local HTTP overlay server (127.0.0.1, OBS Browser
Source) is gone — the overlay now lives on your pairedkitsunexus-serverat a public,
unguessable/overlay/<id>URL for your account, kept fed by a lightweight push every 5s
instead of the app serving it directly. Settings ▸ Cloud Sync's Overlay tab shows your
account's URL (with a copy button) once paired; style/box-background are just query params on
that URL now. Requires pairing to a server — there's no local-only overlay anymore. - Community Rank leaderboard is now server-side. The old leaderboard could only ever show
your own single row, since each install has its own isolated local database — it's not a
leaderboard without a server to aggregate across users. Ranks now push to your paired
kitsunexus-serveron every "Refresh my rank", and the in-app leaderboard reads the real
cross-user list from there (falls back to the old local-only list if unpaired). - Settings ▸ Cloud Sync's server URL field now defaults to the official KitsuNexus server —
clear it and enter your own URL if you're self-hosting.
Fixed
- Now Playing / Spotify detection failing entirely. Root cause was two stacked bugs in the
Windows media-session PowerShell query: reading a WinRT thumbnail stream's.Sizethrough
PowerShell's late-bound COM interop is unreliable and highly variable in timing, and calling
.Dispose()on the raw stream/reader COM objects threw on every single poll (silently caught,
but still cost seconds each time). Removed native thumbnail extraction entirely — album art
now comes solely from the existing Deezer/iTunes lookup, which was already reliable — and
raised the detection timeout to actually cover the real, measured latency of a WinRT session
query (previously tight enough to kill an otherwise-working query in progress). - Now Playing progress bar/timestamp feeling laggy/stale. They only updated once per (slow,
PowerShell-based) poll. Now ticked locally every second from the last poll's cached data using
simple time-math — no extra PowerShell calls, no extra load, just a smooth-feeling clock/bar
between polls. - Local Favorites "Open" not showing details for avatars/worlds/groups/friends. The Favorites
page's "Open" button used the Local Favorite's own database row id instead of the actual
VRChat id, so it looked up the wrong thing every time for anything saved locally (official
favorites, whose row id already is the VRChat id, weren't affected). - "✗ JSON failed to parse" on Wear.
PUT /avatars/:id/selectdoesn't reliably return a JSON
body, so the VRChat SDK's response parser threw even though the avatar swap had already
succeeded. That specific parse failure (only possible after a successful HTTP response) is now
treated as success instead of a false error. [statusPush] backend rejected status push: 401spamming forever. A stale/expired Discord
session token made this retry every 20s indefinitely with no backoff. It now stops after one
401, clears the dead session, and tells you to log in again instead of silently failing forever.- Community Ranks: avatar uploads always showing 0. Only counted avatars marked public —
but keeping your main/personal avatars private is completely normal, so this scored almost
everyone at 0 regardless of how many they'd actually uploaded. Now counts every avatar you own. - Community Ranks: "Years active" stuck near 0 for long-time VRChat accounts. It was purely
a local-history proxy, so a brand-new KitsuNexus install had nothing to show no matter how long
the account had actually played VRChat. Now blends in half-weight credit from VRChat account
age, so long-time accounts aren't penalized on day one; real local play history still overtakes
it naturally with continued use. - Community Ranks: event participation had no way to ever register. Now auto-detected from
real VRChat Group instance visits (not just any public/friends instance of a world some group
happens to use for hangouts), deduped per world+group+day to prevent farming. - Community Ranks: local-history stats were silently discarded on every recompute. The
derived years-active/event stats computed during sync were being thrown away before the score
was actually calculated, due to a stale re-fetch — fixed by passing them straight through.
📦 Downloads
- Windows:
KitsuNexus-Setup-1.0.77.exe(installer),KitsuNexus-Portable-1.0.77.exe, or.zip - Linux (x64):
.AppImage/.deb - Linux (arm64):
.AppImage/.deb
Installers are unsigned, so Windows SmartScreen may warn on first run — click More info → Run anyway.
🛡️ VirusTotal
- KitsuNexus-Portable-1.0.77-x64.exe: 0/65 engines flagged something — full report
- KitsuNexus-Setup-1.0.77-x64.exe: 0/56 engines flagged something — full report
- KitsuNexus-1.0.77-x64.zip: 0/49 engines flagged something — full report
Full Changelog: v1.0.76...v1.0.77
v1.0.76
Added
- VRC+ gate on avatar Local Favorites. Local Favorites for avatars now requires the logged-in
VRChat account to have an active VRC+ subscription (checked via thesystem_supportertag on
the account), mirroring VRChat's own avatar-favorites gating. The project owner's own paired
device always bypasses this —kitsunexus-servergainedGET /api/me(device-token
authenticated) so a paired desktop app can read the KitsuNexus accountroleit's paired to;
the Electron app caches that role (cloudSync.role, refreshed right after pairing) and skips
the VRC+ check when it's'owner'. This is a KitsuNexus-account check, unrelated to the
VRChat account itself — non-owner users still need real VRC+ regardless of pairing. Applies to
the "☆ Local Favorite" button on the avatar detail modal, "Add to Local Favorites by ID", and
all three "☁ Move to Cloud" flows (single/per-group/bulk-selected) on the Favorites page.
Fixed
- Favorite avatars/worlds all dumped into one group. The Favorites page showed every
favorited avatar under "avatars1" (and every world under "worlds1") even when VRChat had
them split across several groups (e.g. "Animations AVI", "My Friends AVI"). Root cause:
/worlds/favoritesand/avatars/favoritesreturn the World/Avatar objects themselves,
which don't carry a favorite-group field, so the group always fell back to the default.
The actual group tag lives on the plain Favorite record from/favorites, so that's now
fetched in parallel and merged in by id (matching VRCX's approach) — all groups now render.
📦 Downloads
- Windows:
KitsuNexus-Setup-1.0.76.exe(installer),KitsuNexus-Portable-1.0.76.exe, or.zip - Linux (x64):
.AppImage/.deb - Linux (arm64):
.AppImage/.deb
Installers are unsigned, so Windows SmartScreen may warn on first run — click More info → Run anyway.
🛡️ VirusTotal
- KitsuNexus-Portable-1.0.76-x64.exe: 0/45 engines flagged something — full report
- KitsuNexus-Setup-1.0.76-x64.exe: 0/54 engines flagged something — full report
- KitsuNexus-1.0.76-x64.zip: 0/54 engines flagged something — full report
Full Changelog: v1.0.75...v1.0.76
v1.0.72
Fixed
- The standalone Windows updater now has a verified launch handoff before KitsuNexus closes.
Update details use an environment payload, inheritedELECTRON_RUN_AS_NODEoverrides are removed
soUpdate.execannot silently run as plain Node, and a two-way ready/ack handshake confirms the
real extracted updater window is alive. Windows updates now prefer the elevation-capable NSIS
Setup asset, preserve/allusersuninstall context and the existing install directory, and
refresh externalUpdate.execopies to helper version1.0.3. NSIS now launches with Windows
ShellExecute semantics instead of through a nested PowerShell process, its own manifest handles
UAC, quoted/D=destinations containing spaces remain intact, and the updater waits for installed
payload files to become stable before relaunching the app. The registry lookup that discovers the
existing uninstaller was also corrected. - The Home dashboard's “Friends Online” tile no longer stays on an em dash while friends are
online. The tile now refreshes when the asynchronous VRChat friends cache finishes loading,
displays a real0when nobody is online, and clears stale counts after logout.
📦 Downloads
- Windows:
KitsuNexus-Setup-1.0.72.exe(installer),KitsuNexus-Portable-1.0.72.exe, or.zip - Linux (x64):
.AppImage/.deb - Linux (arm64):
.AppImage/.deb
Installers are unsigned, so Windows SmartScreen may warn on first run — click More info → Run anyway.
🛡️ VirusTotal
- KitsuNexus-Portable-1.0.72-x64.exe: 0/46 engines flagged something — full report
- KitsuNexus-Setup-1.0.72-x64.exe: 0/45 engines flagged something — full report
- KitsuNexus-1.0.72-x64.zip: 0/53 engines flagged something — full report
Full Changelog: v1.0.71...v1.0.72
v1.0.71
Fixed
- The separate Windows updater no longer terminates itself while closing KitsuNexus. Process
cleanup now targets only main-app executable names and protects the updater's real Electron PID
instead of PowerShell's own$PID. External%LOCALAPPDATA%\KitsuNexus\Update.execopies now
carry a helper-version marker so installed apps refresh older updater binaries before launching
them. The main app also waits for the separate updater's successful spawn event before quitting,
so a launch failure leaves KitsuNexus open and reports the error.
📦 Downloads
- Windows:
KitsuNexus-Setup-1.0.71.exe(installer),KitsuNexus-Portable-1.0.71.exe, or.zip - Linux (x64):
.AppImage/.deb - Linux (arm64):
.AppImage/.deb
Installers are unsigned, so Windows SmartScreen may warn on first run — click More info → Run anyway.
🛡️ VirusTotal
- KitsuNexus-Portable-1.0.71-x64.exe: 0/61 engines flagged something — full report
- KitsuNexus-Setup-1.0.71-x64.exe: 0/56 engines flagged something — full report
- KitsuNexus-1.0.71-x64.zip: 0/49 engines flagged something — full report
Full Changelog: v1.0.70...v1.0.71
v1.0.70
Changed
- Updated the official Discord Rich Presence/RPC Application ID. KitsuNexus now pins
1536095795667795998in both the Electron main process and renderer. Related setup and
allowlist documentation now references the new application.
📦 Downloads
- Windows:
KitsuNexus-Setup-1.0.70.exe(installer),KitsuNexus-Portable-1.0.70.exe, or.zip - Linux (x64):
.AppImage/.deb - Linux (arm64):
.AppImage/.deb
Installers are unsigned, so Windows SmartScreen may warn on first run — click More info → Run anyway.
🛡️ VirusTotal
- KitsuNexus-Portable-1.0.70-x64.exe: 0/53 engines flagged something — full report
- KitsuNexus-Setup-1.0.70-x64.exe: 0/51 engines flagged something — full report
- KitsuNexus-1.0.70-x64.zip: 0/52 engines flagged something — full report
Full Changelog: v1.0.69...v1.0.70
v1.0.69
Added
- Project support and donation information. The README now documents ways to support
NekoSuneProjects, including hosting and maintenance goals, cryptocurrency options, GitHub
Sponsors, network-safety guidance, and thanks for financial and community contributions. - Reusable GitHub Actions packaging prompt. Added a Markdown prompt that can be copied into
other projects so Claude or another assistant asks for the current workflow first, explains
planned changes, researches whether the requested package targets are supported for that
project's stack, and then applies the same AMD64 Ubuntu self-hosted packaging approach where
possible. - Self-hosted runner troubleshooting notes. Added guidance for repeated GitHub runner AAD/RSA
credential messages and the Ctrl-CTaskCanceledExceptionshutdown block. These are runner
listener/service lifecycle logs rather than application packaging failures; running the runner
through its service wrapper is recommended instead of using an interactive terminal.
Changed
- The application is now KitsuNexus. Rebranded NekoSuneAPPSVRC throughout the desktop app,
standalone updater, package/bin metadata, Electron and Microsoft Store identities, Discord and
backend labels, release workflow, issue templates, documentation, policies, community-rank
wording, and user-facing runtime messages. The release version is now1.0.69. - Brand artwork and release filenames now match KitsuNexus. Updated the GitHub social preview,
Microsoft Store hero, and cute README banner without changing their fox artwork, then renamed
the three final PNGs fromnekosuneapps-*tokitsunexus-*and updated their references. - The Windows updater now lives outside the install directory. The packaged helper is copied
to%LOCALAPPDATA%\KitsuNexus\Update.exe, allowing normal app updates to replace files under
Program Files without replacing the running updater. Windows updates prefer published ZIP
packages and copy their contents in place while excluding the updater executable. - Portable installs keep their data beside the executable. A
portablemarker or existing
Datadirectory now redirects Electron's user-data path to the portable installation folder. - Release workflow now cross-builds desktop packages from one AMD64 Ubuntu runner. The GitHub Actions build matrix now targets Windows x64, Linux x64 and Linux arm64 while running every leg on the Linux X64 self-hosted runner. It installs Ubuntu build dependencies including Wine/NSIS where available, caches npm plus Electron downloads, uploads all generated packages, and keeps the existing tag-based release, VirusTotal and Discord announcement flow with updated artifact labels.
Fixed
- Updater handoff no longer depends on a helper inside the app being replaced. Startup now
bootstraps the external updater before update checks, and relaunch errors identify the expected
LocalAppData helper path clearly. - Language selection is easier to complete. The first-run language picker now has a compact,
responsive card, an explicit button type, and Enter-key submission.
📦 Downloads
- Windows:
KitsuNexus-Setup-1.0.69.exe(installer),KitsuNexus-Portable-1.0.69.exe, or.zip - Linux (x64):
.AppImage/.deb - Linux (arm64):
.AppImage/.deb
Installers are unsigned, so Windows SmartScreen may warn on first run — click More info → Run anyway.
🛡️ VirusTotal
- KitsuNexus-Portable-1.0.69-x64.exe: 0/51 engines flagged something — full report
- KitsuNexus-Setup-1.0.69-x64.exe: 0/54 engines flagged something — full report
- KitsuNexus-1.0.69-x64.zip: 0/54 engines flagged something — full report
What's Changed
- Make updater external (LocalAppData), add portable mode, prefer zip updates, and fix language picker by @NekoSuneVR in #14
Full Changelog: v1.0.68...v1.0.69
v1.0.68
Added
- New AI tab — AI features now live in one place. The IntelliChat (AI provider) settings and
the Voice Assistant were previously split across two unrelated tabs: IntelliChat was defined in
Settings but silently relocated at runtime onto the Translation tab, and the Voice Assistant sat
on the Translation tab next to the TTS/STT/OCR cards despite not being a translation feature.
Both now live on a dedicated AI tab, so configuring the AI provider and the assistant that
uses it happens in one spot. Translation keeps TTS, Desktop STT, OCR and the Translator.
Changed
- Sidebar regrouped into meaningful sections. The nav previously dumped 25 of its buttons
under a single "VRChat" heading, with unrelated items ("Social" holding Translation, OAuth) in
the wrong group. It's now split into VRChat, Friends & Social, Avatars & Media,
AI & Speech, Games, Tools, Integrations and General, so each feature sits
under a heading that describes it. No tabs were removed or renamed — only regrouped and
reordered. (Anyone who has drag-reordered their sidebar keeps their saved order; the new AI
button appends to the end.) - Tools and Games are now their own sidebar categories. Tools and Terrors were both sitting in
the "General" catch-all next to Settings/Docs/About/OSC Log, which buried them. Tools is now
its own heading holding Tools, VRChat Tools, OSC Apps and AudioLink — the utility tabs,
previously scattered between "General", "Integrations" and "VRChat". Games is its own
heading for Terrors of Nowhere, so game-specific pages have somewhere to live as more are added. - Heart Rate and Weather moved to Integrations. Both were listed under "VRChat", but neither
is a VRChat feature — they pull from external services (Pulsoid and the weather API) and feed
the result into VRChat, which is exactly what the other Integrations tabs do. Integrations now
holds Live, Discord, OAuth Accounts, Heart Rate, Weather and the OBS Overlay (the last moved out
of "General"), leaving General for Stats, Settings, Docs, About and OSC Log, and VRChat
for the tabs that actually drive VRChat itself.
Fixed
- Possible "Exception Processing Message 0xc0000005" crash dialog on launch. The VR Overlay's
koffiFFI binding was imported at the top level ofmodules/vr/overlay/openvrOverlay.js,
which is loaded at startup bymain.jsthroughvrOverlayController. Requiringkoffiitself
immediatelyLoadLibrarys its nativekoffi.nodeaddon, so every user performed a native
addon load on every launch just to have the VR Overlay available — with no headset and no
SteamVR needed to trigger it. If that native load faulted (a corrupted or antivirus-quarantined
.node, an ABI mismatch, or the binary missing from the packaged build) it took the whole app
down before any window existed, surfacing only as a bare Windows access-violation dialog with
no JS stack to diagnose.koffiis now loaded lazily on first actual VR Overlay use, matching
the existing lazy pattern used forffmpeg-staticandvrnotications, so a brokenkoffican
now only ever disable the VR Overlay feature itself instead of preventing startup. - Packaging: koffi's native binary is now explicitly unpacked from the asar.
asarUnpack
listednode_modules/koffi/**/*, but koffi 3.x ships its actual native binary in a separate
@koromix/koffi-win32-x64package, which was only being unpacked by electron-builder's
automatic.nodedetection rather than by intent. Addednode_modules/@koromix/**/*so a
future koffi restructure can't silently reintroduce the "can't dlopen from inside app.asar"
bug that was already fixed once in 1.0.64.
📦 Downloads
- Windows:
NekoSuneAPPS-Setup-1.0.68.exe(installer) or.msi - Linux (x64):
.AppImage/.deb - Linux (arm64):
.AppImage/.deb
Installers are unsigned, so Windows SmartScreen may warn on first run — click More info → Run anyway.
🛡️ VirusTotal
- NekoSuneAPPS-1.0.68-x64.exe: 0/53 engines flagged something — full report
- NekoSuneAPPS-Setup-1.0.68-x64.exe: 0/47 engines flagged something — full report
What's Changed
- 1.0.68: AI tab, sidebar regroup, 0xc0000005 startup crash fix by @NekoSuneVR in https://github.com/NekoSuneProjects/NekoSuneAPPS/pull/12
- CI: Self-hosted AMD64 packaging matrix with cross-builds, caches and artifact uploads by @NekoSuneVR in https://github.com/NekoSuneProjects/NekoSuneAPPS/pull/13
Full Changelog: NekoSuneProjects/NekoSuneAPPS@v1.0.67...v1.0.68
v1.0.67
Fixed
- Updater: fixed "Failed to uninstall old application files" (exit code 2) error. The NSIS
uninstaller was failing because NekoSuneAPPS processes were still holding file locks. The
updater now kills running NekoSuneAPPS instances before attempting uninstall, and if the
uninstaller still fails (exit code 2), it manually cleans up the install directory so the new
installer can proceed. Error messages also now suggest running the installer as Administrator. - Live Typing with Translation no longer lags while typing. Every keystroke was immediately
triggering a translation API call plus a redundant IPC round-trip to fetch translator settings
from disk. Added an 800ms debounce so translation only fires after the user pauses typing,
and cached translator settings for 5 seconds to eliminate per-keystroke IPC overhead. - Audio slider persistence no longer floods disk with writes. Dragging the gain/boost sliders
(and avatar scaling smoothing, background opacity/blur) was writing the entire electron-store
config to disk on every pixel of drag. All sliderinputhandlers now debounce their
saveSettingcalls by 300ms. - Rightbar friend search no longer freezes the UI on large friend lists.
renderRightbar
(which filters the full friend cache, builds HTML for all friends, and assignsinnerHTML) was
firing on every keystroke uncapped. Now debounced at 150ms. - ToN board search debounced at 150ms to prevent full DOM rebuilds on every keystroke.
- World name resolution now runs in parallel instead of sequential IPC round-trips. N unique
world IDs previously made N serial API calls; now usesPromise.allSettledfor uncached IDs
and a single DOM pass to apply results. - VR overlay capture no longer blocks the main process event loop. Replaced synchronous
writeFileSyncwithawait fs.promises.writeFileand added a minimized-window skip so captures
don't run when the app is hidden. - Photo Relay no longer re-uploads old images on startup.
fs.watchon Windows can fire
spurious events for existing files when the watcher starts, and theseenSet was empty on
startup, so every existing photo was treated as new. Now pre-scans the photos directory on
startup to populate theseenSet, and clears it on restart.
Changed
- Default NSIS install directory changed from AppData to Program Files (
${PROGRAMFILES}\NekoSuneAPPS).
Users can still choose a custom location during install. Existing installs in AppData are not
affected — the updater will continue to use whichever directory the previous install used.
📦 Downloads
- Windows:
NekoSuneAPPS-Setup-1.0.67.exe(installer) or.msi - Linux (x64):
.AppImage/.deb - Linux (arm64):
.AppImage/.deb
Installers are unsigned, so Windows SmartScreen may warn on first run — click More info → Run anyway.
🛡️ VirusTotal
- NekoSuneAPPS-Setup-1.0.67.exe: scan still in progress — check status
- NekoSuneAPPS-Setup-1.0.67.msi: scan still in progress — check status
Full Changelog: NekoSuneProjects/NekoSuneAPPS@v1.0.66...v1.0.67
v1.0.66
Added
- Discord Activity (live VRChat status panel) + an official shared Discord bot mode,
backed by a new standalone backend service that lives on its own branch in this repo
(feature/discord-backend-server,
its ownpackage.json/Docker deployment) rather than as a subfolder of the Electron app —
it's never bundled into an installer. This exists because a bot token — and the OAuth client
secret needed to identify users — can never be safely shipped inside a distributed Electron
app (the asar is trivially unpackable), so both now live only on this backend, which the
desktop app talks to over an authenticated HTTP API instead.- The backend runs a persistent
discord.jsgateway connection for the shared bot
(discordBotGateway.js), a Discord OAuth2 "identify" code exchange that never leaves the
server (auth.js,routes/oauth.js), a live VRChat status feed pushed by each desktop
client and re-filtered server-side through the same join/active/ask/busy privacy gate
already used for Rich Presence (statusStore.js,routes/status.js), and a static
Discord Activity iframe frontend (public/activity/) using@discord/embedded-app-sdk. - Electron gained a "Log in with Discord" flow (
modules/oauth/providers/discordIdentity.js,
modeled on the existing Twitch loopback OAuth pattern), a periodic status pusher
(modules/integrations/discord/statusPush.js, fed by a newgetVrcContextSnapshot()getter
ondiscord.jsso it reuses rather than re-derives the existing Rich Presence data), and an
"official bot" mode on the Voice Bot card (discordBot.js's newstartOfficialBot/
stopOfficialBot/setMuteOfficial/setDeafOfficial) that polls the backend instead of
running a local token-based gateway client, producing the identical state shape so the
existing OSC/chatbox pipeline needed no changes. - Defaults to the official
https://nekosuneappsvrc.nekosunevr.co.ukdeployment
(DEFAULT_NEKOSUNE_BACKEND_URLinmain.js), but — unlike the locked RPC app ID — this is
intentionally user-overridable: a new "Backend URL" field on the Voice Bot card
(nekosuneBackendUrlsetting) lets self-hosters point the app at their own deployment
instead, since a self-hoster runs their own bot/OAuth app entirely and needs nothing from
the official one. - Not deployed by this session — implemented and locally verified in isolation (backend
routes exercised directly over HTTP; every changed/new file passednode --checkand a
plain-Node require-resolution check), but end-to-end use requires actually deploying the
official host, filling in that branch's.envsecrets, and one-time Discord Developer
Portal setup (OAuth redirect + Activities URL Mapping) documented in that branch's
README.md.
- The backend runs a persistent
Changed
- Discord Rich Presence Application ID is now fixed and no longer user-editable. Previously
the "Discord Application (Client) ID" field defaulted to a shipped ID but users could freely
edit or clear it. It's now pinned to1534208250046578790at every layer — the input in the
Discord tab (index.html) is disabled/readonly,renderer.jsforces the saved config and every
outgoingdiscord:startpayload to this ID regardless of what's stored, andmain.js's
discord:startIPC handler overwritesclientIdon the way intostartDiscord()as a final
backstop. The Discord Voice Bot's separate "Application ID (for invite)" field is unaffected —
that's an optional user-supplied bot app ID, unrelated to Rich Presence.
Fixed
- "Invite link" on the Voice Bot card always showed "Connect first, or enter the Application
ID..." when the official NekoSuneAPPS bot mode was selected, even though that message only
makes sense for the bring-your-own-bot mode. Root cause: the button's click handler always
called the own-botapi.botInvite()path regardless of which mode was active, and the
official bot mode never setsdiscordBot.js's internalappId(that only gets set by a real
gateway login, which official mode doesn't do). Fixed by branching on the selected mode: in
official mode, the button now opens the backend's web dashboard
(<backend URL>/dashboard, newnekosune:getBackendUrlIPC handler +api.openExternal) in
the system browser instead, since that's the actual way to add the official bot to a server.
📦 Downloads
- Windows:
NekoSuneAPPS-Setup-1.0.66.exe(installer) or.msi - Linux (x64):
.AppImage/.deb - Linux (arm64):
.AppImage/.deb
Installers are unsigned, so Windows SmartScreen may warn on first run — click More info → Run anyway.
🛡️ VirusTotal
- NekoSuneAPPS-Setup-1.0.66.exe: 0/47 engines flagged something — full report
- NekoSuneAPPS-Setup-1.0.66.msi: 0/51 engines flagged something — full report
What's Changed
- Lock Discord RPC app ID; add official bot/Activity client support by @NekoSuneVR in https://github.com/NekoSuneProjects/NekoSuneAPPS/pull/11
Full Changelog: NekoSuneProjects/NekoSuneAPPS@v1.0.65...v1.0.66
v1.0.65
Added
- Weather is now a first-class Chatbox source, same as Now Playing/Stats/Heart Rate: a
"Weather" row on the Chatbox tab's per-source grid with its own Off / Own line / Rotate toggle
(modules/vrchat/chatbox/chatboxComposer.js). Previously the only way to see weather in
VRChat's chatbox was to manually type the undocumented{weather}token into a Status preset,
where it silently competed with every other preset for the single shared rotation slot — easy
to set up and still never actually see it show up.{weather}still works in presets too. Also
added{weather}to the Chatbox tab's "Show all tokens" reference list, where it was missing
entirely.
Fixed
- Linux build could freeze into "Not Responding" when using OSCQR/ShazamOSC's capture-source
picker. Root cause:oscApps:captureSources(main.js) calleddesktopCapturer.getSources()
with no error handling and no timeout — under Wayland (GNOME/KDE's default now) without a
PipeWire screen-cast portal available, that call can hang indefinitely instead of failing,
leaving the awaiting main-process IPC handler stuck forever and freezing the whole app, not
just erroring in the OSC Apps tab (which is the "Failed to get sources" message actually
reported). Fixed by: enabling Chromium's PipeWire capturer + Ozone auto platform hint on Linux
startup so capture has a real chance of working under Wayland; wrapping both
desktopCapturer.getSources()call sites in a 6s timeout race so a missing portal fails fast
instead of hanging forever; and having the IPC handler resolve with anerrorfield instead of
rejecting, so the renderer always gets an answer either way. crashGuard.js(auto-rejoin after a real VRChat crash) had no platform guard and ran
Windows-only commands (tasklist,reg query, PowerShellGet-WinEvent) unconditionally every
15 seconds on every platform, including Linux/Mac, where those commands don't exist — each tick
spawned a shell that just failed (ENOENT) for a feature that could never actually detect a
crash there anyway. Now a no-op off Windows, matching every other Windows-only module in this
codebase.- Packaging:
koffi's native binaries (used by the VR Overlay's OpenVR bindings) weren't in
asarUnpack, so on any platform they'd fail todlopenfrom inside the packaged app.asar the
moment that code path is required. Addednode_modules/koffi/**/*toasarUnpack. - Packaging: the Linux build had no
filesoverride, unlike Windows, so it silently inherited
the broad top-levelfiles: ["**/*"]glob and shipped extra non-runtime files the Windows
installer already excludes. Linux now uses the same explicit file whitelist as Windows.
📦 Downloads
- Windows:
NekoSuneAPPS-Setup-1.0.65.exe(installer) or.msi - Linux:
.AppImage/.deb
Installers are unsigned, so Windows SmartScreen may warn on first run — click More info → Run anyway.
🛡️ VirusTotal
- NekoSuneAPPS-Setup-1.0.65.exe: 0/55 engines flagged something — full report
- NekoSuneAPPS-Setup-1.0.65.msi: 0/43 engines flagged something — full report
Full Changelog: NekoSuneProjects/NekoSuneAPPS@v1.0.64...v1.0.65