SessionPulse includes two overlay styles — a circular ring and a horizontal bar — both highly customizable via the Custom CSS field in OBS Browser Source properties.
How it works: The overlay CSS uses
var(--sp-*, default)references for all theme-able properties. When you set these properties in OBS Custom CSS, they override the defaults through the native CSS cascade — no JavaScript needed.
- Add a Browser Source to your scene
- Check Local file → select
timer_overlay.html - Set Width: 400, Height: 400 (renders at high resolution; scale down in OBS for crispness)
SessionPulse ships with 3 preset themes. Copy-paste the full Custom CSS line into the Custom CSS field:
Neon — Bright glow, high contrast, thinner ring:
body { background-color: rgba(0, 0, 0, 0); margin: 0px auto; overflow: hidden; --sp-ring-stroke: 6; --sp-ring-filter: drop-shadow(0 0 8px currentColor); --sp-glow-filter: blur(40px); }Minimal — No glow, thin ring, light font:
body { background-color: rgba(0, 0, 0, 0); margin: 0px auto; overflow: hidden; --sp-glow-opacity: 0; --sp-ring-stroke: 4; --sp-time-weight: 300; --sp-time-size: 2.4rem; }Glassmorphism — Frosted glass circle behind the ring:
body { background-color: rgba(0, 0, 0, 0); margin: 0px auto; overflow: hidden; --sp-glass-display: block; }Default — No extra properties needed, use the standard Custom CSS:
body { background-color: rgba(0, 0, 0, 0); margin: 0px auto; overflow: hidden; }All properties are optional. Add them inside body { } in the Custom CSS field:
| Property | Default | Description |
|---|---|---|
--sp-ring-stroke |
14 |
Ring stroke width |
--sp-ring-filter |
drop-shadow(...) |
SVG filter on the ring |
--sp-glow-filter |
blur(40px) |
Filter on the background glow |
--sp-glow-opacity |
1 |
Glow opacity when active (0 to hide) |
--sp-time-size |
5.4rem |
Timer text font size |
--sp-time-weight |
700 |
Timer text font weight |
--sp-time-stroke |
0.5px |
Timer text outline for readability |
--sp-label-size |
1.45rem |
Session label font size |
--sp-stats-size |
1rem |
Stats text font size |
--sp-glass-display |
none |
Set to block to show frosted glass circle |
--sp-tracker-stroke |
4 |
Session tracker segment thickness |
--sp-next-size |
0.82rem |
Next-up line text size |
--sp-transition-display |
block |
Set to none to hide transition pill |
--sp-backdrop-bg |
dark radial | Backdrop center color |
--sp-backdrop-bg-edge |
darker radial | Backdrop edge color |
--sp-backdrop-blur |
24px |
Backdrop blur strength |
You can mix and match — for example, neon ring with glassmorphism glass:
body { background-color: rgba(0, 0, 0, 0); margin: 0px auto; overflow: hidden; --sp-ring-stroke: 6; --sp-ring-filter: drop-shadow(0 0 8px currentColor); --sp-glass-display: block; }- Frosted glass backdrop — dark radial-gradient circle with
backdrop-filter: blur(24px), readable on any stream background (light or dark) - Gradient progress ring — session-colored gradient (e.g., green→cyan for Focus) with
stroke-linecap: roundand dual drop-shadow glow - Glow cap — a bright dot that tracks the leading edge of the ring progress
- Session tracker — inner segmented ring showing completed vs. goal sessions. Each segment lights up as sessions complete
- Next-up line — inline text below stats showing the next session type and end time (always visible during sessions)
- Transition pill — dark pill at the bottom that briefly flashes transition messages ("Time for a Short Break")
- Breathing glow — subtle 5-second scale+fade animation behind the ring when running
- Tick marks — 12 subtle clock-face marks for visual reference
- Paused state — timer and label pulse, glow dims
- Overtime — ring pulses red, timer shows
+0:00counting up
Override the default session colors by adding CSS custom properties:
body {
background-color: rgba(0, 0, 0, 0); margin: 0px auto; overflow: hidden;
--focus-color: #ec4899;
--focus-glow: rgba(236, 72, 153, 0.3);
--short-break-color: #06b6d4;
--short-break-glow: rgba(6, 182, 212, 0.3);
}| Property | Default | Session |
|---|---|---|
--focus-color |
#22c55e (green) |
Focus |
--focus-glow |
rgba(34, 197, 94, 0.3) |
Focus glow |
--short-break-color |
#3b82f6 (blue) |
Short Break |
--short-break-glow |
rgba(59, 130, 246, 0.3) |
Short Break glow |
--long-break-color |
#a855f7 (purple) |
Long Break |
--long-break-glow |
rgba(168, 85, 247, 0.3) |
Long Break glow |
--stopwatch-color |
#f59e0b (amber) |
Stopwatch |
--countdown-color |
#f97316 (orange) |
Countdown |
The overlay renders at 400×400 by default for maximum sharpness. In OBS, resize using Edit Transform (right-click → Transform → Edit Transform) to scale it down. This gives retina-quality crispness at any display size.
| Use Case | Browser Source Size | OBS Display Size |
|---|---|---|
| Corner widget | 400×400 (default) | Scale to ~180px via transform |
| Study stream (prominent) | 400×400 | Scale to ~280px |
| Full-screen overlay | 600×600 | Full canvas or large |
| Small/gaming | 400×400 | Scale to ~120px |
- Bottom-right corner — most common, doesn't obstruct gameplay
- Top-left — good for study/work streams
- Center overlay — use a larger size (300+) for "ambient" streams
- Multiple overlays — you can add more than one Browser Source with different sizes/positions
A horizontal progress bar for the edge of your stream. Shares the same color system as the ring overlay — user color customizations apply to both.
- Add a Browser Source → select
timer_overlay_bar.html - Set Width: 1920 (your stream width), Height: 48
- Position at the top or bottom edge of your canvas
By default the bar slides in from the top. To slide from the bottom, add to Custom CSS:
body { --sp-position: bottom; }All properties are optional. Add them inside body { } in the Custom CSS field:
| Property | Default | Description |
|---|---|---|
--sp-bar-height |
48px |
Bar height |
--sp-bar-bg |
dark (0.82 opacity) | Bar background color |
--sp-bar-blur |
18px |
Bar backdrop blur strength |
--sp-bar-progress-height |
6px |
Progress bar track height |
--sp-bar-label-size |
0.88rem |
Session label font size |
--sp-bar-time-size |
1.25rem |
Timer text font size |
--sp-bar-counter-size |
0.82rem |
Session counter font size |
--sp-bar-next-size |
0.78rem |
Next-up info font size |
--sp-position |
top |
Bar position: top or bottom |
- Gradient progress bar — session-colored gradient (e.g., green→cyan for Focus) with glow
- Session-colored border accent — 2px colored line at the sliding edge
- Status takeover — when SP Status is active, label changes to status message in amber with pulse
- Next-up info — "Next: Short Break · 10:20" displayed on the right side
- Focus duration — counter shows
3/6 · 23m(sessions + total time) - Paused state — timer and label pulse, progress dims
- Overtime — progress track pulses red
- Auto-hides when the timer is idle (slides out)
- Slides in when the timer starts
- Color-coded — gradient fill + border glow matches session type
- Shared colors — uses the same
--focus-color,--short-break-color, etc. as the ring - Transition messages ("Time for a Short Break") appear briefly on the right
body { background-color: rgba(0,0,0,0); margin: 0px auto; overflow: hidden; --sp-ring-stroke: 6; --sp-ring-filter: drop-shadow(0 0 8px currentColor); --sp-glow-filter: blur(40px); }Small, glowing, unobtrusive. Keep Browser Source at 400×400, then scale to ~150px via OBS transform.
body { background-color: rgba(0,0,0,0); margin: 0px auto; overflow: hidden; }Default theme. Larger, clean, readable. Keep Browser Source at 400×400, scale to ~280px via OBS transform.
body { background-color: rgba(0,0,0,0); margin: 0px auto; overflow: hidden; --sp-glow-opacity: 0; --sp-ring-stroke: 4; --sp-time-weight: 300; --sp-time-size: 2.4rem; --focus-color: #6366f1; }Muted, branded colors, thin ring. Keep Browser Source at 400×400, scale to ~180px via OBS transform.
body { background-color: rgba(0,0,0,0); margin: 0px auto; overflow: hidden; --sp-glass-display: block; --focus-color: #f472b6; --focus-glow: rgba(244, 114, 182, 0.3); }Frosted glass, soft pink. Keep Browser Source at 400×400, scale to ~280px via OBS transform.
Add both as separate Browser Sources:
- Ring in a corner for viewers
- Bar at the top edge for at-a-glance progress
When overtime is enabled and the timer hits zero:
- The ring turns red and pulses
- The countdown shows
+0:00,+0:30,+1:00, etc. - The glow intensifies
This continues until you manually skip or stop the session.
Quick Setup creates overlay sources only. If you prefer individual text elements for full positional control, create them manually using this guide.
The overlays (ring + bar) display all session information automatically. However, power users who want to position each element independently can create GDI+ Text (or FreeType 2 on Linux) sources and assign them in the SessionPulse script settings.
| Source Name | Content | Recommended Font Size |
|---|---|---|
SP Session |
Current session type (e.g., "Focus") | 36 |
SP Timer |
Countdown timer (e.g., "24:30") | 72 |
SP Count |
Goal progress (e.g., "3/8") | 24 |
SP Progress |
Text-based progress bar | 20 |
SP Status |
Status messages | 28 |
- In OBS, add a new GDI+ Text source (Windows) or FreeType 2 source (Linux/Mac)
- Name it exactly as shown above (e.g.,
SP Timer) - Set font, size, and color to your preference
- Position the source wherever you want on your canvas
- In the SessionPulse script settings, under Source Assignment, set the matching dropdown to your source name
- Repeat for each text element you want
Each text source supports all standard OBS text source properties:
- Font: Any installed font (monospace fonts like
JetBrains Monowork great for timers) - Color: Any color via the OBS color picker
- Outline: Enable outline for readability over busy backgrounds
- Shadow: Add drop shadow for depth
- Opacity: Adjust via OBS source filters
- Transform: Resize, rotate, or crop via OBS Edit Transform
| Use Case | Recommendation |
|---|---|
| Standard streaming | Overlays — one source, everything included |
| Custom layouts | Text sources — position each element independently |
| Minimal setup | Bar overlay — single stripe at top/bottom |
| Branded stream | Text sources — match your exact font and colors |
| Quick setup | Overlays — one-click via Quick Setup |