Wiki under construction. Many concepts here are from alpha 0.2 and may still change. The wiki will be finalised for version 1.0 — for now it's here to help closed testers and, later, early-access players find their way around. For the most up-to-date and accurate info, join the Discord — that's where changes are announced first and where you can ask directly.

Join the Discord for the latest info

Settings (in career)

The in-career Settings app — language, units, UI and HUD scale, all changeable without leaving your save.

Work in progress. First draft is here, but content may evolve and screenshots are still being added. Spotted something wrong? Tell us on Discord.
On this page

The in-career Settings app is a deliberately small screen: three sections — Language, Units, UI Scale — that you can reach without leaving a save. It exists so you can fix the two things most likely to bite mid-career (text too small at high resolution, wrong speed unit) without a trip back to the main menu. Every control writes to the same config.db keys the main-menu Settings uses, so the two screens are always in agreement.

How to open it

  • Sidebar → Settings (icon 19, directly above Log Out). Available in every phase and in season.
  • Escape, B, or the header’s Back button closes it.

There is no Save button and no Apply button. Every click writes to disk and takes effect immediately.

Language

A row of flag buttons, one per available language. The active one is filled charcoal with an amber border; hovering any of them shows the language’s own name in a hover-help bubble. A language whose flag image is missing falls back to its uppercase code.

Six built-in languages ship with the game:

CodeNameFlag
enEnglishgb
frFrançaisfr
esEspañoles
itItalianoit
deDeutschde
pt-BRPortuguês (BR)br

On top of those, the list is scanned from mods/lang/*.txt at the moment the screen opens: any community language pack found there is offered too, using the #name: and #flag: header lines inside the file for its label and flag. A pack cannot shadow a built-in — a mods/lang/fr.txt is ignored in favour of the shipped French. In the Steam Next Fest demo build, mod support is compile-time disabled and only the six built-ins are listed.

Switching is a hot switch — no restart, no reload of the save:

  1. The dictionary for the new code is loaded.
  2. A global translation epoch counter is bumped, which invalidates every cached parsed template across the game (template caches mix the epoch into their variable hash).
  3. ui/language is written to config.db.
  4. This screen drops its own cached template so it re-renders in the new language on the same frame.

Selecting an unknown code silently falls back to en.

One deliberate exception: the tutorial voice-over is keyed by step id, so the spoken guidance stays English in every language even when the on-screen text translates.

Appearance

One button, Theme: Light / Theme: Dark. It flips the whole interface between the light beige palette and the dark, low-glare one — every career screen, dialog and hover bubble at once (the race view is unchanged). The choice is written straight away and is the same setting as Dark Mode in the main-menu Settings → Display tab.

Automation

One row per department — Infrastructure, Marketing, Scouting, Academy, Car & R&D, Finance, Weekend loadout, Race weekends — each reading AI or Manual, plus All departments to flip them together. The same switches sit as an AI pill in the header of every department app. What each one does is on the Automation page. The choice is saved with the career.

Units

Two toggle buttons.

ButtonValuesApplies to
Speedkm/hmph”Speed unit used across the game (HUD, car data, profiles).”
Temperature°C°F”Temperature unit for tires, engine and weather readouts.”

Each click flips the value, pushes it into the shared Win95 formatting helpers (set_speed_unit_kmh / set_temp_unit_c) so every screen redraws in the new unit, and writes the key straight away. These are display conversions only — nothing in the simulation changes.

UI Scale

Three presets for the Win95 career interface zoom: 100 %, 125 %, 150 %. The active one is bracketed ([125%]). Hover text: “Zoom of the whole career interface. Applies immediately.”

Clicking a preset calls markup::set_ui_scale, writes the key, and drops the cached template — because the layout changes size, the parsed template has to be rebuilt.

This is the fix for small text on a high-DPI screen, and it is also the setting most likely to make a list overflow its window. That is handled: every sidebar screen except the Desktop opts into the generic page scroll, whose range is measured from the real laid-out content height. If something still looks cut off at 150 %, the [app-scroll] line written to debug.log on each app open carries ui_scale, viewport_h, content_h, overflow and max_scroll — that line is what a bug report needs. See Career Desktop & Sidebar.

What this app does not cover

The career Settings app is a subset. In particular, Race HUD Scale is not here — it lives in the main-menu Settings → Display, labelled “Race HUD Scale” with the same 100 / 125 / 150 presets, and writes hud.race_hud_scale. Because the race HUD only exists during a live session, the practical route is the in-race pause menu: Escape → Settings during a session opens the full Settings screen as an overlay, and the race re-reads the HUD scale when the overlay closes.

Everything else also stays in the full Settings screen: Display (vsync, fps cap, fullscreen, resolution, replay recording), Audio (engine / radio / driver / music volumes), Simulation sliders, Career sliders (prize pools, AI financial intelligence, balance multipliers), Keybindings, Events (per-event auto-actions in live sessions), and the --dev-only Dev tab.

The keys it writes

ControlScopeKeyValue written
Languageuilanguagethe language code, e.g. fr, pt-BR
Speed unithudspeed_unit_kmh1 = km/h, 0 = mph
Temperature unithudtemp_unit_c1 = °C, 0 = °F
UI scalehudui_scale1.00 / 1.25 / 1.50
(main-menu Settings only)hudrace_hud_scale1.00 / 1.25 / 1.50

config.db is a SQLite file with a single config(scope, key, value) table, primary-keyed on (scope, key). Reads that find nothing fall back to a default: ui_scale → 1.0, both unit flags → true (km/h and °C).

Advanced

  • Since 0.5.1 the runtime config.db lives in your user data directory, not the game folder. Settings are player data, and a Steam depot update used to overwrite your tuned values on every patch.

    PlatformLocation
    Linux$XDG_DATA_HOME/TheUndercut/ else ~/.local/share/TheUndercut/
    Windows%APPDATA%\TheUndercut\
    macOS~/Library/Application Support/TheUndercut/

    A UNDERCUT_DATA_DIR environment variable overrides it, and a portable-marker file next to the executable forces the game folder. The config.db shipped in the install directory is only the seed: editing it with sqlite3 does not change what a running game reads.

  • The career app writes on click; the main-menu Settings writes on Save. Both apply their changes live, but the full Settings screen only persists when you confirm. If you set units from the main menu and quit without saving, they revert. The career app has no such trap.

  • Settings saves merge, they do not overwrite. Keys you (or a mod) added by hand are preserved.

  • config.db writes use synchronous=NORMAL under WAL. That is safe against corruption, and it means a settings change does not fsync per key. The career save path deliberately keeps synchronous=FULL — these are only preferences.

  • Forced migrations can overwrite a key you tuned. CONFIG_MIGRATIONS rows run exactly once per config.db, keyed on a migration id, and exist so a balance fix reaches every existing player. If a value you set reverts after an update, that is why; a [config_db] migration <id> applied: … line in debug.log names it.

  • On Steam, a depot update overwrites the shipped config.db seed, not your user copy. display_config.txt is deliberately excluded from packing for the same reason — overwriting a player’s vsync/fps cap on every update is rude.

  • Language packs are content, not saved data. They stay in the game folder’s mods/lang/, so they are not cloud-synced and do not fight Workshop.

  • The whole UI is written in English as the translation key. Any string added to the game ships with its lang/fr.txt pair, and fr.txt is the reference file the other five are propagated from. A shipping build is expected to report 0 MISSING on every built-in language.

Common mistakes

  • Editing the config.db in the install folder. Since 0.5.1 that is only the seed. Change settings in-game, or edit the copy in your user data directory.
  • Looking here for the race HUD scale. It is Settings → Display in the main menu, or the in-race Escape → Settings overlay.
  • Looking here for volumes, prize pools or AI sliders. They are in the full Settings screen’s Audio / Career tabs.
  • Setting units from the main menu and quitting without saving. The main-menu screen persists on Save; the career app persists on click.
  • Expecting 150 % UI scale to break lists. It does not — the page scroll measures real content. If something is cut off, grab the [app-scroll] line from debug.log for the report.
  • Installing a language pack named after a built-in. mods/lang/de.txt will simply be ignored; use an unused code.
  • Expecting the tutorial voice-over to translate. It is keyed by step id and stays English by design.

See also