Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
3e124ec
feat(ui): add local production asset foundation
Mahcks Aug 1, 2026
039bb09
feat: extracted jobs JS and cleaned up HTMX
Mahcks Aug 1, 2026
a6ed1fb
feat(ui): redesign jobs workspace
Mahcks Aug 1, 2026
1137b62
fix: bound graceful shutdown
Mahcks Aug 1, 2026
5828ee1
feat: implement activity timeline and job run management with filteri…
Mahcks Aug 1, 2026
7acb5b4
feat: add reusable rules and title exceptions
Mahcks Aug 2, 2026
3b97386
feat: redesign settings experience
Mahcks Aug 2, 2026
570d2c8
refactor: improve job preview UI and error handling
Mahcks Aug 2, 2026
f9f143c
feat(filters): enhance filtering options with required matches and al…
Mahcks Aug 2, 2026
05451a0
feat: enhance readiness indicators and job creation prompts
Mahcks Aug 2, 2026
edbb7ae
feat: enhance legacy job migration process and UI
Mahcks Aug 2, 2026
663f048
chore: remove dead code and stale v2 surfaces
Mahcks Aug 3, 2026
7132b77
feat: Add Rules API documentation and upgrade guide for v2
Mahcks Aug 4, 2026
c4bd625
feat: enhance job import/export functionality and improve configurati…
Mahcks Aug 4, 2026
59b9fb7
feat: add support for list jobs with configurable parameters
Mahcks Aug 4, 2026
4312ec3
feat: add TMDB and Trakt list integration with inspection functionality
Mahcks Aug 4, 2026
3a0db7f
feat: add MDBList and Letterboxd integrations for list management
Mahcks Aug 4, 2026
1d8e76d
feat: add content certification filters and handling
Mahcks Aug 4, 2026
25553e3
feat: add repeat handling for job delivery
Mahcks Aug 4, 2026
dcaf21f
refactor: enhance job template handling and improve UI text
Mahcks Aug 4, 2026
aaf7f31
feat: implement ranked selection feature with preview and cycle manag…
Mahcks Aug 4, 2026
ff2cb3a
feat(activity): enhance activity empty state handling and UI updates
Mahcks Aug 4, 2026
9a4e802
feat: enhance clear logs functionality with confirmation for all hist…
Mahcks Aug 4, 2026
1ece3af
feat: add recommendations feature to job creation
Mahcks Aug 4, 2026
69164f6
feat: add optional owner authentication with BLOCKBUSTERR_AUTH_TOKEN
Mahcks Aug 4, 2026
ee51be4
feat: optimize selection cycle signature generation for improved read…
Mahcks Aug 4, 2026
1b5f590
Add documentation for Rules concept, including evaluation order, rule…
Mahcks Aug 4, 2026
156fc79
feat: update deployment workflow and documentation for v2 support
Mahcks Aug 4, 2026
e5a07b6
feat: update Node.js version to 24.12.0 in deployment workflow
Mahcks Aug 4, 2026
946ff0d
fix(docs): keep v2 links within versioned docs
Mahcks Aug 4, 2026
b7697da
feat(docs): add version switcher
Mahcks Aug 4, 2026
02c1cbf
fix(docs): clarify optional integrations
Mahcks Aug 4, 2026
d79aa6e
fix(release): standardize beta distribution
Mahcks Aug 4, 2026
bd0f955
fix(activity): clarify delivery outcomes
Mahcks Aug 4, 2026
c541e64
fix(docs): clarify media server references and delivery boundaries
Mahcks Aug 4, 2026
451aa5b
docs: prepare v2.0.0 beta release
Mahcks Aug 4, 2026
c973522
fix(release): restore GHCR publish credentials
Mahcks Aug 4, 2026
de22566
feat(activity): enhance job filtering and scheduling functionality
Mahcks Aug 4, 2026
52e160d
chore: improve v2 beta issue reporting
Mahcks Aug 4, 2026
c931f7e
chore: prioritize stable issue reports
Mahcks Aug 4, 2026
c8efa61
docs: advertise v2 public beta
Mahcks Aug 4, 2026
0946cd9
merge: sync main into v2 release and refresh docs hero
Mahcks Aug 4, 2026
5a9baac
test: add migration tests for legacy genre filters and settings prese…
Mahcks Aug 4, 2026
328134a
Merge branch 'main' into release/v2.0.0
Mahcks Aug 5, 2026
f1cf327
docs: polish v2 documentation homepage
Mahcks Aug 5, 2026
9039bfd
feat: update index.html for improved accessibility and styling; add c…
Mahcks Aug 5, 2026
6ea3d5a
refactor: remove unused code and assets for cleaner project structure
Mahcks Aug 5, 2026
2cb122a
Implement code changes to enhance functionality and improve performance
Mahcks Aug 5, 2026
b9d2142
Refactor configuration handling and validation endpoints
Mahcks Aug 5, 2026
139e5a2
feat: enhance selection cycle tracking with additional database field…
Mahcks Aug 5, 2026
2f8a779
feat: implement execution coordinator for managing job executions and…
Mahcks Aug 5, 2026
76dad51
feat: enhance configuration management with backup and restore functi…
Mahcks Aug 5, 2026
c8da2a8
feat: enhance activity logging and delivery memory management
Mahcks Aug 5, 2026
c7eb2a0
refactor: job execution and scoring logic to use stable keys for medi…
Mahcks Aug 5, 2026
2a135a5
docs: update integrations section for clarity and accuracy
Mahcks Aug 5, 2026
1f97ad6
feat: add explicit dry-run mode
Mahcks Aug 5, 2026
d54ce8d
fix: restore clean security and lint gates
Mahcks Aug 5, 2026
8cb3ede
ci: use supported Node runtime
Mahcks Aug 5, 2026
e9bc00a
feat: enhance job preview functionality and update UI elements
Mahcks Aug 5, 2026
1cb873f
feat: implement latest release version fetching and update UI elements
Mahcks Aug 5, 2026
412058a
feat: improve section activation logic for better scroll handling
Mahcks Aug 5, 2026
b445091
feat: add error handling for database write permissions and correspon…
Mahcks Aug 5, 2026
cfa8488
feat: add Docker entrypoint script for ownership repair and update CI…
Mahcks Aug 6, 2026
791ddcf
refactor: activity charts to separate delivery and decision outcomes
Mahcks Aug 6, 2026
456e674
feat(activity): enhance filtering and selection features
Mahcks Aug 6, 2026
be9765c
feat: automated the v1 to v2 upgrade path with safe rollbacks
Mahcks Aug 7, 2026
2b0b51b
ci: build upgrade candidate with release config
Mahcks Aug 7, 2026
5e01c29
feat(docs): update README and installation guide for v2.0.0-beta.5; a…
Mahcks Aug 8, 2026
fa1fa34
fix: update nanoid security patch
Mahcks Aug 8, 2026
3b4b27a
fix: update Fiber security patches
Mahcks Aug 8, 2026
8e197d3
feat: integrate Playwright for browser testing and enhance dialog han…
Mahcks Aug 8, 2026
c21037a
fix: correct database connection mode and adjust file permissions in …
Mahcks Aug 8, 2026
fb47c8a
chore(release): harden v2 beta publishing
Mahcks Aug 8, 2026
b964c84
test(release): complete v2 candidate gate
Mahcks Aug 8, 2026
fe85405
chore(release): prepare v2.0.0 stable and reconcile main
Mahcks Sep 6, 2026
776b604
Fix v2 release audit findings across jobs and configuration
Mahcks Sep 6, 2026
f29289e
Prepare v2.0.0-rc.1 opt-in release
Mahcks Sep 6, 2026
3615a2a
fix: harden v2 configuration, discovery, and delivery
Mahcks Sep 12, 2026
e6115a5
Prepare v2.0.0 stable release and qualify failure recovery
Mahcks Sep 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,15 @@ data/*.db
# Documentation
*.md
LICENSE
docs/

# Local development and agent files
.codex/
.claude/
plans/
reference-docs/
node_modules/
*.log

# Go test files
*.test
Expand Down
19 changes: 10 additions & 9 deletions .github/RELEASE_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,26 @@
-

## Upgrading
1. **Backup current config first!**
1. **Stop Blockbusterr and back up its complete data directory.** The configuration and SQLite database must come from the same stopped snapshot.
```sh
cp data/config.yaml data/config.yaml.backup
docker stop blockbusterr
cp -a data "data.backup-$(date +%Y%m%d-%H%M%S)"
```

2. **Pull and restart**
2. **Update `image:` in your Compose file to `ghcr.io/mahcks/blockbusterr:vX.Y.Z`, then pull and restart.**
```sh
docker pull ghcr.io/mahcks/blockbusterr:vX.Y.Z
docker-compose down && docker-compose up -d
docker compose pull blockbusterr
docker compose up -d blockbusterr
```

*Or for docker run users*
```sh
docker stop blockbusterr
docker rm blockbusterr
docker run -d \\
--name blockbusterr \\
-p 9090:9090 \\
-v $(pwd)/data:/app/data \\
docker run -d \
--name blockbusterr \
-p 9090:9090 \
-v "$(pwd)/data:/app/data" \
ghcr.io/mahcks/blockbusterr:vX.Y.Z
```

Expand Down
6 changes: 6 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
48 changes: 48 additions & 0 deletions .github/releases/v2.0.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Blockbusterr v2.0.0

Blockbusterr discovers movies and shows, evaluates them against your rules, and sends selected titles to Radarr, Sonarr, Jellyseerr, or Seerr. Version 2 adds more control over what reaches your library and clearer explanations of each decision.

## What changed since v1

- **Reusable Rules:** share movie/show policies across jobs, create job-specific copies, and manage universal title exceptions separately.
- **Preview-first Jobs:** inspect candidates before delivery, start from disabled recipes, and choose discovery sources per job.
- **Lists and watchlists:** use supported TMDB, Trakt, and MDBList sources. Direct public Letterboxd scraping remains experimental and opt-in.
- **Delivery controls:** per-job and rolling global budgets, repeat handling, instance-wide dry-run, and ranked selection across participating jobs.
- **Activity Entries and Job Runs:** inspect title decisions, scores, reasons, and delivery outcomes.
- **Configuration portability:** export shareable automation separately from credentialed backups, and migrate supported v1 jobs and rules automatically.

Blockbusterr remains MIT-licensed and runs in one container with SQLite. One configured discovery provider is enough; Trakt is optional. It works with your existing media stack and does not download or play media itself.

## Install

```bash
docker run -d \
--name blockbusterr \
--restart unless-stopped \
-p 9090:9090 \
-v blockbusterr-data:/app/data \
ghcr.io/mahcks/blockbusterr:v2.0.0
```

Open `http://localhost:9090`, connect a discovery provider and delivery target, and preview your first job. Keep the service on a trusted network or behind an authenticated proxy/VPN. Optional owner authentication uses `BLOCKBUSTERR_AUTH_TOKEN` (at least 32 characters), with username `blockbusterr`.

## Upgrade from v1

**The stable `latest` image moves from v1 to v2 with this release.** Pin a version if you want to control when major upgrades happen.

1. Stop Blockbusterr, record its current image, and back up the complete configuration/database mount together to a separate location.
2. Update the image to `ghcr.io/mahcks/blockbusterr:v2.0.0`; keep the existing mounts and set `BLOCKBUSTERR_DRY_RUN=true` before the first start.
3. Leave the container user unset so the entrypoint can repair v1 ownership, then run as UID/GID `10001:10001`.
4. Review migrated Jobs, Rules, title exceptions, and integration settings. Preview enabled jobs before allowing delivery.
5. Remove dry-run only when ready. Duration schedules can run at startup; cron schedules wait for their next occurrence.

For rollback, stop v2 and restore the complete stopped v1 snapshot into an empty mount with the previous image. Do not reuse v2-written files with v1.

## Reliability notes

Release qualification covers configuration recovery, interrupted requests, concurrent budget reservations, provider failures, and preview/execution consistency. A delivery timeout can still mean the downstream service accepted the title: inspect that service before retrying. Uncertain requests retain their budget reservation to avoid spending the same slot twice; rolling reservations age out with the configured window. This is not an exactly-once delivery guarantee.

- [Quick start](https://blockbusterr.dev/getting-started/quickstart/)
- [Upgrade and rollback guide](https://blockbusterr.dev/getting-started/upgrading-to-v2/)
- [Full changelog](https://github.com/Mahcks/blockbusterr/blob/v2.0.0/CHANGELOG.md)
- [Report a bug](https://github.com/Mahcks/blockbusterr/issues)
103 changes: 98 additions & 5 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: CI

on:
push:
branches: [main]
branches: [main, release/v2.0.0]
pull_request:
branches: [main]
branches: [main, release/v2.0.0]

jobs:
lint:
Expand All @@ -16,7 +16,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.25.6"
go-version: "1.25.13"

- name: Run golangci-lint
uses: golangci/golangci-lint-action@v9
Expand All @@ -37,14 +37,58 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.25.6"
go-version: "1.25.13"

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "24.12.0"
cache: npm

- name: Verify frontend assets
run: npm ci && npm run check:assets

- name: Download dependencies
run: go mod download

- name: Build
run: go build -v ./...

- name: Verify v1 container ownership upgrade
run: |
docker build --build-arg VERSION=v2.0.0-ci -t blockbusterr:ci .
legacy_data="$(mktemp -d)"
chmod 0775 "$legacy_data"
original_group="$(stat -c %g "$legacy_data")"
sudo touch "$legacy_data/config.yaml" "$legacy_data/blockbusterr.db" "$legacy_data/unrelated.txt"
sudo chmod 0644 "$legacy_data/config.yaml" "$legacy_data/blockbusterr.db" "$legacy_data/unrelated.txt"

docker run --rm \
-e DATA_DIR=/data \
-v "$legacy_data:/data" \
blockbusterr:ci \
sh -c 'test "$(id -u)" = 10001 && test "$(id -g)" = 10001 && touch /data/runtime-write-test'

test "$(stat -c %u "$legacy_data")" = 10001
test "$(stat -c %g "$legacy_data")" = "$original_group"
test "$(stat -c %u "$legacy_data/config.yaml")" = 10001
test "$(stat -c %u "$legacy_data/blockbusterr.db")" = 10001
test "$(stat -c %u "$legacy_data/unrelated.txt")" = 0
test "$(stat -c %u "$legacy_data/runtime-write-test")" = 10001
if docker run --rm -e DATA_DIR=/ blockbusterr:ci true; then
echo "entrypoint accepted unsafe DATA_DIR=/" >&2
exit 1
fi

- name: Verify unattended v1 to v2 upgrade
run: scripts/test-v1-upgrade.sh blockbusterr:ci

- name: Smoke runtime image
run: scripts/test-container-smoke.sh blockbusterr:ci

- name: Verify release metadata rules
run: scripts/test-release-metadata.sh

test:
name: Test
runs-on: ubuntu-latest
Expand All @@ -54,7 +98,56 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.25.6"
go-version: "1.25.13"

- name: Run tests
run: go test -v -race ./...

security:
name: Dependency security
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.25.13"

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "24.12.0"
cache: npm
cache-dependency-path: |
package-lock.json
docs/package-lock.json

- name: Scan reachable Go vulnerabilities
run: go run golang.org/x/vuln/cmd/govulncheck@latest ./...

- name: Audit application assets
run: npm ci && npm audit

- name: Audit and build documentation
working-directory: docs
run: npm ci && npm audit && npm run test:archive && npm run build

browser:
name: Browser smoke tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-go@v5
with:
go-version: "1.25.13"

- uses: actions/setup-node@v4
with:
node-version: "24.12.0"
cache: npm

- run: npm ci
- run: npx playwright install --with-deps chromium
- run: npm run test:browser
19 changes: 12 additions & 7 deletions .github/workflows/deploy-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Deploy Docs to GitHub Pages

on:
push:
branches: [main, release/v2.0.0]
branches: [main]
paths:
- 'docs/**'
- '.github/workflows/deploy-docs.yml'
Expand All @@ -24,13 +24,12 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
with:
ref: main
ref: v1.5.2
path: v1

- name: Checkout v2
uses: actions/checkout@v4
with:
ref: release/v2.0.0
path: v2

- name: Setup Node
Expand All @@ -53,16 +52,22 @@ jobs:

- name: Build v1 and v2 with Astro
run: |
npm run build --prefix v1/docs
cp v2/docs/src/components/VersionedSiteTitle.astro v1/docs/src/components/VersionedSiteTitle.astro
npm run build --prefix v1/docs -- --base /v1/
node v2/docs/scripts/archive-v1.mjs v1/docs/dist
npm run build --prefix v2/docs
mkdir -p site/v1
cp -a v2/docs/dist/. site/
cp -a v1/docs/dist/. site/v1/
DOCS_BASE=/v2/ npm run build --prefix v2/docs
npm run check:v2-links --prefix v2/docs
mkdir -p v1/docs/dist/v2
cp -a v2/docs/dist/. v1/docs/dist/v2/
mkdir -p site/v2
cp -a v2/docs/dist/. site/v2/

- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: ./v1/docs/dist
path: ./site

deploy:
environment:
Expand Down
Loading
Loading