Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

The Launcher

Double-click, click Launch, you’re in — with your password in the OS credential store instead of your shell history.

What it’s for

You play more than one character, and you would rather not retype an eAccess account, a game world, and a port every time. The Launcher keeps each of those as a named connection you click once. Passwords go into Windows Credential Manager, the macOS Keychain, or the Linux secret service — never into a file, never onto a command line where every process on the machine can read it. Each Launch starts a separate session process, so running four characters at once is four clicks.

📷 screenshot pending
The VellumFE Launcher window: the heading VellumFE, the line Choose a connection to launch, and two saved connections, each with Launch, Edit and Delete buttons.

Set it up

The Launcher is a desktop window, so this is a frontend split: it belongs to the desktop GUI, and the terminal and mobile tabs say what you use instead.

  1. Start vellum-fe with no arguments — double-clicking does exactly this — or run vellum-fe --launcher if you want it from a terminal.
  2. Click ➕ New connection. The form is headed New connection.
  3. Fill in Name (this is also what --launch-profile takes), then choose Connection: Direct to reach the game through eAccess with no Lich, or Lich to attach to a detachable-client Lich you are already running.
    • Direct shows Account, Password, Save password, Game, and Character.
    • Lich shows Host, Port, and Character.
  4. Tick Save password if you want it remembered. Leave it unticked and the Launcher asks each time.
  5. Click Save.
  6. Back in the list, click Launch on the row you just made.

Expected result: the row appears with your name in bold and a summary beneath it — Nisugi @ GemStone IV for direct, or Nisugi via Lich @ 127.0.0.1:8000 for Lich. Clicking Launch opens a session window and the status line at the bottom reads Launched <name>.

📷 screenshot pending
The New connection form in Direct mode, showing Account, the masked Password field with its 👁 reveal button, Save password, the Game dropdown and Character.

Common setups

One account, several characters, all at once

Make a connection per character, all pointing at the same Account:

  1. ➕ New connection → Name Nisugi, Direct, Account MYACCT, Password once, Save password ticked, Game GemStone IV, Character Nisugi. Save.
  2. ➕ New connection → Name Alt, same Account MYACCT, leave Password blank, Save password still ticked, Character Alt. Save.
  3. Click Launch on both rows.

The saved password is keyed by account, not by connection, so the second one reuses the first’s stored password without you typing it again. Because each Launch spawns its own process, both characters run side by side with independent layouts.

→ Two session windows are open, each showing its own character, and the Launcher’s status line shows Launched Alt from the last click.

A connection that starts in the terminal instead

The Launcher defaults everything to the desktop GUI. To make one connection open the text interface:

  1. Edit the connection.
  2. Open the Advanced fold.
  3. Set Frontend to Terminal.
  4. While you are there, set Color mode to direct for true-color terminals, and tick PaletteSet up on startup if you use slot mode on a 256-color terminal. These two rows only appear when Frontend is Terminal.
  5. Save, then Launch.

→ A console window titled VellumFE opens running the terminal frontend, and it remembers its size and position the next time you launch that connection.

Serve this session to your phone

In the connection’s Advanced fold:

  1. Tick Web dashboardEnable on port and leave 8484.
  2. Set Bind address to 0.0.0.0 — the hint beside it reads 0.0.0.0 = allow LAN devices. Leaving it at 127.0.0.1 restricts the server to the machine it runs on.
  3. Save, Launch, then browse to http://<your-pc-ip>:8484/play on the phone.

→ The phone shows the live session, driven by the same core the desktop window is rendering.

Tips & gotchas

⚠️ The Launcher defaults to the GUI; a hand-typed command line defaults to the TUI. A new connection is created with Frontend: GUI, but vellum-fe invoked with flags uses --frontend tui unless you say otherwise. The same character launched two ways can land in two different interfaces. Set it explicitly under AdvancedFrontend, or pass --frontend gui.

⚠️ Deleting a connection can delete the saved password with it. The confirmation window Delete profile? says so: the keyring entry is removed unless another connection still uses the same account. Deleting your only MYACCT connection means the next one has to re-enter the password.

  • “Password was NOT stored” in red means the credential store refused the write — common on headless Linux, inside WSL, or under a bare window manager with no secret service running. The connection still saves and still launches; you are asked for the password each time. Install a secret service (GNOME Keyring, KWallet) to fix it.
  • A red line about launcher.toml on startup means the file could not be parsed. The Launcher deliberately shows the error rather than starting with an empty list, because saving from an empty list would overwrite your connections. Fix the file before saving anything.
  • Connection names cannot contain " or %. The Launcher rejects them at save time, because a terminal session’s name travels through a Windows cmd command line where neither can be passed safely.
  • Renaming a connection does not duplicate it. The edit form tracks the name you started with and replaces that entry.
  • The account name is not shown in the list. Each row’s summary is <character> @ <game> on purpose — the list is on screen constantly, and in screenshots. The account stays inside the edit form.
  • Nothing in the list? “No saved connections yet” with Create one to get started is the empty state, not an error.

The other launcher: cold-starting Lich over SSH

There is a second, separate feature with a confusingly similar name. The SSH Launcher does not manage connections — it starts a headless Lich on your home PC from wherever you are, over an existing WireGuard or Tailscale tunnel, then attaches to it. Use it when the machine that runs Lich is not the machine you are sitting at.

It lives inside a running session, not in the Launcher window:

  • Type .launcher (or bare .launch) in the command input to open the SSH Launcher panel.
  • Fill in Host (tunnel address), User, SSH port, Remote OS, optionally Attach host, and the Launch command template — where {character}, {game} and {port} are substituted per character.
  • Click Generate new key, then Copy public key and paste that one line into ~/.ssh/authorized_keys on the home PC. The private half goes to your OS secure store; the indicator changes to ✓ key stored. Expand Harden it (recommended) to see the restrict,command="…" prefix that limits a leaked key to launching the game and nothing else.
  • Add each character under Characters with its game token and its own detachable-client Port, then Save.
  • Run it with .launch <character>.

If a Lich is already listening on that port, the flow skips the SSH step entirely and attaches straight away. If not, it SSHes in, spawns Lich detached so it survives the SSH channel closing, then polls the port. The open port — not the spawn’s exit code — is what counts as success, so a message like “Launched Lich but 100.64.0.5:8001 never opened” means the command template or the character name is wrong, and the spawner’s own output is appended to tell you which. On a first connection the host key’s fingerprint is pinned; if a pinned key ever changes, the launch is refused outright rather than prompting.

.launch Nisugi reports progress in the session and ends attached to the freshly started Lich.

See also

Config reference (TOML)

~/.vellum-fe/launcher.toml — the Launcher’s connections

Written by the Launcher as [[profiles]] entries. No passwords are ever written here.

FieldTypeDefaultWhat it does
namestring(required)Display name and the key --launch-profile takes. Cannot contain " or %.
mode"direct" | "lich"(required)eAccess login, or attach to a running Lich.
accountstring""play.net account (direct only). Keys the saved password.
gamestring"prime"One of prime, platinum, shattered, test, dr, drplatinum, drfallen, drtest.
password_savedboolfalseTrue when a password for account is in the OS credential store.
characterstring""Character to log in as; also selects that character’s settings and layout.
frontend"gui" | "tui""gui"Note the default differs from the CLI’s --frontend tui.
hoststring"127.0.0.1"Lich host (lich mode).
portu168000Lich detachable-client port (lich mode).
custom_launchstringunsetFull Lich launch line; when present, connecting probes the port and SSH-launches Lich if it is down.
web_portu16unsetEnables the embedded web server on this port.
web_bindstringunset (= 127.0.0.1)0.0.0.0 lets other devices on your network connect.
nosoundboolfalseSkip audio device initialization entirely.
settings_profilestringunsetUse this settings folder instead of the character name, so several characters can share one setup.
data_dirstringunset (= ~/.vellum-fe)Per-connection override of the base directory.
color_mode"direct" | "slot"unsetTerminal color rendering (terminal frontend only).
setup_paletteboolfalseRun .setpalette at startup (pairs with slot).

Passwords are stored through the keyring crate under the service id vellum-fe, keyed by the lowercased account name. A just-typed password handed to a spawned session travels in the private VELLUM_FE_PASSWORD environment variable, which the session consumes and removes immediately — never on a command line.

~/.vellum-fe/ssh-launcher.toml — the SSH Launcher

Written by the SSH Launcher panel. No key material is ever written here.

FieldTypeDefaultWhat it does
ssh.hoststring""Tunnel address of the home PC.
ssh.userstring""SSH user on the home PC.
ssh.portu1622SSH port.
ssh.remote_os"windows" | "unix""windows"Chooses the detach mechanism for the spawned process.
ssh.lich_commandstring""Launch template. {character}, {game} and {port} are substituted; quoted paths are split correctly.
ssh.attach_hoststring""Where to attach after launch. Empty falls back to ssh.host.
ssh.key_savedboolfalseTrue when the ed25519 private key is in the OS secure store.
characters.<Name>.gamestring(required)Game token substituted into {game}gemstone for GS4.
characters.<Name>.portu16(required)That character’s detachable-client port. Give each character its own.

The private key is stored under the same vellum-fe keyring service with the account prefix ssh-launcher-key:, so it can never collide with a play.net password. Host keys are pinned on first use to ~/.vellum-fe/ssh-launcher-known-hosts, which is separate from your personal ~/.ssh/known_hosts — VellumFE never touches your own SSH state.