Skip to content

Overview

Relevant source files

This document provides a high-level introduction to TajsMod (formerly “TajsView”), a mod for Upload Labs that adds quality-of-life improvements, visual enhancements, and optional gameplay modifications without fundamentally altering the core gameplay loop. This overview covers:

  • The mod’s design philosophy and architectural patterns
  • Core component hierarchy and initialization flow
  • Feature categories and their implementation components
  • Integration approach with the base game
  • Development and distribution pipeline

For installation instructions and configuration basics, see Installation and Configuration. For detailed architecture patterns, see Core Architecture. For a complete feature catalog, see Feature Reference.

Sources: README.md L1-L126

manifest.json L1-L37


TajsMod is a non-invasive enhancement mod for Upload Labs v2.0.17+ that provides:

  • Quality-of-Life Utilities: Command palette, wire drop menus, right-click wire clearing, keyboard shortcuts
  • Visual Customization: Extra glow effects, 17 group colors, 11 pattern types, UI opacity control, custom wire colors
  • UI Improvements: 6-input containers, “THE BIN” trash node, Go To Group navigation, notification log
  • Optional Gameplay Features: Node limit control (50-2000+/∞), Buy Max automation, upgrade multipliers, cheats panel

The mod is distributed via Steam Workshop (primary) and GitHub Releases (manual), with automated CI/CD triggered by changes to the export package.

PropertyValue
Current Version0.0.23
Requires Game Version2.0.17+
Requires Mod Loader7.0.0+
DistributionSteam Workshop, GitHub
LicenseAll Rights Reserved

Sources: manifest.json L9-L34

README.md L3-L80

mod_main.gd L2-L10


The mod follows four key design principles, reflected throughout the codebase:

  1. Modularity: Features can be independently toggled via configuration * Implemented through ConfigManager with 40+ configuration keys mod_main.gd L88-L89 * Each feature manager operates independently mod_main.gd L33-L48
  2. Non-Invasive Integration: Uses script extensions rather than binary patches * 10 script extensions installed in _init() mod_main.gd L73-L82 * Extensions augment existing classes without replacing them
  3. Opt-In Gameplay Changes: Controversial features require explicit enablement * Gameplay-modifying features clearly separated in “Cheats” tab mod_main.gd L626-L628 * Default configuration favors QoL over gameplay changes
  4. Persistent User Preferences: Settings survive restarts * Write-through caching: every set_value() writes to disk * Configuration stored in user://tajs_mod_config.json

Sources: mod_main.gd L462-L689

README.md L9-L51


flowchart TD

ModLoader["ModLoader<br>(Godot Mod Loader)"]
ModMain["mod_main.gd<br>Central Orchestrator<br>Node"]
Config["ConfigManager<br>config_manager.gd"]
UI["SettingsUI<br>settings_ui.gd"]
Screenshot["ScreenshotManager<br>screenshot_manager.gd"]
BuyMax["BuyMaxManager<br>buy_max_manager.gd"]
Focus["FocusHandler<br>focus_handler.gd"]
WireColor["WireColorOverrides<br>wire_color_overrides.gd"]
GotoGroup["GotoGroupManager<br>goto_group_manager.gd"]
ZOrderFix["NodeGroupZOrderFix<br>node_group_z_order_fix.gd"]
Disconnected["DisconnectedNodeHighlighter<br>disconnected_node_highlighter.gd"]
StickyNotes["StickyNoteManager<br>sticky_note_manager.gd"]
UpgradeMgr["UpgradeManager<br>upgrade_manager.gd"]
CheatMgr["CheatManager<br>cheat_manager.gd"]
Palette["PaletteController<br>palette_controller.gd"]
DefaultCmds["default_commands.gd<br>60+ Command Definitions"]
PaletteUI["PaletteOverlay<br>palette_overlay.gd"]
ScriptExt["10 Script Extensions<br>globals.gd, windows_menu.gd, etc."]
Patcher["Patcher Utility<br>patcher.gd"]

ModLoader --> ModMain
ModMain --> Config
ModMain --> ScriptExt
ModMain --> UI
ModMain --> Screenshot
ModMain --> BuyMax
ModMain --> Focus
ModMain --> WireColor
ModMain --> GotoGroup
ModMain --> ZOrderFix
ModMain --> Disconnected
ModMain --> StickyNotes
ModMain --> UpgradeMgr
ModMain --> CheatMgr
ModMain --> Palette
Config --> Screenshot
Config --> BuyMax
Config --> Focus
UI --> Screenshot
UI --> BuyMax
UI --> Focus

subgraph subGraph2 ["Integration Layer"]
    ScriptExt
    Patcher
    Patcher --> ScriptExt
end

subgraph subGraph1 ["Command System"]
    Palette
    DefaultCmds
    PaletteUI
    Palette --> DefaultCmds
    Palette --> PaletteUI
end

subgraph subGraph0 ["Feature Managers"]
    Screenshot
    BuyMax
    Focus
    WireColor
    GotoGroup
    ZOrderFix
    Disconnected
    StickyNotes
    UpgradeMgr
    CheatMgr
end

Architecture Characteristics:

  • Central Orchestrator: mod_main.gd acts as the hub, managing lifecycle for all components mod_main.gd L6
  • Manager Autonomy: Each manager handles a specific domain and can operate independently
  • Deferred Initialization: Core setup in _init(), UI-dependent setup in _setup_for_main() mod_main.gd L72-L340
  • Signal-Based Communication: Managers use Globals.signals and Signals.notify for decoupled events

Sources: mod_main.gd L6-L164

high-level architecture diagrams


The following diagram maps user-facing features to their implementation components:

flowchart TD

CmdPalette["Command Palette<br>(MMB / Spacebar)"]
SettingsPanel["Settings Panel<br>(Puzzle Icon)"]
WireDrop["Wire Drop Menu"]
Screenshot["Screenshot System"]
BuyMaxUI["Buy Max Button"]
GotoUI["Go To Group Button"]
CustomColors["Custom Wire Colors"]
ExtraGlow["Extra Glow"]
Cheats["Cheats Panel"]
PC["PaletteController<br>palette_controller.gd"]
PO["PaletteOverlay<br>palette_overlay.gd"]
DC["default_commands.gd"]
SUI["SettingsUI<br>settings_ui.gd"]
CM["ConfigManager<br>config_manager.gd"]
SM["ScreenshotManager<br>screenshot_manager.gd"]
BMM["BuyMaxManager<br>buy_max_manager.gd"]
GGM["GotoGroupManager<br>goto_group_manager.gd"]
WCO["WireColorOverrides<br>wire_color_overrides.gd"]
ChM["CheatManager<br>cheat_manager.gd"]
Main["mod_main.gd<br>_apply_extra_glow()"]

CmdPalette --> PC
WireDrop --> PC
SettingsPanel --> SUI
Screenshot --> SM
BuyMaxUI --> BMM
GotoUI --> GGM
CustomColors --> WCO
Cheats --> ChM
ExtraGlow --> Main

subgraph subGraph1 ["Implementation Components"]
    PC
    PO
    DC
    SUI
    CM
    SM
    BMM
    GGM
    WCO
    ChM
    Main
    PC --> PO
    PC --> DC
    SUI --> CM
end

subgraph subGraph0 ["User-Facing Features"]
    CmdPalette
    SettingsPanel
    WireDrop
    Screenshot
    BuyMaxUI
    GotoUI
    CustomColors
    ExtraGlow
    Cheats
end

Key Components:

ComponentPurposeInitialized In
mod_main.gdCentral orchestrator, lifecycle managerN/A (entry point)
ConfigManagerSettings persistence (JSON)_init()
SettingsUISettings panel with tabs_setup_for_main()
PaletteControllerCommand palette orchestration_init()
ScreenshotManagerTiled screenshot capture_init()
BuyMaxManagerUpgrade automation with 4 strategies_setup_buy_max()
FocusHandlerAudio muting on focus loss_init()
WireColorOverridesCustom wire coloring_init()
GotoGroupManagerNode group navigation_setup_goto_group()
DisconnectedNodeHighlighterDisconnected node visualization_setup_disconnected_highlighter()
StickyNoteManagerCanvas notes system_setup_sticky_notes()

Sources: mod_main.gd L12-L460


sequenceDiagram
  participant ModLoader
  participant mod_main._init()
  participant mod_main._ready()
  participant mod_main._setup_for_main()
  participant Upload Labs Game

  ModLoader->>mod_main._init(): Load mod
  note over mod_main._init(): Phase 1: Core Setup
  mod_main._init()->>mod_main._init(): install_script_extension() x10
  mod_main._init()->>mod_main._init(): ConfigManager.new()
  mod_main._init()->>mod_main._init(): ScreenshotManager.new()
  mod_main._init()->>mod_main._init(): PaletteController.new()
  mod_main._init()->>mod_main._init(): WireClearHandler.new()
  mod_main._init()->>mod_main._init(): FocusHandler.new()
  mod_main._init()->>mod_main._init(): WireColorOverrides.new()
  Upload Labs Game->>mod_main._ready(): Scene tree ready
  note over mod_main._ready(): Phase 2: Scene Integration
  mod_main._ready()->>mod_main._ready(): Create shared ColorPickerPanel
  mod_main._ready()->>mod_main._ready(): Apply wire color overrides
  mod_main._ready()->>mod_main._ready(): Apply saved node limit
  mod_main._ready()->>mod_main._ready(): Patcher.inject_bin_window()
  mod_main._ready()->>mod_main._ready(): Listen for Main node
  Upload Labs Game->>mod_main._setup_for_main(): Main node added
  note over mod_main._setup_for_main(): Phase 3: UI & Features
  mod_main._setup_for_main()->>mod_main._setup_for_main(): SettingsUI.new()
  mod_main._setup_for_main()->>mod_main._setup_for_main(): Initialize BuyMaxManager
  mod_main._setup_for_main()->>mod_main._setup_for_main(): Initialize GotoGroupManager
  mod_main._setup_for_main()->>mod_main._setup_for_main(): Initialize DisconnectedHighlighter
  mod_main._setup_for_main()->>mod_main._setup_for_main(): Initialize StickyNoteManager
  mod_main._setup_for_main()->>mod_main._setup_for_main(): _build_settings_menu()
  mod_main._setup_for_main()->>mod_main._setup_for_main(): palette_controller.initialize()
  mod_main._setup_for_main()->>mod_main._setup_for_main(): Apply initial visuals

Initialization Phases:

  1. _init() 72-112 : Install extensions, create early managers (config, screenshot, palette, wire handlers)
  2. _ready() 115-163 : Scene tree integration, apply saved settings, inject patches
  3. _setup_for_main() 278-340 : Wait for HUD, create UI, initialize feature managers, register commands

Why Two-Phase?

  • Script extensions must be installed before any game code runs
  • Some managers (Screenshot, FocusHandler) need early initialization
  • UI-dependent features require HUD to be available
  • Deferred setup ensures stable initialization order

Sources: mod_main.gd L72-L340

high-level sequence diagram


Feature CategoryUser InterfaceImplementationConfiguration Keys
Command SystemPalette overlay (MMB)PaletteController, default_commands.gdcommand_palette_enabled, wire_drop_menu_enabled
Visual CustomizationVisuals tabmod_main._apply_extra_glow(), WireColorOverridesextra_glow, glow_intensity, custom_wire_colors_*
QoL UtilitiesGeneral tabFocusHandler, ScreenshotManagermute_on_focus_loss, screenshot_quality
UI EnhancementsGeneral tabGotoGroupManager, BuyMaxManager, DisconnectedHighlightergoto_group_enabled, buy_max_enabled, highlight_disconnected_enabled
Gameplay ModifiersCheats tabCheatManager, Globals.custom_node_limitnode_limit, upgrade_multiplier
Development ToolsDebug tab_debug_mode, _debug_log_labeldebug_mode, custom_boot_screen

Sources: mod_main.gd L462-L689

README.md L21-L58


TajsMod uses script extensions exclusively to integrate with Upload Labs:

flowchart TD

BaseGame["Upload Labs<br>Base Game Classes"]
Globals["globals.gd"]
WindowsMenu["windows_menu.gd"]
SchematicContainer["schematic_container.gd"]
PopupSchematic["popup_schematic.gd"]
OptionsBar["options_bar.gd"]
WindowGroup["window_group.gd"]
WindowBin["window_bin.gd"]
WindowInventory["window_inventory.gd"]
RequestPanel["request_panel.gd"]
RequestsTab["requests_tab.gd"]
ModMain["mod_main.gd"]

BaseGame --> Globals
BaseGame --> WindowsMenu
BaseGame --> SchematicContainer
BaseGame --> PopupSchematic
BaseGame --> OptionsBar
BaseGame --> WindowGroup
BaseGame --> WindowBin
BaseGame --> WindowInventory
BaseGame --> RequestPanel
BaseGame --> RequestsTab
ModMain --> Globals
ModMain --> WindowsMenu
ModMain --> SchematicContainer
ModMain --> PopupSchematic
ModMain --> OptionsBar
ModMain --> WindowGroup
ModMain --> WindowBin
ModMain --> WindowInventory
ModMain --> RequestPanel
ModMain --> RequestsTab

subgraph subGraph0 ["Extended Classes (10)"]
    Globals
    WindowsMenu
    SchematicContainer
    PopupSchematic
    OptionsBar
    WindowGroup
    WindowBin
    WindowInventory
    RequestPanel
    RequestsTab
end

Extension Examples:

  • globals.gd: Adds custom_node_limit, select_all_enabled, custom_upgrade_multiplier properties
  • window_group.gd: Adds 11 pattern types and pattern picker UI for node groups
  • window_bin.gd: Implements “THE BIN” trash node functionality
  • window_inventory.gd: Increases container inputs from 4 to 6 (when enabled)
  • schematic_container.gd: Adds Ctrl+A select-all functionality, wire drop spawning

Why Script Extensions?

  • Compatible with game updates (no binary patching)
  • Modular: extensions can be toggled independently
  • Safe: extends classes without replacing core logic
  • Future-proof: game updates rarely break extensions

Sources: mod_main.gd L73-L82

high-level architecture diagram


MetricCountImplementation
Total Commands60+default_commands.gd
Script Extensions10mod_main._init() 73-82
Feature Managers10+mod_main.gd 33-48
Configuration Keys40+ConfigManager.DEFAULT_CONFIG
Settings Tabs4General, Visuals, Cheats, Debug
Group Colors17Extended palette in window_group.gd
Pattern Types11Grid, Stripes, Diagonal, etc.
Wire Resource Types35+Configurable in WireColorOverrides

Code Size Distribution:

  • Core Orchestration: mod_main.gd (~1850 lines, highest importance: 49.96)
  • Command System: default_commands.gd (~430 lines), palette_overlay.gd (~350 lines)
  • Configuration: config_manager.gd (~150 lines), manifest.json (37 lines)
  • Feature Managers: Average ~200-300 lines each
  • Total Codebase: 5000+ lines across 30+ files

Sources: mod_main.gd L1-L1850

high-level importance metrics, file counts


flowchart TD

Dev["Developer"]
Code["Source Code<br>mod_main.gd + extensions"]
Manifest["manifest.json<br>version_number: 0.0.23"]
Export["export/<br>TajemnikTV-TajsModded.zip"]
GitHub["GitHub<br>tajemniktv/TajsMod"]
CI["GitHub Actions<br>release-from-export-zip.yml"]
Release["GitHub Release<br>TajsModded-v0.0.23"]
Workshop["Steam Workshop<br>Auto-update"]

Dev --> Code
Dev --> Manifest
Dev --> Export
Code --> GitHub
Manifest --> GitHub
Export --> GitHub
GitHub --> CI
CI --> Manifest
CI --> Release
Release --> Workshop
Release --> GitHub

Release Process:

  1. Developer exports mod to export/TajemnikTV-TajsModded.zip
  2. Updates version_number in manifest.json manifest.json L34
  3. Pushes changes to GitHub repository
  4. CI workflow release-from-export-zip.yml detects changes
  5. Workflow reads version from manifest.json
  6. Creates GitHub release with .zip attachment
  7. Steam Workshop auto-syncs from GitHub (manual step)

Sources: manifest.json L1-L37

high-level distribution diagram, CHANGELOG.md L1-L154


Sources: Table of contents JSON provided