r/electronjs

Apple notarization taking 4+ hours... normal?

Is Apple notarization super slow for anyone else lately?

Submitted my Electron app DMG around 5pm and it’s still stuck on “In Progress” after 4+ hours. Last time was also around 3 hours.

What confuses me is people online keep saying notarization usually takes like 5–15 mins.

App is already signed properly with Developer ID cert and everything. Around 124MB DMG.

Main thing I’m trying to figure out:

  • is this normal?
  • any way to debug why it gets stuck so long?
  • and is there realistically any alternative to notarization if distributing directly from your own website?

I don’t really want to use the App Store because it’s a menubar-only utility app and App Review keeps becoming a pain with the no-dock-icon behavior.

reddit.com
u/Fresh-Wealth4531 — 1 day ago
▲ 1 r/electronjs+1 crossposts

Building a Multimedia Creative Suite with Zero coding or programing knowledge (Using Chat GPT code copilot, Open AI Codex, and Wind Surf - GPT 5.4 & 5.5 + Claude Opus 4.6 & 4.7)

Have you ever been so frustrated with a program or an app to the point that you wish you could just make your own?
Because that was me. That was me 100%, without question.

Meet Spyglass Studio! A premise to Premiere, All in one creative suite meant for any aspect of any video production. From short form content to Short film creations!

So, about 3-ish weeks ago, give or take, I decided to ask AI, could it help make me a tool for being able to write out information while I'm editing? Because I always ran into the issue with not being able to properly, let's say, brainstorm or formulate my thoughts while I'm in the middle of doing my edits. And my current video editor programs didn't actually allow anything to help make that process a little bit easier outside of just taking my notepad on my computer and just making it a tiny window and displaying it right then and there on top of my editor.

So what I did, with zero knowledge of coding or programming experience, anything whatsoever, I started building an app. So this is a currently functional program that I built using Node, Electron, and a couple other things. It is packed to the brim with so many tools, from converters to exporters for media editing (Wavesurfer, FFMPEG, Open Source Timeline handlers, AI Demucs Vocal Remover , and more).

And surprisingly, I have been able to develop something that runs fast, that is snappy, that is responsive, that you can use alongside other editors. It's not really meant to replace something like Adobe or Cyberlink or DaVinci Resolve, and it's especially not meant to replace Audacity, but it is something that you can definitively use hand in hand alongside those programs. And the very best part? the very best part about my program, full customizable layout for any user, from panel sizing, panel placement, panel use, everything can be freely manipulated and edited and set up however the user wants.

I'm not quite done yet, but I'm learning slowly about the community of people that actually build stuff using AI, and I just wanted to share it!

u/SpyglassQ — 4 days ago
▲ 4 r/electronjs+2 crossposts

I built "Perdanga VSP" because I really dislike the design of most popular media players. I wanted something minimalist and fast, so I made my own. Thought I’d share it here in case anyone else finds it useful.

It’s built with Electron + FFmpeg.

Core highlights:
- Custom local media server
- Streams large files (50GB+) without loading them into memory
- Hardware-accelerated playback (VA-API, zero-copy, Chromium flags tuned)
- GPU-accelerated 4K playback
- Automatic audio/video sync correction

Subtitles:
- Custom subtitle engine
- Supports VTT/SRT + partial ASS parsing
- Real-time adjustments (size, position, delay)

Interface:
- Clean UI
- Floating panels (playlist, chapters)
- Frame preview on timeline (video-based thumbnails)
- Context menu for audio/subtitle track selection
- Audio mode with visualizer

Playback system:
- Playlist + chapters navigation
- Advanced hotkeys (similar to mpv/VLC)
- Screenshot capture (frame-accurate)
- Resume playback (auto-save progress per file)

Security:
- The media server is protected by a secure session token to block unauthorized access
- Metadata sanitization to prevent XSS
- Strict sandboxing (no external navigation or window creation)

Supported Formats:
- Video: mp4, mkv, webm, avi, mov
- Audio: mp3, wav, flac, ogg, m4a

u/RomanKojima — 4 days ago

I built Ditto, an Electron app for local voice to text on Windows (Whisper.cpp + CUDA)

Disclosure: I made this. Free and open source.

I got tired of paying monthly for voice typing apps like WhisprFlow when my RTX could run Whisper locally faster than the cloud round trip. So I built Ditto, a Windows tray app that does voice to text fully offline.

What it does (three things, kept simple on purpose):

  1. Floating pill. A small AirTag-style pill floats on top of any window. Press the global shortcut, talk, release. The pill animates with a live waveform driven by your voice while recording.
  2. Local transcription. Audio goes through whisper.cpp with CUDA acceleration. Nothing leaves your machine. First transcription takes about 1.3 seconds (CUDA init), subsequent ones 300 to 500 ms. You pick the model on first launch: base (140 MB) to large (3.1 GB).
  3. Auto paste. Transcribed text goes to your clipboard and pastes itself into whatever window is focused. Works in any Win32 app: browser, IDE, Discord, Slack, anywhere.

Notes on the build:

  • Electron 39 + React 19 + TypeScript strict, three separate renderer processes (pill, settings, welcome) with typed IPC
  • Whisper.cpp 1.8.4 shipped as a standalone exe with bundled CUDA DLLs, no toolchain needed on the user's machine
  • Audio resampling done entirely in the renderer via OfflineAudioContext before sending to main
  • Pill has a transparent invisible margin around it so OS shadow clipping doesn't cut the visual, with click-through driven from main to avoid breaking the drag region

Repo and release: github.com/asantinos/ditto

Caveat: Windows only for now. CUDA build means it currently targets NVIDIA GPUs (works fine on RTX laptops). No code signing yet so SmartScreen warns on first launch. Installer is ~399 MB because of bundled CUDA DLLs.

Feedback welcome, especially from anyone who has shipped Electron apps with native binary dependencies. The Whisper integration was the trickiest part.

u/aleexsag — 7 days ago

Shipped my first Electron app after a 3 months of building — Yalla Video (YouTube downloader). Here's the stack, here's what hurt, AMA.

Finally pushed v1.0 of an Electron app I've been building solo for about a year. Sharing the stack and a few lessons because this sub has been useful to me when I was stuck.

Yalla Video — desktop YouTube downloader (videos, playlists, entire channels). Mac/Windows/Linux. Site: www.yallavideo.app

Frontend:

  • Electron + React 18 + Vite
  • TailwindCSS + shadcn/ui
  • Zustand for state
  • i18next for 12 languages (Arabic-first, full RTL)

Backend (separate, optional):

  • Laravel 13 + FilamentPHP v5 + MySQL
  • Handles auth, quotas, Paddle subscriptions, analytics only
  • The actual downloading never touches a server — yt-dlp + ffmpeg are bundled in the app and run locally

Things that hurt that I wish someone had warned me about:

  1. Auto-updates on macOS. Notarization + signing + electron-updater is a maze. I lost three weeks to entitlements plists and the "app is damaged" error. The fix was never one thing — it was always seven things at once. GitHub Actions secrets management for the signing certs is its own nightmare.
  2. Bundled binary management. I ship yt-dlp and ffmpeg bundled with the app and auto-update yt-dlp on launch. Getting the chmod, PATH resolution, and "binary not found because the user moved the app" edge cases right took longer than the entire download UI did.
  3. Process lifecycle. Downloads are detached child processes so the app can crash without killing them. Pause/resume uses yt-dlp's native .part files rather than custom checkpointing — much less code, much more robust.
  4. IPC channel discipline. I started with ad-hoc ipcMain.handle calls scattered everywhere. By month 4 it was unmaintainable. Refactored into domain-grouped registrars (registerDownloadsIpc, registerWindowIpc, etc.) and never looked back.
  5. Full RTL support is more than dir="rtl". I had to ban hardcoded pl-/pr-/ml-/mr- Tailwind classes across the entire codebase and switch to logical properties (ps-/pe-/ms-/me-). The codemod was painful but mandatory.
  6. Bundle size. It's 180MB. Yes I know. No I'm not switching to Tauri for v1, maybe for v2.

Things that were easier than expected:

  • Tray icon + minimize-to-tray
  • Deep-link protocol (yallavideo://) for password reset flows
  • Cross-platform native file pickers
  • shadcn/ui in Electron just... works

Things I'd do differently:

  • Start with the design system on day one, not month four
  • Pick a state manager before writing any UI code (I started with Context, rewrote in Zustand at month two, never regretted it)
  • Set up Playwright E2E tests before the codebase has 10k LOC, not after

Happy to dig into any of these in the comments. Curious what other Electron devs are doing for: auto-update reliability, bundle-size reduction, and IPC organization at scale.

u/LonelyWinner2158 — 7 days ago
▲ 2 r/electronjs+1 crossposts

CrossOver - crosshair overlay built with Electron, just launched on ProductHunt

CrossOver is a desktop crosshair overlay built with Electron. It runs as a transparent window overlay on top of any game or application.

Built with Electron + a few tricks to keep the window always-on-top, click-through, and invisible to screen capture. Works on Windows, macOS, and Linux.

Key things it does:

- 50+ included crosshair styles, or use your own image

- Adjustable size, color, gap, opacity

- Keyboard shortcut to toggle and lock in place

- Multiple monitors and duplicate crosshairs supported

- Works as a screen overlay (not game injection), so no anti-cheat issues

1,100+ GitHub stars over 3 years. Just launched on ProductHunt today.

GitHub: https://github.com/lacymorrow/crossover

ProductHunt: https://www.producthunt.com/posts/crossover-2

u/lacymcfly — 9 days ago

Zenbu.js - A framework for building extensible electron applications

Hello! I'm Rob, I was previously a member on the Next.js core team, and I built Zenbu.js - a framework for building electron apps that your users can extend

All apps written in Zenbu.js inherit a TypeScript native plugin system that can be used by users to hook into or modify nearly any part of your app. I think this is one of the most important features new apps should have today, now that it's possible for users to build plugins to personalize their experience using coding agents.

A novel feature Zenbu.js is trying to pioneer is that you do not compile the application from TS -> JS when building the application. Instead, your app should be able to natively understand TypeScript. This unlocks the ability for your user to edit the source code of the app while in production, while instantly hot reloading.

If you are interested and want to learn more, there are docs on the website! You can create a Zenbu.js app today using:

npx create-zenbu-app

zenbu.dev
u/RobKnight_ — 10 days ago
▲ 4 r/electronjs+1 crossposts

Electron app + Apple Music playback: queue works, playback does not start. Looking for guidance.

Hi everyone. I’m building a macOS-first desktop app where music drives the behavior loop. The app is currently an Electron prototype.

The blocker: we’re testing Apple Music inside an Electron app. MusicKit JS authorization works, catalog search works, and setting the queue works, but playback does not actually start in Electron.

What we tried:

  • Created Apple Developer / MusicKit credentials.
  • Generated Apple Music developer tokens successfully.
  • Retrieved a Music User Token through MusicKit JS.
  • Confirmed Apple Music API calls work.
  • Confirmed /v1/test and /me/storefront return 200 OK.
  • Built a local HTTP auth/playback window inside Electron instead of using file://.
  • Tested music.setQueue() with both:
    • { song: songId }
    • { url: catalogUrl }
  • In Electron, the queue loads correctly:
    • queueEmpty=false
    • queueLength=1
    • volume=1
    • playbackRate=1
  • But after music.play(), playbackTime stays at 0 and no audio plays.

Then we ran the same MusicKit playback test in normal Chrome using the same token, same local origin, same catalog track, and same queue descriptor. Chrome played successfully and playbackTime advanced.

We also checked Electron directly and found navigator.requestMediaKeySystemAccess is missing, so our current theory is that stock Electron lacks the protected media / EME support Apple Music web playback needs.

Important: we are not trying to bypass DRM or extract audio. We just want a legitimate way for a user-authorized macOS app to control Apple Music playback or observe playback state.

What we’re considering next:

  • Use the native macOS Music app as the playback engine and control it from our app.
  • Test AppleScript / Automation permissions for play, pause, next, current track, player state, etc.
  • Later, possibly build a native Swift helper using Apple Music / MediaPlayer APIs and communicate with Electron over IPC.
  • Avoid relying on Electron MusicKit JS playback if this is a known dead end.

Questions:

  1. Has anyone successfully made Apple Music / MusicKit JS playback work inside Electron?
  2. Is the missing EME/protected-media layer the expected blocker here?
  3. Is controlling the native macOS Music app the more realistic path?
  4. Any gotchas with AppleScript, MusicKit native APIs, or Electron + native helper architecture for this use case?

Any pointers from people who have dealt with Electron + Apple Music / protected media would be appreciated.

reddit.com
u/Holiday_Rip_2428 — 12 days ago

How long does it take this god damn notarization?

It's my first time notarizing anything for MacOS. Apple Developer Account is also brand new.

There is nothing wrong with my build pipeline, it just gets stuck at notarization so it looks like an Apple related issue rather than my pipeline.

Adding my other 3 trials to this current process, I've now waited for more than 6 hours. Is this normal?

u/theseckinaktunc — 14 days ago
▲ 17 r/electronjs+2 crossposts

GitHub: https://github.com/Ron537/DPlex
License: MIT
Latest release: v0.11.2 (macOS/Windows/Linux binaries)

DPlex discovers every past Claude Code / Copilot CLI session you've ever run, lets you resume any of them in one click, and restores every open session tab (splits, CWDs, resume commands) across restarts. Built on Electron + React + xterm.js with a small SessionProvider abstraction so adding more AI CLIs is straightforward.

u/Ron537 — 14 days ago