Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
165883d
feat: ship FrameCull Pro and Flash updates
Jul 9, 2026
ed796ba
docs: update beta download links
Jul 9, 2026
8b1a6dc
docs: polish GitHub README landing page
Jul 9, 2026
53e5e76
docs: update README introduction copy
Jul 9, 2026
63f80ad
chore: refresh beta copy and raw preview release build
Jul 9, 2026
f2b9a38
chore: refine settings cache controls
Jul 9, 2026
40ff6dd
feat: add macOS tester builds and precision updates
Jul 10, 2026
49f2852
ci: bootstrap macOS test workflow
Jul 10, 2026
5bdd8e6
fix: borrow macOS Lightroom launch path
Jul 10, 2026
d0edadb
fix: pass macOS target to Tauri CLI
Jul 10, 2026
4415e7b
fix: exclude Pro benchmark from Flash bundle
Jul 10, 2026
287664e
fix: keep Pro benchmark out of Tauri auto-bundling
Jul 10, 2026
e458e3e
ci: stage macOS packages in draft release
Jul 10, 2026
96d8f85
fix: target repository for draft release
Jul 10, 2026
f277393
feat: build macOS Pro test packages
Jul 10, 2026
13a725d
fix: support macOS Pro runtime packaging
Jul 10, 2026
e65661f
docs: design bundled RawTherapee macOS package
Jul 10, 2026
5e8676a
docs: plan bundled RawTherapee macOS package
Jul 10, 2026
eadc8a7
docs: include RawTherapee macOS installer guidance
Jul 10, 2026
3a928db
ci: bundle RawTherapee with macOS Pro packages
Jul 10, 2026
ab8da36
docs: design unified macOS Pro installer
Jul 10, 2026
b875f3d
docs: make macOS installer update-safe
Jul 10, 2026
68aec48
docs: plan unified macOS Pro installer
Jul 10, 2026
c3ae90a
fix: detect installed RawTherapee CLI on macOS
Jul 10, 2026
3823665
feat: add unified macOS Pro installer
Jul 10, 2026
365f823
ci: verify unified macOS Pro installer
Jul 11, 2026
3bbea7b
fix: clean up timed-out macOS CLI processes
Jul 11, 2026
8c4eb38
fix: handle APFS DMG mount devices
Jul 11, 2026
80d8e9c
ci: diagnose macOS DMG attach cancellation
Jul 11, 2026
9a3311b
fix: accept RawTherapee DMG license noninteractively
Jul 11, 2026
578285e
ci: inspect RawTherapee APFS attach plist
Jul 11, 2026
af8e56b
fix: parse licensed DMG plist output
Jul 11, 2026
4a48e2b
merge: sync main and resolve README conflict
Jul 12, 2026
8bccf3d
fix: avoid empty macOS signing secrets in CI
Jul 12, 2026
25252c2
ci: diagnose RawTherapee CLI startup
Jul 12, 2026
ebd606d
ci: fix RawTherapee CLI diagnostic probe
Jul 12, 2026
f4c55fb
fix: accept RawTherapee macOS CLI version exit
Jul 12, 2026
14ddddd
docs: update README with macOS Flash downloads
Jul 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 9 additions & 0 deletions .claude/settings.local.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"permissions": {
"allow": [
"Bash(pnpm run:*)",
"Bash(pnpm install:*)",
"Bash(npx tsc:*)"
]
}
}
3 changes: 3 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Gemini API Key (optional - for AI session analysis feature)
# Get your API key from: https://makersuite.google.com/app/apikey
VITE_GEMINI_API_KEY=
166 changes: 166 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
name: Build Beta Installers

permissions:
contents: write

on:
push:
tags:
- 'v*'
- 'beta-v*'
pull_request:
branches:
- main
- master
workflow_dispatch:

jobs:
build:
strategy:
fail-fast: false
matrix:
platform:
- os: windows-latest
rust_target: x86_64-pc-windows-msvc
artifact_label: Windows-x64
- os: macos-latest
rust_target: aarch64-apple-darwin
artifact_label: macOS-arm64
- os: macos-latest
rust_target: x86_64-apple-darwin
artifact_label: macOS-x64

runs-on: ${{ matrix.platform.os }}

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10

- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

- name: Setup pnpm cache
uses: actions/cache@v4
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-

- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.platform.rust_target }}

- name: Install frontend dependencies
run: pnpm install --frozen-lockfile

- name: Validate build workflow contract
run: node tools/check-build-workflow-contract.mjs

- name: Configure signing environment
shell: bash
env:
TAURI_SIGNING_PRIVATE_KEY_SECRET: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD_SECRET: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
APPLE_CERTIFICATE_SECRET: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD_SECRET: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY_SECRET: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_ID_SECRET: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD_SECRET: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID_SECRET: ${{ secrets.APPLE_TEAM_ID }}
run: |
set -euo pipefail

write_env_if_set() {
local name="$1"
local value="$2"
local delimiter

if [[ -z "${value}" ]]; then
return
fi

delimiter="FRAMECULL_${name}_${RANDOM}${RANDOM}"
{
printf '%s<<%s\n' "${name}" "${delimiter}"
printf '%s\n' "${value}"
printf '%s\n' "${delimiter}"
} >> "${GITHUB_ENV}"
}

write_env_if_set TAURI_SIGNING_PRIVATE_KEY "${TAURI_SIGNING_PRIVATE_KEY_SECRET}"
write_env_if_set TAURI_SIGNING_PRIVATE_KEY_PASSWORD "${TAURI_SIGNING_PRIVATE_KEY_PASSWORD_SECRET}"

if [[ "${RUNNER_OS}" == "macOS" ]]; then
write_env_if_set APPLE_CERTIFICATE "${APPLE_CERTIFICATE_SECRET}"
write_env_if_set APPLE_CERTIFICATE_PASSWORD "${APPLE_CERTIFICATE_PASSWORD_SECRET}"
if [[ "${RUNNER_OS}" == "macOS" && -z "${APPLE_CERTIFICATE_SECRET}" ]]; then
printf 'APPLE_SIGNING_IDENTITY=-\n' >> "${GITHUB_ENV}"
else
write_env_if_set APPLE_SIGNING_IDENTITY "${APPLE_SIGNING_IDENTITY_SECRET}"
fi
write_env_if_set APPLE_ID "${APPLE_ID_SECRET}"
write_env_if_set APPLE_PASSWORD "${APPLE_PASSWORD_SECRET}"
write_env_if_set APPLE_TEAM_ID "${APPLE_TEAM_ID_SECRET}"
fi

- name: Build and check release frontend
run: pnpm run build:release

- name: Build Tauri app
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tagName: ${{ github.ref_name }}
releaseName: 'FrameCull AI Beta __VERSION__'
releaseBody: |
FrameCull AI external beta installers.

## Installation
- **Windows**: Download and run the `.exe` installer first.
- **macOS**: Download the `.dmg`, drag FrameCull AI to Applications, then launch it.
releaseDraft: true
prerelease: true
tauriScript: pnpm run tauri
args: ${{ matrix.platform.rust_target && format('--target {0}', matrix.platform.rust_target) || '' }}

build-release:
if: startsWith(github.ref, 'refs/tags/v')
needs: build
runs-on: ubuntu-latest
steps:
- name: Publish Release
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { owner, repo } = context.repo;
const releases = await github.rest.repos.listReleases({
owner,
repo,
});

const draft = releases.data.find(r => r.draft && r.tag_name === context.ref.replace('refs/tags/', ''));
if (draft) {
await github.rest.repos.updateRelease({
owner,
repo,
release_id: draft.id,
draft: false,
});
console.log('Release published successfully');
}
Loading
Loading