Cloudward
Sync your Outward saves across devices via a mounted/shared folder: boot-time reconcile, offline-first play, fork detection/resolution, crash-safe session lock. Verified across real devices; some offl
About this mod Author’s original text
Cloudward — sync your saves across devices
📖 Full documentation: Cloudward wiki page
Actively in use across real devices. The compute layer (mount guard, fork detection, lock/lease,
reconciliation) is fully unit-tested, and the full sync loop — boot-time reconcile, offline play,
clean two-device handoff, and both paused and auto fork resolution — has been live-verified across
real physical machines over a real NAS share, including three bugs found, fixed, and re-verified in
that process. Still being staged: some offline/reconnect edge cases and crash-recovery scenarios
that need a human at the keyboard to exercise. It is inert by default (Enable=false) —
installing it changes nothing until you turn it on. Back up your SaveGames/ folder before your
first real sync.
Outward has no built-in way to carry a save between two computers — Steam Cloud is deliberately
unsupported for it. Cloudward fills that gap: point it at a folder mounted on every device you play
on (a NAS share, a Syncthing folder, a mapped drive) and it keeps your character in sync.
Requires: BepInEx 5 (Outward's Mono branch — see Compatibility) and ForgeKit. No
SideLoader.
Installing
Install and the dependency comes with it. Installing by hand: drop ForgeKit/ and
Cloudward/ side by side into BepInEx/plugins. If BepInEx logs a dependency error and refuses to
load Cloudward, ForgeKit is missing.
How it works
The game always writes to its own local save folder — Cloudward never redirects that. The mount
you point it at is a synced replica, not the source of truth:
- At boot, Cloudward reconciles: it pulls in anything newer on the share before the character list
loads, so a character you played on another device shows up here.
- While you play, completed save snapshots push out to the share once you're online and holding
the sync lock.
- Offline just works. No mount, no marker, or another device holding the lock — Cloudward plays
entirely from local and catches up next time it can reach the share.
A marker file in the mount root is how Cloudward tells "actually mounted" from "empty directory
because the share isn't connected right now" — an unmounted mountpoint looks exactly like an empty
folder to your OS, so without the marker a sync could silently start writing to local disk instead of
the share. Cloudward creates the marker itself on first run when it can positively confirm the
folder is a real mount — the share already holds save data, or the platform probe sees it in the
mount table (native Linux /proc/mounts, or a Windows network drive / UNC path). It remembers doing
so per mount path, so a later launch with the share disconnected is correctly read as "offline",
not re-marked onto the placeholder. Under Proton (Linux / Steam Deck) an empty first-run share can
never be confirmed — the game-side process only sees Wine drive paths, so the probe can't reach the
mount table. That's expected: Cloudward stays offline, logs the instruction, and you run the
syncmarker command once (or touch the marker file) to bless the share; after that everything is
automatic. Set AutoCreateMarker=false for strict manual setup, where syncmarker is always
required.
A session lock (a small heartbeat file on the share) makes sure only one device pushes at a time.
It's crash-safe: a lock whose heartbeat goes stale (the device crashed, lost power, whatever) is
reclaimed automatically — nothing can wedge your saves.
If two devices genuinely diverge
If the same character was played offline on two devices before either could sync, Cloudward resolves
it automatically per the [Sync] ForkResolution setting — and always backs up the version it
doesn't keep to.cloudward-forks, so nothing is ever lost:
- NewestWins (default) — keep whichever device has the most recent in-game save.
- ThisDevice / OtherDevice — always keep this / the other device's version.
- KeepBoth — keep this device's version live and preserve the other (v1: a restorable backup; a
true second s
Install & use Install: BepInEx plugin
- The archive from playbuff is the mod itself — usually a BepInEx plugin (a .dll or a plugin folder once unzipped).
- Recommended: use a community mod manager (such as r2modman) — pick this game, import the mod, and the manager sets up BepInEx and its dependencies for you.
- Manual route: install the BepInEx loader in the game folder, then drop the unzipped .dll or plugin folder into BepInEx/plugins/.
- Launch the game — the BepInEx console logs every plugin it loads; seeing this mod in the log means it is installed.
Mods with listed dependencies need those installed too, or they will not load. Options are usually changed in-game or in the plugin's config file.
Install these first, or the mod will not work: