diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..611349e --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,79 @@ +name: Release + +on: + push: + tags: + - "v*" + workflow_dispatch: + inputs: + version: + description: "Version to release (e.g. 0.1.0)" + required: true + default: "0.1.0" + +permissions: + contents: write + +jobs: + release: + name: Create GitHub Release + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Resolve tag name + id: tag + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "TAG=v${{ github.event.inputs.version }}" >> "$GITHUB_OUTPUT" + echo "VERSION=${{ github.event.inputs.version }}" >> "$GITHUB_OUTPUT" + else + TAG="${GITHUB_REF_NAME}" + echo "TAG=${TAG}" >> "$GITHUB_OUTPUT" + echo "VERSION=${TAG#v}" >> "$GITHUB_OUTPUT" + fi + + - name: Create and push tag (workflow_dispatch only) + if: github.event_name == 'workflow_dispatch' + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + TAG="${{ steps.tag.outputs.TAG }}" + if git rev-parse "$TAG" >/dev/null 2>&1; then + echo "Tag $TAG already exists, skipping creation." + else + git tag "$TAG" + git push origin "$TAG" + fi + + - name: Extract changelog for this version + id: changelog + run: | + VERSION="${{ steps.tag.outputs.VERSION }}" + # Extract the section for this version from CHANGELOG.md + NOTES=$(awk "/^## \[$VERSION\]/{found=1; next} found && /^## \[/{exit} found{print}" CHANGELOG.md) + # Use a delimiter to safely pass multiline output + { + echo "NOTES<> "$GITHUB_OUTPUT" + + - name: Create GitHub Release + uses: actions/github-script@v7 + with: + script: | + const tag = '${{ steps.tag.outputs.TAG }}'; + const notes = `${{ steps.changelog.outputs.NOTES }}`.trim(); + await github.rest.repos.createRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + tag_name: tag, + name: `Release ${tag}`, + body: notes || `Release ${tag}`, + draft: false, + prerelease: false, + }); diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..60c36b0 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,24 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.1.0] - 2026-03-03 + +### Added +- Initial release of `if-curator` — Immich to Frigate training set curator +- **Face recognition prep**: InsightFace (ArcFace/Buffalo_L) embeddings on face crops for Frigate face recognition training +- **Object/state classification prep**: SigLIP (Vision Transformer) embeddings with YOLOv9c object detection +- **Smart diversity selection**: K-Medoids clustering + Farthest Point Sampling (FPS) with hard-example weighting +- **Adaptive auto-threshold**: Automatically stops selection when adding more images becomes redundant (capped at 80) +- **Quality filtering**: Automatic rejection of blurry, grayscale/IR, over/underexposed, low-confidence, and too-small images +- **Face alignment**: Align faces to ArcFace 112×112 format via InsightFace landmarks +- **Full-resolution downloads**: Downloads originals for final crops (falls back to JPEG preview for HEIC/RAW) +- **Concurrent downloads**: 8 parallel thumbnail workers for performance +- **Embedding cache**: Optional disk-based cache for faster re-runs +- **Multi-person batch mode**: Process multiple people in one session +- **Interactive CLI**: Rich terminal UI with preview summary table before downloading +- **GPU support**: Optional CUDA/ROCm/MPS acceleration via `onnxruntime-gpu` extra +- **Environment variable configuration**: Full control via `.env` or shell environment