Comprehensive Stopwatch & Countdown Timer

OBS Lua Comprehensive Stopwatch & Countdown Timer 6.0

TIMER PLUGIN​

Version 6.0
Released 3 October 2026


This script is a plugin written in the Lua programming language, designed specifically to run inside OBS Studio (OBS > Tools > Scripts).

Completely customizable timer format & display

Stopwatch 4.gif


Stopwatch.gif


New in 6.0​

  • Reset and hotkeys fixed on OBS 31/32, including with the Scripts window closed.
  • Overtime: a countdown can keep counting up after zero.
  • Pause at markers: e.g. pause at 45:00 and 90:00 for a football match.
  • Expiry audio, then switch scene.
  • Frame display, independent hour/minute units, round-up countdown, a 'Set' hotkey, 1-second add/subtract steps, and a Script Description checkbox for small screens.
See the 6.0 update post for the full list of changes.

Feature Overview​

This plugin is designed to be highly customizable and versatile, making it suitable for a wide range of scenarios and user preferences. Here are some of the features this plugin has to offer.
  • Supports Duplication: The plugin can be duplicated and used to run multiple instances simultaneously.
  • Customizable Timer Format & Display: The timer format and display are completely customizable, allowing for various configurations.
  • Count Up: The plugin can count time upwards.
  • Count Down: The plugin can count time downwards.
  • Real-Time Count Inversion: The plugin can change the counter direction in real-time.
  • Countdown Components: The plugin supports counting down in days, hours, minutes, seconds, and milliseconds.
  • Specific Date & Time Countdown: The plugin supports counting down to a specific date and time.
  • Overtime (new in 6.0): When a countdown reaches zero, the timer can keep counting up, optionally shown with a '+' and its own colour.
  • Round Up Countdown Display (new in 6.0): Countdown formats without seconds (e.g. hours:minutes) show 00:01 until the timer really reaches zero.
  • Toggle Visibility of Split Seconds: Triggered by Hotkey or timestamp to show/hide the split seconds.
  • Frame Display (new in 6.0): Show split seconds as video frames (e.g. 60 fps) instead of hundredths of a second.
  • Events when Timer Expires: Show a message, play a media source, switch scene, cycle lists, start recording, or keep counting as overtime.
  • Create a Stopwatch: Features to mark laps and intervals.
  • Start Timer from Specific Timestamp: The plugin can be started from a specific timestamp, from the settings or with a 'Set' hotkey.
  • Autoload Last Saved Timestamp: The plugin can autoload the last saved timestamp on startup (Count Up). The time is saved regularly, so it survives a crash.
  • Cycle Through Source List: The plugin can cycle through a defined source list based on a timer.
  • Cycle Through Nested Sources: The plugin can cycle through sources that are placed in a defined group or nested scene based on a timer.
  • Cycle Through Scene List: The plugin can cycle through a defined scene list based on a timer.
  • Switch to Specific Scene when Timer Expires: The plugin can switch to a specific scene when the timer expires, optionally after the expiry audio has played.
  • Play a Media Source at Specified Time: The plugin can play up to two media sources (Marker A and Marker B) at specified times, every time the marker is reached, with an optional playback duration.
  • Play a Media Source when Timer Expires: The plugin can play a media source when the timer expires.
  • Pause at Specified Time (new in 6.0): The timer can pause itself exactly at Marker A or Marker B, e.g. at half time and full time of a football match.
  • Change Timer Text Color: The plugin can change the timer text color at a specified time, allows defining two color changes, and can restore the normal color after a set time.
  • Enable Visibility on Another Text Source: The plugin can enable visibility on another text source (a note) at a specified time, and hide it again after a set time.
  • Start Recording at Specified Time: In Count Down, the plugin can start recording when the timer expires, at Marker A or Marker B, when the timer becomes visible, or when it starts.
  • Custom Message on Timer Expiry: The plugin can display a custom message when the timer expires.
  • Custom Timer Prefix/Suffix: The plugin allows defining a custom prefix or suffix for the timer.
  • Automatic Timer Start: The plugin can start the timer when the Timer Text Source becomes visible, when its scene (or a specific scene, source or media source) becomes active, or when recording or streaming starts, with an optional automatic reset.
  • Export Script Settings: The plugin allows exporting script settings for backup or quick setup.
  • Import Script Settings: The plugin allows importing previously saved script settings.
  • Add/Subtract Seconds: The plugin can add or subtract time with three preset step sizes each (from 1 second), with optional limits, also while paused.
  • Assign Minute Unit Format: The plugin allows assigning a minute unit to create a 90-minute timer or any length minute timer, e.g. {$M90}.
  • Assign Hour Unit Format: The plugin allows assigning an hour unit to override the default 24-hour timer with any length hour timer, e.g. {$H100}. Hour and minute units can be used separately or together.
  • Debug Logging: Create a local file for debugging issues.
  • Dedicated Buttons: Ability to split the 'Start' and 'Pause' button.
  • Hotkey Support: The plugin supports hotkeys for starting, pausing, resetting, setting a manual time, split-time, toggling milliseconds, changing time direction, and adding/subtracting time. Hotkeys work while the Scripts window is closed.
  • Compact Settings: The script description can be hidden to give the settings more room on small screens.
  • Disable Unwanted Features: Ability to completely remove unwanted features.

PLUGIN DESIGN OVERVIEW:​


To ensure an optimal user experience, it's important to understand the distinction between two types of objectives some of the properties serve in the plugin UI: those that enhance the user experience and those that directly impact the core functionality and behaviour. Let's delve into these categories to help you navigate the plugin effortlessly.​

1687527880899.png


PROPERTIES FOR ENHANCING USER EXPERIENCE:​

These properties focus on providing additional customization options and improving the overall usability of the plugin. While they don't directly affect the core functionality, they play a vital role in tailoring the plugin to a specific purpose.

Here's what you need to know:

The OBS native UI can sometimes become cluttered when using plugins with complex configurability. To address this issue, this plugin has been designed to display or hide certain properties based on their relevance. It's important to understand that some properties, while relevant, are intentionally hidden to prevent an overwhelming amount of information. Therefore, it is crucial to carefully examine each property to determine if it reveals any extendable settings. Each property also has a tooltip: hover over its name for help.​

Here are some properties that will simplify or expand the available properties:
1. Script Description (top of the settings: show or hide the description)
2. Layout (Basic / Advanced)
3. Timer Settings
4. Marker Settings
5. Timer Manipulation
6. Disable Features

1687767243269.png


PROPERTIES AFFECTING CORE FUNCTIONALITY AND BEHAVIOR:​

These properties directly impact how the plugin operates and can significantly influence its core functionality. Understanding and adjusting these settings will ensure the plugin behaves precisely as you intend.

Here's what you should consider:

The plugin provides timer-focused functionality that can be configured for various scenarios.
The plugin provides two modes, each with some unique features and some that overlap between the two modes.​

The plugin modes are:
  • Count Up
  • Count Down
The plugin initializes with Count Up as the default mode and with a Basic layout, which expands to an Advanced layout.

The Basic layout hides additional properties that only become available in the Advanced layout.

Switching between the Basic and Advanced layout has no impact on the features or any defined settings of the plugin; it only shows or hides properties in the plugin settings UI. This removes clutter when only a simple layout is required. This approach was chosen because many of the features are not used by the average user, and having them all displayed in a small area can be overwhelming. The downside is that settings may feel hidden at first: if you cannot find a setting, switch to the Advanced layout and expand the relevant section.
​

Item​
PROPERTIES DESIGN​
Version​
Mode Available​
1​
  1. Script Description
    1. Type: Checkbox,
    2. Default value: checked,
    3. Shown at the very top of the settings, in every layout,
    4. Unticked: hides the script description (title, links) to give the settings more room on small screens,
    5. Applies after “Reload Scripts” or an OBS restart.
6.0​
Always​
2​
  1. Timer Mode
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Count Up”,
        2. “Count Down”,
    2. Use dynamic options: No,
    3. Default value: “Count Up”,
    4. On Change: “Hide or display relevant properties”.
0.2
2.0 (Expanded)​
Always​
3​
  1. Layout
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Basic”,
        2. “Advanced”,
    2. Use dynamic options: No,
    3. Default value: “Basic”,
    4. On Change: “Hide or display properties”.
2.0​
Always​
4​
  1. Timer Settings
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Hidden”,
        2. “Expanded”,
    2. Use dynamic options: No,
    3. Default value: “Hidden”,
    4. On Change: “Hide or display properties”.
4.2​
Always​
5​
  1. Timer Source
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Select”,
    2. Use dynamic options: Yes,
      1. List all available names of Text Sources,
    3. Default value: “Select”,
    4. On Change: “”.
0.2​
Always​
6​
  1. Count Down Type
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Specific Date & Time”,
        2. “Hours, Minutes, Seconds”,
    2. Use dynamic options: No,
    3. Default value: “Hours, Minutes, Seconds”,
    4. On Change: “Hide or display relevant properties”.
2.9​
Count Down​
7​
  1. Day Text Format
    1. Type: Text input,
    2. Default value: “# Day”,
    3. On Change: “Updates Timer Display”.
2.9.1​
Count Down​
8​
  1. Days Text Format
    1. Type: Text input,
    2. Default value: “# Days”,
    3. On Change: “Updates Timer Display”.
2.9.1​
Count Down​
9​
  1. Month
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Select”,
        2. “January”,
        3. “February”,
        4. “March”,
        5. “April”,
        6. “May”,
        7. “June”,
        8. “July”,
        9. “August”,
        10. “September”,
        11. “October”,
        12. “November”,
        13. “December”,
    2. Use dynamic options: No,
    3. Default value: “Select”,
    4. On Change: “Updates Timer Display”.
2.9​
Count Down​
10​
  1. Year
    1. Type: Integer input,
    2. Default value: the current year,
    3. On Change: “Updates Timer Display”.
2.9.1​
Count Down​
11​
  1. Day
    1. Type: Integer input (1–31),
    2. Default value: “1”,
    3. On Change: “Updates Timer Display”.
2.9.1​
Count Down​
12​
  1. Hours
    1. Type: Integer input,
    2. Range: 0–9999 (“Hours, Minutes, Seconds”), 0–23 (“Specific Date & Time”),
    3. Default value: “0”,
    4. On Change: “Updates Timer Display”.
2.0
6.0 (Range)​
Count Down​
13​
  1. Minutes
    1. Type: Integer input,
    2. Range: 0–9999 (“Hours, Minutes, Seconds”), 0–59 (“Specific Date & Time”),
    3. Default value: “0”,
    4. On Change: “Updates Timer Display”.
2.0
6.0 (Range)​
Count Down​
14​
  1. Seconds
    1. Type: Integer input,
    2. Default value: “0”,
    3. On Change: “Updates Timer Display”.
2.0​
Count Down​
15​
  1. Timer Format
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Display full format”,
        2. “No leading zeros”,
        3. “No leading zeros, no split seconds”,
        4. “No split seconds”,
        5. “Custom Time Format”,
    2. Use dynamic options: No,
    3. Default value: “Display full format”,
    4. Conditional: If “Custom Time Format” is selected, “Time Format” will be shown,
    5. On Change: “Hide or display relevant properties”.
3.0 (Expanded)
3.3 (Expanded)
4.8 (Expanded)​
Always​
16​
  1. Time Format
    1. Type: Text Input,
    2. Default value: “$T$D:$H:$M:$S,$F”,
    3. Placeholders:
      1. $D day, $H hour, $M minute, $S second, $F split second,
      2. $T trims leading zeros,
    4. Support Instructions: Yes ( “{param}” ),
      1. {$H100} / {$M200}: hour or minute unit, used separately or together, e.g. {$H100}:{$M200},
      2. {$F60} / {$F}: show split seconds as frames (60 fps / OBS frame rate),
      3. Older form still supported: {M90}, {H100M200},
    5. On Change: “Adjust timer display” (typing does not move the cursor).
4.8
5.6
6.0 (Expanded)​
Always​
17​
  1. Round up displayed countdown
    1. Type: Checkbox,
    2. Default value: checked,
    3. Shown with “Custom Time Format”,
    4. Applies when the Time Format has no seconds ($S), e.g. $H:$M shows 00:01 until zero.
6.0​
Count Down​
18​
  1. Timer Activation
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Manually”,
        2. “Timer Source Visible”,
        3. “Timer Scene Active”,
        4. “Specific Scene Active”,
        5. “Specific Source Active”,
        6. “Specific Media Active”,
        7. “Recording Started”,
        8. “Streaming Started”,
    2. Use dynamic options: No,
    3. Default value: “Manually”,
    4. Conditional: “Specific …” options show “Activation Source”; any option other than “Manually” shows “Timer Reset”,
    5. Replaces the earlier “Start/Reset Timer on Source Visible / Scene Active” checkboxes,
    6. On Change: “Hide or display relevant properties”.
5.x​
Always​
19​
  1. Activation Source
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Select”,
    2. Use dynamic options: Yes,
      1. List the scenes, sources or media sources that match the selected Timer Activation,
    3. Default value: “Select”,
    4. On Change: “”.
5.x​
Always​
20​
  1. Timer Reset
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Manual”,
        2. “Auto”,
    2. Use dynamic options: No,
    3. Default value: “Manual”,
    4. Auto: reset the timer each time it is activated,
    5. On Change: “”.
5.x​
Always​
21​
  1. Toggle Milliseconds
    1. Type: Text Input,
    2. Default value: “”,
    3. Use: time stamp 00:00:00 at which to show the milliseconds,
    4. On Change: “”.
3.9​
Count Down​
22​
  1. Split Source
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Select”,
    2. Use dynamic options: Yes,
      1. List all available names of Text Sources,
    3. Default value: “Select”,
    4. The Timer Source and other text roles are not listed; if no Text Source is free, a greyed-out hint explains why,
    5. Conditional: If a valid Text Source is selected then “Split Type” will be shown,
    6. On Change: “Hide or display relevant properties”.
1.0
6.0 (Hint)​
Count Up​
23​
  1. Refresh sources
    1. Type: Button,
    2. On Click: “Rebuild the Split Source list from the current OBS sources”.
6.0​
Count Up​
24​
  1. Split Type
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Interval”,
        2. “Mark”,
        3. “Mark Interval”,
        4. “Interval Mark”,
    2. Use dynamic options: No,
    3. Default value: “Mark”,
    4. On Change: “”.
1.0​
Count Up​
25​
  1. Marker Settings
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Hidden”,
        2. “Expanded”,
    2. Use dynamic options: No,
    3. Default value: “Hidden”,
    4. On Change: “Hide or display relevant properties”.
4.2​
Always​
26​
  1. Tip
    1. Type: Text (information),
    2. Value: “Use format 00:00:00 ( hours:minutes:seconds )”.
5.x​
Always​
27​
  1. Marker A Time
    1. Type: Editable list,
    2. Use: time stamps 00:00:00, one per entry,
    3. On Change: “”.
2.0​
Always​
28​
  1. Marker B Time
    1. Type: Editable list,
    2. Use: time stamps 00:00:00, one per entry,
    3. On Change: “”.
2.0​
Always​
29​
  1. Pause timer at Marker A
    1. Type: Checkbox,
    2. Default value: unchecked,
    3. Pauses the timer exactly on each Marker A time; marker audio, colour and note still run; press Start to continue.
6.0​
Always​
30​
  1. Pause timer at Marker B
    1. Type: Checkbox,
    2. Default value: unchecked,
    3. Pauses the timer exactly on each Marker B time; marker audio, colour and note still run; press Start to continue.
6.0​
Always​
31​
  1. Reset Marker A Text
    1. Type: Integer Slider (seconds),
    2. Default value: “3”,
    3. Restores the normal colour after this time; paused with the timer,
    4. On Change: “”.
5.0
6.0​
Always​
32​
  1. Reset Marker B Text
    1. Type: Integer Slider (seconds),
    2. Default value: “3”,
    3. Restores the normal colour after this time; paused with the timer,
    4. On Change: “”.
5.0
6.0​
Always​
33​
  1. Marker A Audio
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “None”,
        2. “Allow Multiple Selections”,
    2. Use dynamic options: Yes,
      1. List all available names of Media Sources,
    3. Default value: “None”,
    4. Plays every time the marker is reached (no Reset needed),
    5. Conditional: If “Allow Multiple Selections” is selected then “Marker A Audio List” will be shown,
    6. On Change: “Show/Hide relevant properties”.
2.0
6.0​
Always​
34​
  1. Marker A Audio List
    1. Type: Editable list,
    2. Use: Define names of Media Sources, played in turn,
    3. On Change: “”.
5.0​
Always​
35​
  1. Marker B Audio
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “None”,
        2. “Allow Multiple Selections”,
    2. Use dynamic options: Yes,
      1. List all available names of Media Sources,
    3. Default value: “None”,
    4. Plays every time the marker is reached (no Reset needed),
    5. Conditional: If “Allow Multiple Selections” is selected then “Marker B Audio List” will be shown,
    6. On Change: “Show/Hide relevant properties”.
2.0
6.0​
Always​
36​
  1. Marker B Audio List
    1. Type: Editable list,
    2. Use: Define names of Media Sources, played in turn,
    3. On Change: “”.
5.0​
Always​
37​
  1. Timer Expired Audio
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “None”,
    2. Use dynamic options: Yes,
      1. List all available names of Media Sources,
    3. Default value: “None”,
    4. Shown for “Select”, “TIMER END TEXT”, overtime, and a scene with “Play Timer Expired Audio first, then switch”,
    5. On Change: “”.
4.2
6.0​
Count Down​
38​
  1. Media Playback Limit
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Disabled”,
        2. “Enabled”,
    2. Use dynamic options: No,
    3. Default value: “Disabled”,
    4. On Change: “Show/Hide relevant properties and enable/disable relevant features”.
2.0​
Always​
39​
  1. Marker A Duration
    1. Type: Integer Slider (seconds),
    2. Default value: “5”,
    3. Conditional: Setting to 0 = disabled,
    4. Stops the Marker A audio after this time (real time),
    5. On Change: “”.
2.0
6.0 (fixed)​
Always​
40​
  1. Marker B Duration
    1. Type: Integer Slider (seconds),
    2. Default value: “5”,
    3. Conditional: Setting to 0 = disabled,
    4. Stops the Marker B audio after this time (real time),
    5. On Change: “”.
2.0
6.0 (fixed)​
Always​
41​
  1. End Audio Duration
    1. Type: Integer Slider (seconds),
    2. Default value: “5”,
    3. Conditional: Setting to 0 = disabled,
    4. On Change: “”.
4.2​
Count Down​
42​
  1. Normal Color
    1. Type: Colour Select,
    2. Default value: “#ffffff”,
    3. On Change: “”.
2.0​
Always​
43​
  1. Marker A Color
    1. Type: Colour Select,
    2. Default value: “#edf340”,
    3. On Change: “”.
2.0​
Always​
44​
  1. Marker B Color
    1. Type: Colour Select,
    2. Default value: “#5a0505”,
    3. Also used for overtime (optional),
    4. On Change: “”.
2.0​
Always​
45​
  1. Marker Notes
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Disabled”,
        2. “Enabled”,
    2. Use dynamic options: No,
    3. Default value: “Disabled”,
    4. On Change: “Hide or display relevant properties”.
3.2​
Always​
46​
  1. Marker A Note Source
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Select”,
    2. Use dynamic options: Yes,
      1. List all available names of Text Sources,
      2. List all available names of Group Sources (all nested Text Sources will be used),
    3. Default value: “Select”,
    4. On Change: “”.
3.2​
Always​
47​
  1. Marker B Note Source
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Select”,
    2. Use dynamic options: Yes,
      1. List all available names of Text Sources,
      2. List all available names of Group Sources (all nested Text Sources will be used),
    3. Default value: “Select”,
    4. On Change: “”.
3.2​
Always​
48​
  1. Marker A Note
    1. Type: Text Input,
    2. Default value: “”,
    3. On Change: “”.
3.2​
Always​
49​
  1. Marker B Note
    1. Type: Text Input,
    2. Default value: “”,
    3. On Change: “”.
3.2​
Always​
50​
  1. Hide Marker A Note
    1. Type: Integer Slider (seconds),
    2. Default value: “3”,
    3. Conditional: Setting to 0 = disabled,
    4. Paused with the timer,
    5. On Change: “”.
5.0
6.0​
Always​
51​
  1. Hide Marker B Note
    1. Type: Integer Slider (seconds),
    2. Default value: “3”,
    3. Conditional: Setting to 0 = disabled,
    4. Paused with the timer,
    5. On Change: “”.
5.0
6.0​
Always​
52​
  1. Auto Recording
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Disabled”,
        2. “Timer Expires”,
        3. “Marker A Time”,
        4. “Marker B Time”,
        5. “Timer Visible”,
        6. “Timer Start”,
    2. Use dynamic options: No,
    3. Default value: “Disabled”,
    4. Starts OBS recording (if not already recording),
    5. On Change: “”.
2.0​
Count Down​
53​
  1. Timer Prefix
    1. Type: Text Input,
    2. Default value: “”,
    3. On Change: “Update Timer prefix display”,
    4. Support Instructions: Yes ( “{param,param}” ),
    5. Restored after an OBS restart.
2.4
6.0​
Always​
54​
  1. Timer Suffix
    1. Type: Text Input,
    2. Default value: “”,
    3. On Change: “Update Timer suffix display”,
    4. Support Instructions: Yes ( “{param,param}” ),
    5. Restored after an OBS restart.
3.0
6.0​
Always​
55​
  1. Active Source
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Select”,
    2. Use dynamic options: Yes,
      1. List all available names of Text Sources,
    3. Default value: “Select”,
    4. Shown with the Source / Scene / Auto List expire events,
    5. On Change: “”.
2.8​
Count Down​
56​
  1. Timer Expire Event
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Select”,
        2. “TIMER END TEXT”,
        3. “Continue counting (overtime)”,
        4. “Source List”,
        5. “Scene List”,
        6. “Auto List”,
    2. Use dynamic options: Yes,
      1. List all available scene names (switch to that scene when the timer expires),
    3. Default value: “Select”,
    4. Conditional: Expands features when timer expires, selected feature dependent,
    5. On Change: “Show/Hide relevant properties and enable/disable relevant features”.
2.8
5.1 (Expanded)
6.0 (Overtime)​
Count Down​
57​
  1. Play Timer Expired Audio first, then switch
    1. Type: Checkbox,
    2. Default value: unchecked,
    3. Shown when a scene is the Timer Expire Event,
    4. Plays the Timer Expired Audio, then switches when it ends or after End Audio Duration,
    5. On Change: “Show Timer Expired Audio settings”.
6.0​
Count Down​
58​
  1. Overtime: show '+' and Marker B colour
    1. Type: Checkbox,
    2. Default value: checked,
    3. Shown with “Continue counting (overtime)”,
    4. Overtime counts up after zero; Reset ends it.
6.0​
Count Down​
59​
  1. Auto List
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Select”,
    2. Use dynamic options: Yes,
      1. List all available names of Group Sources (all nested Text Sources will be used),
    3. Default value: “Select”,
    4. On Change: “”.
5.1​
Count Down​
60​
  1. Timer Expired Text
    1. Type: Text Input,
    2. Default value: “”,
    3. Shown with “TIMER END TEXT”,
    4. On Change: “”.
2.0​
Count Down​
61​
  1. Cycle List
    1. Type: Editable list,
    2. Use: Define names of Sources or Scenes,
    3. Conditional: “Will only allow the appropriate types, will disregard others”,
    4. On Change: “”.
2.8​
Count Down​
62​
  1. Cycle Direction
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Ascending”,
        2. “Descending”,
    2. Use dynamic options: No,
    3. Default value: “Ascending”,
    4. On Change: “”.
5.1 (Expanded)​
Count Down​
63​
  1. Timer Manipulation
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “Hidden”,
        2. “Expanded”,
        3. “Disabled”,
    2. Use dynamic options: No,
    3. Default value: “Hidden”,
    4. Hidden: hotkeys work, options collapsed; Expanded: show step sizes and limits; Disabled: the hotkeys do nothing,
    5. On Change: “Show/Hide relevant properties and enable/disable relevant features”.
4.7
6.0 (Default)​
Always​
64​
  1. Add Seconds
    1. Type: Group,
    2. Name: Add Seconds to time (Initiate with Hotkey),
    3. Group Item Name: Set 1,
      1. Type: Integer Input (seconds, from 1),
      2. Default value: “5”,
      3. Step: “1”,
      4. Hotkey Available: Yes, must be assigned (“Add Seconds Set 1”).
    4. Group Item Name: Set 2,
      1. Type: Integer Input (seconds, from 1),
      2. Default value: “15”,
      3. Step: “1”,
      4. Hotkey Available: Yes, must be assigned (“Add Seconds Set 2”).
    5. Group Item Name: Set 3,
      1. Type: Integer Input (seconds, from 1),
      2. Default value: “30”,
      3. Step: “1”,
      4. Hotkey Available: Yes, must be assigned (“Add Seconds Set 3”).
    6. Group Item Name: Limit,
      1. Type: Integer Input,
      2. Default value: “0”,
      3. Conditional: Setting 0 = infinite,
    7. Group Item Name: Used,
      1. Type: Integer Input,
      2. Default value: “0”,
    8. Group Item Name: Limit Note,
      1. Type: Dropdown list,
      2. Static option: “Select”,
      3. Dynamic options: List all available names of Text Sources,
      4. Default value: “Select”,
    9. Group Item Name: Note visible,
      1. Type: Integer Input (milliseconds),
      2. Default value: “0” (0 = always visible),
    10. Group Item Name: Refresh to update form,
      1. Type: Button,
      2. On Click: “Refresh Properties”.
    11. Works while the timer is paused (the display updates).
4.5
4.7 (Expanded)
6.0​
Always​
65​
  1. Subtract Seconds
    1. Type: Group,
    2. Name: Subtract Seconds from time (Initiate with Hotkey),
    3. Group Item Name: Set 1,
      1. Type: Integer Input (seconds, from 1),
      2. Default value: “5”,
      3. Step: “1”,
      4. Hotkey Available: Yes, must be assigned (“Subtract Seconds Set 1”).
    4. Group Item Name: Set 2,
      1. Type: Integer Input (seconds, from 1),
      2. Default value: “15”,
      3. Step: “1”,
      4. Hotkey Available: Yes, must be assigned (“Subtract Seconds Set 2”).
    5. Group Item Name: Set 3,
      1. Type: Integer Input (seconds, from 1),
      2. Default value: “30”,
      3. Step: “1”,
      4. Hotkey Available: Yes, must be assigned (“Subtract Seconds Set 3”).
    6. Group Item Name: Limit,
      1. Type: Integer Input,
      2. Default value: “0”,
      3. Conditional: Setting 0 = infinite,
    7. Group Item Name: Used,
      1. Type: Integer Input,
      2. Default value: “0”,
    8. Group Item Name: Limit Note,
      1. Type: Dropdown list,
      2. Static option: “Select”,
      3. Dynamic options: List all available names of Text Sources,
      4. Default value: “Select”,
    9. Group Item Name: Note visible,
      1. Type: Integer Input (milliseconds),
      2. Default value: “0” (0 = always visible),
    10. Group Item Name: Refresh to update form,
      1. Type: Button,
      2. On Click: “Refresh Properties”.
    11. Works while the timer is paused (the display updates).
4.5
4.7 (Expanded)
6.0​
Always​
66​
  1. Manually set timer
    1. Type: Group,
    2. Group Item Name: DD,
      1. Type: Integer input (days),
      2. Default value: “0”,
    3. Group Item Name: HH,
      1. Type: Integer input (0–9999),
      2. Default value: “0”,
    4. Group Item Name: MM,
      1. Type: Integer input (0–9999),
      2. Default value: “0”,
      3. With a minute unit (e.g. {$M90}), MM is the minute value shown,
    5. Group Item Name: SS,
      1. Type: Integer input,
      2. Default value: “0”,
    6. Group Item Name: FF,
      1. Type: Integer input,
      2. Default value: “0”,
    7. Group Item Name: Autoload last time stamp when OBS starts,
      1. Type: Checkbox,
      2. Default value: unchecked,
      3. Saved every 30 seconds while running and whenever the timer stops (survives a crash),
    8. Group Item Name: Set,
      1. Type: Button,
      2. On Click: “Apply settings to Timer”,
      3. Hotkey Available: Yes, must be assigned (“Set”).
    9. Group Item Name: Saved Seconds,
      1. Type: Number (the last saved time),
3.5
6.0​
Count Up​
67​
  1. Start Timer
    1. Type: Button,
    2. On Click: “Activate Timer”,
    3. Hotkey Available: Yes, must be assigned (“Start (Start/Pause if not split)”),
    4. Available via Opt-In (see Split Start Pause Button)
5.1​
Always
conditional​
68​
  1. Start / Pause Timer
    1. Type: Button,
    2. On Click: “Activate / Stop Timer”,
    3. Hotkey Available: Yes, must be assigned (“Pause (Start/Pause if not split)”),
    4. Can be dedicated Pause only via Opt-In (see Split Start Pause Button)
5.1 (Expanded)​
Always​
69​
  1. Split Time
    1. Type: Button,
    2. On Click: “Split Timer”,
    3. Hotkey Available: Yes, must be assigned.
1.0​
Count Up​
70​
  1. Show/Hide Milliseconds
    1. Type: Button,
    2. On Click: “Toggle visibility for timer split seconds”,
    3. Hotkey Available: Yes, must be assigned (works while the Scripts window is closed).
3.9​
Count Down​
71​
  1. Count Up/Down
    1. Type: Button,
    2. On Click: “Toggle timer direction (positive/negative)”,
    3. Shown when “Enable Timer Direction Toggle” is checked,
    4. Hotkey Available: Yes, must be assigned.
4.4​
Always
not with Specific Date & Time​
72​
  1. Reset Timer
    1. Type: Button,
    2. On Click: “Reset Timer to initial position”,
    3. Hotkey Available: Yes, must be assigned (works while the Scripts window is closed).
0.2
6.0​
Always​
73​
  1. Split Start Pause Button
    1. Type: Checkbox,
    2. Default value: unchecked,
    3. Unchecked: one Start/Pause button, both hotkeys toggle; Checked: separate Start and Pause,
    4. Applies straight away (no OBS restart).
5.1
6.0​
Always​
74​
  1. Adjust timer manually
    1. Type: Checkbox,
    2. Default value: unchecked,
    3. On Click: “Display ‘Manually set timer’”.
3.2​
Count Up​
75​
  1. Active Source Force Visibility
    1. Type: Checkbox,
    2. Default value: unchecked,
    3. On Click: “”.
3.9​
Count Down​
76​
  1. Enable Timer Direction Toggle
    1. Type: Checkbox,
    2. Default value: unchecked,
    3. On Click: “Show the Count Up/Down button and Prevent Negative Time Value”.
4.4​
Always
not with Specific Date & Time​
77​
  1. Prevent Negative Time Value
    1. Type: Checkbox,
    2. Default value: unchecked,
    3. On Click: “”.
4.4​
Always
not with Specific Date & Time​
78​
  1. Backup Mode
    1. Type: Checkbox,
    2. Default value: unchecked,
    3. On Click: “Display Backup Mechanisms”.
3.3​
Always​
79​
  1. Enable debug logging
    1. Type: Checkbox,
    2. Default value: unchecked,
    3. Writes a “Debug Log” text file next to the script.
5.0​
Always​
80​
  1. Backup Folder
    1. Type: Folder path,
    2. Default value: “”,
    3. On Change: “List the settings files found in the folder”.
3.3​
Always​
81​
  1. Load Settings
    1. Type: Dropdown list,
      1. Available Static Options:
        1. “No Files Found”,
    2. Use dynamic options: Yes,
      1. List names of all valid settings files in the Backup Folder,
    3. Default value: “No Files Found”,
    4. On Select: “(when a valid file is selected) Import and apply all property settings from the selected file”,
    5. On Change: “”.
3.3​
Always​
82​
  1. Export Split Time
    1. Type: Checkbox,
    2. Default value: unchecked,
    3. Exports split times to a text file (opt-in).
5.9​
Always​
83​
  1. Import Settings
    1. Type: Button,
    2. On Click: “Import settings from the selected file”.
3.3​
Always​
84​
  1. Export Settings
    1. Type: Button,
    2. On Click: “Export current property settings to a ‘json’ file”.
3.3​
Always​
85​
  1. Disable Script
    1. Type: Checkbox,
    2. Default value: unchecked,
    3. On Click: “Prevent Core Functions to execute”.
0.2​
Always​
86​
  1. Disable Features
    1. Type: Checkbox (shows the group below),
    2. Default value: unchecked,
    3. Group: “Disable or Enable Plugin Features - Check [x] = enabled”, each item a Checkbox, default checked:
      1. Split Seconds Toggle,
      2. Timer Time Split/Lap,
      3. Marker Settings,
      4. Text Colour [Normal],
      5. Text Colour [Marker A],
      6. Text Colour [Marker B],
      7. Recording,
      8. Timer Text Prefix,
      9. Timer Text Suffix,
      10. Timer Activation,
      11. Timer Manipulation,
      12. Debugging,
      13. Backup.
5.1​
Always​

  1. Video tutorial: Download and install the Script
  2. Getting started with a basic Count Up timer
  3. Exploring advanced features for a Count Up timer.
  4. Getting started with a basic Count Down timer
  5. Exploring advanced features for a Count Down timer [Tutorial Coming Soon]
  6. Exploring advanced features for any timer mode [Tutorial Coming Soon]
  7. Upgrading from an earlier version: in OBS > Tools > Scripts, remove the old StopWatch script first, then add StopWatch-[6.0].lua. Running both would give you two timers.
  8. Need help? Turn on Enable debug logging, reproduce the problem, and attach the log file to your post.
Author
GrumpyDog
Downloads
179,366
Views
179,366
First release
Last update

Ratings

4.55 star(s) 20 ratings

More resources from GrumpyDog

Latest updates

  1. 6.0: Reset & hotkey fixes, overtime, pause at markers, frame display and more

    StopWatch 6.0 is a big maintenance and feature release. It fixes the long-standing Reset and...
  2. Relinked

    Relinked
  3. Version 5.9

    Thank you @RobertWilliams, @rez1coder and @goods0ul for your valuable feedback and help on the...

Latest reviews

Works well but I'm a bit confused how to set it up so audio plays once the timer is complete. Ideally, I want a 5 minute timer with a manual start and at the end a media file (mp3 notification) plays
only issue i have is reset button everything works tho
I can't figure out how to import into the studio please help.
Incredibly flexible plugin. Does everything I could want and more.
This plugin is great, My original intention was to track Zone Time for 3 different Areas during my e-sports broadcasts.

The only QoL feature that would make this perfect for me would be to have a designated 'Pause Timer' hotkey.
That way I can pause the other timers while I start the other one.

There's already designated hotkeys for 'Start' & 'Reset' but there isn't one for specifically 'Pause'
GrumpyDog
GrumpyDog
Pretty sure there is. There is a feature to "Split Pause / Start" allowing for a dedicated "Start" and "Pause" hotkey.
Very powerful script. The Split Time triggering and tracking has been a god send when tweaking my advance scene switcher macros to next level. TY.
Amazing program! I just want to know how to access the "Autoload Last Saved Timestamp" in version 5.8! I'm doing a charity stream for a total of 30 hours, so I'd like to be able to resume the count up to the 30-hour goal when I start my stream the next time, instead of manually having to adjust it every stream, since I'll be streaming multiple days in a row.
Hi

Great script so far. 5 stars if you could add more timers. Need 2 extra timers with separate count and connect to textbox in obs.

Streaming handball and want to have a timer for xx:xx tíme since last goal, for both teams, and the main counter free for other things.
GrumpyDog
GrumpyDog
Then you owe me another star because it is already possible. Simply duplicate the Script and give it a unique name and add it in the script index with the first one. You can add several scripts if your system can support it. Check the Main Description page, it includes some links for video tutorials.
Thanks for this easy-to-customize stopwatch! Also nice are the comprehensive YouTube tuts on installation and settings.
GrumpyDog
GrumpyDog
Thank you. Planning to do more vids on this in the future.
Amazing work ! Many great features ..
GrumpyDog
GrumpyDog
Thank you for the feedback (:
Back
Top