From c3c5d1ed63ea3e61575fe78a5a786c3c84b76acc Mon Sep 17 00:00:00 2001
From: webadderall <131426131+webadderall@users.noreply.github.com>
Date: Tue, 10 Mar 2026 18:17:05 +1100
Subject: [PATCH] Initial release of Recordly
---
.github/ISSUE_TEMPLATE/bug_report.yml | 59 +-
.github/pull_request_template.md | 4 +-
.gitignore | 5 +-
CONTRIBUTING.md | 4 +-
LICENSE-OpenScreen | 21 +
LICENSE.md | 21 +
README.md | 324 +-
biome.json | 164 +
branding/source-assets/1024-mac.png | Bin 0 -> 27422 bytes
branding/source-assets/128-mac.png | Bin 0 -> 3438 bytes
branding/source-assets/16-mac.png | Bin 0 -> 404 bytes
branding/source-assets/256-mac.png | Bin 0 -> 6820 bytes
branding/source-assets/32-mac.png | Bin 0 -> 946 bytes
branding/source-assets/512-mac.png | Bin 0 -> 14050 bytes
branding/source-assets/64-mac.png | Bin 0 -> 1796 bytes
branding/source-assets/Recordly.svg | 10 +
dist-electron/main.js | 1650 +-
dist-electron/preload.mjs | 64 +-
electron-builder.json5 | 18 +-
electron/electron-env.d.ts | 61 +-
electron/ipc/handlers.ts | 1932 +-
electron/main.ts | 255 +-
electron/native/NativeCursorMonitor.swift | 435 +
.../native/ScreenCaptureKitRecorder.swift | 465 +
.../native/ScreenCaptureKitWindowList.swift | 126 +
electron/native/SystemCursorAssets.swift | 209 +
electron/preload.ts | 109 +-
electron/uiohook-napi.d.ts | 1 +
electron/windows.ts | 28 +-
icons/icons/mac/icon.icns | Bin 1422500 -> 134019 bytes
icons/icons/png/1024x1024.png | Bin 832645 -> 248579 bytes
icons/icons/png/128x128.png | Bin 13964 -> 20137 bytes
icons/icons/png/16x16.png | Bin 630 -> 888 bytes
icons/icons/png/24x24.png | Bin 1092 -> 1418 bytes
icons/icons/png/256x256.png | Bin 53916 -> 50016 bytes
icons/icons/png/32x32.png | Bin 1643 -> 2556 bytes
icons/icons/png/48x48.png | Bin 2941 -> 3542 bytes
icons/icons/png/512x512.png | Bin 229117 -> 113614 bytes
icons/icons/png/64x64.png | Bin 4412 -> 7327 bytes
icons/icons/win/icon.ico | Bin 361102 -> 361102 bytes
index.html | 4 +-
package-lock.json | 28763 ++++++++--------
package.json | 180 +-
public/app-icons/recordly-1024.png | Bin 0 -> 248579 bytes
public/app-icons/recordly-128.png | Bin 0 -> 20137 bytes
public/app-icons/recordly-16.png | Bin 0 -> 888 bytes
public/app-icons/recordly-256.png | Bin 0 -> 50016 bytes
public/app-icons/recordly-32.png | Bin 0 -> 2556 bytes
public/app-icons/recordly-512.png | Bin 0 -> 113614 bytes
public/app-icons/recordly-64.png | Bin 0 -> 7327 bytes
public/wallpapers/cityscape.jpg | Bin 0 -> 423864 bytes
public/wallpapers/farmvalley.jpg | Bin 0 -> 1805963 bytes
public/wallpapers/levels.jpg | Bin 0 -> 492847 bytes
public/wallpapers/luisdelrio.jpg | Bin 0 -> 1800273 bytes
public/wallpapers/mountaintrees.jpg | Bin 0 -> 703517 bytes
src/App.tsx | 23 +-
src/assets/cursors/Cursor=Beachball.svg | 45 +
src/assets/cursors/Cursor=Cross.svg | 4 +
src/assets/cursors/Cursor=Default.svg | 4 +
src/assets/cursors/Cursor=Hand-(Grabbing).svg | 4 +
src/assets/cursors/Cursor=Hand-(Open).svg | 4 +
src/assets/cursors/Cursor=Hand-(Pointing).svg | 4 +
src/assets/cursors/Cursor=Menu.svg | 17 +
src/assets/cursors/Cursor=Move.svg | 4 +
src/assets/cursors/Cursor=Resize-(Down).svg | 4 +
src/assets/cursors/Cursor=Resize-(Left).svg | 4 +
.../cursors/Cursor=Resize-(Left-Right).svg | 4 +
src/assets/cursors/Cursor=Resize-(Right).svg | 4 +
src/assets/cursors/Cursor=Resize-(Up).svg | 4 +
.../cursors/Cursor=Resize-(Up-Down).svg | 4 +
.../Cursor=Resize-North-East-South-West.svg | 4 +
.../cursors/Cursor=Resize-North-South.svg | 4 +
.../Cursor=Resize-North-West-South-East.svg | 4 +
.../cursors/Cursor=Resize-West-East.svg | 4 +
src/assets/cursors/Cursor=Text-Cursor.svg | 4 +
src/assets/cursors/Cursor=Zoom-In.svg | 7 +
src/assets/cursors/Cursor=Zoom-Out.svg | 5 +
src/components/launch/LaunchWindow.tsx | 286 +-
.../launch/SourceSelector.module.css | 10 +-
src/components/launch/SourceSelector.tsx | 95 +-
src/components/ui/audio-level-meter.tsx | 37 +
src/components/ui/item-content.tsx | 2 +-
src/components/ui/slider.tsx | 4 +-
src/components/ui/switch.tsx | 2 +-
.../video-editor/AnnotationOverlay.tsx | 18 +-
.../video-editor/AnnotationSettingsPanel.tsx | 34 +-
src/components/video-editor/CropControl.tsx | 8 +-
src/components/video-editor/ExportDialog.tsx | 26 +-
.../video-editor/FormatSelector.tsx | 8 +-
.../video-editor/KeyboardShortcutsHelp.tsx | 93 +-
.../video-editor/PlaybackControls.tsx | 2 +-
src/components/video-editor/SettingsPanel.tsx | 330 +-
.../video-editor/ShortcutsConfigDialog.tsx | 223 +
src/components/video-editor/VideoEditor.tsx | 710 +-
src/components/video-editor/VideoPlayback.tsx | 437 +-
.../video-editor/projectPersistence.ts | 309 +
src/components/video-editor/timeline/Item.tsx | 37 +-
.../timeline/ItemGlass.module.css | 48 +-
.../video-editor/timeline/KeyframeMarkers.tsx | 2 +-
.../video-editor/timeline/TimelineEditor.tsx | 417 +-
.../video-editor/timeline/TimelineWrapper.tsx | 7 +-
.../timeline/zoomSuggestionUtils.ts | 268 +
src/components/video-editor/types.ts | 54 +-
.../video-editor/videoPlayback/constants.ts | 6 +-
.../videoPlayback/cursorRenderer.ts | 717 +
.../video-editor/videoPlayback/focusUtils.ts | 101 +-
.../video-editor/videoPlayback/mathUtils.ts | 84 +
.../videoPlayback/motionSmoothing.ts | 142 +
.../videoPlayback/overlayUtils.ts | 28 +-
.../videoPlayback/uploadedCursorAssets.ts | 70 +
.../videoPlayback/videoEventHandlers.ts | 22 +-
.../videoPlayback/zoomRegionUtils.ts | 220 +-
.../videoPlayback/zoomTransform.ts | 229 +-
src/contexts/ShortcutsContext.tsx | 60 +
src/hooks/useAudioLevelMeter.ts | 106 +
src/hooks/useMicrophoneDevices.ts | 77 +
src/hooks/useScreenRecorder.ts | 456 +-
src/index.css | 42 +-
src/lib/assetPath.ts | 72 +
src/lib/customFonts.ts | 6 +-
src/lib/exporter/annotationRenderer.ts | 29 +-
src/lib/exporter/audioEncoder.ts | 160 +
src/lib/exporter/frameRenderer.ts | 265 +-
src/lib/exporter/gifExporter.ts | 66 +-
src/lib/exporter/muxer.ts | 2 +-
src/lib/exporter/streamingDecoder.ts | 145 +-
src/lib/exporter/videoExporter.ts | 153 +-
src/lib/shortcuts.ts | 125 +
src/lib/wallpapers.ts | 37 +
src/main.tsx | 2 +
src/vite-env.d.ts | 107 +-
vite.config.ts | 4 +-
132 files changed, 25913 insertions(+), 16164 deletions(-)
create mode 100644 LICENSE-OpenScreen
create mode 100644 LICENSE.md
create mode 100644 biome.json
create mode 100644 branding/source-assets/1024-mac.png
create mode 100644 branding/source-assets/128-mac.png
create mode 100644 branding/source-assets/16-mac.png
create mode 100644 branding/source-assets/256-mac.png
create mode 100644 branding/source-assets/32-mac.png
create mode 100644 branding/source-assets/512-mac.png
create mode 100644 branding/source-assets/64-mac.png
create mode 100644 branding/source-assets/Recordly.svg
create mode 100644 electron/native/NativeCursorMonitor.swift
create mode 100644 electron/native/ScreenCaptureKitRecorder.swift
create mode 100644 electron/native/ScreenCaptureKitWindowList.swift
create mode 100644 electron/native/SystemCursorAssets.swift
create mode 100644 electron/uiohook-napi.d.ts
create mode 100644 public/app-icons/recordly-1024.png
create mode 100644 public/app-icons/recordly-128.png
create mode 100644 public/app-icons/recordly-16.png
create mode 100644 public/app-icons/recordly-256.png
create mode 100644 public/app-icons/recordly-32.png
create mode 100644 public/app-icons/recordly-512.png
create mode 100644 public/app-icons/recordly-64.png
create mode 100644 public/wallpapers/cityscape.jpg
create mode 100644 public/wallpapers/farmvalley.jpg
create mode 100644 public/wallpapers/levels.jpg
create mode 100644 public/wallpapers/luisdelrio.jpg
create mode 100644 public/wallpapers/mountaintrees.jpg
create mode 100644 src/assets/cursors/Cursor=Beachball.svg
create mode 100644 src/assets/cursors/Cursor=Cross.svg
create mode 100644 src/assets/cursors/Cursor=Default.svg
create mode 100644 src/assets/cursors/Cursor=Hand-(Grabbing).svg
create mode 100644 src/assets/cursors/Cursor=Hand-(Open).svg
create mode 100644 src/assets/cursors/Cursor=Hand-(Pointing).svg
create mode 100644 src/assets/cursors/Cursor=Menu.svg
create mode 100644 src/assets/cursors/Cursor=Move.svg
create mode 100644 src/assets/cursors/Cursor=Resize-(Down).svg
create mode 100644 src/assets/cursors/Cursor=Resize-(Left).svg
create mode 100644 src/assets/cursors/Cursor=Resize-(Left-Right).svg
create mode 100644 src/assets/cursors/Cursor=Resize-(Right).svg
create mode 100644 src/assets/cursors/Cursor=Resize-(Up).svg
create mode 100644 src/assets/cursors/Cursor=Resize-(Up-Down).svg
create mode 100644 src/assets/cursors/Cursor=Resize-North-East-South-West.svg
create mode 100644 src/assets/cursors/Cursor=Resize-North-South.svg
create mode 100644 src/assets/cursors/Cursor=Resize-North-West-South-East.svg
create mode 100644 src/assets/cursors/Cursor=Resize-West-East.svg
create mode 100644 src/assets/cursors/Cursor=Text-Cursor.svg
create mode 100644 src/assets/cursors/Cursor=Zoom-In.svg
create mode 100644 src/assets/cursors/Cursor=Zoom-Out.svg
create mode 100644 src/components/ui/audio-level-meter.tsx
create mode 100644 src/components/video-editor/ShortcutsConfigDialog.tsx
create mode 100644 src/components/video-editor/projectPersistence.ts
create mode 100644 src/components/video-editor/timeline/zoomSuggestionUtils.ts
create mode 100644 src/components/video-editor/videoPlayback/cursorRenderer.ts
create mode 100644 src/components/video-editor/videoPlayback/motionSmoothing.ts
create mode 100644 src/components/video-editor/videoPlayback/uploadedCursorAssets.ts
create mode 100644 src/contexts/ShortcutsContext.tsx
create mode 100644 src/hooks/useAudioLevelMeter.ts
create mode 100644 src/hooks/useMicrophoneDevices.ts
create mode 100644 src/lib/exporter/audioEncoder.ts
create mode 100644 src/lib/shortcuts.ts
create mode 100644 src/lib/wallpapers.ts
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 1c917690..0944a84e 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -1,5 +1,5 @@
name: Bug Report
-description: Create a report to help us improve
+description: Create a report to help us improve. If you are not sure what you are experiencing is a bug, report it anyway. We would rather you submit an unprofessional bug report than not report it at all.
title: "[Bug]: "
labels: ["bug", "triage"]
body:
@@ -60,8 +60,6 @@ body:
- Windows
- macOS
- Linux
- - iOS
- - Android
- Other
validations:
required: false
@@ -84,61 +82,6 @@ body:
validations:
required: false
- - type: dropdown
- id: browser
- attributes:
- label: Browser
- description: What browser are you using?
- options:
- - Chrome
- - Firefox
- - Safari
- - Edge
- - Other
- validations:
- required: false
-
- - type: input
- id: browser-version
- attributes:
- label: Browser Version
- description: Please specify your browser version
- placeholder: e.g., 120.0, 121.0.1
- validations:
- required: false
-
- - type: input
- id: browser-other
- attributes:
- label: Other Browser
- description: If you selected "Other" for Browser, please specify your browser
- placeholder: e.g., Brave, Vivaldi, Opera
- validations:
- required: false
-
- - type: dropdown
- id: device-type
- attributes:
- label: Device Type
- description: Device category
- options:
- - Desktop
- - Laptop
- - Tablet
- - Mobile
- - Other
- validations:
- required: false
-
- - type: input
- id: device-other
- attributes:
- label: Other Device
- description: If you selected "Other" for Device Type, please specify your device
- placeholder: e.g., Smart TV, IoT device
- validations:
- required: false
-
- type: textarea
id: additional-context
attributes:
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 79f39d4d..cd322028 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -25,13 +25,13 @@

```
-**Video** (if applicable):
+**Video** (wherever possible):
```html
```
-## Testing
+## Testing Guide
## Checklist
diff --git a/.gitignore b/.gitignore
index 3913db1c..294f84b3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,7 @@ lerna-debug.log*
node_modules
dist
+dist-electron
dist-ssr
*.local
@@ -24,4 +25,6 @@ dist-ssr
*.sw?
release/**
*.kiro/
-# npx electron-builder --mac --win
\ No newline at end of file
+# npx electron-builder --mac --win
+.tmp/
+.history/
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f2bbbe29..4c95f30e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -10,7 +10,7 @@ Thank you for considering contributing to this project! By contributing, you hel
2. **Clone Your Fork**
- Clone your forked repository to your local machine:
```bash
- git clone https://github.com/your-username/openscreen.git
+ git clone https://github.com/your-username/Recordly.git
```
3. **Create a New Branch**
@@ -43,7 +43,7 @@ Thank you for considering contributing to this project! By contributing, you hel
## Reporting Issues
-If you encounter a bug or have a feature request, please open an issue in the [Issues](https://github.com/siddharthvaddem/openscreen/issues) section of this repository. Provide as much detail as possible to help us address the issue effectively.
+If you encounter a bug or have a feature request, please open an issue in the [Issues](https://github.com/webadderall/Recordly/issues) section of this repository. Provide as much detail as possible to help us address the issue effectively.
## Style Guide
diff --git a/LICENSE-OpenScreen b/LICENSE-OpenScreen
new file mode 100644
index 00000000..a9f8d8c8
--- /dev/null
+++ b/LICENSE-OpenScreen
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 Siddharth Vaddem
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 00000000..e71d9143
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 webadderall
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index ba776fc0..ad5a8bf6 100644
--- a/README.md
+++ b/README.md
@@ -1,91 +1,281 @@
-> [!WARNING]
-> This is very much in beta and might be buggy here and there (but hope you have a good experience!).
+# Recordly
-
-
-
-
-
-
+
-# OpenScreen
-
-OpenScreen is your free, open-source alternative to Screen Studio (sort of).
-
-If you don't want to pay $29/month for Screen Studio but want a much simpler version that does what most people seem to need, making beautiful product demos and walkthroughs, here's a free-to-use app for you. OpenScreen does not offer all Screen Studio features, but covers the basics well!
-
-Screen Studio is an awesome product and this is definitely not a 1:1 clone. OpenScreen is a much simpler take, just the basics for folks who want control and don't want to pay. If you need all the fancy features, your best bet is to support Screen Studio (they really do a great job, haha). But if you just want something free (no gotchas) and open, this project does the job!
-
-OpenScreen is 100% free for personal and commercial use. Use it, modify it, distribute it. (Just be cool 😁 and give a shoutout if you feel like it !)
-
-
-
-
-
+
+
+
-## Core Features
-- Record your whole screen or specific apps
-- Add manual zooms (customizable depth levels)
-- Customize the duration and position of zooms however you please
-- Crop video recordings to hide parts
-- Choose between wallpapers, solid colors, gradients or your own picture for your background
-- Motion blur for smoother pan and zoom effects
-- Add annotations (text, arrows, images)
-- Trim sections of the clip
-- Export in different aspect ratios and resolutions
+### Create polished, pro-grade screen recordings.
+[Recordly](https://www.recordly.dev) is an **open-source screen recorder and editor** for creating **polished walkthroughs, demos, tutorials, and product videos**.
-## Installation
-Download the latest installer for your platform from the [GitHub Releases](https://github.com/siddharthvaddem/openscreen/releases) page.
+
+
+
-### macOS
+> Note on origins: Recordly is a hard fork of the excellent [**OpenScreen**](https://github.com/siddharthvaddem/openscreen) foundation by [Siddharth](https://x.com/sidious_man), which is focused on robustness and a stable feature set. Recordly focuses on a different product direction - i.e. adding cursor animations, Apple-inspired zoom animations, smoother panning - and aims to reach full feature parity with Screen Studio.
-If you encounter issues with macOS Gatekeeper blocking the app (since it does not come with a developer certificate), you can bypass this by running the following command in your terminal after installation:
+---
+## What is Recordly?
-```bash
-xattr -rd com.apple.quarantine /Applications/Openscreen.app
-```
+Recordly lets you record your screen and automatically transform it into a polished video. It handles the heavy lifting of zooming into important actions and smoothing out jittery cursor movement so your demos look professional by default.
-Note: Give your terminal Full Disk Access in **System Settings > Privacy & Security** to grant you access and then run the above command.
+Recordly runs on:
-After running this command, proceed to **System Preferences > Security & Privacy** to grant the necessary permissions for "screen recording" and "accessibility". Once permissions are granted, you can launch the app.
+- **macOS**
+- **Windows**
+- **Linux**
-### Linux
+macOS includes a **native smooth cursor animation pipeline**.
+Windows and Linux currently use Electron's capture path, which means the OS cursor cannot always be hidden during recording.
-Download the `.AppImage` file from the releases page. Make it executable and run:
-```bash
-chmod +x Openscreen-Linux-*.AppImage
-./Openscreen-Linux-*.AppImage
-```
-
-You may need to grant screen recording permissions depending on your desktop environment.
-
-**Note:** If the app fails to launch due to a "sandbox" error, run it with --no-sandbox:
-```bash
-./Openscreen-Linux-*.AppImage --no-sandbox
-```
-
-## Built with
-- Electron
-- React
-- TypeScript
-- Vite
-- PixiJS
-- dnd-timeline
---
-_I'm new to open source, idk what I'm doing lol. If something is wrong please raise an issue 🙏_
+# Features
-## Contributing
+### Recording
-Contributions are welcome! If you’d like to help out or see what’s currently being worked on, take a look at the open issues and the [project roadmap](https://github.com/users/siddharthvaddem/projects/3) to understand the current direction of the project and find ways to contribute.
+- Record an entire screen or a single window
+- Jump straight from recording into the editor
+- Microphone or system audio recording
+- Native **ScreenCaptureKit** capture on macOS
-## License
+### Smart Motion
-This project is licensed under the [MIT License](./LICENSE). By using this software, you agree that the authors are not liable for any issues, damages, or claims arising from its use.
+- Apple-style zoom animations
+- Automatic zoom suggestions based on cursor activity
+- Manual zoom regions
+- Smooth pan transitions between zoom regions
+
+### Cursor Controls
+
+- Adjustable cursor size
+- Cursor smoothing
+- Motion blur
+- Click bounce animation
+- macOS-style cursor assets
+
+### Editing Tools
+
+- Timeline trimming
+- Speed-up / slow-down regions
+- Annotations
+- Zoom spans
+- Project save + reopen (`.recordly` files)
+
+### Frame Styling
+
+- Wallpapers
+- Gradients
+- Solid fills
+- Padding
+- Rounded corners
+- Blur
+- Drop shadows
+
+### Export
+
+- MP4 video export
+- GIF export
+- Aspect ratio controls
+- Quality settings
+
+---
+
+# Screenshots
+
+
+
+
+
+
+
+
+
+---
+
+# Installation
+
+## Download a build
+
+Prebuilt releases are available here:
+
+https://github.com/webadderall/Recordly/releases
+
+---
+
+## Build from source
+
+```bash
+git clone https://github.com/webadderall/Recordly.git recordly
+cd recordly
+npm install
+npm run dev
+```
+
+---
+
+## macOS: "App cannot be opened"
+
+Recordly is not signed. macOS may quarantine locally built apps.
+
+Remove the quarantine flag with:
+
+```bash
+xattr -rd com.apple.quarantine /Applications/Recordly.app
+```
+
+---
+
+# Usage
+
+## Record
+
+1. Launch Recordly
+2. Select a screen or window
+3. Choose audio recording options
+4. Start recording
+5. Stop recording to open the editor
+
+---
+
+## Edit
+
+Inside the editor you can:
+
+- Add zoom regions manually
+- Use automatic zoom suggestions
+- Adjust cursor behavior
+- Trim the video
+- Add speed changes
+- Add annotations
+- Style the frame
+
+Save your work anytime as a `.recordly` project.
+
+---
+
+## Export
+
+Export options include:
+
+- **MP4** for full-quality video
+- **GIF** for lightweight sharing
+
+Adjust:
+
+- Aspect ratio
+- Output resolution
+- Quality settings
+
+---
+
+# Limitations
+
+### Windows & Linux Cursor Capture
+
+Electron’s desktop capture API does not allow hiding the system cursor during recording.
+
+If you enable the animated cursor layer, recordings may contain **two cursors**.
+
+Improving cross-platform cursor capture is an area where contributions are welcome.
+
+---
+
+### System Audio
+
+System audio capture depends on platform support.
+
+**Windows**
+- Works out of the box
+
+**Linux**
+- Requires PipeWire (Ubuntu 22.04+, Fedora 34+)
+- Older PulseAudio setups may not support system audio
+
+**macOS**
+- Requires macOS 12.3+
+- Uses ScreenCaptureKit helper
+
+---
+
+# How It Works
+
+Recordly is a **desktop video editor with a renderer-driven motion pipeline and platform-specific capture layer**.
+
+**Capture**
+- Electron orchestrates recording
+- macOS uses native helpers for ScreenCaptureKit and cursor telemetry
+
+**Motion**
+- Zoom regions
+- Cursor tracking
+- Speed changes
+- Timeline edits
+
+**Rendering**
+- Scene composition handled by **PixiJS**
+
+**Export**
+- Frames rendered through the same scene pipeline
+- Encoded to MP4 or GIF
+
+**Projects**
+- `.recordly` files store the source video path and editor state
+
+---
+
+# Contributing
+
+Contributions are welcome.
+
+Please:
+
+- Keep pull requests **focused and modular**
+- Test playback, editing, and export flows
+- Avoid large unrelated refactors
+
+Areas where help is especially valuable:
+
+- Smooth cursor pipeline for **Windows and Linux**
+- **Export speed improvements**
+
+See `CONTRIBUTING.md` for guidelines.
+
+---
+
+# Community
+
+Bug reports and feature requests:
+
+https://github.com/webadderall/Recordly/issues
+
+Pull requests are welcome.
+
+---
+
+# Donations & Sponsors
+
+
+
+---
+
+# License
+
+Recordly is licensed under the **MIT License**.
+
+---
+
+# Credits
+
+Created by
+[@webadderall](https://x.com/webadderall)
+
+---
\ No newline at end of file
diff --git a/biome.json b/biome.json
new file mode 100644
index 00000000..33c079ae
--- /dev/null
+++ b/biome.json
@@ -0,0 +1,164 @@
+{
+ "$schema": "https://biomejs.dev/schemas/2.3.13/schema.json",
+ "vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true },
+ "files": { "ignoreUnknown": false },
+ "formatter": {
+ "enabled": true,
+ "indentStyle": "tab",
+ "formatWithErrors": true,
+ "lineEnding": "lf",
+ "lineWidth": 100,
+ "attributePosition": "auto"
+ },
+ "linter": {
+ "enabled": true,
+ "rules": {
+ "recommended": false,
+ "complexity": {
+ "noAdjacentSpacesInRegex": "error",
+ "noBannedTypes": "error",
+ "noExtraBooleanCast": "error",
+ "noUselessCatch": "error",
+ "noUselessEscapeInRegex": "error",
+ "noUselessThisAlias": "error",
+ "noUselessTypeConstraint": "error"
+ },
+ "correctness": {
+ "noConstAssign": "error",
+ "noConstantCondition": "error",
+ "noEmptyCharacterClassInRegex": "error",
+ "noEmptyPattern": "error",
+ "noGlobalObjectCalls": "error",
+ "noInnerDeclarations": "error",
+ "noInvalidConstructorSuper": "error",
+ "noNonoctalDecimalEscape": "error",
+ "noPrecisionLoss": "error",
+ "noSelfAssign": "error",
+ "noSetterReturn": "error",
+ "noSwitchDeclarations": "error",
+ "noUndeclaredVariables": "error",
+ "noUnreachable": "error",
+ "noUnreachableSuper": "error",
+ "noUnsafeFinally": "error",
+ "noUnsafeOptionalChaining": "error",
+ "noUnusedLabels": "error",
+ "noUnusedVariables": "error",
+ "useExhaustiveDependencies": "warn",
+ "useHookAtTopLevel": "error",
+ "useIsNan": "error",
+ "useValidForDirection": "error",
+ "useValidTypeof": "error",
+ "useYield": "error"
+ },
+ "style": {
+ "noNamespace": "error",
+ "useArrayLiterals": "error",
+ "useAsConstAssertion": "error",
+ "useComponentExportOnlyModules": "warn"
+ },
+ "suspicious": {
+ "noAssignInExpressions": "error",
+ "noAsyncPromiseExecutor": "error",
+ "noCatchAssign": "error",
+ "noClassAssign": "error",
+ "noCompareNegZero": "error",
+ "noControlCharactersInRegex": "error",
+ "noDebugger": "error",
+ "noDuplicateCase": "error",
+ "noDuplicateClassMembers": "error",
+ "noDuplicateElseIf": "error",
+ "noDuplicateObjectKeys": "error",
+ "noDuplicateParameters": "error",
+ "noEmptyBlockStatements": "error",
+ "noExplicitAny": "error",
+ "noExtraNonNullAssertion": "error",
+ "noFallthroughSwitchClause": "error",
+ "noFunctionAssign": "error",
+ "noGlobalAssign": "error",
+ "noImportAssign": "error",
+ "noIrregularWhitespace": "error",
+ "noMisleadingCharacterClass": "error",
+ "noMisleadingInstantiator": "error",
+ "noNonNullAssertedOptionalChain": "error",
+ "noPrototypeBuiltins": "error",
+ "noRedeclare": "error",
+ "noShadowRestrictedNames": "error",
+ "noSparseArray": "error",
+ "noTsIgnore": "error",
+ "noUnsafeDeclarationMerging": "error",
+ "noUnsafeNegation": "error",
+ "noUselessRegexBackrefs": "error",
+ "noWith": "error",
+ "useGetterReturn": "error"
+ }
+ },
+ "includes": ["**", "**/dist", "**/.eslintrc.cjs", "**", "**/dist", "**/.eslintrc.cjs"]
+ },
+ "javascript": { "formatter": { "quoteStyle": "double" } },
+ "overrides": [
+ {
+ "includes": ["*.ts", "*.tsx", "*.mts", "*.cts"],
+ "linter": {
+ "rules": {
+ "complexity": { "noArguments": "error" },
+ "correctness": {
+ "noConstAssign": "off",
+ "noGlobalObjectCalls": "off",
+ "noInvalidBuiltinInstantiation": "off",
+ "noInvalidConstructorSuper": "off",
+ "noSetterReturn": "off",
+ "noUndeclaredVariables": "off",
+ "noUnreachable": "off",
+ "noUnreachableSuper": "off"
+ },
+ "style": { "useConst": "error" },
+ "suspicious": {
+ "noDuplicateClassMembers": "off",
+ "noDuplicateObjectKeys": "off",
+ "noDuplicateParameters": "off",
+ "noFunctionAssign": "off",
+ "noImportAssign": "off",
+ "noRedeclare": "off",
+ "noUnsafeNegation": "off",
+ "noVar": "error",
+ "useGetterReturn": "off"
+ }
+ }
+ }
+ },
+ {
+ "includes": ["*.ts", "*.tsx", "*.mts", "*.cts"],
+ "linter": {
+ "rules": {
+ "complexity": { "noArguments": "error" },
+ "correctness": {
+ "noConstAssign": "off",
+ "noGlobalObjectCalls": "off",
+ "noInvalidBuiltinInstantiation": "off",
+ "noInvalidConstructorSuper": "off",
+ "noSetterReturn": "off",
+ "noUndeclaredVariables": "off",
+ "noUnreachable": "off",
+ "noUnreachableSuper": "off"
+ },
+ "style": { "useConst": "error" },
+ "suspicious": {
+ "noDuplicateClassMembers": "off",
+ "noDuplicateObjectKeys": "off",
+ "noDuplicateParameters": "off",
+ "noFunctionAssign": "off",
+ "noImportAssign": "off",
+ "noRedeclare": "off",
+ "noUnsafeNegation": "off",
+ "noVar": "error",
+ "useGetterReturn": "off"
+ }
+ }
+ }
+ }
+ ],
+ "assist": {
+ "enabled": true,
+ "actions": { "source": { "organizeImports": "on" } }
+ }
+}
diff --git a/branding/source-assets/1024-mac.png b/branding/source-assets/1024-mac.png
new file mode 100644
index 0000000000000000000000000000000000000000..7602ca8eb89d8f90eba0fcd556c2bccea61f7753
GIT binary patch
literal 27422
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
AjQ{`u
literal 0
HcmV?d00001
diff --git a/branding/source-assets/128-mac.png b/branding/source-assets/128-mac.png
new file mode 100644
index 0000000000000000000000000000000000000000..94ad18d1b47d8e3fbed46f190fc6a7156f7a112e
GIT binary patch
literal 3438
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
Q8NH(R(dnqI%wPZj0AJU}lmGw#
literal 0
HcmV?d00001
diff --git a/branding/source-assets/16-mac.png b/branding/source-assets/16-mac.png
new file mode 100644
index 0000000000000000000000000000000000000000..90118bdf083d406be68c7f97919c5c0fd46f17c0
GIT binary patch
literal 404
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
literal 0
HcmV?d00001
diff --git a/branding/source-assets/32-mac.png b/branding/source-assets/32-mac.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e21b5e134873efd0d570f034b0e3aea37dc22d6
GIT binary patch
literal 946
zcmV;j15Nx=Nk&Gh0{{S5MM6+kP&il$0000G0000V0018V06|PpNC^P|01c2M+qP;e
zbM5c$q5t^zKtqMdBFM;T2u&c>*t_76y5{a&_F3q;?-LP5#02nagaZy-G!&MQgVu7e{3L|5!=
z>VSpyTYed`=%n=_fXL?y4y%=;=s7a-wJj4yRVIwC5ryQ;!e&Dkt`f<>_4_2C=Ge(q
z+J|nPLIxbqkFV^^4nNtNsR{SqVk
zbTg?zW-NgSEGB>d_qM;Sm#^k=|Hb;4AB=)G#VY5d*lxhwxEHbWJ`|De@&){7|BM9{
zb{%lffSG~aU~S>aAc~@j|ABh>3a+4JA~+Cryk5f}p%?lp7E8`_m}3^Cj_l-iX1pIx
zaxQF;oWoZA9{=i$##^&$B61QnpU1r(88bT?`M}%}2G**Ht$b78b>gRfFWt76zLaI)
zzPaT)gI*NlgqIlClC;OxYXf)z#&*6UlcUPos(w=S$Oz-<&zuhzZ|Nr!M
zkIN{xh5jFxM*V*Tnr#sa*>i}TOF6(bT*`W?bF#M9$DbEk^5jo1%=F6aJT^0;%eY2*
zJQCBLKmXP=_$_l3|GQm-stUMzcfs0?33MgLc*7C
UUd9sMo)ld$oj}Y=U4nuD09vrg^8f$<
literal 0
HcmV?d00001
diff --git a/branding/source-assets/512-mac.png b/branding/source-assets/512-mac.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0647e1a1fcb08d5f102abe20f2899b1c3c3a1c
GIT binary patch
literal 14050
zcmZX418`+c)a|{oCe}@6V%zq_PA0Z9v2EM7CbsQNY}>Ytf4=wXRsB`(RG;dz&t84H
z`qb|3Rcp7RgsA8$8vvjxA|$UO&!Gkf005Bx-Cw}}ilDT-c=kUN2pY5^p;YX@JS5MHAqC)zyf;uAKq`ipzR7xC|tR1ZEMx?f9Q|Eg}*pupti!Hi%ST1GZJG?Fms
z&losZKg3xW4ny(rASrYWLNoejs`CK*v<`Ouo`+m%
z^(xMctEnevI<4iYa~Jv?pPLmd=hF&Px4^876d_(IB)O~ByYaY`uJ>28gb|kISkt@D
z(Yu(=qxA!^&3hq!)7lbu2dYzGQ`Jk$TJ_g;3Lf{QGFKE91ed^9%>4ww)P#^7`7viZD*1k^qZR?M^=GxZ)U
z&Vs6=f?$HSJQs!HUI4z?ygY2V^G++#HfOkHV(`4#Q%Aq
znL8gPpwRmC)_u>C_RnLDljaEB{TAZ`l+=DhPvZ93#r4+#hBD3%PZH_8#dybsvQ`JI
z`8;aE-4THp({W0u-dFhFt-=>uz=nKw-=b%+K#Wy5oRsgcA4Qr=N+nw#`%(8IqLJ02
zvO!-btjHGXN_;14Hby!|0~{9naJml*$Y&|r$0?o+UU4XUl?rJNyHZ!hF|5>7_)jlt
zy~h^i<1ZysA!_9V`}J43NRfkhJ%ppC8)1!XBkM0_M#G^fY659@JNSYN>3>GOs{cS4
z){z$Bf76J7z~>ZX!ij+pKIqDr!6A|DO2>(umejdH?fA5vlM-j-gO}2BfL?5KxNssU
zm@zBeHnFc{G>s+{wM@$pv_M!R7`)g=KPz7`c~`0H>|y{$X&Ka3P#Q#o`i&oZ&O(+2
zBlj>sk4z#@dJ}$EisQNA#F!!C8Dz0c@dtvYz8#MCyIR@qfJa^)
z&V<~w5$FW)H0f_PqP60sHk+D8+3d0oXvB8xeUR+6uixNwK((BIQbNU8$7XuLb9(Nw
z!!Y;Zj^kfA1z^4J)RVFf0_om~Hm04XzPLuzsw1C1QE-}~zeE}FP6%E|T>{8pe%S1Tp
Kkva$KX#4Y^=U+(o;&Ws)KMnZ?H8-ztM%M~
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