Repository navigation
Conversation
A portable community app bundle resolves runtime/mcp.mjs (with its material-color identity sidecar) and runtime/remote.mjs in release mode. `--community --with-mcp-and-remote` now builds those self-authored entrypoints next to service.mjs. Plain `--community` still builds only the service, and the owner's release-input manifest stays limited to non-community builds. Signed-off-by: Hao0321 <126182090+Hao0321@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YQbUWKu73ka7dZ58vWVzgY
Add a macOS arm64 pipeline for the community-desktop app that does not depend on owner-only inputs or ffmpeg-static: - scripts/stage-macos-community-runtime.mjs stages .platform-runtime/: FFmpeg 8.1.2 built from the SHA-256-pinned release tarball with --disable-autodetect against Homebrew x264/x265/zimg/libass/dav1d, its dylib closure copied and rewritten to @loader_path, Node.js and whisper.cpp with the owner's pins, hao-core and the GPU compositor, and the static caption faces export needs (repo generator plus a pinned fontTools wheel). Every Mach-O except Node.js is ad-hoc re-signed; hashes, FFmpeg provenance, license texts and a GPL notice are recorded. It fails on host or build-path references, non-arm64 slices and missing encoders, decoders, filters or formats. - src-tauri/tauri.macos.community.conf.json maps the staged runtime, the service/MCP/Remote bundles, the Agent launcher files and the generated font pack into the bundle, keeping signingIdentity "-". - scripts/macos-community-app-gate.ts checks a delivered Editkin.app: hashed runtime closure, arm64 Mach-O files, codesign, the libraries dyld loads, FFmpeg encodes and filters through Editkin's argument builders, and import, preview proxy, save/reopen and export through the bundled resident service. - .github/workflows/macos-community-desktop.yml runs on macos-15 for the maintainer's manual runs on main and for same-repository pull requests that touch the pipeline, with read-only contents permission, no secrets and SHA-pinned actions reused from Source CI. It builds the app and DMG, verifies a clean copy from the DMG (including the owner's macOS runtime gate, the source journey with the bundled FFmpeg and an app launch), and uploads the DMG, a zipped app and SHA256SUMS. - scripts/lib/macos-community-runtime.mjs holds the pins and pure helpers; its unit test runs in the default suite on every platform. No src-tauri Rust code changes. The app is ad-hoc signed and not an official release. Signed-off-by: Hao0321 <126182090+Hao0321@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YQbUWKu73ka7dZ58vWVzgY
Explain how to run the macOS community desktop workflow, verify and open the unsigned app, what it bundles, how to build it locally, and its limits: Apple Silicon only, owner-only features fail closed, Agent setup is not expected to work, and redistribution must comply with the GPL because the bundled FFmpeg includes libx264 and libx265. Signed-off-by: Hao0321 <126182090+Hao0321@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YQbUWKu73ka7dZ58vWVzgY
The macOS job failed compiling spikes/gpu-compositor: it include_bytes! three generated ACES 2 output LUTs that are gitignored, and it refuses to start unless their bytes match the owner's pinned SHA-256. Running scripts/generate-aces-luts.py with the published PyOpenColorIO 2.5.2 wheel (Linux x86_64) produced different bytes for every LUT OCIO bakes, so CI cannot recreate them, and the check must not be loosened. Leave the compositor out of the community app instead: - COMMUNITY_OMITTED_RUNTIME_FILES records it; the community PLATFORM-MANIFEST is the owner's file set minus that entry and lists it under community.omittedRuntimeFiles. - The stager no longer requires, copies or signs it, and the workflow no longer builds it. The Tauri overlay removes its resource mapping. - The app gate fails if it is shipped. The owner's macos-bundle-runtime-gate.mjs requires it in its closed-world set, so the workflow no longer runs that gate. The default Rec.709 pipeline exports through FFmpeg and does not use the compositor. Scene-linear ACES 2 output and GPU preview are unavailable in this build; docs/BUILDING.md and the bundled notice say so. Also resolve the CodeQL findings on this pipeline: - Verified downloads are streamed to tar's stdin instead of being written to an archive file first. - fontTools is installed by pip in hash-checking mode from the pinned wheel URL. - escapeFilterOptionPath applies both FFmpeg escape levels in one pass (equivalence with captionAss.ts stays covered by the unit test, now with tabs, newlines, NBSP, U+3000 and CJK). - The unit test's JSON merge skips prototype keys, and a configure argument check no longer uses an unanchored regex alternation. Signed-off-by: Hao0321 <126182090+Hao0321@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YQbUWKu73ka7dZ58vWVzgY
The macOS job's FFmpeg link failed with undefined _iconv, _iconv_open and _iconv_close. With --disable-autodetect, FFmpeg's configure probes iconv only in libc and never adds -liconv, but on macOS iconv is in /usr/lib/libiconv.2.dylib. Since --enable-iconv was explicit, CONFIG_ICONV stayed enabled and only the final link noticed. Pass --extra-libs=-liconv. It reaches the program link through EXTRALIBS, and the dependency is an OS library that the runtime audit already allows. The unit test now requires the flag alongside --enable-iconv. Signed-off-by: Hao0321 <126182090+Hao0321@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YQbUWKu73ka7dZ58vWVzgY
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
This adds a GitHub Actions pipeline that builds an Editkin desktop app for Apple Silicon Macs from the community source. The app is ad-hoc signed and is for the maintainer's own use; it is not an official release.
Release builds of the Tauri shell only use files inside the app bundle, so the pipeline stages a complete runtime first:
Contents/Resourcesruntime/nodestage-platform-runtime.mjs)runtime/ffmpeg,ffprobe,lib/*.dylib, licenses,FFMPEG-PROVENANCE.jsonruntime/whisper-cliand its receiptsruntime/hao-corecargo build --release --lockedruntime/service.mjs,mcp.mjs, its identity file,remote.mjsnode scripts/build-desktop.mjs --community --with-mcp-and-remoteruntime/PLATFORM-MANIFEST.jsoncommunityblock (officialRelease: false,omittedRuntimeFiles)font-packs/editkin-open-fonts/scripts/build-static-font-pack.py, using fontTools 4.60.2 installed by pip in hash-checking modeagent-runtime-v3/*, demo media,color/aces2,pluginsNot bundled:
editkin-gpu-compositor.spikes/gpu-compositorembeds three generated ACES 2 output LUTs withinclude_bytes!and refuses to start unless their bytes match the owner's pinned SHA-256. The LUTs are gitignored. I regenerated them withscripts/generate-aces-luts.pyand the published PyOpenColorIO 2.5.2 wheel on Linux x86_64. Every LUT that OCIO bakes came out with different bytes, so CI cannot recreate them, and that check must not be loosened.So the community app ships without the compositor:
COMMUNITY_OMITTED_RUNTIME_FILESrecords it.The default Rec.709 pipeline exports through FFmpeg and does not use it. Scene-linear ACES 2 output and GPU preview are unavailable in this build. The owner's
macos-bundle-runtime-gate.mjsrequires the compositor in its closed-world set, so the workflow does not run it.FFmpeg build: library autodetection is off. GPL is enabled, plus libx264, libx265, zimg, libass, dav1d, VideoToolbox and AudioToolbox.
--extra-libs=-liconvlinks macOS's own libiconv. With--disable-autodetect, FFmpeg's configure only probes libc for iconv, which macOS does not provide.runtime/lib, rewritten to@loader_pathwith every LC_RPATH removed, and ad-hoc re-signed.Downloads: each one is checked against its pinned SHA-256 in memory and then streamed to
tar's stdin, so no unverified archive is written. fontTools is installed bypip --require-hashesfrom the pinned wheel URL.The stager fails if:
Packaging: the app is built with
npx tauri build --features community-desktop --bundles app,dmgand the overlaysrc-tauri/tauri.macos.community.conf.json. The minimum macOS is raised to the highest minimum any bundled binary declares. No Rust code changes.Checks in the same job, on the app extracted from the DMG:
codesign --verify --deep --strictscripts/macos-community-app-gate.ts: closed file set, hashes, encoders, burned-in captions, a demo frame, and the bundled service's import, preview proxy, save/reopen and exportnpm run test:journeywith the bundled FFmpegUploaded artifacts (14 days):
Editkin-community-macos-arm64.dmg, a zipped.app,SHA256SUMS, and the evidence files.Triggers:
workflow_dispatch, only onmainand only for actor id 126182090.pull_requestfrom this repository when the pipeline files change. That is how this PR builds the first artifact.Other files:
scripts/build-desktop.mjs: an opt-in--with-mcp-and-remotefor community builds. The existing paths are unchanged..gitignore: ignores/.platform-runtime*.docs/BUILDING.md: how to run the build and open an ad-hoc-signed app (Finder → right-click → Open, orxattr -dr com.apple.quarantine /Applications/Editkin.app), and its limits.User journey and platform
macOS 12+ on Apple Silicon. The maintainer downloads the DMG from the workflow run and opens the app.
Features that fail closed:
Validation
macOS CI (run 37462382388, head 7cad210,
macos-15arm64) built the app and DMG, then checked a clean copy taken out of the DMG:scripts/macos-community-app-gate.ts: GREEN, all 7 steps PASS with no warnings:npm run test:journeywith the bundled FFmpeg 8.1.2: GREEN. The export is H.264 High + AAC, 960×540, 12 s.EDITKIN_SMOKE=1exited 0, so the web UI loaded and calledsmoke_readyover IPC. A normal launch was still running after 30 s, with its resident service.SHA256SUMS:a812b9f17678bc24145d725607cb930ecf976b55c55282dbeb3fc8e84480af5d Editkin-community-macos-arm64.dmgab190d516e73cd9b54cff09717a04ce66256516f78ff61458f196ea8e7905756 Editkin-community-macos-arm64.app.zipOn Linux:
actionlintwith shellcheck: clean.scripts/lib/macos-community-runtime.test.mjs: 16/16.verifyBundleClosurepasses, and rejects a bundle with a compositor added.escapeFilterOptionPathmatches the old two-pass version on 200,000 random strings.pip --require-hashesrefuses a wrong hash.bsdtarextracts the pinned tarballs from stdin and rejects junk.npm test(2184 tests): pass.source:scanandsource:verify:self-test: GREEN..ascsignature verified against the FFmpeg release keyFCF9 86EA 15E6 E293 A564 4F10 B432 2F04 D676 58D8.Not covered:
Security and provenance
FFMPEG-PROVENANCE.json.contents: readonly, no secrets, and every action pinned to a full SHA.Found while building this, not fixed here:
scripts/stage-tauri-resources.mjsstages onlylauncher.mjsand the contract, but the launcher has imported./lib/regular-file.mjssince fix(security): read script inputs through a single handle and encode fixture URLs #75. This overlay ships that file.@tauri-apps/api2.11.1 does not match the tauri 2.12.0 crate, hence--ignore-version-mismatches.DCO
Every commit has a
Signed-off-by:trailer.🤖 Generated with Claude Code
https://claude.ai/code/session_01YQbUWKu73ka7dZ58vWVzgY
Generated by Claude Code