Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions co.meldstudio.streamdeck.sdPlugin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ And we're not done yet! We are continually working to bring you even more capabi

## What's New

Version 0.6.4.2
- Raised the Record Clip action's maximum duration to 120 seconds, matching Meld Studio's supported clip length.

Version 0.6.4.1
- Added configurable durations to the Record Clip action. Choose a 10, 15, 30, 60, or 90 second preset, or enter a custom duration from 0 to 90 seconds.
- Improved action state synchronization and recovery after Meld Studio reconnects and session restores.
Expand All @@ -35,6 +38,12 @@ hi@meldstudio.co
# Change History:
------------

## 2026-08-14 (v0.6.4.2)
### Changes:
-----------
- Raised the Record Clip action's maximum duration to 120 seconds, matching Meld Studio's supported clip length.


## 2026-08-12 (v0.6.4.1)
### Changes:
-----------
Expand Down
4 changes: 2 additions & 2 deletions co.meldstudio.streamdeck.sdPlugin/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
},
"Description": "Meld Studio 💙 Stream Deck. Take your stream to new heights with powerful new capabilities at your fingertips. Trigger transitions, manage audio tracks, toggle filter effects on and off, and much more.",
"URL": "https://meldstudio.co",
"Version": "0.6.4.1",
"Version": "0.6.4.2",
"UUID": "co.meldstudio.streamdeck",
"OS": [
{
Expand Down Expand Up @@ -260,4 +260,4 @@
"PropertyInspectorPath": "ui/widget-control.html"
}
]
}
}
5 changes: 3 additions & 2 deletions co.meldstudio.streamdeck.sdPlugin/ui/clip.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@
<option value="30">30</option>
<option value="60">60</option>
<option value="90">90</option>
<option value="120">120</option>
<option value="custom">Custom…</option>
</select>
</div>
<div class="sdpi-item" id="custom-duration-row" style="display: none;">
<div class="sdpi-item-label">Custom</div>
<input type="number" class="sdpi-item-value" id="clipDuration" value="90" min="0" max="90"
<input type="number" class="sdpi-item-value" id="clipDuration" value="90" min="0" max="120"
step="1" />
</div>
</div>
Expand All @@ -38,7 +39,7 @@
"clipDuration",
"clipDurationPreset",
"custom-duration-row",
["10", "15", "30", "60", "90"],
["10", "15", "30", "60", "90", "120"],
"90"
);
});
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "meld-studio-streamdeck",
"version": "0.6.4.1",
"version": "0.6.4.2",
"description": "Meld Studio Stream Deck plugin (Node SDK)",
"license": "MIT",
"type": "module",
Expand Down
4 changes: 2 additions & 2 deletions src/actions/clip.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ type ClipSettings = {
};

const DEFAULT_CLIP_DURATION = 90;
const MAX_CLIP_DURATION = 90;
const MAX_CLIP_DURATION = 120;

/** Records a configurable-duration clip to disk. */
@action({ UUID: "co.meldstudio.streamdeck.clip" })
Expand Down Expand Up @@ -40,7 +40,7 @@ export class Clip extends MeldAction<ClipSettings> {
}
}

/** Normalizes user input to Meld's advertised finite 0–90 second range. */
/** Normalizes user input to Meld's advertised finite 0–120 second range. */
#duration(value: string | number | null | undefined): number {
const parsed = value == null || (typeof value === "string" && value.trim() === "") ? Number.NaN : Number(value);
if (!Number.isFinite(parsed)) {
Expand Down
4 changes: 2 additions & 2 deletions test/meld-pi.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ describe("property inspector runtime", () => {
const presetSelect = html.match(/<select[^>]+id="clipDurationPreset"[^>]*>([\s\S]*?)<\/select>/)?.[1] ?? "";
assert.deepEqual(
[...presetSelect.matchAll(/<option value="(\d+)"/g)].map((match) => match[1]),
["10", "15", "30", "60", "90"],
["10", "15", "30", "60", "90", "120"],
);
assert.match(presetSelect, /<option value="custom">Custom…<\/option>/);
assert.match(html, /<input[^>]+type="number"[^>]+id="clipDuration"[^>]+min="0"[^>]+max="90"/s);
assert.match(html, /<input[^>]+type="number"[^>]+id="clipDuration"[^>]+min="0"[^>]+max="120"/s);
assert.match(html, /MeldPI\.bindEditablePreset\(/);
});

Expand Down
4 changes: 2 additions & 2 deletions test/settings-migration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ describe("durable settings migrations", () => {
{
name: "clip clamps hand-edited durations to Meld's advertised maximum",
create: (c) => new Clip(c) as unknown as MeldAction<JsonObject>,
input: () => ({ clipDuration: "120", future }),
expected: () => ({ clipDuration: "90", future }),
input: () => ({ clipDuration: "150", future }),
expected: () => ({ clipDuration: "120", future }),
},
{
name: "toggle-layer derives the scene from the selected layer",
Expand Down
Loading