Skip to content

Streamathon

Streamathon shows a live countdown timer in OBS and other tools that support browser sources. Use it when viewer activity should add time to a stream timer.

Streamathon editor
  1. Open the Synchra Dashboard.
  2. Go to Widgets.
  3. Create a Streamathon widget.
  4. Enter a title and starting time.
  5. Set Ends at if you want to cap it to a specific date.
  6. Set the base time per activity.
  7. Select which sources should add time.
  8. Set each source’s multiplier.
  9. Click Widget URL and copy the URL.
  10. Add it to OBS as a Browser Source.
  11. Open Controls and start the timer.

Open controls from the widget settings.

You can start, pause, resume, restart, reset, add time and remove time.

The timer starts with the configured starting time. When it is running, it counts down until it reaches zero. When it is paused, it stays where it is.

Activity such as subs, bits and donations can add time after the timer has started. Activity types start from the base time per activity and can be fine-tuned in the source settings.

You can customize the title, starting time, end cap, base time per activity, sources, multipliers, subtype multipliers, colors, font, size, padding, border and visibility settings.

Disabling the widget hides it from the browser source.

Streamathon can be styled using custom CSS. Start with the built-in settings first. Use custom CSS when you need a specific layout, glow, shadow, background or timer treatment.

CSS order: built-in CSS, Theme CSS, then Widget CSS. Later rules win at equal specificity.

Simplified generated markup; optional elements are marked.

<section
  class="streamathon-widget"
  data-status="paused"
  data-warning="false"
>
  <div class="streamathon-widget__content">
    <div class="streamathon-widget__title">Streamathon</div> <!-- Optional -->
    <div class="streamathon-widget__timer-wrap">
      <div class="streamathon-widget__timer">12:34:56</div>
      <div class="streamathon-widget__gain">1m</div> <!-- Temporary -->
    </div>
    <div class="streamathon-widget__status">Paused</div> <!-- Optional -->
    <div class="streamathon-widget__recent-events"> <!-- Optional -->
      <div class="streamathon-widget__recent-event">
        <span class="streamathon-widget__recent-viewer">Viewer name</span>
        <span class="streamathon-widget__recent-duration">+1m</span>
      </div>
      <!-- More .streamathon-widget__recent-event elements -->
    </div>
  </div>
</section>

Layout: vertical content; gain text overlays the timer; recent rows use flexible viewer | duration.

ClassDescription
.streamathon-widgetRoot container. It sizes to its content and owns the widget theme variables.
.streamathon-widget--disabledAdded when disabled. The built-in CSS lowers its opacity in previews.
.streamathon-widget__contentInner column that keeps the timer and optional rows aligned.
.streamathon-widget__titleOptional title. The built-in style truncates it with an ellipsis.
.streamathon-widget__timer-wrapPositioned wrapper for the timer and temporary gain text.
.streamathon-widget__timerLive countdown. Uses tabular numerals to prevent digit-width shifts.
.streamathon-widget__timer--bumpAdded briefly when activity adds time. It runs the built-in bump animation.
.streamathon-widget__gainTemporary added-time text, such as 1m, positioned over the timer.
.streamathon-widget__statusOptional status text, such as paused, ended or capped.
.streamathon-widget__recent-eventsOptional list of recent time additions.
.streamathon-widget__recent-eventOne recent activity row.
.streamathon-widget__recent-viewerViewer name. The built-in style truncates it with an ellipsis.
.streamathon-widget__recent-durationTime added by the event. Uses tabular numerals.

All attributes below are on .streamathon-widget.

AttributeDescription
data-status="idle"Timer has not started.
data-status="running"Timer is running.
data-status="paused"Timer is paused.
data-status="ended"Timer reached zero.
data-warning="false"Timer is not in its warning window.
data-warning="true"Timer is running with 5 minutes or less remaining.
VariableValue typeControls
--streamathon-widget-text-colorCSS colorTitle, status and recent-viewer color.
--streamathon-widget-background-colorCSS colorRoot background. Alpha colors keep the OBS canvas visible.
--streamathon-widget-border-colorCSS colorRoot border color.
--streamathon-widget-time-left-colorCSS colorNormal timer, added-time text and recent-duration color.
--streamathon-widget-warning-timer-colorCSS colorTimer color when data-warning="true".
--streamathon-widget-ended-timer-colorCSS colorTimer color when data-status="ended".
--streamathon-widget-border-widthCSS lengthRoot border width.
--streamathon-widget-border-radiusCSS lengthRoot corner radius.
--streamathon-widget-paddingCSS lengthSpace inside the root.
--streamathon-widget-font-familyFont family listFont for the entire widget.
--streamathon-widget-font-sizeCSS lengthTimer size; supporting text is sized in em from this value.
--streamathon-widget-min-widthCSS length or percentageMinimum root width.
--streamathon-widget-max-widthCSS length or percentageMaximum root width.

Set theme variables on .streamathon-widget.

Get a font import, then:

@import url("https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap");

.streamathon-widget {
  --streamathon-widget-font-family: "Roboto", sans-serif;
}
.streamathon-widget__timer {
  text-shadow: 0 0 12px currentColor;
}

.streamathon-widget__status {
  opacity: 0.85;
}
.streamathon-widget[data-status="ended"] .streamathon-widget__timer {
  color: var(--streamathon-widget-ended-timer-color);
  text-shadow: 0 0 18px currentColor;
}