diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 7c69c18..672376d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -62,7 +62,7 @@ jobs:
- name: Verify universal release packaging
run: |
./scripts/build_release.sh
- (cd dist && shasum -a 256 --check SHA256SUMS.txt)
+ (cd dist && shasum -a 256 --check Cineleaf-0.3.0-macOS-SHA256SUMS.txt)
hdiutil verify dist/Cineleaf-0.3.0-macOS.dmg
ARCHITECTURES="$(lipo -archs dist/Cineleaf.app/Contents/MacOS/Cineleaf)"
[[ "$ARCHITECTURES" == *arm64* && "$ARCHITECTURES" == *x86_64* ]]
diff --git a/.github/workflows/release-packages.yml b/.github/workflows/release-packages.yml
new file mode 100644
index 0000000..45a7aab
--- /dev/null
+++ b/.github/workflows/release-packages.yml
@@ -0,0 +1,125 @@
+name: Publish release packages
+
+on:
+ workflow_dispatch:
+ inputs:
+ tag:
+ description: Existing GitHub release tag
+ required: true
+ default: v0.3.0-beta.2
+ type: string
+ platform:
+ description: Packages to build and attach
+ required: true
+ default: all
+ type: choice
+ options:
+ - all
+ - macos
+ - windows
+
+permissions:
+ contents: write
+
+concurrency:
+ group: cineleaf-release-${{ inputs.tag }}-${{ inputs.platform }}
+ cancel-in-progress: false
+
+jobs:
+ validate-release:
+ runs-on: ubuntu-latest
+ outputs:
+ version: ${{ steps.validate.outputs.version }}
+ steps:
+ - name: Validate tag and existing release
+ id: validate
+ env:
+ GH_TOKEN: ${{ github.token }}
+ GH_REPO: ${{ github.repository }}
+ RELEASE_TAG: ${{ inputs.tag }}
+ run: |
+ set -euo pipefail
+ [[ "$RELEASE_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+([.-][0-9A-Za-z.-]+)?$ ]]
+ gh release view "$RELEASE_TAG" >/dev/null
+ VERSION="${RELEASE_TAG#v}"
+ echo "version=$VERSION" >> "$GITHUB_OUTPUT"
+
+ macos-package:
+ if: inputs.platform == 'all' || inputs.platform == 'macos'
+ needs: validate-release
+ runs-on: macos-15
+ timeout-minutes: 45
+ steps:
+ - name: Check out the released source
+ uses: actions/checkout@v7
+ with:
+ ref: ${{ inputs.tag }}
+ - name: Select Xcode 16.4
+ run: sudo xcode-select -s /Applications/Xcode_16.4.app/Contents/Developer
+ - name: Install XcodeGen
+ run: brew install xcodegen
+ - name: Build and verify universal Mac package
+ env:
+ CINELEAF_RELEASE_VERSION: ${{ needs.validate-release.outputs.version }}
+ run: |
+ set -euo pipefail
+ ./scripts/build_release.sh
+ PREFIX="Cineleaf-$CINELEAF_RELEASE_VERSION-macOS"
+ (cd dist && shasum -a 256 --check "$PREFIX-SHA256SUMS.txt")
+ hdiutil verify "dist/$PREFIX.dmg"
+ ARCHITECTURES="$(lipo -archs dist/Cineleaf.app/Contents/MacOS/Cineleaf)"
+ [[ "$ARCHITECTURES" == *arm64* && "$ARCHITECTURES" == *x86_64* ]]
+ - name: Attach Mac downloads to the release
+ env:
+ GH_TOKEN: ${{ github.token }}
+ GH_REPO: ${{ github.repository }}
+ RELEASE_TAG: ${{ inputs.tag }}
+ MAC_VERSION: ${{ needs.validate-release.outputs.version }}
+ run: |
+ set -euo pipefail
+ PREFIX="Cineleaf-$MAC_VERSION-macOS"
+ gh release upload "$RELEASE_TAG" \
+ "dist/$PREFIX.dmg" \
+ "dist/$PREFIX.zip" \
+ "dist/$PREFIX-SHA256SUMS.txt" \
+ --clobber
+
+ windows-package:
+ if: inputs.platform == 'all' || inputs.platform == 'windows'
+ needs: validate-release
+ runs-on: windows-2025
+ timeout-minutes: 50
+ steps:
+ - name: Check out the released source
+ uses: actions/checkout@v7
+ with:
+ ref: ${{ inputs.tag }}
+ - name: Set up .NET 10 SDK
+ uses: actions/setup-dotnet@v5
+ with:
+ dotnet-version: 10.0.x
+ - name: Install installer compiler
+ shell: pwsh
+ run: choco install innosetup --yes --no-progress
+ - name: Build and verify Windows packages
+ shell: pwsh
+ env:
+ RELEASE_VERSION: ${{ needs.validate-release.outputs.version }}
+ run: ./scripts/build_windows_release.ps1 -ReleaseVersion $env:RELEASE_VERSION
+ - name: Attach Windows downloads to the release
+ shell: pwsh
+ env:
+ GH_TOKEN: ${{ github.token }}
+ GH_REPO: ${{ github.repository }}
+ RELEASE_TAG: ${{ inputs.tag }}
+ RELEASE_VERSION: ${{ needs.validate-release.outputs.version }}
+ run: |
+ $assets = Get-ChildItem -LiteralPath dist -File | Where-Object { $_.Name -like "Cineleaf-$env:RELEASE_VERSION-Windows-*" }
+ if ($assets.Count -ne 3) {
+ throw "Expected three Windows release files, found $($assets.Count)."
+ }
+ $arguments = @("release", "upload", $env:RELEASE_TAG) + @($assets.FullName) + "--clobber"
+ & gh @arguments
+ if ($LASTEXITCODE -ne 0) {
+ throw "Uploading Windows release files failed."
+ }
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fb8aa7d..a61d5c5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,15 @@ All notable changes are recorded here. Cineleaf follows semantic versioning afte
## Unreleased
+## 0.3.0-beta.2 — 2026-07-27
+
+### Distribution and documentation
+
+- Added one reproducible GitHub Release workflow that builds, verifies and attaches both Windows and universal Mac packages.
+- Added direct, plain-language Windows and Mac download instructions to the English base README.
+- Versioned Mac DMG, ZIP and checksum names now match their GitHub release tag; the DMG volume also shows the correct release version.
+- Kept the private `instructions.md` build brief ignored and guarded by both CI systems.
+
## 0.3.0-beta.1 — 2026-07-27
### Added
diff --git a/README.md b/README.md
index a50a4b9..4c5b61f 100644
--- a/README.md
+++ b/README.md
@@ -3,139 +3,151 @@
- Edición de vídeo rápida, privada y gratuita para Windows y Mac.
- Sin cuenta, nube, anuncios, suscripción, marca de agua ni seguimiento.
+ A fast, private, and free video editor for Windows and Mac.
+ No account, cloud upload, ads, subscription, watermark, or tracking.
-
-
-
-
+
+
+
+
-## Descargar Cineleaf para Windows
+## Download Cineleaf
-La forma más sencilla es descargar **[Cineleaf para Windows (instalador EXE)](https://github.com/luucabg/cineleaf/releases/download/v0.3.0-beta.1/Cineleaf-0.3.0-beta.1-Windows-x64-Setup.exe)**.
+Choose your computer below. These are ready-to-use downloads; you do not need to install programming tools.
-1. Descarga el archivo.
-2. Ábrelo y sigue el instalador. No necesita permisos de administrador.
-3. Abre Cineleaf desde el menú Inicio.
+| Your computer | Recommended download | Other download |
+| --- | --- | --- |
+| **Windows 10/11, 64-bit** | **[Download the Windows installer (.exe)](https://github.com/luucabg/cineleaf/releases/download/v0.3.0-beta.2/Cineleaf-0.3.0-beta.2-Windows-x64-Setup.exe)** | [Portable Windows version (.zip)](https://github.com/luucabg/cineleaf/releases/download/v0.3.0-beta.2/Cineleaf-0.3.0-beta.2-Windows-x64-Portable.zip) |
+| **macOS 14 or newer, Apple Silicon or Intel** | **[Download the Mac installer (.dmg)](https://github.com/luucabg/cineleaf/releases/download/v0.3.0-beta.2/Cineleaf-0.3.0-beta.2-macOS.dmg)** | [Mac app (.zip)](https://github.com/luucabg/cineleaf/releases/download/v0.3.0-beta.2/Cineleaf-0.3.0-beta.2-macOS.zip) |
-También existe una **[versión portátil ZIP](https://github.com/luucabg/cineleaf/releases/download/v0.3.0-beta.1/Cineleaf-0.3.0-beta.1-Windows-x64-Portable.zip)** que no se instala. Los usuarios avanzados pueden comprobar la descarga con el archivo de **[sumas SHA-256](https://github.com/luucabg/cineleaf/releases/download/v0.3.0-beta.1/Cineleaf-0.3.0-beta.1-Windows-SHA256SUMS.txt)**.
+You can verify the downloads with the [Windows SHA-256 checksums](https://github.com/luucabg/cineleaf/releases/download/v0.3.0-beta.2/Cineleaf-0.3.0-beta.2-Windows-SHA256SUMS.txt) or [Mac SHA-256 checksums](https://github.com/luucabg/cineleaf/releases/download/v0.3.0-beta.2/Cineleaf-0.3.0-beta.2-macOS-SHA256SUMS.txt).
-> La versión de Windows es una beta para Windows 10/11 de 64 bits. El instalador no está firmado todavía, por lo que Windows puede mostrar una advertencia de SmartScreen. El código, las pruebas y el proceso de construcción son públicos.
+### Install on Windows
-## Qué es Cineleaf
+1. Download and open the `.exe` file.
+2. Follow the installer. Administrator access is not required.
+3. Open Cineleaf from the Start menu.
-Cineleaf es un editor para crear vídeos sin aprender una herramienta profesional complicada. Arrastra vídeos, fotos y música; corta y ordena; añade texto, efectos, transiciones o subtítulos; y exporta un MP4 listo para compartir.
+The Windows installer is not digitally signed yet, so Microsoft SmartScreen may show a warning. The complete source code, build process, and tests are public in this repository.
-Todo se procesa en tu ordenador. Cineleaf no sube tus vídeos a ningún servidor.
+### Install on Mac
-La interfaz está disponible en español e inglés. Los proyectos `.cineleaf` usan el mismo formato en Windows y Mac, así que se pueden mover entre ambos sistemas si las rutas de los archivos multimedia siguen siendo accesibles.
+1. Download and open the `.dmg` file.
+2. Drag Cineleaf into the Applications folder.
+3. Open Cineleaf from Applications.
-## Súper optimizado para ser rápido
+The Mac build is ad-hoc signed but not Apple-notarized because this project does not use a paid Apple Developer account. If macOS blocks the first launch, right-click Cineleaf and choose **Open**. You can also use **System Settings > Privacy & Security > Open Anyway**. Cineleaf never disables macOS security settings.
-Cineleaf está diseñado para responder al instante incluso en proyectos grandes:
+## What is Cineleaf?
-- La línea de tiempo dibuja solo lo que se ve, en vez de crear miles de elementos ocultos.
-- Busca los clips visibles con un índice rápido y no recorre el proyecto entero.
-- Miniaturas, formas de onda, análisis, subtítulos y exportación trabajan en segundo plano.
-- Cancela trabajos de previsualización antiguos cuando haces un cambio nuevo.
-- Reutiliza resultados en una caché limitada a 2 GB, evitando repetir trabajo sin llenar el disco.
-- Procesa audio y vídeo por partes para mantener limitado el uso de memoria.
-- Usa tiempo racional exacto para evitar que los cortes se desplacen por errores decimales.
-- Prueba el hardware disponible y prefiere aceleración NVIDIA, Intel, AMD o Windows cuando funciona; si no, usa una alternativa compatible.
-- El instalador incluye todo lo necesario: no obliga a instalar .NET ni FFmpeg por separado.
+Cineleaf is designed for people who want to make a video without learning a complicated professional editor. Drag in videos, photos, or music; cut and arrange them; add text, effects, transitions, or subtitles; then export an MP4 that is ready to share.
-En un Ryzen 5 5600X, la última pasada aislada midió una mediana de **0,0040 ms** para localizar lo visible dentro de 10.000 clips, **0,3286 ms** para validar un proyecto de una hora con 100 clips y **11,8451 ms** para mover un clip con copia segura, historial y validación completa. Son medidas del motor, no una promesa de que toda exportación tarde lo mismo. Consulta [las medidas y sus límites](Documentation/PERFORMANCE.md).
+Everything is processed on your computer. Cineleaf does not upload your videos anywhere. The app is available in English and Spanish.
-## Controlarlo con una IA
+Windows and Mac use the same `.cineleaf` project format. You can move a project between them as long as its original video, image, and audio files are also available.
-Cineleaf incluye un servidor **MCP**, un puente estándar para que una IA compatible pueda trabajar con el editor sin tener que buscar botones en la pantalla. Puedes pedir, por ejemplo: “crea 12 vídeos verticales con estos clips, añade el título y expórtalos”. La IA puede:
+## Highly optimized for speed
-- Examinar un proyecto y recibir identificadores claros de clips, pistas y recursos.
-- Preparar uno o hasta 32 vídeos por lote, manteniendo el orden de los resultados.
-- Mover, recortar, dividir, duplicar, transformar, silenciar o borrar clips con tiempos exactos.
-- Añadir pausas negras, quitar intervalos, separar audio y cambiar nombre, formato, fotogramas por segundo o resolución.
-- Añadir textos, subtítulos y marcadores, extraer audio o un fotograma, y exportar en H.264 o HEVC de 720p a 4K.
-- Ver primero un plan sin tocar archivos y ejecutar después exactamente ese plan.
+Performance is a core part of Cineleaf, not an afterthought. It is heavily optimized to stay quick and responsive, including with large projects:
-Todo sigue ocurriendo en tu ordenador. El puente solo puede acceder a las carpetas que tú autorices, no usa una nube de Cineleaf y valida cada proyecto con el motor nativo de Windows o Mac antes de guardarlo. Los trabajos usan claves de reintento: si una exportación se interrumpe, se puede continuar sin crear el proyecto dos veces.
+- The timeline draws only the part you can see instead of creating thousands of hidden items.
+- A fast index finds visible clips without scanning the entire project.
+- Thumbnails, waveforms, analysis, subtitles, and exports run in the background.
+- Outdated preview work is cancelled as soon as you make a newer change.
+- A size-limited cache reuses safe results without filling the disk.
+- Audio and video are streamed in small parts instead of loading complete files into memory.
+- Exact rational time prevents cuts from drifting because of decimal rounding.
+- Windows tests NVIDIA, Intel, AMD, or system hardware encoding and uses the fastest working option. Mac uses Apple media frameworks and hardware acceleration when available.
+- Preview quality can be reduced for smooth editing without reducing the quality of the final export.
+- The Windows installer includes .NET and FFmpeg, so there is nothing else to install.
-La instalación para IA es opcional y requiere Node.js 20 o posterior. En Windows, después de instalar Cineleaf, abre PowerShell y ejecuta:
+On a Ryzen 5 5600X, isolated engine benchmarks measured a median of **0.0040 ms** to locate the visible section of a 10,000-clip timeline, **0.3286 ms** to validate a one-hour/100-clip project, and **11.8451 ms** to move a clip with safe copying, history, and full validation. These are engine measurements, not a promise that every export will finish in that time. See [performance measurements and their limits](Documentation/PERFORMANCE.md).
-```powershell
-powershell -ExecutionPolicy Bypass -File "$env:LOCALAPPDATA\Programs\Cineleaf\Automation\setup_cineleaf_mcp.ps1" -AllowedRoot "D:\Videos"
-```
+## Main features
-En Mac, después de copiar Cineleaf a Aplicaciones:
+### Comfortable editing
-```bash
-"/Applications/Cineleaf.app/Contents/Resources/Automation/setup_cineleaf_mcp.sh" "$HOME/Movies"
-```
+- Landscape, vertical, square, and 4:5 projects at 24, 25, 30, 50, or 60 fps.
+- Import video, audio, and images with a button, double-click, or drag and drop.
+- Multiple tracks; move, trim, split, duplicate, delete, ripple-delete, undo, and redo.
+- Insert black pauses of any length, remove exact time ranges, and detach audio from video.
+- Markers, private beat detection, and reviewed silence detection/removal.
+- Smooth timeline zooming and scrolling with virtualized drawing.
+- Background preview composition with caching and cancellation.
+
+### Effects and creation
-El instalador genera un pequeño bloque de configuración para pegar en cualquier cliente compatible con MCP. Consulta la [guía de automatización para IA](Documentation/AI_AUTOMATION.md), con ejemplos y límites explicados sin jerga.
+- Position, scale, rotation, crop, opacity, speed, and reverse playback.
+- Change project shape, resolution, and frame rate, from 720p to 4K.
+- Exposure, contrast, saturation, temperature, tint, highlights, shadows, sharpening, and vignette.
+- Blur, monochrome, sepia, bloom, sharpen, and vignette effects.
+- Dissolve, fade-through-black, slide, wipe, and blur transitions.
+- Configurable text and subtitles over the video.
+- H.264 or HEVC MP4 export from 720p to 4K with AAC audio, progress, and cancellation.
+- Extract original audio to M4A or save the current frame as a PNG.
-## Funciones disponibles
+### Automatic subtitles and privacy
-### Edición cómoda
+Cineleaf can create automatic subtitles using speech recognition on the computer when the operating system supports it. Your audio is not sent to a Cineleaf server. You can review and correct the text before export, and import or export SRT and WebVTT subtitle files. Available languages depend on the speech packages installed on the computer.
-- Proyectos horizontales, verticales, cuadrados y 4:5; 24, 25, 30, 50 o 60 fps.
-- Importación de vídeo, audio e imágenes mediante botón, doble clic o arrastrar y soltar.
-- Varias pistas, mover, recortar, dividir, duplicar, borrar, borrado con cierre de hueco, deshacer y rehacer.
-- Pausas negras de cualquier duración, eliminación exacta de intervalos y separación del audio de un clip.
-- Marcadores, detección local de ritmos y revisión/eliminación de silencios.
-- Zoom y desplazamiento fluidos en una línea de tiempo virtualizada.
-- Vista previa compuesta en segundo plano con caché y cancelación.
+### Useful ideas already included
-### Efectos y creación
+- The same project format works on Windows and Mac.
+- Beat detection creates useful points for cutting to music.
+- Silence detection proposes changes for review before deleting anything.
+- Automatic encoder selection tests the GPU instead of assuming it will work.
+- Atomic saving, autosave, and recovery reduce the risk of losing work.
+- Export checks free disk space, removes incomplete temporary files, and inspects the finished video again.
-- Posición, escala, rotación, recorte, opacidad, velocidad y reproducción inversa.
-- Cambio de formato, resolución y fotogramas por segundo; proyectos de 720p a 4K.
-- Exposición, contraste, saturación, temperatura, tinte, luces, sombras, nitidez y viñeta.
-- Desenfoque, nitidez, monocromo, sepia, bloom y viñeta.
-- Fundidos y transiciones de disolución, negro, deslizamiento, barrido y desenfoque.
-- Texto configurable y subtítulos sobre el vídeo.
-- Exportación MP4 H.264 o HEVC desde 720p hasta 4K, con audio AAC, progreso y cancelación.
-- Extracción del audio original a M4A y guardado del fotograma actual como PNG, ambos verificados antes de reemplazar un archivo.
+## Control Cineleaf with AI
-### Subtítulos automáticos y privacidad
+Cineleaf includes an optional **MCP server**. MCP is a standard connection that lets a compatible AI understand and control the editor directly instead of trying to find buttons on the screen.
-En Windows, Cineleaf puede transcribir el audio usando el reconocimiento instalado en el propio sistema. No envía el audio a la nube. También importa y exporta SRT y WebVTT. La disponibilidad y los idiomas dependen de los paquetes de voz instalados en Windows; siempre se puede corregir el texto antes de exportar.
+You can ask an AI to do things such as: “Create 12 vertical videos from these clips, add this title, and export them.” The AI can:
-### Ideas innovadoras ya incorporadas
+- Read a project with clear IDs for clips, tracks, and media.
+- Prepare between 1 and 32 videos in a batch while keeping results in order.
+- Move, trim, split, duplicate, transform, mute, or delete clips using exact times.
+- Add black pauses, remove intervals, detach audio, and change the name, shape, frame rate, or resolution.
+- Add text, subtitles, and markers; extract audio or a frame; and export H.264 or HEVC from 720p to 4K.
+- Show a dry-run plan first and make changes only after that plan is accepted.
-- Un proyecto puede abrirse tanto en Windows como en Mac.
-- La detección de ritmo crea puntos útiles para cortar al compás.
-- La detección de silencio propone cambios para revisar antes de borrar nada.
-- La elección automática de codificador prueba la GPU en vez de asumir que funcionará.
-- Guardado atómico, autoguardado y recuperación reducen el riesgo de perder trabajo.
-- La exportación comprueba espacio libre, limpia archivos incompletos y vuelve a inspeccionar el vídeo final.
+AI automation remains local. It can access only the folders you allow, and every project is validated by the native Windows or Mac engine before it is saved. Retry keys let interrupted batch work continue without creating duplicate projects.
-## Atajos principales
+The optional AI connection requires Node.js 20 or newer. See the plain-language [AI automation guide](Documentation/AI_AUTOMATION.md) for setup, examples, and safety limits.
-| Acción | Windows | Mac |
+## Main keyboard shortcuts
+
+| Action | Windows | Mac |
| --- | --- | --- |
-| Guardar | Ctrl+S | ⌘S |
-| Deshacer / rehacer | Ctrl+Z / Ctrl+Y | ⌘Z / ⇧⌘Z |
-| Dividir en el cursor | Ctrl+B | ⌘B |
-| Borrar | Supr | Supr |
-| Duplicar | Ctrl+D | ⌘D |
-| Marcador | M | M |
-| Insertar pausa negra | Ctrl+Alt+G | ⌥⌘G |
-| Separar audio | Ctrl+Alt+A | ⌥⌘A |
-| Reproducir / pausar | Espacio | Espacio |
+| Save | Ctrl+S | Command+S |
+| Undo / redo | Ctrl+Z / Ctrl+Y | Command+Z / Shift+Command+Z |
+| Split at the playhead | Ctrl+B | Command+B |
+| Delete | Delete | Delete |
+| Duplicate | Ctrl+D | Command+D |
+| Add marker | M | M |
+| Insert black pause | Ctrl+Alt+G | Option+Command+G |
+| Detach audio | Ctrl+Alt+A | Option+Command+A |
+| Play / pause | Space | Space |
+
+## Current quality and honest limitations
-## Estado de calidad
+The Windows code currently passes 39 unit tests, 28 MCP contract tests, and 3 integration tests with real FFmpeg processing. Packaging checks cover the Release build, silent installation, launch, uninstall, audio/frame extraction, and SHA-256 files. The Mac code has 44 engine tests, 17 app/integration tests, and 2 UI workflows; GitHub Actions builds and checks the universal Apple Silicon/Intel package.
-Windows pasa 39 pruebas unitarias, 28 pruebas del contrato MCP y 3 pruebas de integración con FFmpeg real, incluida la extracción de audio y fotogramas que se vuelven a inspeccionar. También se verifica cancelación, idiomas, construcción Release sin avisos, instalación silenciosa, arranque y desinstalación. El código Mac contiene 44 pruebas del motor, 17 de aplicación y 2 flujos de interfaz; GitHub Actions compila, ejecuta los casos de medios reales y crea los paquetes universales.
+No honest project can promise that software has zero bugs. This beta has no known release-blocking failures after the automated checks, but the Windows pixel-by-pixel visual review and a complete manual Mac test on physical hardware are still pending. See [STATUS.md](STATUS.md) for the exact current state and [ROADMAP.md](ROADMAP.md) for planned work.
-No es honesto prometer que ningún programa tiene cero bugs. En esta beta no quedan fallos bloqueantes conocidos después de esas comprobaciones. La revisión visual por píxeles de Windows quedó pendiente porque la sesión de escritorio usada para construirlo estaba bloqueada; el proceso sí arrancó y permaneció estable. En Mac sigue pendiente una prueba manual completa en hardware físico. Consulta [STATUS.md](STATUS.md).
+## Privacy
-## Para desarrolladores
+Cineleaf has no account, telemetry, analytics, ads, or cloud storage. Editing and AI automation are local. Read the complete [privacy statement](PRIVACY.md).
-Windows usa .NET 8, WPF y FFmpeg; Mac usa Swift, SwiftUI/AppKit y AVFoundation. No hay dependencia web ni telemetría.
+## Build it yourself
+
+Most people should use the downloads at the top of this page. Developers can build from source.
+
+Windows targets .NET 8 and uses WPF and FFmpeg. The downloadable installer is self-contained:
```powershell
git clone https://github.com/luucabg/cineleaf.git
@@ -143,16 +155,28 @@ cd cineleaf
powershell -ExecutionPolicy Bypass -File .\scripts\build_windows_release.ps1
```
-En Mac:
+Mac requires macOS 14 or newer, Xcode 16.4 (Swift 6.1.2), and XcodeGen 2.42 or newer:
```bash
+git clone https://github.com/luucabg/cineleaf.git
+cd cineleaf
brew install xcodegen
xcodegen generate
+swift test --package-path Packages/CineleafCore
+xcodebuild -project Cineleaf.xcodeproj -scheme Cineleaf -destination 'platform=macOS' test CODE_SIGNING_ALLOWED=NO
./scripts/build_release.sh
```
-La arquitectura, formato de proyecto y pipeline están documentados en [Documentation](Documentation). Las contribuciones son bienvenidas; consulta [CONTRIBUTING.md](CONTRIBUTING.md).
+The Mac release script creates an ad-hoc signed universal `.app`, `.zip`, `.dmg`, and SHA-256 checksums in `dist/`. It does not claim Apple notarization.
+
+Architecture, project format, and rendering details are in [Documentation](Documentation).
+
+## Contributing and translations
+
+Contributions are welcome. Start with [CONTRIBUTING.md](CONTRIBUTING.md), and use the issue templates for bugs, feature ideas, or performance problems.
+
+English is the base language and Spanish is included. Mac translations live in `Cineleaf/Resources/Localizable.xcstrings`; Windows translations live in `Windows/src/Cineleaf.Windows.App/Resources/Strings.en.xaml` and `Strings.es.xaml`. Add the same key to every language, keep technical format names unchanged, run the localization tests, and check that longer text still fits.
-## Licencia
+## License
-Cineleaf se publica con licencia [MIT](LICENSE). FFmpeg y las demás piezas redistribuidas conservan sus propias licencias, enumeradas en [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
+Cineleaf is available under the [MIT License](LICENSE). FFmpeg and every redistributed component keep their own licenses, listed in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
diff --git a/STATUS.md b/STATUS.md
index 7acede7..2efa0e8 100644
--- a/STATUS.md
+++ b/STATUS.md
@@ -1,6 +1,6 @@
# Project status
-## Windows — `0.3.0-beta.1` candidate
+## Windows — `0.3.0-beta.2`
The native Windows editor and downloadable self-contained installer are prepared for Windows 10/11 x64. The package includes .NET and FFmpeg, installs without administrator privileges, and does not require a separate runtime.
@@ -19,7 +19,7 @@ GitHub Actions run [30248743334](https://github.com/luucabg/cineleaf/actions/run
The Windows workstation became locked during final visual inspection. Accessibility inspection confirmed the complete Spanish editor and a prior launch crash was diagnosed and fixed, but a final pixel-by-pixel screenshot review is still pending. The installer is unsigned, so SmartScreen can warn. No blocking defects are currently known after the automated and smoke checks.
-## Mac — `0.3.0-beta.1` source candidate
+## Mac — `0.3.0-beta.2`
GitHub Actions run [30248743464](https://github.com/luucabg/cineleaf/actions/runs/30248743464) passed with Xcode 16.4 and Apple Swift 6.1.2:
@@ -27,7 +27,7 @@ GitHub Actions run [30248743464](https://github.com/luucabg/cineleaf/actions/run
- Real synthetic media covered import, derivatives, analysis, effects, composition, cancellation, verified M4A/PNG extraction and verified MP4 export.
- Packaging produced a universal `arm64`/`x86_64` app, ZIP, DMG and checksums.
-The utility pass includes project settings, black pauses, safe duplication, detached audio, verified M4A extraction and verified PNG frame capture. The updated AVFoundation source, CLI and universal packages all passed the macOS gate.
+The utility pass includes project settings, black pauses, safe duplication, detached audio, verified M4A extraction and verified PNG frame capture. The updated AVFoundation source, CLI and universal packages all passed the macOS gate. The public beta provides an ad-hoc-signed universal DMG and ZIP with SHA-256 checksums; it is not Apple-notarized.
Mac still needs a complete hands-on review on physical hardware before a signed public Mac download: playback feel, microphone permissions, Gatekeeper flow, long-session memory/energy profiling and final screenshots.
diff --git a/Windows/installer/Cineleaf.iss b/Windows/installer/Cineleaf.iss
index 9598545..cb6a588 100644
--- a/Windows/installer/Cineleaf.iss
+++ b/Windows/installer/Cineleaf.iss
@@ -4,12 +4,21 @@
#ifndef OutputDir
#error OutputDir must be supplied by the build script.
#endif
+#ifndef ReleaseVersion
+ #define ReleaseVersion "0.3.0-beta.1"
+#endif
+#ifndef DisplayVersion
+ #define DisplayVersion "0.3.0 Beta 1"
+#endif
+#ifndef NumericVersion
+ #define NumericVersion "0.3.0.1"
+#endif
[Setup]
AppId={{13D98B93-0E26-42F1-A4CA-7DCE509BB689}
AppName=Cineleaf
-AppVersion=0.3.0.1
-AppVerName=Cineleaf 0.3.0 Beta 1
+AppVersion={#NumericVersion}
+AppVerName=Cineleaf {#DisplayVersion}
AppPublisher=Cineleaf contributors
AppPublisherURL=https://github.com/luucabg/cineleaf
AppSupportURL=https://github.com/luucabg/cineleaf/issues
@@ -20,7 +29,7 @@ PrivilegesRequiredOverridesAllowed=dialog
ArchitecturesAllowed=x64compatible
ArchitecturesInstallIn64BitMode=x64compatible
OutputDir={#OutputDir}
-OutputBaseFilename=Cineleaf-0.3.0-beta.1-Windows-x64-Setup
+OutputBaseFilename=Cineleaf-{#ReleaseVersion}-Windows-x64-Setup
SetupIconFile=..\src\Cineleaf.Windows.App\Assets\Cineleaf.ico
UninstallDisplayIcon={app}\Cineleaf.exe
Compression=lzma2/ultra64
diff --git a/scripts/build_release.sh b/scripts/build_release.sh
index c8984a6..def6e51 100755
--- a/scripts/build_release.sh
+++ b/scripts/build_release.sh
@@ -4,6 +4,13 @@ set -euo pipefail
REPOSITORY_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
DIST_DIR="$REPOSITORY_ROOT/dist"
DERIVED_DATA="$REPOSITORY_ROOT/build/ReleaseDerivedData"
+RELEASE_VERSION="${CINELEAF_RELEASE_VERSION:-0.3.0}"
+
+if [[ ! "$RELEASE_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+([.-][0-9A-Za-z.-]+)?$ ]]; then
+ echo "Invalid release version: $RELEASE_VERSION" >&2
+ exit 1
+fi
+MAC_BASENAME="Cineleaf-$RELEASE_VERSION-macOS"
if [[ "$(uname -s)" != "Darwin" ]]; then
echo "Release builds require macOS with Xcode." >&2
@@ -62,12 +69,15 @@ ditto "$REPOSITORY_ROOT/Automation/mcp/src" "$AUTOMATION_RESOURCES/mcp/src"
ditto "$REPOSITORY_ROOT/scripts/setup_cineleaf_mcp.sh" "$AUTOMATION_RESOURCES/setup_cineleaf_mcp.sh"
codesign --force --deep --sign - "$DIST_DIR/Cineleaf.app"
codesign --verify --deep --strict "$DIST_DIR/Cineleaf.app"
-ditto -c -k --sequesterRsrc --keepParent "$DIST_DIR/Cineleaf.app" "$DIST_DIR/Cineleaf-0.3.0-macOS.zip"
-"$REPOSITORY_ROOT/scripts/create_dmg.sh" "$DIST_DIR/Cineleaf.app" "$DIST_DIR/Cineleaf-0.3.0-macOS.dmg"
+ditto -c -k --sequesterRsrc --keepParent "$DIST_DIR/Cineleaf.app" "$DIST_DIR/$MAC_BASENAME.zip"
+"$REPOSITORY_ROOT/scripts/create_dmg.sh" \
+ "$DIST_DIR/Cineleaf.app" \
+ "$DIST_DIR/$MAC_BASENAME.dmg" \
+ "Cineleaf $RELEASE_VERSION"
(
cd "$DIST_DIR"
- shasum -a 256 Cineleaf-0.3.0-macOS.zip Cineleaf-0.3.0-macOS.dmg > SHA256SUMS.txt
+ shasum -a 256 "$MAC_BASENAME.zip" "$MAC_BASENAME.dmg" > "$MAC_BASENAME-SHA256SUMS.txt"
)
echo "Created ad-hoc signed, non-notarized artifacts in $DIST_DIR"
diff --git a/scripts/build_windows_release.ps1 b/scripts/build_windows_release.ps1
index b26b086..608fa8e 100644
--- a/scripts/build_windows_release.ps1
+++ b/scripts/build_windows_release.ps1
@@ -1,6 +1,8 @@
[CmdletBinding()]
param(
[string]$Configuration = "Release",
+ [ValidatePattern('^[0-9]+\.[0-9]+\.[0-9]+([.-][0-9A-Za-z.-]+)?$')]
+ [string]$ReleaseVersion = "0.3.0-beta.1",
[switch]$SkipTests
)
@@ -41,7 +43,7 @@ Copy-Item -LiteralPath (Join-Path $toolsDirectory "FFmpeg-LICENSE.txt") -Destina
Copy-Item -LiteralPath (Join-Path $repositoryRoot "LICENSE") -Destination (Join-Path $publishDirectory "LICENSE.txt") -Force
Copy-Item -LiteralPath (Join-Path $repositoryRoot "THIRD_PARTY_NOTICES.md") -Destination $publishDirectory -Force
-$portable = Join-Path $distributionDirectory "Cineleaf-0.3.0-beta.1-Windows-x64-Portable.zip"
+$portable = Join-Path $distributionDirectory "Cineleaf-$ReleaseVersion-Windows-x64-Portable.zip"
if (Test-Path -LiteralPath $portable) { Remove-Item -LiteralPath $portable -Force }
Compress-Archive -Path (Join-Path $publishDirectory "*") -DestinationPath $portable -CompressionLevel Optimal
@@ -52,12 +54,16 @@ $isccCandidates = @(
)
$iscc = $isccCandidates | Where-Object { Test-Path -LiteralPath $_ } | Select-Object -First 1
if ($null -eq $iscc) { throw "Inno Setup 6 is required to create the installer. Install it, then rerun this script." }
-& $iscc "/DSourceDir=$publishDirectory" "/DOutputDir=$distributionDirectory" (Join-Path $repositoryRoot "Windows\installer\Cineleaf.iss")
+$baseVersion = ($ReleaseVersion -split '-', 2)[0]
+$buildNumber = if ($ReleaseVersion -match '-(?:beta|rc)\.(\d+)$') { $Matches[1] } else { "0" }
+$numericVersion = "$baseVersion.$buildNumber"
+$displayVersion = $ReleaseVersion -replace '-beta\.', ' Beta ' -replace '-rc\.', ' RC ' -replace '-', ' '
+& $iscc "/DSourceDir=$publishDirectory" "/DOutputDir=$distributionDirectory" "/DReleaseVersion=$ReleaseVersion" "/DDisplayVersion=$displayVersion" "/DNumericVersion=$numericVersion" (Join-Path $repositoryRoot "Windows\installer\Cineleaf.iss")
if ($LASTEXITCODE -ne 0) { throw "Inno Setup failed." }
-$checksumName = "Cineleaf-0.3.0-beta.1-Windows-SHA256SUMS.txt"
+$checksumName = "Cineleaf-$ReleaseVersion-Windows-SHA256SUMS.txt"
$checksumPath = Join-Path $distributionDirectory $checksumName
-$artifacts = Get-ChildItem -LiteralPath $distributionDirectory -File | Where-Object { $_.Name -like "Cineleaf-0.3.0-beta.1-Windows-*" -and $_.Name -ne $checksumName }
+$artifacts = Get-ChildItem -LiteralPath $distributionDirectory -File | Where-Object { $_.Name -like "Cineleaf-$ReleaseVersion-Windows-*" -and $_.Name -ne $checksumName }
$lines = $artifacts | Sort-Object Name | ForEach-Object { "{0} {1}" -f (Get-FileHash -LiteralPath $_.FullName -Algorithm SHA256).Hash.ToLowerInvariant(), $_.Name }
[IO.File]::WriteAllLines($checksumPath, $lines, [Text.UTF8Encoding]::new($false))
-Get-ChildItem -LiteralPath $distributionDirectory -File | Where-Object { $_.Name -like "Cineleaf-0.3.0-beta.1-Windows-*" } | Select-Object FullName,Length
+Get-ChildItem -LiteralPath $distributionDirectory -File | Where-Object { $_.Name -like "Cineleaf-$ReleaseVersion-Windows-*" } | Select-Object FullName,Length
diff --git a/scripts/create_dmg.sh b/scripts/create_dmg.sh
index c9726d8..ee3c252 100755
--- a/scripts/create_dmg.sh
+++ b/scripts/create_dmg.sh
@@ -5,10 +5,11 @@ if [[ "$(uname -s)" != "Darwin" ]]; then
echo "DMG creation requires macOS." >&2
exit 1
fi
-[[ $# -eq 2 ]] || { echo "Usage: $0 /path/to/Cineleaf.app /path/to/Cineleaf.dmg" >&2; exit 1; }
+[[ $# -ge 2 && $# -le 3 ]] || { echo "Usage: $0 /path/to/Cineleaf.app /path/to/Cineleaf.dmg [volume-name]" >&2; exit 1; }
APP_PATH="$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
OUTPUT_PATH="$(cd "$(dirname "$2")" && pwd)/$(basename "$2")"
+VOLUME_NAME="${3:-Cineleaf}"
[[ -d "$APP_PATH" ]] || { echo "Application not found: $APP_PATH" >&2; exit 1; }
STAGING="$(mktemp -d "${TMPDIR:-/tmp}/cineleaf-dmg.XXXXXX")"
@@ -20,7 +21,7 @@ ln -s /Applications "$STAGING/Applications"
printf '%s\n' 'Drag Cineleaf.app to the Applications folder. This build is ad-hoc signed and not Apple-notarized.' > "$STAGING/Drag Cineleaf to Applications.txt"
rm -f "$OUTPUT_PATH"
hdiutil create \
- -volname "Cineleaf 0.1.0" \
+ -volname "$VOLUME_NAME" \
-srcfolder "$STAGING" \
-format UDZO \
-ov \