Cortisol Gauge
A five-band health gauge with a needle that sweeps from one reading to another, overshoots, and settles. Configure labels, values, timing, colors, and optional numeric readout.
Put this in your video
Any reading that moves between low, normal and high: stress, risk, a score. Paste this into Claude Code, Codex, or any coding agent.
Use the OverlayMotion video templates from https://github.com/ricardo/overlay-motion Add the Cortisol Gauge template titled "CORTISOL LEVEL" sweeping from 90 down to 10, centered, with the needle overshooting before it settles.
- Have ready: The title, the start and end values, and the band labels.
- Works over any clip, and still renders with no clip at all.
- Defaults to the center of the frame for about 6 seconds. Ask for another spot, a start time, or a longer hold.
- A correction is one sentence: “Show the number while the needle moves.”
Technical reference: props, spec knobs and JSON
Inputs
Everything inside the overlay's props. Omit one and its default applies.
titletextDefault "CORTISOL LEVEL"Heading above the gauge
lowLabeltextDefault "LOW"Label over the low range
normalLabeltextDefault "NORMAL"Label over the middle range
highLabeltextDefault "HIGH"Label over the high range
startValuenumberDefault 90Needle value before the sweep, from 0 to 100
endValuenumberDefault 10Needle value after the sweep, from 0 to 100
delaySecondsnumberDefault 0.7Hold before the needle starts moving
sweepSecondsnumberDefault 2.2Duration of the main needle sweep
settleSecondsnumberDefault 1.1Duration of the elastic settling motion after the sweep
overshootnumberDefault 4Strength of the elastic landing, in value points
elasticBouncesnumberDefault 2Number of pointer oscillations while it settles
showValuetrue / falseDefault falseShow the animated numeric value inside the gauge
valueSuffixtextDefault ""Text appended to the optional numeric value, such as %
lowColortextDefault "#00CD34"First range color
lowMidColortextDefault "#9ACB34"Second range color
normalColortextDefault "#FFCC33"Middle range color
highMidColortextDefault "#FF6600"Fourth range color
highColortextDefault "#FE0002"Final range color
backgroundColortextOptionalGauge background; omit to use the theme surface color
textColortextOptionalTitle and label color; omit to use the theme text color
needleColortextOptionalNeedle and hub color; omit to use the theme text color
What the spec changes without touching props
These live on the overlay, not in this template. They are renderer-provided, so they behave the same here as on every other template.
regionWhere it sits. One of the 12 named boxes, or your own
{ "x": 62, "y": 12, "w": 34, "h": 42 }in percent of the frame. This template is designed aroundcenter, which is what it uses when the spec says nothing.fullscreentop-bannerlower-thirdupper-thirdcaption-zoneleft-panelright-panelcentercorner-tlcorner-trcorner-blcorner-brscaleUniform size inside the resolved region,
0.25to2. Props that size the artwork stay relative to the region box, soscaleis how an overlay grows past it.timeWhen it lives:
start,duration, or theappear+holdpair (entrance length plus how long the finished overlay stays). Seconds (3s), percentages (66%) and negative seconds from the end (-2s) are all valid.motionObject motion, applied to the element itself so nothing is cropped or zoomed. Unset here, so add
{ "style": "shake" }(orwobble,float,sway-3d) withamount(0..1) and its owntimewindow, or one of theskew-*sweeps for a single slow turn into a perspective keystone. Pass an array to stack several.shakewobblefloatsway-3dskew-rightskew-leftskew-upskew-downnoneenterRenderer-owned entrance, 0.6s, identical on every template. It stacks with whatever entrance the template already runs, so set the template's own entrance prop to
nonewhen you drive it from here.slide-leftslide-rightspringmaskexitHow it leaves:
blur-outmelts it away,fade-downdrifts down,shrinkscales to center (0.9s each),vanishpops it out of existence in 0.45s. Set one and the template's own fade steps aside.blur-outfade-downshrinkvanishcameraMoves the region's VIEWPORT rather than the element:
push-in,pull-out, thepan-*family,handheld. Its own transform layer, so it stacks withmotion,enter,exitandscale.soundPer-overlay override of the spec's sound block:
enabled,volume, and asoundsmap that remaps one cue by name ({ "pop": "ding" }, a path to your own file, orfalseto mute just that cue). The map is keyed by CUE, so remappingpopalso changes anexit: "vanish", which firespoptoo. To change only this template's own sound, use itssfxprop instead. Core palette:click,pop,whoosh,ding,typewriter.All 45 premade cues
popbubbletickdingwhooshkeyboard-typing-naturalmouse-click-pressmouse-click-releasetypewriter-scissor-metallic-lowtypewriter-scissor-metallic-basstypewriter-scissor-metallic-subtypewriter-scissor-metallictypewriter-scissor-lowtypewriter-scissor-deeptypewriter-laptoptypewriter-chiclettypewriter-scissortypewritertypewriter-softtypewriter-mechanicaltypewriter-digitaltypewriter-heavytypewriter-thocktypewriter-steeltypewriter-slamtypewriter-buttontypewriter-switchtypewriter-keycapclickclick-crispclick-roundclick-glasstogglesuccesserrornotificationsparkleswoopriserimpactglitchshutterswipedropdisplay
Copy and customize
This exact spec drives the preview. Replace media paths and props with your own.
{
"theme": "<your-brand-tokens>",
"version": 1,
"format": "square",
"fps": 60,
"durationSec": 6,
"source": {
"type": "none"
},
"sound": {
"enabled": true,
"volume": 1,
"sounds": {}
},
"overlays": [
{
"template": "cortisol-gauge",
"region": "center",
"time": {},
"motion": {
"style": "sway-3d",
"amount": 0.3,
"frequency": 0.16,
"seed": 29,
"rampSec": 0.7,
"rampOutSec": 0.7
},
"props": {
"title": "CORTISOL LEVEL",
"lowLabel": "LOW",
"normalLabel": "NORMAL",
"highLabel": "HIGH",
"startValue": 90,
"endValue": 10,
"delaySeconds": 0.6,
"sweepSeconds": 1.7,
"settleSeconds": 1.1,
"overshoot": 4,
"elasticBounces": 2,
"showValue": false
}
}
]
}