Opt-in fixed-world startup for isolated Linux Valheim test profiles. Source/developer preview.
  • Python 63%
  • C# 37%
Find a file
2026-10-02 15:20:19 -05:00
src Publish StraightToWorld 0.1.0 isolated Linux source preview 2026-10-02 15:20:19 -05:00
tests Publish StraightToWorld 0.1.0 isolated Linux source preview 2026-10-02 15:20:19 -05:00
.gitignore Publish StraightToWorld 0.1.0 isolated Linux source preview 2026-10-02 15:20:19 -05:00
build.py Publish StraightToWorld 0.1.0 isolated Linux source preview 2026-10-02 15:20:19 -05:00
launch.py Publish StraightToWorld 0.1.0 isolated Linux source preview 2026-10-02 15:20:19 -05:00
LICENSE Publish StraightToWorld 0.1.0 isolated Linux source preview 2026-10-02 15:20:19 -05:00
PUBLISHING.md Publish StraightToWorld 0.1.0 isolated Linux source preview 2026-10-02 15:20:19 -05:00
README.md Publish StraightToWorld 0.1.0 isolated Linux source preview 2026-10-02 15:20:19 -05:00
steam_cloud_probe.py Publish StraightToWorld 0.1.0 isolated Linux source preview 2026-10-02 15:20:19 -05:00
stw_common.py Publish StraightToWorld 0.1.0 isolated Linux source preview 2026-10-02 15:20:19 -05:00

StraightToWorld

An opt-in, fixed-world startup bootstrap for isolated Valheim test profiles.

Status: 0.1.0 source/developer preview. Linux only. Not a general-purpose mod-manager install, not published on Thunderstore.

Pick one existing local character and world in a separate profile, launch through the guarded launcher, and enter that world without character/world-selection clicks. The startup hook is removed after the initial menu starts. A bounded observer verifies the local player is alive and loading is finished, then disables itself. There is no gameplay controller or continuing game-state interface.

Existing alternatives — start here for normal play

Automatic world entry is not a new idea, and this project does not claim otherwise:

  • QuickLaunch by Landoria resumes the last local or multiplayer session and skips the cinematic. Version 1.0.11 was uploaded September 24, 2026; its changelog explicitly covers Valheim 1.0.x and BepInEx 5.4.2351. Source.
  • DirectPlay by CookiexMilk advertises direct loading of configured or recently selected characters/worlds and servers. Version 1.0.1 was uploaded December 5, 2025. Compatibility with the build used here has not been independently tested.
  • Simple Auto Game Start is an older, deprecated configured single-player startup mod.

These were missed in the initial research that led to the private prototype. They should have been evaluated first. For ordinary last-session resume, evaluate QuickLaunch before adopting this narrower tool. Neither alternative was installed or executed during the publication audit.

StraightToWorld's focus is different: explicit test targets, a separate HOME/XDG/save directory, local-only startup, read-only Cloud checks, and a one-shot setup boundary. These safeguards are useful for repeatable development fixtures; they do not establish that other mods lack comparable safeguards, nor do they justify a second generic auto-resume product.

What it does — and does not do

  • Requires explicit opt-in and exact character/world identifiers; does not pick a recent save or create one.
  • Requires a separate Linux profile HOME/XDG/save root and one matching -savedir argument.
  • Rejects symlinked target paths, incompatible or ambiguous saves, remote-join arguments, pending joins/invites, and missing targets.
  • Starts through Valheim's normal character/world-selection APIs with open/public/crossplay disabled.
  • Refuses to launch alongside another native Valheim process or when Steam reports that Valheim Cloud is enabled. It does not change Cloud settings.
  • Checks build-receipt hashes before launching; changed qualified dependencies require a rebuild and requalification.
  • Attempts startup once per process. Logout does not trigger another automatic load.
  • Observes readiness for at most 90 seconds and then stops on either success or failure. Failure is logged, not retried; the game is not force-killed.
  • Does not install BepInEx, download dependencies, clone saves, change the normal Steam launch options, select a GPU, or modify the normal game directory.
  • Does not provide server hosting, multiplayer auto-join, console cheats, gameplay automation, private game-state tracking, or a security sandbox.

Intro scope: this plugin bypasses selection menus, not every publisher splash or cinematic. Configure the game's native startup-cinematic skip setting in the separate test profile if desired. This is not a promise to reduce asset/world loading time.

Validation boundary

The private, hardcoded precursor compiled against Valheim l-1.0.16, Steam build 25527674, with BepInExPack_Valheim 5.4.2351. One live cold start entered a copied local world without menu input. A bounded controls smoke check and original-save hash comparison passed; one independent review reported no findings.

This public preview generalizes identities and paths. That precursor's live result is not a live test of this public revision. The public revision passed 24 offline unit tests, compiled against the same owner-supplied game/BepInEx references, and received one independent source review with no blocking findings. The publication set was checked against an explicit ten-file text-only allowlist. No additional game session was launched to publish this source. Windows, Proton, Xbox, multiplayer, other game builds, long-running reliability, and restart/reconnect behavior are not qualified.

Safety and setup

Use disposable copies of a character and an already completed world save. Back up first and finish the source game's normal save/quit before copying. Keep original saves and credentials outside the test profile. A separate HOME is filesystem routing, not access control: the native process still runs as your desktop user.

The copied profile must already have any required first-run acceptance/preferences. Keep Steam running under your normal desktop account, and disable Valheim's per-game Cloud setting yourself if it is not already disabled. The launcher only reads the setting and refuses otherwise. It must never silently change global Steam Cloud.

Supply your own legally installed game and a separately obtained BepInExPack_Valheim. No game assemblies, decompiled game sources, BepInEx binaries, SDK, saves, private launch receipts, or credentials are distributed in this repository.

Build and run explicitly

Requirements: Linux, Python 3 (standard library), a .NET 8 SDK, the installed game's valheim_Data/Managed directory, and the separately obtained BepInEx 5 BepInEx/core directory.

Build without downloading or copying proprietary references:

python3 build.py \
  --dotnet /path/to/dotnet \
  --sdk-dir /path/to/dotnet/sdk/8.0.425 \
  --managed-dir /path/to/Valheim/valheim_Data/Managed \
  --bepinex-core /path/to/test-home/runtime/BepInEx/core
python3 -m unittest discover -s tests -v

Outputs are build/StraightToWorld.dll and build/build-receipt.json, both ignored by Git. Manually place only the project's DLL at test-home/runtime/BepInEx/plugins/StraightToWorld.dll. Keep the build receipt for the launcher. Rebuilding does not itself establish live compatibility.

Prepare an isolated HOME containing .config, .local/share, .cache, the external runtime/, and saves/. Under saves/, copy the existing character into characters_local/ and the complete existing world into worlds_local/. Do not merge this with your normal profile. The Steam client/API must be reachable from the chosen environment; do not copy Steam credentials into it.

Read-only preflight (requires a running Steam client; this is not an offline test):

STW_ENABLE=1 python3 launch.py \
  --game-dir /path/to/Valheim \
  --runtime-dir /path/to/test-home/runtime \
  --profile-home /path/to/test-home \
  --original-home /path/to/normal-home \
  --save-dir /path/to/test-home/saves \
  --character test_character \
  --world TestWorld \
  --check

Only when the preflight succeeds and you intend to start the test game, repeat without --check. Character is the .fch filename stem; world is the exact world name/save basename. This preview supports identifiers containing only ASCII letters, digits, _ and - (1–64 characters); spaces and Unicode names are not supported. Never rename an original save just to satisfy this restriction.

The launcher supplies the plugin's STW_ENABLE, STW_CHARACTER, STW_WORLD, STW_SAVE_DIR, and STW_ORIGINAL_HOME environment contract and isolated HOME/XDG paths. Installing the DLL without the explicit opt-in does not auto-load a world. These variables and the separate-runtime workflow are deliberate developer-preview limitations, not a polished one-click mod-manager interface.

Source and publication

  • Canonical repository: Forgejo
  • Public mirror: GitHub
  • License: MIT, covering this project's original source only. Third-party components retain their own licenses.
  • AI-assisted implementation; reviewed and scoped by the operator. Treat the code and stated evidence—not generation method or delivery acknowledgements—as the basis for trust.
  • Thunderstore publication requirements and remaining gates.

To undo use: quit the test game normally and use the ordinary Steam launch. The separate profile/runtime can be retained without affecting that route. Do not point this launcher at the normal save directory to bypass its safeguards.