KimP0ssible Autosplitter

Documentation

Overview

KimP0ssible Autosplitter uses real-time OCR to read on-screen text from your game and automatically trigger splits in your speedrun timer. It connects to LiveSplit Server to send split commands in real time, or works standalone with its own built-in timer.

Originally built for Tom Clancy's The Division 2, it works with any game that displays matchable text. Just create an XML profile with your keywords and go.

Application Screenshots

AutoSplitter main window

The main AutoSplitter window showing the split table, timer, settings panel, OCR output, and log

Game overlay

The game overlay mirrors your splits and timer directly over your game

Getting Started

Installation

  1. Download the ZIP from autosplitter.attr.ee
  2. Extract to a folder of your choice (e.g. C:\Tools\AutoSplitter\)
  3. Run AutoSplitter.exe — no installation, runtime, or setup needed

First Run

  1. Launch AutoSplitter and select a profile from the dropdown, or click New to create one for your game.
  2. Open your game and set it to the resolution you normally play at.
  3. Set the OCR capture region — click Set Region, then draw a rectangle around the area of the screen where objective/mission text appears.
    • Press S to save the region to your profile
    • Press Q or Esc to close without saving
    Setting the OCR capture region

    Drawing the OCR capture region over the game's objective text area

  4. Configure your splits in the XML profile. Each segment needs one or more keyword phrases that the OCR will match against. You also need a StartTrigger with at least one <To> keyword (and, optionally, one or more <From> keywords for a two-phase trigger) to tell the timer when to begin.
  5. Click Start (or press F9) and play your game. The autosplitter will watch for text matches and trigger splits automatically. Enable the DEBUG checkbox to see OCR readings in the log.

Global Hotkeys

These hotkeys work globally — even when your game is in the foreground and AutoSplitter is in the background.

KeyActionNotes
F9StartBegins capture, OCR detection, and timer
F10ResetResets timer to 0:00.000 and clears all split times
F11StopStops the backend and detection
Mouse3 (default)Manual SplitForce-advances to the next segment. Configurable via Split Key button in settings

The manual split key can be changed to any keyboard key (F1–F12, Numpad, etc.) or mouse button (Mouse3/Mouse4/Mouse5). Click the Split Key button in settings, then press the desired key. Press Esc to cancel.

Main Window

Title Bar

Shows the currently loaded profile as Game — Mission (e.g., "The Division 2 — Paradise Lost Incursion").

Timer Display

Large centered timer in M:SS.mmm format (e.g., 5:54.000). Updates at 20 Hz while running.

Status Label

Text below the timer showing the current state: Stopped, Running, Complete, or Waiting for start trigger.

Split Table

Shows all segments from the active profile. Maximum 7 visible rows; scrollbar appears for longer profiles.

ColumnMeaning
SegmentName of the split (from the profile XML)
SplitTime elapsed during this segment alone
TotalCumulative time from run start to the end of this segment
PBPersonal best cumulative time (from the pb attribute in XML)
+/-Difference vs PB. Negative (green) = ahead of PB. Positive (red) = behind PB

Action Buttons

▶ Start [F9]

Starts the backend: begins screen capture, OCR detection, and the timer. Connects to LiveSplit if enabled.

↻ Reset [F10]

Resets the timer and all split times to zero. Sends a reset command to LiveSplit. Does not stop the backend.

■ Stop [F11]

Stops the backend entirely. Screen capture and OCR detection cease. Sends a reset to LiveSplit.

⊞ Set Region

Opens the calibration tool to visually select the OCR capture region. Only available when stopped.

OCR Output Panel

At the bottom of the window, shows the most recent OCR text detected in the capture region, along with the inference time in milliseconds (e.g., 42 ms). Useful for verifying that the OCR is reading the correct text.

Log Panel

Scrollable log showing status messages, split triggers, warnings, and errors. Enable the DEBUG checkbox to see detailed OCR text, similarity scores, keyword match attempts, and state machine transitions. Holds up to 1000 lines.

Settings Panel

All settings are saved per profile when you click Save Settings.

Row 1: Detection Parameters

ControlDefaultRangeDescription
FPS51–30Screen capture rate. Higher = more responsive detection but more CPU. 5 FPS is sufficient for most games.
Retries31 to FPS−1When OCR doesn't find a keyword match on the newest frame, it retries older frames from the buffer. Higher values search further back in time.
Interval1.000.20–5.00Seconds between OCR inference runs. Lower = faster detection but more CPU usage.
Match%9250–100Fuzzy match strictness. 92% tolerates 1–2 misread characters. Lower values are more lenient but risk false positives.
PB Prot(s)1201–9999PB protection threshold in seconds. If a run beats the existing PB by more than this amount, the save prompt is suppressed (catches accidental/glitched runs).
DEBUGOff—Enables verbose logging: OCR text output, similarity scores, keyword match attempts, frame retry info, and state machine transitions.

Row 2: Integration & Controls

ControlDefaultDescription
LiveSplit checkboxOnEnable LiveSplit Server connection. When checked, the app connects on Start and sends split/reset commands.
HostlocalhostLiveSplit Server hostname or IP address.
Port16834LiveSplit Server TCP port (1–65535).
Overlay checkboxOffToggle the always-on-top game overlay window.
Split Key buttonMouse3Click to enter capture mode, then press any key or mouse button to set as the manual split key. Press Esc to cancel.

Row 3: Profile Management

ControlDescription
Profile dropdownLists all XML profiles found in the profiles/ folder. Selecting a profile loads its segments and settings.
EditOpens the selected profile's XML file in Notepad++ (if installed) or Notepad.
ReloadReloads the profile from disk, discarding any unsaved UI changes.
NewCreates a new profile XML from a template. Opens in editor immediately for editing.
DeleteDeletes the selected profile file (with confirmation dialog).

Row 4: Region & Save

ControlDescription
OCR RegionDisplays the current capture region coordinates: left, top, right, bottom in screen pixels. Set via the Set Region button.
Save SettingsWrites all current UI settings back to the profile XML file. The profile auto-reloads after saving.

OCR Region Calibration

Click Set Region (only available when the backend is stopped) to open the calibration tool. It takes a screenshot of your desktop and lets you draw a rectangle around the text area.

OCR region calibration

The green rectangle shows the saved region; the red rectangle shows the region being drawn

KeyAction
SSave the drawn region to the profile and close
QClose without saving
EscClose without saving
Click + DragDraw a new region (shown in red)

A smaller, tighter region around the text area results in faster and more accurate OCR. A second "Region Preview" window shows the cropped area at full resolution so you can verify the text is fully captured.

Game Overlay

The overlay is a borderless always-on-top window that mirrors your split table and timer directly over your game. It stays visible even when the game is in fullscreen windowed mode.

Game overlay

The overlay showing segments, PB times, timer, and Personal Best total

LiveSplit Integration

LiveSplit integration is enabled by default. To send splits to LiveSplit in real time, enable LiveSplit Server in your LiveSplit layout:

  1. In LiveSplit, right-click → Edit Layout → Add LiveSplit Server component
  2. Right-click → Control → Start Server
  3. In AutoSplitter, ensure the LiveSplit checkbox is checked and Host is localhost, Port is 16834
  4. Click Start [F9] — the log will confirm "LiveSplit connected" or show a warning if the server isn't running
LiveSplit Server settings

LiveSplit Server component enabled in the layout editor

Commands Sent

CommandWhen
starttimerStart trigger detected (two-phase or single-phase keyword match)
initgametimeAt backend start (enables game time sync)
setgametimeBefore each split (accurate frame-based timing)
splitEach segment keyword matched
skipsplitWhen segments are skipped (state machine jumps ahead)
resetUser clicks Reset or Stop

If no LiveSplit Server is detected, AutoSplitter logs a warning and continues running with its built-in timer. Use "Compare Against → Game Time" in LiveSplit for the most accurate timing (eliminates OCR delay drift).

XML Profile Reference

Profiles are stored in the profiles/ folder next to AutoSplitter.exe as XML files. Each profile defines a game, mission, segments with keywords, and all detection settings.

Full Structure

<!-- profiles/my_game.xml --> <SplitProfile profileVersion="1"> <Game>My Game Title</Game> <Mission>Mission or Category Name</Mission> <Capture targetFps="5" /> <Detection cooldownSeconds="5.0" pbProtectionSeconds="120"> <Pixel enabled="true" fadeThreshold="12" fadeFramesRequired="5" /> <OCR enabled="true" region="285,1242,820,1325" intervalSeconds="1.0" changeThreshold="0.6" fuzzyMatchThreshold="0.92" ocrRetryFrames="3" /> </Detection> <StartTrigger> <From>text visible before the run</From> <To>text that starts the timer</To> </StartTrigger> <Segments> <Segment name="First Split" pb="45.000"> <Keyword>match this text</Keyword> <Keyword>or this variant</Keyword> </Segment> <Segment name="Final Boss" final="true" pb="120.000" pte="60"> <Keyword>mission complete</Keyword> </Segment> </Segments> <LiveSplit enabled="true" host="localhost" port="16834" /> <Overlay enabled="false" x="100" y="100" /> <Hotkeys manualSplitKey="Mouse3" /> </SplitProfile>

Attribute Reference

ElementAttributeTypeDefaultDescription
SplitProfileprofileVersionint1Profile format version. Used for automatic upgrade merging.
CapturetargetFpsint (1–30)5Screen capture rate in frames per second.
DetectioncooldownSecondsfloat5.0Minimum seconds between split triggers to prevent duplicates.
DetectionpbProtectionSecondsfloat120Max PB improvement (seconds) before suppressing save prompt. Catches glitched/accidental runs.
PixelenabledbooltrueEnable fade-to-black / fade-from-black detection.
PixelfadeThresholdint (0–255)12Luminance threshold for fade detection.
PixelfadeFramesRequiredint5Consecutive dark frames before triggering a fade event.
OCRenabledbooltrueEnable OCR text recognition.
OCRregion4 ints0,0,800,600Capture region: left,top,right,bottom in screen pixels.
OCRintervalSecondsfloat1.0Seconds between OCR inference runs (0.2–5.0).
OCRchangeThresholdfloat0.6Text similarity threshold for change detection (0.0–1.0).
OCRfuzzyMatchThresholdfloat0.92Keyword match strictness (Match% in UI). Higher = stricter.
OCRocrRetryFramesint3Max frames back in ring buffer to retry (1 to targetFps−1).
StartTriggerTwo-phase start: OCR must see a <From> keyword, then a <To> keyword. Timer starts on the <To> match. Multiple entries allowed for each phase. v1.3.5+: omit <From> entirely for a single-phase trigger that fires on the first <To> match.
Segmentnamestring—Display name for the split.
SegmentfinalboolfalseMarks the last segment. When matched, the run is complete.
Segmentpbfloat—Personal best cumulative time in seconds. Written automatically when you save a PB.
Segmentpteint0Prevent-trigger-execution window in seconds. OCR is skipped entirely for this segment until this many seconds have elapsed since the run started — blocks early false matches on segments that can’t realistically occur until late in a run. 0 disables the gate.
KeywordText to match against OCR output. Multiple per segment (OR logic). Uses fuzzy case-insensitive substring matching.
LiveSplitenabledboolfalseConnect to LiveSplit Server on start.
LiveSplithoststringlocalhostLiveSplit Server hostname.
LiveSplitportint16834LiveSplit Server port (1–65535).
OverlayenabledboolfalseShow game overlay window on start.
Overlayx, yint100Overlay position in screen pixels. Updated when you drag the overlay.
HotkeysmanualSplitKeystringMouse3Key name for manual split: F1–F12, Mouse3/Mouse4/Mouse5, numpad keys, etc.

Personal Best & PB Protection

Saving Personal Bests

When a run completes (the final segment is matched) and the total time is faster than the existing PB, a dialog asks whether to save the new split times. If you click Yes, the cumulative times are written to the pb attribute on each <Segment> in the XML. The split table and overlay update immediately.

PB Protection Threshold

The PB Prot(s) setting (default: 120 seconds) prevents saving suspiciously fast runs. If a run beats the existing PB by more than this threshold, the save prompt is suppressed entirely. This catches scenarios where you reset mid-run but the final segment keyword was accidentally detected.

Auto-Update

On startup, AutoSplitter checks for new versions by fetching version.json from the update server. If a newer version is available, a dialog shows the changelog and asks whether to update.

How Detection Works

Understanding the detection pipeline helps you create better profiles and debug issues.

Start Trigger

The timer doesn't start immediately. The <StartTrigger> element supports two modes:

Two-Phase (populated <From>)

Prevents false starts by requiring a transition between two text states:

  1. Phase 1 (From) — OCR must first detect any <From> keyword. This primes the trigger.
  2. Phase 2 (To) — OCR must then detect any <To> keyword. The timer starts at the frame timestamp of this match.

Example: <From>Loading...</From> followed by <To>Mission Start</To> means the timer starts when "Mission Start" appears after "Loading..." was seen.

Single-Phase (empty <From>, v1.3.5+)

Omit all <From> entries from <StartTrigger> and the timer starts on the first OCR text containing any <To> keyword. Use this when your <To> text is unique to the run-start moment — otherwise prefer two-phase so static menu / replay text doesn't trigger an early start.

Fuzzy Keyword Matching

Keywords use sliding-window Levenshtein distance matching, not exact string comparison. At the default 92% threshold, a keyword like "Secure the Area" will match OCR output containing "Secure the Areo" (1 misread character). Multiple <Keyword> entries per segment act as OR alternatives.

Frame Retry

When the OCR interval fires, the engine doesn't just check the newest frame. It tries up to Retries frames from the capture buffer (newest first), stopping when one produces a keyword match. The split timestamp comes from the matching frame, not the current time, giving frame-accurate timing.

Cooldown

After a split triggers, a cooldown period (cooldownSeconds, default 5s) prevents the same or next keyword from immediately triggering. This handles cases where text persists on screen across multiple OCR cycles.

Tips & Troubleshooting