Screen-reader accessibility mod for Melatonin using MelonLoader.
- Install MelonLoader for Melatonin: https://github.com/LavaGang/MelonLoader.Installer/releases
- Download the latest release ZIP, for example
MelatoninAccess-v1.4.zip. - Open the ZIP, press
Ctrl+A, pressCtrl+C, then paste everything into your Melatonin folder, the folder that containsMelatonin.exe. - Confirm these files exist after pasting:
Mods/MelatoninAccess.dllMods/cutscene-ad/manifest.jsonMods/localization/loc.en.jsonTolk.dllnvdaControllerClient32.dllUserData/Loader.cfg
- Start the game and confirm you hear the mod loaded announcement.
Important:
Tolk.dllandnvdaControllerClient32.dllmust stay in the main game folder besideMelatonin.exe, not insideMods.cutscene-adandlocalizationmust stay inside theModsfolder.
Speech goes through VoiceOver. Turn VoiceOver on before you start the game.
Your Melatonin folder is:
~/Library/Application Support/Steam/steamapps/common/Melatonin
The macOS release ZIP contains an installer. Download and open
MelatoninAccess-v1.4-macOS.zip, then open install-macOS.command. In
Finder, select it and press Command-O, or use VoiceOver's Open command.
It finds the game, installs the mod, and unblocks everything so macOS will load it. Then it shows you the one remaining step, which has to be done in Steam itself: the launch options line appears in a text field you can read and copy from, with a Copy To Clipboard button if you want it on the clipboard.
If MelonLoader is not installed yet, the installer offers to open the download page for you, and then lets you pick the downloaded ZIP from a file dialog. It does not go looking through your Downloads folder, because macOS would ask Terminal for permission to read it.
If Finder refuses to run it, right-click it, choose Open, and confirm.
If you extracted the ZIP into Downloads, Desktop or Documents, macOS may stop the installer reading the mod files out of it. The installer notices and asks you to choose the folder yourself, which is what grants permission. Extracting somewhere else, such as your home folder, avoids it entirely.
If you would rather do it by hand, or the installer cannot find something, the full steps are below.
The level editor. Everything else -- menus, gameplay, map, dialog, cutscenes, results -- has been played through on macOS and works. The editor loads and looks right, but its narration has not been exercised properly, so treat it as unverified rather than known-good. Please report anything that misbehaves there.
Open uninstall-macOS.command from the same release ZIP. It asks about each
thing that is installed -- Melatonin Access, then MelonLoader -- and removes
only what you say Remove to, after one confirmation. MelonLoader ships no uninstaller of its own, which is why it is
offered here.
Your other mods, your settings in UserData, and anything you put in
UserLibs are left alone. If you remove MelonLoader, clear the Steam launch
options as well, or the game will not start.
Download the ZIP, not the DMG. MelonLoader's macOS installer is a .dmg
file, and macOS refuses to open it with a message saying it is damaged. The
file is fine. macOS blocks it because the app is not signed by an Apple
developer account. The ZIP avoids the problem entirely.
-
Download
MelonLoader.macOS.x64.zip. Do not downloadMelonLoader.Installer.MacOS.dmg.This is the correct file on both Intel and Apple Silicon Macs. Steam runs Melatonin in Intel mode on Apple Silicon, so the x64 build is the one that matches. There is no separate Apple Silicon download.
-
Open the ZIP. Copy these three items into your Melatonin folder, beside
Melatonin.app:MelonLoader.Bootstrap.dylibmelonloader-launch.sh- the
MelonLoaderfolder
-
Open Terminal and run these two commands. The first lets macOS load the files you just copied, the second makes the launch script runnable:
xattr -dr com.apple.quarantine ~/Library/Application\ Support/Steam/steamapps/common/Melatonin chmod +x ~/Library/Application\ Support/Steam/steamapps/common/Melatonin/melonloader-launch.sh
Steam will not load the mod on its own. You have to point it at MelonLoader's launch script.
-
In Steam, right-click Melatonin, choose Properties, then General.
-
Find the Launch Options box and paste this in, replacing
YOURNAMEwith your Mac user name:"/Users/YOURNAME/Library/Application Support/Steam/steamapps/common/Melatonin/melonloader-launch.sh" %command%Type the path out in full. Steam does not understand
~here, and a shortened path will fail. -
Close the window.
-
Download the macOS release ZIP, for example
MelatoninAccess-v1.4-macOS.zip. -
Open the ZIP and copy the
ModsandUserDatafolders into your Melatonin folder. -
Confirm these files exist after copying:
Mods/MelatoninAccess.dllMods/libprism.dylibMods/cutscene-ad/manifest.jsonMods/localization/loc.en.jsonUserData/Loader.cfg
-
Run this command so macOS will load the speech library:
xattr -dr com.apple.quarantine ~/Library/Application\ Support/Steam/steamapps/common/Melatonin/Mods
-
Start Melatonin from Steam. You should hear the mod loaded announcement.
On macOS the speech library is Mods/libprism.dylib, and it goes inside
the Mods folder. There is no Tolk.dll or nvdaControllerClient32.dll on
macOS; those are Windows only.
Almost always one of two things. Check the MelonLoader log:
tail -30 ~/Library/Application\ Support/Steam/steamapps/common/Melatonin/MelonLoader/Latest.log- The log has no entry from this launch. Steam did not use MelonLoader.
Re-check the Launch Options in Step 2, especially the quotes, the full
path, and the
%command%at the end. - The log says the speech library could not be loaded. macOS is still
blocking
libprism.dylib. Run thexattrcommand from Step 3 again, or open System Settings, go to Privacy & Security, and choose Allow Anyway next to the blocked file.
When it is working, the log contains:
Prism (VoiceOver (macOS)) loaded successfully
- Spoken menu navigation and option state announcements.
- Contextual tutorial and gameplay cue announcements.
- Tutorial, dialog, and popup reading.
- Map navigation support, including fast landmark teleport.
- Results and stage-end announcements, including lock reasons.
- Credits narration while entries scroll.
- Full level editor narration, including cursor, tools, advanced menu, and timeline tabs.
- Mod-generated speech in all game-supported languages.
- Toggleable announcement groups through
MelonPreferences.
- Title screen: press Action to begin. Press the language key, default
Tab, to change language. - Menus:
UpandDownmove, Action confirms, Cancel goes back. - Map:
[and]jump between landmarks. - Map fallback: if Action is bound to
[or], useF9for previous andF10for next. - Gamepad map jump: use
Action LeftandAction Right, commonlyLBandRB. - Map summary: press
F1on map scenes to hear total stars, rings, and perfect runs. On chapters 1-4 it also says how many more stars are needed to pass. - Context help: press
F11to hear the available controls for the current screen.
F1: on map scenes only, speak chapter progress totals for stars, rings, and perfect runs.F2: turn contextual cue announcements on or off.F3: turn menu position announcements on or off.F11: speak context help for the current screen.F12: turn debug logging on or off.
F2, F3, and F12 save immediately and keep their state after restart.
Mod-generated announcements follow the in-game language. Supported languages match the game language menu:
- English
- Simplified Chinese
- Traditional Chinese
- Japanese
- Korean
- Vietnamese
- French
- German
- Spanish
- Portuguese
Settings are stored in UserData/MelonPreferences.cfg under the MelatoninAccess category.
AnnounceMapHotspots: map arrival and teleport destination speech.AnnounceRhythmCues: contextual tutorial and gameplay cues.AnnounceMenuPositions: position context such as1 of 4.AnnounceTutorialDialog: tutorial and dialog narration.AnnounceCreditsRoll: credits title and scrolling names.DebugModeEnabled: debug logging state used byF12.
Note:
- The config key
AnnounceRhythmCuesis a legacy name. It controls contextual cues.
Use the wrapper scripts instead of raw dotnet build.
Build only:
pwsh -File .\scripts\Build-Mod.ps1Build and copy the mod into the game Mods folder:
pwsh -File .\scripts\Deploy-Mod.ps1The local scripts currently default to:
L:\SteamLibrary\steamapps\common\Melatonin
If your install is somewhere else, pass -GamePath.
The PowerShell scripts are Windows only. On macOS, build with Mono's msbuild directly. No .NET SDK is needed.
msbuild MelatoninAccess.csproj /t:Restore
msbuild MelatoninAccess.csproj /t:Build /p:Configuration=ReleaseThe project finds the game automatically in the stock Steam location. Point
it elsewhere with /p:GameRoot="/path/to/Melatonin". The build copies the
mod into the game's Mods folder when that folder exists.
dotnet build works too if you have the .NET SDK, and is what CI uses.
The QA scripts are PowerShell. Install it with brew install powershell and
scripts/build-release-macos.sh will run them as part of packaging; without
it the script warns and stamps QA: NOT RUN on the package.
pwsh -File .\scripts\Build-ReleasePackage.ps1 -Version "v1.4"This creates a copy-paste-ready ZIP with this runtime layout:
Mods/MelatoninAccess.dllMods/cutscene-ad/manifest.jsonMods/cutscene-ad/scripts/*.jsonMods/localization/loc.<lang>.jsonTolk.dllnvdaControllerClient32.dllUserData/Loader.cfg
The release ZIP intentionally leaves out development docs, logs, and regression scripts.
./scripts/build-release-macos.sh --version v1.4This produces release/MelatoninAccess-<version>-macOS.zip with the same
layout, except that the speech library is Mods/libprism.dylib instead of
the Windows Tolk.dll and nvdaControllerClient32.dll, and a
README-macOS.txt is included for end users.
Two things the script does deliberately:
- It refuses to package
libprism.dylibunless it is a universal binary (x86_64 and arm64). A single-architecture build works on the machine that made it and silently fails on other Macs, leaving users with a mod that loads but never speaks. - It clears extended attributes before zipping, so a quarantine flag on the build machine is not baked into the published archive.
The localization and cutscene QA checks are PowerShell. They run only if
pwsh is installed; otherwise the script warns and records QA: NOT RUN in
its summary. Those checks cover platform-independent data, so a Windows build
of the same commit covers them.
Speech regression check:
pwsh -File .\scripts\Test-SpeechRegression.ps1Localization coverage check:
pwsh -File .\scripts\Test-LocalizationQA.ps1Cutscene audio-description data check:
pwsh -File .\scripts\Test-CutsceneAdPipeline.ps1For cutscene authoring details, see docs/cutscene-ad-pipeline.md.
Extract Unity assets from the installed game:
python .\scripts\extract_unity_assets.py --output-dir .\artifacts\asset-extractIf you like the project, you can support it here: https://buymeacoffee.com/potatophones
- Thanks to luyi for testing and Chinese localization fixes.
- Thanks to dreamburguer for Spanish localization fixes.