pureframe 0.1.0b1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. pureframe-0.1.0b1/.github/ISSUE_TEMPLATE/bug_report.yml +51 -0
  2. pureframe-0.1.0b1/.github/dependabot.yml +19 -0
  3. pureframe-0.1.0b1/.github/workflows/ci.yml +52 -0
  4. pureframe-0.1.0b1/.github/workflows/codeql.yml +35 -0
  5. pureframe-0.1.0b1/.github/workflows/publish.yml +57 -0
  6. pureframe-0.1.0b1/.github/workflows/release.yml +53 -0
  7. pureframe-0.1.0b1/.gitignore +50 -0
  8. pureframe-0.1.0b1/BENCHMARKS.md +76 -0
  9. pureframe-0.1.0b1/CHANGELOG.md +15 -0
  10. pureframe-0.1.0b1/LAUNCH.md +33 -0
  11. pureframe-0.1.0b1/LICENSE +21 -0
  12. pureframe-0.1.0b1/PKG-INFO +221 -0
  13. pureframe-0.1.0b1/README.md +178 -0
  14. pureframe-0.1.0b1/RELEASE_CHECKLIST.md +79 -0
  15. pureframe-0.1.0b1/ROADMAP.md +16 -0
  16. pureframe-0.1.0b1/SECURITY.md +5 -0
  17. pureframe-0.1.0b1/VERIFICATION_NOTES.md +51 -0
  18. pureframe-0.1.0b1/assets/demo.gif +0 -0
  19. pureframe-0.1.0b1/assets/logo.png +0 -0
  20. pureframe-0.1.0b1/assets/logo.svg +68 -0
  21. pureframe-0.1.0b1/docs/CONTRIBUTING.md +47 -0
  22. pureframe-0.1.0b1/docs/architecture.md +31 -0
  23. pureframe-0.1.0b1/docs/legal.md +24 -0
  24. pureframe-0.1.0b1/docs/plan-sharing.md +26 -0
  25. pureframe-0.1.0b1/docs/privacy.md +5 -0
  26. pureframe-0.1.0b1/examples/configs/cpu.toml +8 -0
  27. pureframe-0.1.0b1/examples/configs/strict.toml +8 -0
  28. pureframe-0.1.0b1/examples/sample.censorplan.json +29 -0
  29. pureframe-0.1.0b1/gui/.gitignore +24 -0
  30. pureframe-0.1.0b1/gui/README.md +7 -0
  31. pureframe-0.1.0b1/gui/components.json +25 -0
  32. pureframe-0.1.0b1/gui/index.html +14 -0
  33. pureframe-0.1.0b1/gui/package-lock.json +8224 -0
  34. pureframe-0.1.0b1/gui/package.json +38 -0
  35. pureframe-0.1.0b1/gui/postcss.config.js +6 -0
  36. pureframe-0.1.0b1/gui/public/tauri.svg +6 -0
  37. pureframe-0.1.0b1/gui/public/vite.svg +1 -0
  38. pureframe-0.1.0b1/gui/src/App.css +116 -0
  39. pureframe-0.1.0b1/gui/src/App.tsx +330 -0
  40. pureframe-0.1.0b1/gui/src/assets/react.svg +1 -0
  41. pureframe-0.1.0b1/gui/src/components/ui/button.tsx +67 -0
  42. pureframe-0.1.0b1/gui/src/index.css +89 -0
  43. pureframe-0.1.0b1/gui/src/lib/utils.ts +6 -0
  44. pureframe-0.1.0b1/gui/src/main.tsx +10 -0
  45. pureframe-0.1.0b1/gui/src/vite-env.d.ts +1 -0
  46. pureframe-0.1.0b1/gui/src-tauri/.gitignore +7 -0
  47. pureframe-0.1.0b1/gui/src-tauri/Cargo.lock +5059 -0
  48. pureframe-0.1.0b1/gui/src-tauri/Cargo.toml +27 -0
  49. pureframe-0.1.0b1/gui/src-tauri/build.rs +3 -0
  50. pureframe-0.1.0b1/gui/src-tauri/capabilities/default.json +10 -0
  51. pureframe-0.1.0b1/gui/src-tauri/icons/128x128.png +0 -0
  52. pureframe-0.1.0b1/gui/src-tauri/icons/128x128@2x.png +0 -0
  53. pureframe-0.1.0b1/gui/src-tauri/icons/32x32.png +0 -0
  54. pureframe-0.1.0b1/gui/src-tauri/icons/Square107x107Logo.png +0 -0
  55. pureframe-0.1.0b1/gui/src-tauri/icons/Square142x142Logo.png +0 -0
  56. pureframe-0.1.0b1/gui/src-tauri/icons/Square150x150Logo.png +0 -0
  57. pureframe-0.1.0b1/gui/src-tauri/icons/Square284x284Logo.png +0 -0
  58. pureframe-0.1.0b1/gui/src-tauri/icons/Square30x30Logo.png +0 -0
  59. pureframe-0.1.0b1/gui/src-tauri/icons/Square310x310Logo.png +0 -0
  60. pureframe-0.1.0b1/gui/src-tauri/icons/Square44x44Logo.png +0 -0
  61. pureframe-0.1.0b1/gui/src-tauri/icons/Square71x71Logo.png +0 -0
  62. pureframe-0.1.0b1/gui/src-tauri/icons/Square89x89Logo.png +0 -0
  63. pureframe-0.1.0b1/gui/src-tauri/icons/StoreLogo.png +0 -0
  64. pureframe-0.1.0b1/gui/src-tauri/icons/icon.icns +0 -0
  65. pureframe-0.1.0b1/gui/src-tauri/icons/icon.ico +0 -0
  66. pureframe-0.1.0b1/gui/src-tauri/icons/icon.png +0 -0
  67. pureframe-0.1.0b1/gui/src-tauri/src/lib.rs +113 -0
  68. pureframe-0.1.0b1/gui/src-tauri/src/main.rs +6 -0
  69. pureframe-0.1.0b1/gui/src-tauri/tauri.conf.json +35 -0
  70. pureframe-0.1.0b1/gui/tailwind.config.js +12 -0
  71. pureframe-0.1.0b1/gui/tsconfig.json +29 -0
  72. pureframe-0.1.0b1/gui/tsconfig.node.json +10 -0
  73. pureframe-0.1.0b1/gui/vite.config.ts +38 -0
  74. pureframe-0.1.0b1/pureframe/__init__.py +1 -0
  75. pureframe-0.1.0b1/pureframe/batch.py +127 -0
  76. pureframe-0.1.0b1/pureframe/checkpoint.py +145 -0
  77. pureframe-0.1.0b1/pureframe/cli.py +628 -0
  78. pureframe-0.1.0b1/pureframe/config.py +52 -0
  79. pureframe-0.1.0b1/pureframe/data/deploy.prototxt +1790 -0
  80. pureframe-0.1.0b1/pureframe/data/res10_300x300_ssd_iter_140000.caffemodel +0 -0
  81. pureframe-0.1.0b1/pureframe/hardware.py +96 -0
  82. pureframe-0.1.0b1/pureframe/pipeline/__init__.py +1 -0
  83. pureframe-0.1.0b1/pureframe/pipeline/densify.py +60 -0
  84. pureframe-0.1.0b1/pureframe/pipeline/detect/__init__.py +1 -0
  85. pureframe-0.1.0b1/pureframe/pipeline/detect/audio.py +122 -0
  86. pureframe-0.1.0b1/pureframe/pipeline/detect/face.py +44 -0
  87. pureframe-0.1.0b1/pureframe/pipeline/detect/nudity.py +91 -0
  88. pureframe-0.1.0b1/pureframe/pipeline/detect/scene.py +44 -0
  89. pureframe-0.1.0b1/pureframe/pipeline/detect/scene_clip.py +136 -0
  90. pureframe-0.1.0b1/pureframe/pipeline/fuse.py +107 -0
  91. pureframe-0.1.0b1/pureframe/pipeline/probe.py +7 -0
  92. pureframe-0.1.0b1/pureframe/pipeline/render/__init__.py +1 -0
  93. pureframe-0.1.0b1/pureframe/pipeline/render/apply.py +70 -0
  94. pureframe-0.1.0b1/pureframe/pipeline/render/plan.py +62 -0
  95. pureframe-0.1.0b1/pureframe/pipeline/sample.py +64 -0
  96. pureframe-0.1.0b1/pureframe/pipeline/shots.py +111 -0
  97. pureframe-0.1.0b1/pureframe/pipeline/smooth.py +91 -0
  98. pureframe-0.1.0b1/pureframe/tracking/__init__.py +1 -0
  99. pureframe-0.1.0b1/pureframe/tracking/iou_tracker.py +77 -0
  100. pureframe-0.1.0b1/pureframe/utils/__init__.py +1 -0
  101. pureframe-0.1.0b1/pureframe/utils/ffmpeg.py +287 -0
  102. pureframe-0.1.0b1/pureframe/utils/logging.py +13 -0
  103. pureframe-0.1.0b1/pyproject.toml +60 -0
  104. pureframe-0.1.0b1/pytest.ini +3 -0
  105. pureframe-0.1.0b1/scripts/bench.py +67 -0
  106. pureframe-0.1.0b1/scripts/make_demo.py +142 -0
  107. pureframe-0.1.0b1/scripts/make_demo_gif.sh +68 -0
  108. pureframe-0.1.0b1/scripts/make_smoke_test_clip.sh +24 -0
  109. pureframe-0.1.0b1/scripts/run_benchmarks.sh +20 -0
  110. pureframe-0.1.0b1/tests/__init__.py +1 -0
  111. pureframe-0.1.0b1/tests/conftest.py +97 -0
  112. pureframe-0.1.0b1/tests/fixtures/synthetic_explicit.mp4 +0 -0
  113. pureframe-0.1.0b1/tests/test_audio_classifier.py +35 -0
  114. pureframe-0.1.0b1/tests/test_batch.py +164 -0
  115. pureframe-0.1.0b1/tests/test_clip_classifier.py +29 -0
  116. pureframe-0.1.0b1/tests/test_e2e.py +172 -0
  117. pureframe-0.1.0b1/tests/test_fuse.py +106 -0
  118. pureframe-0.1.0b1/tests/test_iou_tracker.py +37 -0
  119. pureframe-0.1.0b1/tests/test_kiss_mouth_region.py +32 -0
  120. pureframe-0.1.0b1/tests/test_plan_apply.py +110 -0
  121. pureframe-0.1.0b1/tests/test_plan_serialize.py +167 -0
  122. pureframe-0.1.0b1/tests/test_probe.py +12 -0
  123. pureframe-0.1.0b1/tests/test_shots.py +33 -0
  124. pureframe-0.1.0b1/tests/test_smoothing.py +35 -0
@@ -0,0 +1,51 @@
1
+ name: Bug Report
2
+ description: Create a report to help us improve
3
+ title: "[BUG] "
4
+ labels: ["bug"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for taking the time to fill out this bug report!
10
+ - type: textarea
11
+ id: what-happened
12
+ attributes:
13
+ label: What happened?
14
+ description: Also tell us what you expected to happen.
15
+ validations:
16
+ required: true
17
+ - type: textarea
18
+ id: command
19
+ attributes:
20
+ label: Command executed
21
+ description: What exact CLI command did you run?
22
+ render: bash
23
+ validations:
24
+ required: true
25
+ - type: textarea
26
+ id: traceback
27
+ attributes:
28
+ label: Error Traceback / Logs
29
+ description: Paste any error messages, logs, or tracebacks here.
30
+ render: log
31
+ - type: input
32
+ id: os
33
+ attributes:
34
+ label: Operating System
35
+ description: e.g. Windows 11, Ubuntu 22.04, macOS Sonoma
36
+ validations:
37
+ required: true
38
+ - type: input
39
+ id: python-version
40
+ attributes:
41
+ label: Python Version
42
+ description: Run `python --version`
43
+ validations:
44
+ required: true
45
+ - type: input
46
+ id: gpu
47
+ attributes:
48
+ label: GPU / Hardware
49
+ description: e.g. RTX 3060, M2 Max, CPU only
50
+ validations:
51
+ required: true
@@ -0,0 +1,19 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "pip"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ - package-ecosystem: "npm"
8
+ directory: "/gui"
9
+ schedule:
10
+ interval: "weekly"
11
+ - package-ecosystem: "cargo"
12
+ directory: "/gui/src-tauri"
13
+ schedule:
14
+ interval: "weekly"
15
+ - package-ecosystem: "github-actions"
16
+ directory: "/"
17
+ schedule:
18
+ interval: "monthly"
19
+
@@ -0,0 +1,52 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [master, main]
6
+ pull_request:
7
+ branches: [master, main]
8
+
9
+ jobs:
10
+ test:
11
+ name: test (ubuntu, py${{ matrix.python-version }})
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ python-version: ["3.11", "3.12", "3.13"]
17
+
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - name: Set up Python ${{ matrix.python-version }}
22
+ uses: actions/setup-python@v5
23
+ with:
24
+ python-version: ${{ matrix.python-version }}
25
+ cache: "pip"
26
+
27
+ - name: Install ffmpeg
28
+ run: sudo apt-get update && sudo apt-get install -y ffmpeg
29
+
30
+ - name: Install CPU-only PyTorch first
31
+ run: |
32
+ python -m pip install --upgrade pip
33
+ pip install torch --index-url https://download.pytorch.org/whl/cpu
34
+
35
+ - name: Install package
36
+ run: pip install -e ".[dev]"
37
+
38
+ - name: Ruff lint
39
+ run: ruff check pureframe tests
40
+
41
+ - name: Ruff format
42
+ run: ruff format --check pureframe tests
43
+
44
+ - name: Build package
45
+ run: python -m build
46
+
47
+ - name: Check package
48
+ run: python -m twine check dist/*
49
+
50
+ - name: Run fast tests
51
+ run: pytest -q -m "not slow" --maxfail=3
52
+ timeout-minutes: 10
@@ -0,0 +1,35 @@
1
+ name: "CodeQL"
2
+
3
+ on:
4
+ push:
5
+ branches: [ "master" ]
6
+ pull_request:
7
+ branches: [ "master" ]
8
+ schedule:
9
+ - cron: '0 0 * * 1'
10
+
11
+ jobs:
12
+ analyze:
13
+ name: Analyze
14
+ runs-on: ubuntu-latest
15
+ permissions:
16
+ actions: read
17
+ contents: read
18
+ security-events: write
19
+
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ language: [ 'python', 'javascript', 'typescript', 'rust' ]
24
+
25
+ steps:
26
+ - name: Checkout repository
27
+ uses: actions/checkout@v4
28
+
29
+ - name: Initialize CodeQL
30
+ uses: github/codeql-action/init@v3
31
+ with:
32
+ languages: ${{ matrix.language }}
33
+
34
+ - name: Perform CodeQL Analysis
35
+ uses: github/codeql-action/analyze@v3
@@ -0,0 +1,57 @@
1
+ # .github/workflows/publish.yml
2
+ name: Publish Python Package
3
+
4
+ on:
5
+ push:
6
+ tags:
7
+ - "v*"
8
+
9
+ jobs:
10
+ build:
11
+ name: Build distribution
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ with:
17
+ persist-credentials: false
18
+
19
+ - name: Set up Python
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: "3.13"
23
+
24
+ - name: Install build tools
25
+ run: python -m pip install --upgrade build twine
26
+
27
+ - name: Build package
28
+ run: python -m build
29
+
30
+ - name: Check package
31
+ run: python -m twine check dist/*
32
+
33
+ - name: Upload dist artifact
34
+ uses: actions/upload-artifact@v4
35
+ with:
36
+ name: python-package-distributions
37
+ path: dist/
38
+
39
+ publish:
40
+ name: Publish to PyPI
41
+ needs: build
42
+ runs-on: ubuntu-latest
43
+ environment:
44
+ name: pypi
45
+ url: https://pypi.org/project/pureframe/
46
+ permissions:
47
+ id-token: write
48
+
49
+ steps:
50
+ - name: Download dist artifact
51
+ uses: actions/download-artifact@v4
52
+ with:
53
+ name: python-package-distributions
54
+ path: dist/
55
+
56
+ - name: Publish package
57
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,53 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ jobs:
9
+ tauri-build:
10
+ strategy:
11
+ fail-fast: false
12
+ matrix:
13
+ include:
14
+ - os: ubuntu-latest
15
+ target: x86_64-unknown-linux-gnu
16
+ - os: macos-latest
17
+ target: aarch64-apple-darwin
18
+ - os: macos-latest
19
+ target: x86_64-apple-darwin
20
+ - os: windows-latest
21
+ target: x86_64-pc-windows-msvc
22
+ runs-on: ${{ matrix.os }}
23
+
24
+ steps:
25
+ - uses: actions/checkout@v4
26
+ - name: Setup Node.js
27
+ uses: actions/setup-node@v4
28
+ with:
29
+ node-version: 20
30
+ - name: Setup Rust
31
+ uses: dtolnay/rust-toolchain@stable
32
+ with:
33
+ targets: ${{ matrix.target }}
34
+ - name: Install dependencies (Ubuntu)
35
+ if: matrix.os == 'ubuntu-latest'
36
+ run: |
37
+ sudo apt-get update
38
+ sudo apt-get install -y libwebkit2gtk-4.1-dev build-essential curl wget file libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev
39
+ - name: Install Frontend Dependencies
40
+ working-directory: gui
41
+ run: npm install
42
+ - name: Build Tauri App
43
+ uses: tauri-apps/tauri-action@v0
44
+ env:
45
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
46
+ with:
47
+ projectPath: gui
48
+ tagName: ${{ github.ref_name }}
49
+ releaseName: 'PureFrame ${{ github.ref_name }}'
50
+ releaseBody: 'Release ${{ github.ref_name }}'
51
+ releaseDraft: true
52
+ prerelease: false
53
+ args: ${{ matrix.os == 'macos-latest' && format('--target {0}', matrix.target) || '' }}
@@ -0,0 +1,50 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.egg-info/
6
+ dist/
7
+ build/
8
+ *.egg
9
+ .eggs/
10
+
11
+ # Virtual environments
12
+ .venv/
13
+ venv/
14
+ env/
15
+
16
+ # Testing
17
+ .pytest_cache/
18
+ .coverage
19
+ htmlcov/
20
+ .mypy_cache/
21
+
22
+ # IDE
23
+ .vscode/
24
+ .idea/
25
+ *.swp
26
+ *.swo
27
+
28
+ # OS
29
+ .DS_Store
30
+ Thumbs.db
31
+
32
+ # Logs
33
+ *.log
34
+
35
+ # Debug scripts (dev-only)
36
+ debug_test*.py
37
+ update_cli.py
38
+
39
+ # Lock files (generated)
40
+ uv.lock
41
+
42
+ # Tauri build artifacts
43
+ gui/src-tauri/target/
44
+ gui/node_modules/
45
+ gui/dist/
46
+
47
+ # Demo intermediates (keep demo.gif and logo.svg)
48
+ assets/demo_input.mp4
49
+ assets/demo_output.mp4
50
+ assets/demo_plan.json
@@ -0,0 +1,76 @@
1
+ # Performance Benchmarks
2
+
3
+ > Measurements below are **real, on the machine indicated**. Other tiers are estimated from community contributions. To add your hardware, run `scripts/run_benchmarks.sh` and open a PR.
4
+
5
+ > **Note on these numbers:** The benchmark clip is a 30s synthetic 1080p video (solid colours, test patterns) with **zero detections**. Real movie content with actual detections will take longer — blurring adds per-frame overhead, and complex scenes trigger more model inference. Use these numbers as a floor, not a ceiling.
6
+
7
+ ## Measured: Author's Machine
8
+
9
+ | | |
10
+ |---|---|
11
+ | **OS** | Linux (Pop!_OS 24.04, kernel 6.18.7) |
12
+ | **CPU** | Intel Core i5-10400F @ 2.90GHz (6 cores) |
13
+ | **GPU** | NVIDIA GeForce RTX 3060 (12 GB VRAM) |
14
+ | **Python** | 3.13.12 |
15
+ | **PyTorch** | 2.11.0+cu130 |
16
+ | **CUDA** | 13.0 |
17
+
18
+ | Profile | 30s 1080p clip | Extrapolated 90-min movie | Detection FPS |
19
+ |---|---|---|---|
20
+ | HIGH (12 GB VRAM) | **25.96s** | ~78 min | ~28 fps |
21
+ | MEDIUM (6–11 GB VRAM) | **41.23s** | ~124 min | ~18 fps |
22
+ | LOW (3–5 GB VRAM) | **27.83s** | ~83 min | ~26 fps |
23
+ | CPU (no GPU) | **21.37s** | ~64 min* | ~34 fps* |
24
+
25
+ *CPU appears faster on synthetic content because CUDA initialization overhead is amortised differently and no inference is triggered on zero-detection clips. Expect CPU to be **3–10× slower** on real movie content.*
26
+
27
+ ## Estimated: Other Hardware
28
+
29
+ Community contributions welcome. Run `scripts/run_benchmarks.sh` and open a PR to add your hardware below.
30
+
31
+ | Hardware | Profile | Estimated 90-min movie |
32
+ |---|---|---|
33
+ | RTX 4090 (24 GB) | HIGH | ~30 min (estimated, not measured) |
34
+ | RTX 4070 (12 GB) | HIGH | ~50 min (estimated, not measured) |
35
+ | GTX 1650 (4 GB) | LOW | ~120 min (estimated, not measured) |
36
+ | Apple M2 Pro | MEDIUM | ~90 min (estimated, not measured) |
37
+ | Apple M4 Max | HIGH | ~35 min (estimated, not measured) |
38
+
39
+ ## Profile Knobs
40
+
41
+ ### HIGH (12+ GB VRAM)
42
+ - Detection resolution: 1080px
43
+ - Batch size: 32 frames
44
+ - FP16 inference: enabled
45
+ - Models kept in VRAM between stages
46
+ - Samples 5 keyframes per shot + densifies every frame
47
+
48
+ ### MEDIUM (6–11 GB VRAM)
49
+ - Detection resolution: 720px
50
+ - Batch size: 16 frames
51
+ - FP16 inference: enabled
52
+ - Models kept in VRAM between stages
53
+ - Samples 3 keyframes per shot, densifies every 2nd frame
54
+
55
+ ### LOW (3–5 GB VRAM)
56
+ - Detection resolution: 540px
57
+ - Batch size: 4 frames
58
+ - FP16 inference: enabled
59
+ - Models unloaded between stages (reduces VRAM pressure)
60
+ - Samples 3 keyframes per shot, densifies every 3rd frame
61
+
62
+ ### CPU (no GPU)
63
+ - Detection resolution: 480px
64
+ - Batch size: 1 frame
65
+ - FP16 disabled (CPU doesn't benefit)
66
+ - Models unloaded between stages
67
+ - Samples 2 keyframes per shot, densifies every 5th frame
68
+
69
+ ## How to Contribute Benchmarks
70
+
71
+ 1. Clone the repo and install: `pip install -e .`
72
+ 2. Generate the benchmark clip:
73
+ ```bash
74
+ bash scripts/run_benchmarks.sh
75
+ ```
76
+ 3. Open a PR adding your row to the "Estimated" table above. Mark it "measured" and include your hardware spec.
@@ -0,0 +1,15 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.1.0b1] - 2026-05-07
9
+
10
+ ### Added
11
+ - Initial beta release.
12
+ - CLI plan/apply/process workflow.
13
+ - Local explicit-content detection.
14
+ - JSON censor plan review workflow.
15
+ - FFmpeg-based blur rendering.
@@ -0,0 +1,33 @@
1
+ # Launch Sequence: PureFrame
2
+
3
+ Follow this battle-tested sequence to maximize visibility and adoption for PureFrame.
4
+
5
+ ### 1. Soft Launch on r/selfhosted
6
+ - **Timing:** Tuesday morning (EST).
7
+ - **Format:** A short text post explaining the *why* (privacy, local AI, Family Movie Act) and a clear link to the GitHub repository.
8
+ - **Visuals:** Use the side-by-side GIF as the primary hook.
9
+
10
+ ### 2. r/Parenting
11
+ - **Timing:** Wednesday evening.
12
+ - **Format:** A relatable, non-technical post. Focus entirely on the benefit: "I built a tool that lets me watch my favorite movies with my kids without skipping scenes."
13
+ - **Tone:** Helpful, empathetic, community-focused.
14
+
15
+ ### 3. r/PleX
16
+ - **Timing:** Thursday.
17
+ - **Format:** Technical showcase. Mention the CLI and batch processing.
18
+ - **Hook:** "I'm working on a Plex plugin for this next, but the standalone CLI/GUI is ready now."
19
+
20
+ ### 4. Hacker News (Show HN)
21
+ - **Title:** `Show HN: PureFrame — Censor explicit visuals in any video locally, without cutting a frame`
22
+ - **First Comment:** Write a detailed comment explaining the technical challenges (YOLOv8, Audio Zero-shot classification, temporal smoothing algorithm) to engage the HN crowd.
23
+
24
+ ### 5. Product Hunt
25
+ - **Timing:** 12:01 AM PST on a Tuesday or Wednesday.
26
+ - **Assets:** The demo GIF, a nice banner image (using the logo), and clear UI screenshots of the Tauri app's Plan Editor.
27
+
28
+ ### 6. X/Twitter
29
+ - **Format:** A short thread.
30
+ - **Tags:** Tag prominent `#selfhosted`, `#AI`, and open-source tech accounts. Use the demo GIF on the first tweet.
31
+
32
+ ### 7. Blogger Outreach
33
+ - Reach out to family-friendly streaming bloggers and tech journalists. Offer them a pre-compiled Windows `.exe` or Mac `.dmg` so they don't have to compile from source.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 PureFrame
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.