Overview
Relevant source files
Purpose and Scope
Section titled “Purpose and Scope”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
What is TajsMod?
Section titled “What is TajsMod?”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.
| Property | Value |
|---|---|
| Current Version | 0.0.23 |
| Requires Game Version | 2.0.17+ |
| Requires Mod Loader | 7.0.0+ |
| Distribution | Steam Workshop, GitHub |
| License | All Rights Reserved |
Sources: manifest.json L9-L34
Design Philosophy
Section titled “Design Philosophy”Core Principles
Section titled “Core Principles”The mod follows four key design principles, reflected throughout the codebase:
- Modularity: Features can be independently toggled via configuration * Implemented through
ConfigManagerwith 40+ configuration keys mod_main.gd L88-L89 * Each feature manager operates independently mod_main.gd L33-L48 - 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 - 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
- Persistent User Preferences: Settings survive restarts * Write-through caching: every
set_value()writes to disk * Configuration stored inuser://tajs_mod_config.json
Sources: mod_main.gd L462-L689
Architectural Patterns
Section titled “Architectural Patterns”Hub-and-Spoke Orchestration
Section titled “Hub-and-Spoke Orchestration”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.gdacts 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.signalsandSignals.notifyfor decoupled events
Sources: mod_main.gd L6-L164
high-level architecture diagrams
Component Hierarchy
Section titled “Component Hierarchy”Code Entity Map
Section titled “Code Entity Map”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:
| Component | Purpose | Initialized In |
|---|---|---|
mod_main.gd | Central orchestrator, lifecycle manager | N/A (entry point) |
ConfigManager | Settings persistence (JSON) | _init() |
SettingsUI | Settings panel with tabs | _setup_for_main() |
PaletteController | Command palette orchestration | _init() |
ScreenshotManager | Tiled screenshot capture | _init() |
BuyMaxManager | Upgrade automation with 4 strategies | _setup_buy_max() |
FocusHandler | Audio muting on focus loss | _init() |
WireColorOverrides | Custom wire coloring | _init() |
GotoGroupManager | Node group navigation | _setup_goto_group() |
DisconnectedNodeHighlighter | Disconnected node visualization | _setup_disconnected_highlighter() |
StickyNoteManager | Canvas notes system | _setup_sticky_notes() |
Sources: mod_main.gd L12-L460
Initialization Flow
Section titled “Initialization Flow”Two-Phase Initialization Pattern
Section titled “Two-Phase Initialization Pattern”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:
_init()72-112 : Install extensions, create early managers (config, screenshot, palette, wire handlers)_ready()115-163 : Scene tree integration, apply saved settings, inject patches_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 Categories
Section titled “Feature Categories”Implementation Matrix
Section titled “Implementation Matrix”| Feature Category | User Interface | Implementation | Configuration Keys |
|---|---|---|---|
| Command System | Palette overlay (MMB) | PaletteController, default_commands.gd | command_palette_enabled, wire_drop_menu_enabled |
| Visual Customization | Visuals tab | mod_main._apply_extra_glow(), WireColorOverrides | extra_glow, glow_intensity, custom_wire_colors_* |
| QoL Utilities | General tab | FocusHandler, ScreenshotManager | mute_on_focus_loss, screenshot_quality |
| UI Enhancements | General tab | GotoGroupManager, BuyMaxManager, DisconnectedHighlighter | goto_group_enabled, buy_max_enabled, highlight_disconnected_enabled |
| Gameplay Modifiers | Cheats tab | CheatManager, Globals.custom_node_limit | node_limit, upgrade_multiplier |
| Development Tools | Debug tab | _debug_mode, _debug_log_label | debug_mode, custom_boot_screen |
Sources: mod_main.gd L462-L689
Integration Approach
Section titled “Integration Approach”Script Extensions vs. Binary Patches
Section titled “Script Extensions vs. Binary Patches”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: Addscustom_node_limit,select_all_enabled,custom_upgrade_multiplierpropertieswindow_group.gd: Adds 11 pattern types and pattern picker UI for node groupswindow_bin.gd: Implements “THE BIN” trash node functionalitywindow_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
Scale and Complexity
Section titled “Scale and Complexity”System Metrics
Section titled “System Metrics”| Metric | Count | Implementation |
|---|---|---|
| Total Commands | 60+ | default_commands.gd |
| Script Extensions | 10 | mod_main._init() 73-82 |
| Feature Managers | 10+ | mod_main.gd 33-48 |
| Configuration Keys | 40+ | ConfigManager.DEFAULT_CONFIG |
| Settings Tabs | 4 | General, Visuals, Cheats, Debug |
| Group Colors | 17 | Extended palette in window_group.gd |
| Pattern Types | 11 | Grid, Stripes, Diagonal, etc. |
| Wire Resource Types | 35+ | 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
Development Pipeline
Section titled “Development Pipeline”Automated Release Workflow
Section titled “Automated Release Workflow”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:
- Developer exports mod to
export/TajemnikTV-TajsModded.zip - Updates
version_numberinmanifest.jsonmanifest.json L34 - Pushes changes to GitHub repository
- CI workflow
release-from-export-zip.ymldetects changes - Workflow reads version from
manifest.json - Creates GitHub release with
.zipattachment - Steam Workshop auto-syncs from GitHub (manual step)
Sources: manifest.json L1-L37
high-level distribution diagram, CHANGELOG.md L1-L154
Navigation Guide
Section titled “Navigation Guide”- Installation and Configuration: Get started with installing and configuring the mod
- Core Architecture: Deep dive into architectural patterns and component lifecycle
- Command Palette System: Learn about the 60+ command system and fuzzy search
- Feature Reference: Complete catalog of all features with implementation details
- Utility Manager Components: Technical reference for individual managers
- Development Guide: Contributing, building, and release workflow
Sources: Table of contents JSON provided