* fix: accept shared YouTube links and recover valid timeline segments
* docs: record project review and reproducible recovery gaps
* fix: isolate timeline retries and recover rejected Studio imports
* docs: audit Studio analytics and Sentry coverage for 1.4
* fix: cover Studio telemetry and caught workflow failures
* fix: finish Windows Proactor cleanup after peer resets
Fixes PYTHON-FASTAPI-3
* docs: record Windows reset fix validation
* fix: clean Windows backend descendants and repair import thumbnails
* fix: offer explicit compatible source previews in Studio
* fix: keep compatible preview recovery available and document validation
- scripts/lib/desktop_build_common.sh: platform-neutral steps extracted from
build_macos_arm.sh (PBS download with mirrors, pip install, backend copy via
shutil instead of rsync, import completeness check, zip extraction via
zipfile instead of unzip, frontend build). file_size() now uses wc -c: GNU
stat -f %z 'succeeds' with filesystem info, which broke the size guard on
Linux / Git Bash
- scripts/build_macos_arm.sh: same steps in the same order, now calling the lib
- scripts/build_windows_x64.sh: PBS x86_64-pc-windows-msvc runtime, BtbN static
ffmpeg/ffprobe (gyan.dev fallback), portable-runtime import smoke test,
cargo tauri build --bundles nsis
- src-tauri/tauri.windows.conf.json: declares resources/{python,backend,ffmpeg}
and the nsis target (Tauri merges it only when building on Windows; macOS
keeps post-build injection)
- backend_manager.rs: python.exe / Scripts\python.exe / ffmpeg.exe lookups,
PYTHONUTF8=1 (backend prints emoji to a piped stdout), AUTOCLIP_APP_DIR set
to <platform data dir>/AutoClip (identical to the old macOS default),
CREATE_NO_WINDOW so python.exe does not pop a console
- desktop-build.yml: windows-latest job in Git Bash, LF-forced checkout,
per-platform artifacts, single release job that attaches whatever built
Not executed on Windows here (no Windows runner in this environment); shared lib
verified end-to-end on Linux with the x86_64-unknown-linux-gnu PBS build, Rust
side passes cargo check.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Kris K <zhouxiaoka@users.noreply.github.com>
* fix(docker): make the documented docker-compose path actually run
- .dockerignore: allow docker-entrypoint.sh / docker-dev-entrypoint.sh, which
Dockerfile COPYs; excluding them made every 'docker build' fail (#1#4#9#47#50#88)
- add .gitattributes forcing LF on shell scripts so Windows clones can start
the container (#73#88)
- base image python:3.9-slim -> python:3.11-slim; current yt-dlp no longer
supports 3.9 and only yields 360p via the android fallback (#88)
- celery worker in docker-compose / dev compose / start_autoclip.sh now
consumes the queues task_routes actually targets
(-Q celery,processing,video,notification,upload); without it tasks piled up
in 'processing' and were never executed (#88)
- the four compose services share one image tag so it is built once
- docs: Python 3.10+ requirement, Linux bind-mount permission note
Co-authored-by: Kris K <zhouxiaoka@users.noreply.github.com>
* fix(backend): remove machine-specific paths and the Redis probe that failed every Docker project
- task_submission_utils: the queue-depth log after a successful send_task used
redis.Redis(host='localhost') inside the try block, so under docker-compose
(Redis at redis:6379) every project was marked failed right after being
queued. Probe now uses REDIS_URL and only warns on failure (#88)
- youtube.py: yt-dlp was invoked via a hardcoded /Users/zhoukk venv path with
a hardcoded cwd, so /parse returned 500 on every other machine. Use
sys.executable -m yt_dlp with the data directory as cwd (#88)
- youtube.py: requesting five subtitle languages at once triggers HTTP 429 and
aborts the download; default to zh-Hans,zh,en, overridable with
AUTOCLIP_YT_SUBTITLE_LANGS (#88)
- llm_providers._build_full_input: JSON-serialise list/tuple input instead of
str() so the scoring step no longer breaks on list payloads (#53)
- fix_project_thumbnails.py / SettingsPage.tsx: drop remaining hardcoded
developer paths (the settings page was writing them into users'
settings.json)
- delete backend/api/v1/youtube_improved.py (unreferenced)
- add regression tests for the submission path and input serialisation
Co-authored-by: Kris K <zhouxiaoka@users.noreply.github.com>
* ci: add docker-compose smoke job
Builds the image, starts redis + api + worker, and asserts: API health,
yt-dlp importable on the image's Python, Redis reachable through REDIS_URL
from the app container, and the worker consuming every routed queue
(celery, processing, video, notification, upload). Guards the failure modes
from #88 that nothing in CI previously exercised.
Co-authored-by: Kris K <zhouxiaoka@users.noreply.github.com>
* chore: bump desktop version to 1.2.1 and stop hardcoding app_version in the backend
Cargo.toml was still 1.1.0 while tauri.conf.json said 1.2.0. Align both (and
Cargo.lock) at 1.2.1. The Rust launcher now passes CARGO_PKG_VERSION to the
backend as AUTOCLIP_APP_VERSION so /settings reports the real version instead
of a fixed "1.0.0".
Co-authored-by: Kris K <zhouxiaoka@users.noreply.github.com>
* docs: 1.2.1 changelog; refresh HANDOFF with current status, PR/issue triage and plan
CHANGELOG 1.2.0 had absorbed old unreleased web-side items wholesale; keep
them but label them as historical. Fix the compare/release links that still
pointed at your-username.
Co-authored-by: Kris K <zhouxiaoka@users.noreply.github.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Kris K <zhouxiaoka@users.noreply.github.com>
Bump desktop app version 1.1.0 -> 1.2.0 and cut CHANGELOG [未发布] into
[1.2.0]. First release carrying PostHog analytics.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Bump version 1.0.0 → 1.1.0 (tauri.conf.json, Cargo.toml, Cargo.lock); the
build script now derives the DMG name from tauri.conf.json so it won't drift.
- RELEASE_NOTES.md + CHANGELOG.md: document v1.1.0 (zero-dependency desktop
install, end-to-end clip pipeline, black-screen / stuck-list / retry-spam /
stuck-pipeline fixes, opt-in faster-whisper, Gemini→google-genai, CI unify +
repo cleanup).
- Drop two stale doc links to files removed in the cleanup
(QUICK_START_GUIDE, SYSTEM_REBUILD_GUIDE).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The desktop build started the backend fine on the build machine but would
fail on any clean Mac: video processing needs ffmpeg/ffprobe and neither was
usable for distribution.
Three compounding bugs, all fixed:
1. backend_manager.rs never set AUTOCLIP_FFMPEG_PATH, so the backend fell
back to `shutil.which("ffmpeg")` — i.e. the build machine's homebrew
ffmpeg. Now the launcher exports AUTOCLIP_FFMPEG_PATH / AUTOCLIP_FFPROBE_PATH
pointing at the bundled binaries (resources/ffmpeg/{ffmpeg,ffprobe}).
2. The build bundled only ffmpeg, not ffprobe (the backend needs both).
3. The bundled ffmpeg was homebrew's dynamic build (412KB, 57 /opt/homebrew
dylib deps) — dead on any machine without homebrew. The build now downloads
the STATIC arm64 ffmpeg+ffprobe (48MB each, zero non-system deps) from
osxexperts.net, cached under build/ffmpeg-cache, with a build-time assert
that fails if any homebrew dep reappears.
Also exclude stray *.rdb from the bundled backend source.
Verified end-to-end: full build → App+DMG; app launches with /opt/homebrew
stripped from PATH (clean-machine sim), backend starts, HTTP server responds;
bundled ffmpeg/ffprobe run under an empty environment.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>