Skip to content

Foodhy/insta-record

Repository files navigation

insta-record

insta-record — grabador de pantalla nativo lite

Grabador de pantalla nativo lite para Windows / macOS / Linux. Vive en la barra del sistema (menubar/tray). Versión lite estilo TapRecord.

Stack: Tauri 2 (Rust) + React + FFmpeg como sidecar.

Referencia técnica rápida (gotchas, comandos, arquitectura) en CLAUDE.md. Roadmap y futuro en ROADMAP.md. Cambios por versión en CHANGELOG.md.

TL;DR comandos

source "$HOME/.cargo/env"                 # cargo no está en PATH por defecto
bash scripts/start.sh                     # dev (hot reload) — app NATIVA, no navegador
bash scripts/stop.sh                      # detener todo
cargo test --manifest-path src-tauri/Cargo.toml   # tests backend
pnpm exec tsc --noEmit                    # typecheck frontend
bash scripts/build-mac.sh                 # instalador .dmg

Estado

Fase Qué Estado
1 — Cimientos Tray, menú, list_devices, settings store, scripts
2 — Esencial Grabar pantalla/área + audio, countdown, RAM live, autostart
3 — Funcionalidades Reproducir + cut/trim
4 — Web detect Extensión navegador + listener + grabar instantáneo
5 — Export + pulir Instaladores por OS, permisos, UI 🟡 Mac listo

Requisitos

  • Node + pnpm
  • Rust (rustup) — curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  • FFmpeg (dev usa el del sistema; build empaqueta uno por OS en src-tauri/binaries/)

Correr en local (sin instalar)

bash scripts/start.sh            # modo dev (hot reload) — ESTE para iterar
bash scripts/start.sh --preview  # build release sin empaquetar
bash scripts/stop.sh             # detener app + ffmpeg huérfano + listener

IMPORTANTE: la app es nativa, NO se abre en el navegador. localhost:1420 en Chrome = solo el frontend, sin backend → no funciona. Al arrancar, la ventana del menú se abre sola. También sale un icono ●REC en el menubar de macOS (arriba). Click en él muestra/oculta el menú.

Iterar (dev)

  • Editas React (src/) → recarga sola, instantánea.
  • Editas Rust (src-tauri/src/) → recompila auto (~5s) y reinicia.
  • Si el watcher se cae, bash scripts/stop.sh y vuelve a bash scripts/start.sh.

Cómo usar la app

Grabar

  • ● Grabar pantalla — graba la pantalla completa.
  • ▭ Grabar área — oscurece la pantalla; arrastra un rectángulo sobre la zona deseada y suelta. Esc cancela.
  • Antes de grabar corre el countdown 3-2-1 (se puede apagar en Settings).
  • ■ Detener termina y guarda. La ruta del archivo sale en pantalla.

Mover / expandir la ventana

  • Arrastra desde el header ("insta-record"). El cursor cambia a mano.
  • Botón (header) expande la ventana; 🗗 la compacta. También es redimensionable desde los bordes.

Atajos de teclado (globales)

  • ⌘⇧J — grabar / detener (funciona aunque la ventana esté oculta).
  • ⌘⇧X — cancelar todo: mata la grabación y descarta el archivo.

Accesibilidad (macOS): los atajos usan RegisterEventHotKey (Carbon), que NO requiere permiso de Accesibilidad — funcionan directo. Si algún día no responden, revisa/abre el panel:

# Abrir el panel de Accesibilidad directo
open "x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility"
# Abrir Grabación de pantalla (este SÍ es obligatorio para grabar)
open "x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture"
# Abrir Micrófono
open "x-apple.systempreferences:com.apple.preference.security?Privacy_Microphone"
# Resetear permisos del bundle si quedan en mal estado (pide de nuevo)
tccutil reset Accessibility com.insta-record
tccutil reset ScreenCapture com.insta-record
tccutil reset Microphone com.insta-record

Ocultar / salir

  • (header) — oculta la ventana. Vuelve con ⌘⇧J o el icono ●REC del menubar.
  • (header) — cierra la app.
  • Al grabar, la ventana se encoge a una barra mini y se aparta a la esquina superior para no estorbar.

Cancelar

Durante la grabación: ✕ Cancelar (descartar) mata ffmpeg y borra el archivo parcial (no guarda nada). ■ Detener y guardar finaliza y conserva.

Reproducir y recortar (cut)

  1. 📼 Grabaciones → lista de archivos.
  2. Click en un video → se abre el reproductor.
  3. Mueve el video al punto deseado → ⟦ Inicio; ve al final → Fin ⟧.
  4. ✂ Cortar segmento → crea <nombre>-cut.mp4.
    • Marca Corte exacto para re-encode (más lento, corte preciso); sin marcar usa -c copy (instantáneo, corta en keyframe).
  5. Renombrar (✎), borrar (🗑), abrir carpeta — en la lista.

Settings (⚙)

Carpeta destino · juntos/separados · audio (mic/sistema/ambos) · micrófono · countdown · autostart · detección de páginas web (dominios, umbral seg, instantáneo).


Permisos macOS (primera vez)

System Settings → Privacy & Security:

  • Screen Recording → permite insta-record (en dev puede aparecer como la Terminal).
  • Microphone → permite.

Sin esto: pantalla negra / sin audio.


Exportar ejecutable por sistema

bash scripts/build-mac.sh    # .app + .dmg   (correr en macOS)
bash scripts/build-win.sh    # .exe + .msi   (correr en Windows)
bash scripts/build-linux.sh  # .AppImage + .deb (correr en Linux)

Artefactos en src-tauri/target/<triple>/release/bundle/.


Probar / verificar piezas sueltas

# Tests unitarios del backend (ffmpeg args, parse devices, trim, duración)
cargo test --manifest-path src-tauri/Cargo.toml

# Typecheck del frontend
pnpm exec tsc --noEmit

# Listener web (con la app corriendo): simula la señal de la extensión
curl -X POST http://127.0.0.1:8787/seen \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://youtube.com","seconds":16}'
# → debe disparar el prompt "¿Grabar?" en la app

# Enumerar dispositivos como lo hace la app (macOS)
src-tauri/binaries/ffmpeg-aarch64-apple-darwin -f avfoundation -list_devices true -i ""

FFmpeg sidecar

Tauri empaqueta un binario por target, nombrado con el triple de Rust:

src-tauri/binaries/ffmpeg-aarch64-apple-darwin
src-tauri/binaries/ffmpeg-x86_64-pc-windows-msvc.exe
src-tauri/binaries/ffmpeg-x86_64-unknown-linux-gnu

Estado actual:

  • ffmpeg-aarch64-apple-darwin y ffmpeg-x86_64-apple-darwin = build estático de evermeet.cx (x86_64, sin dylibs). En Apple Silicon corre vía Rosetta (instálala con softwareupdate --install-rosetta si falta).
  • El de Homebrew quedó respaldado como *.homebrew-dev por si quieres dev nativo arm.
  • Pendiente: ffmpeg arm64 nativo (evermeet solo da Intel) + binarios Win/Linux.

macOS pide permisos vía entitlements.plist + Info.plist (NSMicrophoneUsageDescription, cámara, LSUIElement para ocultar del Dock).

Carpeta de grabaciones

Default macOS: ~/Movies/insta-record (dirs::video_dir() = Movies en Mac). Linux/Windows: ~/Videos/insta-record. Configurable en Settings.

Extensión de navegador (Fase 4)

Ver scripts/load-extension.md. Resumen:

  • Chrome: chrome://extensions → modo desarrollador → "Cargar descomprimida" → browser-extension/.
  • Firefox: about:debugging → "Cargar complemento temporal" → browser-extension/manifest.json.

Troubleshooting

Síntoma Causa Fix
Errores invoke undefined en consola Abriste en navegador Usa la ventana nativa; no abras localhost:1420
No veo icono en menubar Saturado / notch Busca texto ●REC; la ventana abre sola igual
Pantalla negra al grabar Sin permiso Screen Recording Privacy & Security → permite
Sin audio del sistema Mac no captura loopback nativo Instala BlackHole o usa solo mic
ELIFECYCLE 143 en el log pnpm al matar dev Ruido, ignorar; o stop.sh + start.sh

About

Lightweight native screen recorder for Mac. Menubar app, FFmpeg-powered, global hotkeys, trim & library, web-activity detection.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors