Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
627 commits
Select commit Hold shift + click to select a range
770a872
Merge pull request #521 from makaradam/feature/save-dialog-redesign
siddharthvaddem May 9, 2026
3721553
feat: add custom zoom slider with continuous scale control (#513)
makaradam May 2, 2026
f30090b
fix: sanitize customScale in getZoomScale and fix isCustomActive styling
makaradam May 2, 2026
f3dcbf2
fix: address code review feedback on custom zoom slider
makaradam May 2, 2026
42127e6
fix: add NaN guard in handleZoomCustomScaleChange before state update
makaradam May 2, 2026
bc7c51e
Merge branch 'main' into feature/add-russian-localization
siddharthvaddem May 9, 2026
b7c85a9
Merge pull request #546 from psychosomat/feature/add-russian-localiza…
siddharthvaddem May 9, 2026
e880f05
Merge pull request #504 from 0david0mp/fix/package.nix
siddharthvaddem May 9, 2026
b4f7b4c
Merge pull request #518 from makaradam/feature/custom-zoom-slider-clean
siddharthvaddem May 9, 2026
38f2044
Merge pull request #549 from Ayusman-Singhal/feat/no-webcam-layout-pr…
siddharthvaddem May 9, 2026
c771bf8
fix: clamp trim handle end position to timeline boundary
muratclk Apr 8, 2026
d3e397e
Merge pull request #399 from muratclk/fix/trim-handle-boundary-clamp
siddharthvaddem May 9, 2026
5bd17f4
fix layout
siddharthvaddem May 9, 2026
c1f6cf6
loc first and then export processing
siddharthvaddem May 9, 2026
c9b6074
fix(electron): add screen and display-capture to Electron permission …
auberginewly May 9, 2026
be4e2d0
fix(electron/macOS): proactively check screen recording permission on…
auberginewly May 9, 2026
3dd7b85
fix(build): remove misplaced entitlement key from mac.extendInfo
auberginewly May 9, 2026
68c35ff
zoom precision position
siddharthvaddem May 9, 2026
2381e48
Merge main into add-vietnamese-i18n-1022783609047552672
siddharthvaddem May 9, 2026
3ad3e22
test(i18n): add vi to tutorialHelpTranslations locale map
siddharthvaddem May 9, 2026
f0699cc
Merge pull request #507 from hthienloc/add-vietnamese-i18n-1022783609…
siddharthvaddem May 9, 2026
d8da26a
Merge pull request #561 from auberginewly/fix/electron-screen-capture…
siddharthvaddem May 9, 2026
4a0878c
add homebrew cask bump workflow
siddharthvaddem May 9, 2026
64c2a43
Merge pull request #562 from siddharthvaddem/chore/homebrew-cask-work…
siddharthvaddem May 9, 2026
f42c478
fix homebrew cask audit warnings
siddharthvaddem May 9, 2026
c820b41
Merge pull request #563 from siddharthvaddem/chore/homebrew-cask-audi…
siddharthvaddem May 9, 2026
24be97b
fix: final homebrew cask style + audit cleanup
siddharthvaddem May 9, 2026
8c0c555
Merge pull request #564 from siddharthvaddem/chore/homebrew-cask-fina…
siddharthvaddem May 9, 2026
b48370e
update readme w brew
siddharthvaddem May 9, 2026
ed825d8
add winget-releaser workflow
siddharthvaddem May 9, 2026
9ac4e77
Merge pull request #565 from siddharthvaddem/chore/winget-releaser-wo…
siddharthvaddem May 9, 2026
7feb05c
add nix package auto-bump workflow
siddharthvaddem May 9, 2026
8afca89
Merge pull request #566 from siddharthvaddem/chore/nix-auto-bump-work…
siddharthvaddem May 9, 2026
2ae7aca
chore: bump nix package to v1.4.0
github-actions[bot] May 10, 2026
68a95c6
Merge pull request #567 from siddharthvaddem/chore/bump-nix-1.4.0
siddharthvaddem May 10, 2026
52cb709
readme update
siddharthvaddem May 10, 2026
7bbb855
update readme
siddharthvaddem May 10, 2026
e3d4a33
ui revamp
siddharthvaddem May 10, 2026
2b8ec9e
Merge remote-tracking branch 'origin/main' into codex/export-diagnostics
yusufm May 10, 2026
162e734
Merge pull request #535 from yusufm/codex/lazy-load-editor
siddharthvaddem May 10, 2026
d3b51e8
Merge remote-tracking branch 'upstream/main' into codex/allow-png-bac…
Sunwood-ai-labs May 10, 2026
6f099b3
feat: add cursor overlay pipeline
EtienneLescot Mar 15, 2026
44f59bf
feat: add unified native bridge foundation
EtienneLescot Mar 16, 2026
248ebab
feat: add windows native cursor capture and rendering
EtienneLescot Mar 16, 2026
e965022
feat: add cursor overlay pipeline for high-fidelity cursor recording …
EtienneLescot Mar 26, 2026
28ff0fb
fix: restore cursor pipeline build after rebase
EtienneLescot May 3, 2026
bb0dec7
feat: add windows cursor preview diagnostics
EtienneLescot May 5, 2026
ef36da4
feat: complete windows cursor assets
EtienneLescot May 5, 2026
3d1d4a5
fix: avoid unsupported display media min constraint
EtienneLescot May 5, 2026
87240a9
fix: align native cursor preview and export
EtienneLescot May 5, 2026
d21e5eb
fix: restore native cursor preview and export
EtienneLescot May 5, 2026
062cf2a
feat: add native Windows recorder helper
EtienneLescot May 5, 2026
588a0a7
feat: add native Windows microphone capture
EtienneLescot May 5, 2026
7929aea
fix: align native mixed audio timeline
EtienneLescot May 5, 2026
048189d
feat: add native Windows window capture
EtienneLescot May 5, 2026
fb85f66
feat: add native Windows webcam composition
EtienneLescot May 5, 2026
fdcd882
fix: honor selected native Windows webcam
EtienneLescot May 5, 2026
84484d6
fix: support DirectShow virtual webcams
EtienneLescot May 5, 2026
38d727e
fix: skip black webcam warmup frames
EtienneLescot May 5, 2026
c0deb03
fix: gate Windows cursor settings
EtienneLescot May 5, 2026
0ebf5c1
test: add Windows native checklist smoke test
EtienneLescot May 5, 2026
c7b43a5
fix: resolve selected Windows microphone
EtienneLescot May 5, 2026
ab3d38d
fix: address native capture review feedback
EtienneLescot May 5, 2026
d034158
feat: apply native cursor visual effects
EtienneLescot May 5, 2026
3a32a14
fix: capture quick native cursor clicks
EtienneLescot May 5, 2026
e33d220
fix: record native cursor click events
EtienneLescot May 5, 2026
f76fb42
docs: backlog native cursor click bounce
EtienneLescot May 5, 2026
9b85cac
test: harden Windows cursor diagnostic
EtienneLescot May 5, 2026
826790f
fix: address native cursor review findings
EtienneLescot May 5, 2026
82bffef
fix: harden native recorder review paths
EtienneLescot May 5, 2026
f91300a
fix: make native cursor click bounce visible
EtienneLescot May 5, 2026
f4fc7fa
fix: preserve native cursor click interactions
EtienneLescot May 5, 2026
722f630
fix: address maintainer platform regressions
EtienneLescot May 6, 2026
34e22d0
fix: restore source copy export fast path
EtienneLescot May 6, 2026
0d9e821
fix: guard source copy while native cursor data loads
EtienneLescot May 6, 2026
238fc97
fix: preserve cursor and audio in exports
EtienneLescot May 6, 2026
b349c0a
fix: downmix multichannel export audio
EtienneLescot May 6, 2026
4d3bce0
feat: add Windows cursor capture mode
EtienneLescot May 6, 2026
ac2e34e
fix: preserve Windows system audio on export
EtienneLescot May 6, 2026
afd5e35
docs: remove README developer notes link
EtienneLescot May 7, 2026
4e5b7a4
test: log source copy fast path blockers
EtienneLescot May 7, 2026
8137e81
fix: normalize native Windows audio for AAC
EtienneLescot May 10, 2026
0720a6d
fix: restore native cursor wiring after upstream rebase
EtienneLescot May 10, 2026
201729e
Merge pull request #536 from yusufm/codex/export-diagnostics
siddharthvaddem May 10, 2026
b41c4f4
remove macos cursor highlight; wire telemetry session for non-windows
siddharthvaddem May 10, 2026
1d36ad2
Merge remote-tracking branch 'origin/main' into feat/cursor-pipeline
siddharthvaddem May 10, 2026
b0293e7
Merge pull request #217 from EtienneLescot/feat/cursor-pipeline
siddharthvaddem May 10, 2026
872bd95
Merge remote-tracking branch 'origin/main' into feature/timeline-hand…
AbhinRustagi May 11, 2026
d802473
fix: update snap guide color
AbhinRustagi May 11, 2026
33bb751
fix: resolve comments
AbhinRustagi May 11, 2026
c13d3c7
feat: add Brazilian Portuguese (pt-BR) translation
nxc-7 May 12, 2026
55bc0c9
fix native aspect ratio fallback
EtienneLescot May 16, 2026
c9985a0
add empty timeline scrubbing
EtienneLescot May 16, 2026
7bf0761
fix language prompt hud clicks
EtienneLescot May 16, 2026
c4eb300
fix timeline scrub lint formatting
EtienneLescot May 16, 2026
9d5be8b
fix: enforce cursor-free WGC editable mode
EtienneLescot May 16, 2026
0d3c4df
fix: relax cursor capture helper validation
EtienneLescot May 16, 2026
5e76170
Clarify MP4 export resolution presets
EtienneLescot May 16, 2026
55dfca0
Merge pull request #596 from EtienneLescot/codex/fix-language-prompt-…
siddharthvaddem May 16, 2026
939de70
Merge pull request #593 from EtienneLescot/codex/fix-native-aspect-ra…
siddharthvaddem May 16, 2026
80e2c35
Merge pull request #598 from EtienneLescot/codex/fix-high-quality-export
siddharthvaddem May 16, 2026
e50f65e
Merge pull request #597 from EtienneLescot/codex/fix-editable-cursor-…
siddharthvaddem May 16, 2026
6018ba0
Merge pull request #594 from EtienneLescot/codex/timeline-empty-space…
siddharthvaddem May 16, 2026
fbdc7d5
feat: scaffold macOS native capture pipeline
EtienneLescot May 11, 2026
7102110
chore: ignore macos native build outputs
May 12, 2026
b9e2134
feat: add macos screencapturekit helper
May 12, 2026
6a4ddc5
feat: compose mac native capture with media
May 12, 2026
b2f9afa
feat: add macOS editable cursor overlay support
EtienneLescot May 12, 2026
73870c6
feat: support pausing macOS native recordings
EtienneLescot May 12, 2026
c1ba82f
chore: sync i18n locale keys
EtienneLescot May 13, 2026
df6da28
fix: improve macOS HUD interactions and audio preview
EtienneLescot May 13, 2026
179047b
fix: isolate macOS native capture by platform
EtienneLescot May 13, 2026
e708ae9
fix: address native mac review feedback
EtienneLescot May 13, 2026
31e394f
fix: address follow-up review comments
EtienneLescot May 13, 2026
65bb5bc
feat(cursor): clip native cursor to camera-aware video bounds in prev…
auberginewly May 18, 2026
58722a1
feat(cursor): add cursorClipToBounds setting with i18n translations
auberginewly May 18, 2026
8516707
fix(cursor): address review findings — aria-label, 3D transform sync,…
auberginewly May 18, 2026
788b0a2
fix(cursor): default canvas clipping off
EtienneLescot May 18, 2026
b5c105b
fix: respect native webcam orientation on Windows
sagar290 May 18, 2026
0e130b6
feat(i18n): fill missing Korean (ko-KR) translation keys
kwakseongjae May 18, 2026
e7ca9ec
Merge pull request #573 from EtienneLescot/feat/macos-native-capture-…
siddharthvaddem May 18, 2026
bc8655a
fix(zoom): 批量建议缩放后不再抢占选中态,避免导出面板被隐藏
auberginewly May 19, 2026
7bae09f
Merge branch 'main' into i18n/ko-kr-missing-keys
siddharthvaddem May 19, 2026
36ceca3
Merge pull request #611 from auberginewly/fix/suggest-zooms-export-hi…
siddharthvaddem May 19, 2026
2993a57
feat(zoom): add hold-to-preview button for zoom focus editing
auberginewly May 19, 2026
24ce67b
i18n(zoom): clarify previewHold wording to "preview zoom effect"
auberginewly May 19, 2026
a686fa0
fix(zoom): address PR review — preview selected zoom + keyboard a11y
auberginewly May 19, 2026
b25c2c8
revert(zoom): drop selected-zoom preview override, preview the curren…
auberginewly May 19, 2026
dd41378
fix(i18n): remove duplicate keys in ko-KR settings after main merge
kwakseongjae May 19, 2026
00fbd95
Merge pull request #609 from kwakseongjae/i18n/ko-kr-missing-keys
siddharthvaddem May 19, 2026
9348b9c
ux: rename 'Native' aspect ratio label to 'Original'
creazyfrog May 19, 2026
de2cc65
i18n: Added italian
May 19, 2026
7319ec2
i18n: Fixed language sorting and added italian to config and test
May 19, 2026
a1a75ba
i18n: Add italian (and missing russian) language to window main locale
May 19, 2026
c4acb9d
i18n: Fix application language selection with electronAPI setLocale
May 19, 2026
de3c2ef
i18n: CR update src/i18n/locales/it/shortcuts.json
LucaFontanot May 19, 2026
94e8484
test: cover MP4 editor exports
AjTheSpidey May 19, 2026
fd2bf21
test: wait for export bytes in e2e
AjTheSpidey May 19, 2026
49ee3ac
refactor: Migrate the powershell cursor script into the native cursor…
May 19, 2026
3be317b
refactor: update support key
marcgabe15 May 20, 2026
a9181e6
fix: update translations
marcgabe15 May 20, 2026
1235052
Merge pull request #622 from marcgabe15/fix-locale-save-diagnostics
siddharthvaddem May 20, 2026
57eed2c
test: tighten export e2e guards
AjTheSpidey May 20, 2026
7826cc4
fix: Add <algorithm> include for std::max
May 20, 2026
cfe6b9e
fix: Thread detach before teardown is race-prone.
May 20, 2026
4a55dcd
Merge pull request #618 from LucaFontanot/i18n-ita
siddharthvaddem May 21, 2026
37ab35f
Merge pull request #603 from AjTheSpidey/codex/multi-source-recording…
siddharthvaddem May 21, 2026
a9df720
Merge pull request #614 from creazyfrog/feature/rename-native-to-orig…
siddharthvaddem May 21, 2026
9f7f498
Merge pull request #621 from LucaFontanot/refactor-cursor
siddharthvaddem May 21, 2026
ef5855f
Fix native Windows webcam sidecar capture
EtienneLescot May 22, 2026
ca826d9
Fix native Windows recording pause
EtienneLescot May 22, 2026
b36a32d
refactor: centralize editor defaults
EtienneLescot May 18, 2026
10614c2
Address webcam sidecar review feedback
EtienneLescot May 22, 2026
0daf229
fix: accept decimal custom speeds
AjTheSpidey May 22, 2026
97fa74a
Merge pull request #643 from AjTheSpidey/codex/fix-decimal-playback-s…
siddharthvaddem May 23, 2026
3b7e78a
Merge pull request #642 from siddharthvaddem/codex/fix-windows-webcam…
siddharthvaddem May 23, 2026
b8e78cc
Merge branch 'main' into codex/editor-defaults-ssot
siddharthvaddem May 23, 2026
086039b
Merge pull request #600 from sagar290/webcam-layout-constraints
siddharthvaddem May 23, 2026
84b523d
fix: drop unused imports and reorder in SettingsPanel
siddharthvaddem May 23, 2026
d658ec4
Merge remote-tracking branch 'origin/main' into codex/editor-defaults…
siddharthvaddem May 23, 2026
9eaae72
fix: drop removed WEBCAM_TARGET width/height refs after main merge
siddharthvaddem May 23, 2026
dfd9613
Merge pull request #605 from EtienneLescot/codex/editor-defaults-ssot
siddharthvaddem May 23, 2026
a50835e
Merge remote-tracking branch 'origin/main' into codex/fix-windows-pau…
siddharthvaddem May 23, 2026
b6b37e3
Merge pull request #639 from siddharthvaddem/codex/fix-windows-paused…
siddharthvaddem May 23, 2026
259bfa9
Merge remote-tracking branch 'origin/main' into feat/zoom-hold-preview
siddharthvaddem May 23, 2026
85d0dea
Merge remote-tracking branch 'origin/main' into feat/zoom-hold-preview
siddharthvaddem May 23, 2026
fbd06fc
Merge pull request #613 from auberginewly/feat/zoom-hold-preview
siddharthvaddem May 23, 2026
2dbdb27
Merge remote-tracking branch 'origin/main' into codex/allow-png-backg…
siddharthvaddem May 23, 2026
34340c2
Merge pull request #526 from Sunwood-ai-labs/codex/allow-png-backgrou…
siddharthvaddem May 23, 2026
37eaacc
fix(export): clear timeline selection when opening export panel
auberginewly May 23, 2026
d856a52
fix stale speed selection in editor
AjTheSpidey May 23, 2026
8413095
feat: audio waveform on trim track + Timeline Settings toggle
davideme May 23, 2026
70c7d20
fix: timeline waveform in dedicated Timeline panel, disabled by default
davideme May 23, 2026
5b4f31f
chore: swap AudioWaveform icon for Brackets, improve toggle label
davideme May 23, 2026
46732fc
revert: restore hint text opacity to 0.12 in Row
davideme May 23, 2026
a72aa1a
refactor: extract audio peak decoding into useAudioPeaks hook
davideme May 23, 2026
514943c
refactor: extract loadFileAsArrayBuffer to eliminate duplicated file …
davideme May 23, 2026
f67e997
refactor: offload peak computation to Web Worker, replace module cach…
davideme May 23, 2026
b7d7c08
i18n: add Timeline panel translations for all 12 locales
davideme May 23, 2026
98f7441
refactor: rename RowWaveform to BackgroundWaveform, drop wrapper div
davideme May 23, 2026
f19d1bc
fix: clear stale peaks before decoding a new source
davideme May 23, 2026
87f7268
i18n(zh-TW): align waveform label with existing trim terminology
davideme May 23, 2026
9f55611
fix: always clear canvas before bailing on empty peaks
davideme May 23, 2026
9a72f31
docs: add missing JSDoc to satisfy docstring coverage threshold
davideme May 23, 2026
928cabc
fix: add AbortSignal to worker, fix data: URL filename in loadSourceFile
davideme May 23, 2026
c293786
Add vertical tray layout toggle
stellar003 May 23, 2026
9fc047f
Improve tray layout documentation
stellar003 May 23, 2026
d06bf37
fix: propagate Content-Type from fetch through loadFileAsArrayBuffer
davideme May 24, 2026
69d0aa4
refactor: split loadSourceFile into loadLocalSourceFile and loadRemot…
davideme May 24, 2026
db1d6bf
refactor: rewrite loadFileAsArrayBuffer using static loadLocalSourceF…
davideme May 24, 2026
c0b929d
refactor: simplify function signatures and reduce line breaks for rea…
davideme May 24, 2026
3a2f907
chore: restore original VideoFrame formatting in streamingDecoder.ts
davideme May 24, 2026
6ba9f1e
Fix screen source selection recovery flow
May 25, 2026
3d129f8
Added .import files to .gitignore
nachobh May 25, 2026
d32bb00
Increased max rounding to 64
nachobh May 25, 2026
f6b0bbd
Merge pull request #653 from nachobh/roundingIncreased
siddharthvaddem May 25, 2026
7f73f90
Merge pull request #646 from AjTheSpidey/codex/editor-settings-scroll
siddharthvaddem May 25, 2026
5467796
Merge pull request #645 from auberginewly/fix/export-panel-hidden-aft…
siddharthvaddem May 25, 2026
727e395
fix: stream long recordings to disk and patch WebM duration on save
neurot1cal May 26, 2026
8c7ea93
fix: increase rounding snap tolerance to 4px to prevent background li…
aaravshirpurkar May 26, 2026
f3c5b8a
fix: harden streaming lifecycle and lift it out of the IPC god-module
neurot1cal May 26, 2026
36d7d2b
fix: tighten streaming failure handling from re-review
neurot1cal May 26, 2026
5c5cab6
fix: don't stream when the append IPC is unavailable
neurot1cal May 26, 2026
b70994b
Merge pull request #658 from neurot1cal/fix/streaming-recording-duration
siddharthvaddem May 27, 2026
8117d48
Merge pull request #657 from aaravshirpurkar/main
siddharthvaddem May 27, 2026
0d39f65
feat(timeline): green filled polygon waveform style
davideme May 28, 2026
60cbb44
feat(timeline): rectified (half) waveform style
davideme May 28, 2026
489f157
fix(timeline): align waveform bounds with trim box height
davideme May 28, 2026
d8ab206
fix(timeline): draw waveform within item bounds, not CSS canvas bounds
davideme May 28, 2026
abb4413
fix(timeline): correct waveform vertical alignment and silent baseline
davideme May 28, 2026
fca17f9
revert(timeline): restore polygon waveform, remove per-column bar app…
davideme May 28, 2026
3d572b2
Merge branch 'siddharthvaddem:main' into claude/trusting-mcnulty-1089a4
davideme May 28, 2026
202c670
Add more built-in annotation font options
enstie May 28, 2026
62000c6
Add text animation presets for annotations
enstie May 28, 2026
480890b
feat: add configurable global shortcut to open app
zhenya-band May 28, 2026
f1a8552
refactor: update ShortcutBinding import path in main and preload scripts
zhenya-band May 28, 2026
d86c174
fix: convert special keys to valid Electron accelerators
zhenya-band May 28, 2026
902d4e4
fix: show error feedback when global shortcut registration fails
zhenya-band May 28, 2026
59c9a19
fix: preserve working shortcut when new registration fails
zhenya-band May 28, 2026
ff40a73
fix: keep shortcuts dialog open on registration failure
zhenya-band May 28, 2026
ed5ef32
fix: remove conflicting hover style from shortcuts reset button
zhenya-band May 28, 2026
dd2513d
Merge pull request #667 from zhenya-band/fix/shortcuts-reset-button-h…
siddharthvaddem May 29, 2026
df6c821
Merge pull request #665 from zhenya-band/feature/keyboard-shortcut-to…
siddharthvaddem May 29, 2026
391817d
Merge pull request #663 from enstie/font-addition
siddharthvaddem May 29, 2026
0abe134
Merge pull request #647 from davideme/claude/trusting-mcnulty-1089a4
siddharthvaddem May 29, 2026
afc76c3
Merge branch 'main' into feat/pt-BR-translation
siddharthvaddem May 29, 2026
cf74b76
Merge pull request #581 from nxc-7/feat/pt-BR-translation
siddharthvaddem May 29, 2026
e82fc0d
feat: capture native cursor bitmaps on macOS
kaili-yang May 29, 2026
eac5cc6
fix: address review comments on PR #671
kaili-yang May 29, 2026
545c35d
chore: format codebase and update i18n locale files
enstie May 30, 2026
928e1c5
Merge branch 'siddharthvaddem:main' into font-animation
enstie May 30, 2026
c0702b5
Add text animation i18n keys to all locale files
enstie May 30, 2026
0b06900
Add textAnimation keys to ja-JP, ko-KR, and ru locales
enstie May 30, 2026
c34a600
Update src/i18n/locales/ko-KR/settings.json
enstie May 30, 2026
2aa6e90
Refactor text animation options to use translation keys for localization
enstie May 30, 2026
82b41da
Add Portuguese (pt-BR) dialogs to tutorial help translations
enstie May 30, 2026
fb49ee1
Add Portuguese (pt-BR) dialogs to tutorial help translations
enstie May 30, 2026
993f693
Refine vertical tray appearance
stellar003 May 30, 2026
ff767a5
Fix tutorial help translations test for pt-BR locale
siddharthvaddem May 30, 2026
324f4e0
Merge pull request #671 from kaili-yang/mac-native-cursor-capture
siddharthvaddem May 30, 2026
19be540
Merge pull request #648 from Arunsiva003/feature/vertical-menu-tray-l…
siddharthvaddem May 30, 2026
180a1ea
Merge pull request #515 from AbhinRustagi/feature/timeline-handle-snap
siddharthvaddem May 30, 2026
2cacedf
Merge pull request #664 from enstie/font-animation
siddharthvaddem May 30, 2026
c491b7c
Merge pull request #652 from kimsr96/main
siddharthvaddem May 30, 2026
1f43ef8
i18n: add Studio Dashboard, New Project, and import strings across lo…
makaradam May 31, 2026
34ef71b
feat(electron): project import/new-project IPC, menu wiring, HUD/edit…
makaradam May 31, 2026
00191c4
feat(editor): Studio Dashboard empty state + project lifecycle
makaradam May 31, 2026
0f554e7
test: import jest-dom matchers in SourceSelector test
makaradam May 31, 2026
d2dd44a
Merge pull request #577 from makaradam/feature/open-studio-and-import
siddharthvaddem May 31, 2026
aff5784
implementation to main/master
ThairaHub Jun 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 10 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
APP_NAME=Openscreen
BUNDLE_ID=com.siddharthvaddem.openscreen

APPLE_ID=
TEAM_ID=
SIGN_IDENTITY="Developer ID Application: Samir Patil ()"
CSC_NAME="Samir Patil ()"

NOTARY_PROFILE=OpenScreen-notary
APPLE_APP_SPECIFIC_PASSWORD=
1 change: 1 addition & 0 deletions .envrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
use flake
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @siddharthvaddem
198 changes: 176 additions & 22 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,32 @@ name: Build Electron App

on:
workflow_dispatch:
inputs:
arch:
description: 'Architecture to build'
required: true
default: 'both'
type: choice
options:
- arm64
- x64
- both

jobs:
build-windows:
runs-on: windows-latest
steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '22'

- name: Install dependencies
run: npm ci

- name: Install app dependencies
run: npx electron-builder install-app-deps


- name: Build Windows app
run: npm run build:win
env:
Expand All @@ -36,38 +43,180 @@ jobs:

build-macos:
runs-on: macos-latest
strategy:
matrix:
arch: ${{ github.event.inputs.arch == 'both' && fromJSON('["arm64", "x64"]') || fromJSON(format('["{0}"]', github.event.inputs.arch)) }}

steps:
# ─── Checkout ─────────────────────────────────────────────
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4

# ─── Setup Node.js ────────────────────────────────────────
- name: Setup Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: '22'
node-version: 22
cache: npm

# ─── Setup Python (needed by some native deps) ────────────
- name: Setup Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: '3.11'

# ─── Install Dependencies ─────────────────────────────────
- name: Install dependencies
run: npm ci

- name: Install app dependencies
run: npx electron-builder install-app-deps

- name: Build macOS app
run: npm run build:mac
# ─── Import Code Signing Certificate ──────────────────────
# This is the KEY step that makes CI signing work.
# We create a temporary keychain, import the .p12 cert into it,
# and set it as the default so codesign can find it.
- name: Import code signing certificate
env:
MAC_CERTIFICATE_P12: ${{ secrets.MAC_CERTIFICATE_P12 }}
MAC_CERTIFICATE_PASSWORD: ${{ secrets.MAC_CERTIFICATE_PASSWORD }}
run: |
# Create a temporary keychain
KEYCHAIN_PATH=$RUNNER_TEMP/build.keychain-db
KEYCHAIN_PASSWORD=$(openssl rand -base64 32)

# Create and configure keychain
security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH"
security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"

# Decode and import certificate
echo "$MAC_CERTIFICATE_P12" | base64 --decode > $RUNNER_TEMP/certificate.p12
security import $RUNNER_TEMP/certificate.p12 \
-k "$KEYCHAIN_PATH" \
-P "$MAC_CERTIFICATE_PASSWORD" \
-T /usr/bin/codesign \
-T /usr/bin/security

# Allow codesign to access the keychain without UI prompt
security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"

# Add to keychain search path (makes it the default)
security list-keychains -d user -s "$KEYCHAIN_PATH" $(security list-keychains -d user | tr -d '"')

# Verify the identity is available
security find-identity -v -p codesigning "$KEYCHAIN_PATH"

# Clean up the .p12 file
rm -f $RUNNER_TEMP/certificate.p12

# ─── Build Vite + Electron ────────────────────────────────
- name: Build Vite + Electron
run: npx tsc && npx vite build

# ─── Package with electron-builder ────────────────────────
# electron-builder handles deep codesigning the .app bundle
# "notarize: false" in electron-builder.json5 prevents it from
# trying its own notarization flow
- name: Package .app bundle
run: npx electron-builder --mac --${{ matrix.arch }} --dir
env:
CSC_NAME: "Samir Patil (N26FZ4GW28)"
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Upload macOS build
# ─── Read version from package.json ───────────────────────
- name: Get version
id: version
run: echo "version=$(node -p 'require(\"./package.json\").version')" >> $GITHUB_OUTPUT

# ─── Locate the .app bundle ───────────────────────────────
- name: Find .app bundle
id: find_app
run: |
VERSION="${{ steps.version.outputs.version }}"
echo "=== Release directory contents ==="
ls -laR "release/${VERSION}/" || echo "release/${VERSION}/ not found"
echo "=== Searching for .app bundle ==="
APP_BUNDLE=$(find "release/${VERSION}" -maxdepth 4 -name "*.app" -type d | head -n1)
if [ -z "$APP_BUNDLE" ]; then
echo "::error::No .app bundle found in release/${VERSION}/"
exit 1
fi
echo "app_bundle=$APP_BUNDLE" >> $GITHUB_OUTPUT
echo "Found: $APP_BUNDLE"

# ─── Verify .app signature ────────────────────────────────
- name: Verify .app code signature
run: codesign --verify --deep --strict "${{ steps.find_app.outputs.app_bundle }}"

# ─── Create DMG ───────────────────────────────────────────
- name: Create DMG
id: dmg
run: |
VERSION="${{ steps.version.outputs.version }}"
ARCH="${{ matrix.arch }}"
DMG_NAME="Openscreen-Mac-${ARCH}-${VERSION}.dmg"
RELEASE_DIR="release/${VERSION}"
DMG_OUTPUT="${RELEASE_DIR}/${DMG_NAME}"
STAGING="${RELEASE_DIR}/dmg-staging"

mkdir -p "$STAGING"
cp -R "${{ steps.find_app.outputs.app_bundle }}" "$STAGING/"
ln -s /Applications "$STAGING/Applications"

hdiutil create \
-srcfolder "$STAGING" \
-volname "Openscreen" \
-fs HFS+ \
-fsargs "-c c=64,a=16,e=16" \
-format UDBZ \
"$DMG_OUTPUT"

rm -rf "$STAGING"

echo "dmg_path=$DMG_OUTPUT" >> $GITHUB_OUTPUT
echo "dmg_name=$DMG_NAME" >> $GITHUB_OUTPUT

# ─── Sign DMG ─────────────────────────────────────────────
- name: Sign DMG
run: |
codesign --force \
--sign "Developer ID Application: Samir Patil (N26FZ4GW28)" \
--timestamp \
"${{ steps.dmg.outputs.dmg_path }}"

# ─── Notarize DMG ────────────────────────────────────────
# On CI we can't use keychain profiles for notarytool, so we
# pass credentials directly via env vars / flags
- name: Notarize DMG
run: |
xcrun notarytool submit "${{ steps.dmg.outputs.dmg_path }}" \
--apple-id "${{ secrets.APPLE_ID }}" \
--team-id "${{ secrets.APPLE_TEAM_ID }}" \
--password "${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}" \
--wait
timeout-minutes: 15

# ─── Staple ───────────────────────────────────────────────
- name: Staple notarization ticket
run: xcrun stapler staple "${{ steps.dmg.outputs.dmg_path }}"

# ─── Validate ─────────────────────────────────────────────
- name: Validate stapled DMG
run: |
xcrun stapler validate "${{ steps.dmg.outputs.dmg_path }}"
spctl -a -vv -t install "${{ steps.dmg.outputs.dmg_path }}"

# ─── Upload Artifact ──────────────────────────────────────
- name: Upload notarized DMG
uses: actions/upload-artifact@v4
with:
name: macos-installer
path: release/**/*.dmg
name: openscreen-mac-${{ matrix.arch }}
path: ${{ steps.dmg.outputs.dmg_path }}
retention-days: 30

# ─── Cleanup Keychain ─────────────────────────────────────
- name: Cleanup keychain
if: always()
run: security delete-keychain $RUNNER_TEMP/build.keychain-db || true

build-linux:
runs-on: ubuntu-latest
steps:
Expand All @@ -82,8 +231,10 @@ jobs:
- name: Install dependencies
run: npm ci

- name: Install app dependencies
run: npx electron-builder install-app-deps
# bsdtar (from libarchive-tools) is required by fpm to build pacman
# packages. AppImage and deb don't need it; ubuntu-latest doesn't ship it.
- name: Install pacman build dependencies
run: sudo apt-get update && sudo apt-get install -y libarchive-tools

- name: Build Linux app
run: npm run build:linux
Expand All @@ -94,6 +245,9 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: linux-installer
path: release/**/*.AppImage
path: |
release/**/*.AppImage
release/**/*.zsync
release/**/*.deb
release/**/*.pacman
retention-days: 30

118 changes: 118 additions & 0 deletions .github/workflows/bump-nix-package.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
name: Bump Nix package on release

on:
release:
types: [published]
workflow_dispatch:
inputs:
tag:
description: "Release tag to bump (e.g. v1.5.0)"
required: true
type: string

permissions:
contents: write
pull-requests: write

jobs:
bump:
runs-on: ubuntu-latest
if: github.event_name == 'workflow_dispatch' || !github.event.release.prerelease
steps:
- name: Resolve tag and version
id: meta
env:
GH_EVENT_TAG: ${{ github.event.release.tag_name }}
INPUT_TAG: ${{ inputs.tag }}
run: |
set -euo pipefail
TAG="${GH_EVENT_TAG:-$INPUT_TAG}"
if [[ -z "$TAG" ]]; then
echo "::error::No tag resolved from release event or workflow input"
exit 1
fi
VERSION="${TAG#v}"
BRANCH="chore/bump-nix-${VERSION}"
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "branch=$BRANCH" >> "$GITHUB_OUTPUT"

- name: Checkout main
uses: actions/checkout@v4
with:
ref: main
fetch-depth: 0

- name: Install Nix
uses: cachix/install-nix-action@v27
with:
nix_path: nixpkgs=channel:nixos-unstable
extra_nix_config: |
experimental-features = nix-command flakes

- name: Compute npmDepsHash
id: hash
run: |
set -euo pipefail
HASH=$(nix run nixpkgs#prefetch-npm-deps -- package-lock.json)
if [[ -z "$HASH" ]]; then
echo "::error::prefetch-npm-deps returned an empty hash"
exit 1
fi
echo "hash=$HASH" >> "$GITHUB_OUTPUT"
echo "Computed npmDepsHash: $HASH"

- name: Update nix/package.nix
env:
VERSION: ${{ steps.meta.outputs.version }}
HASH: ${{ steps.hash.outputs.hash }}
run: |
set -euo pipefail
# Update version line: ` version = "<anything>";`
sed -i -E "s|^([[:space:]]*version[[:space:]]*=[[:space:]]*)\"[^\"]*\";|\1\"${VERSION}\";|" nix/package.nix
# Update npmDepsHash line: ` npmDepsHash = "<anything>";`
sed -i -E "s|^([[:space:]]*npmDepsHash[[:space:]]*=[[:space:]]*)\"[^\"]*\";|\1\"${HASH}\";|" nix/package.nix

echo "=== diff ==="
git --no-pager diff nix/package.nix || true

- name: Create PR
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ steps.meta.outputs.version }}
HASH: ${{ steps.hash.outputs.hash }}
BRANCH: ${{ steps.meta.outputs.branch }}
TAG: ${{ steps.meta.outputs.tag }}
run: |
set -euo pipefail

if git diff --quiet -- nix/package.nix; then
echo "nix/package.nix already at v${VERSION} with this hash — nothing to do."
exit 0
fi

git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"

# Replace any prior bump branch to keep the workflow idempotent.
git push origin --delete "$BRANCH" 2>/dev/null || true
git checkout -b "$BRANCH"
git add nix/package.nix
git commit -m "chore: bump nix package to v${VERSION}"
git push -u origin "$BRANCH"

gh pr create \
--title "chore: bump nix package to v${VERSION}" \
--base main \
--head "$BRANCH" \
--body "$(cat <<EOF
Automated bump triggered by release \`${TAG}\`.

- \`version\` → \`${VERSION}\`
- \`npmDepsHash\` → \`${HASH}\` (computed via \`prefetch-npm-deps package-lock.json\`)

Merge this so Nix users (NixOS, Home Manager, \`nix run github:siddharthvaddem/openscreen\`) pick up the new release.

> Note: PRs opened by \`GITHUB_TOKEN\` don't auto-trigger CI. The diff is two lines — review the change here, then merge. If you want CI to run, push an empty commit to this branch or close-and-reopen the PR.
EOF
)"
Loading
Loading