Skip to content

feat(crossseed): add option to skip recheck-required matches - #825

Merged
s0up4200 merged 2 commits into
mainfrom
feat/crossseed-skip-recheck
Dec 21, 2025
Merged

feat(crossseed): add option to skip recheck-required matches#825
s0up4200 merged 2 commits into
mainfrom
feat/crossseed-skip-recheck

Conversation

@s0up4200

@s0up4200 s0up4200 commented Dec 19, 2025

Copy link
Copy Markdown
Collaborator

Summary

  • Add skipRecheck setting to skip cross-seed matches requiring disk verification
  • Applies to all cross-seed sources: RSS automation, completion search, seeded search, and webhooks
  • Helps users on shared hosting or constrained hardware avoid heavy disk I/O

Test plan

  • Enable "Skip recheck-required matches" in Cross-Seed settings
  • Trigger a cross-seed that requires rename alignment or has extra files
  • Verify it shows "Skipped - recheck required" status instead of adding the torrent
  • Verify cross-seeds that don't require recheck still work normally

Closes #820

Summary by CodeRabbit

  • New Features
    • Added a toggle in automation settings to skip cross-seed matches requiring manual rechecks (such as those needing rename alignment or extra file handling).
    • Added status display for cross-seed operations skipped due to recheck requirements.

✏️ Tip: You can customize this high-level summary in your review settings.

Add a new setting to skip cross-seed matches that would require disk
verification (rename alignment or extra files). This helps users on
shared hosting or constrained hardware avoid heavy disk I/O that can
tank drive performance for extended periods.

When enabled, cross-seeds requiring recheck are skipped entirely rather
than being added and triggering verification. The setting applies to all
cross-seed sources: RSS automation, completion search, seeded search,
and webhook requests.

Closes #820
@coderabbitai

coderabbitai Bot commented Dec 19, 2025

Copy link
Copy Markdown
Contributor

Walkthrough

This PR adds a new SkipRecheck boolean flag to CrossSeed automation settings, enabling users to skip torrent rechecks when cross-seed matches are found. The flag is threaded through the database schema, backend models, API handlers, service layer, and frontend UI, with conditional logic to apply the skip behavior in the service.

Changes

Cohort / File(s) Summary
Database Migration
internal/database/migrations/035_add_cross_seed_skip_recheck.sql
Adds non-null boolean column skip_recheck (default false) to cross_seed_settings table.
Backend Models & Data Layer
internal/models/crossseed.go
Adds SkipRecheck bool field to CrossSeedAutomationSettings struct; updates DefaultCrossSeedAutomationSettings() initialization; threads field through SQL in GetSettings() and UpsertSettings() for read/write operations.
API Handler
internal/api/handlers/crossseed.go
Adds SkipRecheck field to request/patch payloads (automationSettingsRequest, automationSettingsPatchRequest); updates isEmpty() logic; threads value through UpdateAutomationSettings and applyAutomationSettingsPatch.
Service Layer
internal/services/crossseed/...
Adds SkipRecheck bool option to SearchRunOptions; propagates flag through CrossSeedRequest model; introduces conditional to skip recheck when flag is true and operation requires alignment or has extra files; plumbs flag across Completion search, RSS/autobrr apply, manual apply, and search path entry points.
API Documentation
internal/web/swagger/openapi.yaml
Adds skipRecheck boolean field to CrossSeedAutomationSettings and CrossSeedAutomationSettingsPatch schemas in OpenAPI spec.
Frontend Types & Pages
web/src/types/index.ts, web/src/pages/CrossSeedPage.tsx
Adds skipRecheck: boolean field to TypeScript CrossSeedAutomationSettings and CrossSeedAutomationSettingsPatch interfaces; adds skipRecheck property to GlobalCrossSeedSettings interface with default value false; wires field through patch builders and settings initialization; adds UI toggle "Skip recheck-required matches" to Global Cross-Seed Settings panel.
Frontend Components
web/src/components/torrents/CrossSeedDialog.tsx
Adds handling for new instance status "skipped_recheck" in status display mapper, returning "Skipped - recheck required" with destructive variant styling.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

The changes follow a consistent, repetitive pattern across multiple layers (field addition + threading through data access paths). While touching 9 files across multiple domains (backend, database, service, frontend, types), each individual modification is straightforward. The service layer conditional logic is simple. Verify that:

  • The SkipRecheck field is correctly threaded through all request/patch payloads and database operations
  • The conditional logic in service.go correctly identifies when to skip recheck (alignment required or extra files present)
  • The UI toggle correctly binds to and updates the global settings payload

Possibly related PRs

Suggested labels

enhancement, database:migrations, cross-seed, web, api, backend

Poem

🐰 A hoppy flag floats down the stack,
Through database rows and UI black,
When recheck's skip rings loud and clear,
Poor hardware users raise a cheer!
No hour-long checks on drives so vast—
Just swift cross-seeding at last! ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately and concisely describes the main feature being added: a new option to skip recheck-required matches in cross-seed processing.
Linked Issues check ✅ Passed The PR successfully implements the feature request from issue #820 by adding a skipRecheck setting across all cross-seed sources (RSS, completion, seeded search, webhooks) with proper UI toggle and status display.
Out of Scope Changes check ✅ Passed All changes are directly scoped to implementing the skipRecheck feature: database schema, models, API handlers, service logic, UI components, and type definitions. No unrelated modifications detected.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/crossseed-skip-recheck

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@s0up4200 s0up4200 added this to the v1.12.0 milestone Dec 19, 2025

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
internal/services/crossseed/service.go (1)

1895-1904: Treat skipped_recheck as a skipped outcome in RSS automation, not a failure

The new logic in processCrossSeedCandidate:

  • Early-returns with Status = "skipped_recheck" when req.SkipRecheck && (requiresAlignment || hasExtraFiles), correctly avoiding both AddTorrent and any disk recheck.
  • Suppresses the AddTorrent “retry with recheck” fallback when req.SkipRecheck is true, which aligns with the feature’s intent to never trigger recheck-driven I/O.

However, in processAutomationCandidate the RSS automation aggregation still routes unknown statuses (including skipped_recheck) through the default branch:

switch instanceResult.Status {
case "exists":
    ...
case "no_match", "skipped":
    run.TorrentsSkipped++
default:
    itemHasFailure = true
    run.TorrentsFailed++
}

That will count explicitly skipped-for-recheck items as failures, which can flip runs to Failed/Partial even though everything worked as configured and the test plan expects a “Skipped - recheck required” style outcome.

Recommend classifying skipped_recheck alongside the other skipped statuses:

Proposed fix: classify skipped_recheck as skipped
-       switch instanceResult.Status {
-       case "exists":
-           itemHadExisting = true
-           run.TorrentsSkipped++
-       case "no_match", "skipped":
-           run.TorrentsSkipped++
-       default:
-           itemHasFailure = true
-           run.TorrentsFailed++
-       }
+       switch instanceResult.Status {
+       case "exists":
+           itemHadExisting = true
+           run.TorrentsSkipped++
+       case "no_match", "skipped", "skipped_recheck":
+           run.TorrentsSkipped++
+       default:
+           itemHasFailure = true
+           run.TorrentsFailed++
+       }

This keeps RSS automation run statistics and overall status aligned with the new SkipRecheck feature while preserving existing behavior for genuine errors.

Also applies to: 2562-2668, 2898-2909

🧹 Nitpick comments (1)
internal/services/crossseed/models.go (1)

45-46: SkipRecheck flag wiring looks good; consider refreshing status doc comment

The new SkipRecheck field and json:"skip_recheck,omitempty" tag fit the existing request shape and default safely to false for callers that don’t know about it yet.

Minor nit: the InstanceCrossSeedResult.Status comment still only lists "added", "exists", "no_match", "error", while the code/UX now handle additional values like no_save_path, invalid_content_path, and skipped_recheck. Consider updating the comment so future contributors see the full set of expected statuses.

Optional doc tweak
-	// Status describes the result: "added", "exists", "no_match", "error"
+	// Status describes the result: "added", "exists", "no_match", "no_save_path",
+	// "invalid_content_path", "skipped_recheck", "error", or other internal status codes.
 	Status  string `json:"status"`

Also applies to: 73-83

📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e9fcbda and d9c0bf5.

📒 Files selected for processing (9)
  • internal/api/handlers/crossseed.go (5 hunks)
  • internal/database/migrations/035_add_cross_seed_skip_recheck.sql (1 hunks)
  • internal/models/crossseed.go (7 hunks)
  • internal/services/crossseed/models.go (1 hunks)
  • internal/services/crossseed/service.go (11 hunks)
  • internal/web/swagger/openapi.yaml (2 hunks)
  • web/src/components/torrents/CrossSeedDialog.tsx (1 hunks)
  • web/src/pages/CrossSeedPage.tsx (6 hunks)
  • web/src/types/index.ts (2 hunks)
🧰 Additional context used
🧠 Learnings (6)
📓 Common learnings
Learnt from: s0up4200
Repo: autobrr/qui PR: 641
File: internal/services/crossseed/service.go:209-212
Timestamp: 2025-11-28T20:32:30.126Z
Learning: Repo: autobrr/qui PR: 641
File: internal/services/crossseed/service.go
Learning: The cross-seed recheck-resume worker intentionally runs for the process lifetime and keys pending entries by hash only. This is acceptable under the current constraint that background seeded-search runs operate on a single instance at a time; graceful shutdown and instanceID|hash keying are deferred by design.
📚 Learning: 2025-11-28T20:32:30.126Z
Learnt from: s0up4200
Repo: autobrr/qui PR: 641
File: internal/services/crossseed/service.go:209-212
Timestamp: 2025-11-28T20:32:30.126Z
Learning: Repo: autobrr/qui PR: 641
File: internal/services/crossseed/service.go
Learning: The cross-seed recheck-resume worker intentionally runs for the process lifetime and keys pending entries by hash only. This is acceptable under the current constraint that background seeded-search runs operate on a single instance at a time; graceful shutdown and instanceID|hash keying are deferred by design.

Applied to files:

  • internal/services/crossseed/models.go
  • web/src/types/index.ts
  • internal/models/crossseed.go
  • internal/services/crossseed/service.go
  • internal/api/handlers/crossseed.go
📚 Learning: 2025-11-28T22:21:20.730Z
Learnt from: s0up4200
Repo: autobrr/qui PR: 641
File: internal/services/crossseed/service.go:2415-2457
Timestamp: 2025-11-28T22:21:20.730Z
Learning: Repo: autobrr/qui PR: 641
File: internal/services/crossseed/service.go
Learning: The determineSavePath function intentionally includes a contentLayout string parameter for future/content-layout branching and API consistency. Its presence is by design even if unused in the current body; do not flag as an issue in reviews.

Applied to files:

  • internal/services/crossseed/models.go
  • internal/services/crossseed/service.go
📚 Learning: 2025-12-03T18:11:08.682Z
Learnt from: finevan
Repo: autobrr/qui PR: 677
File: web/src/components/torrents/AddTorrentDialog.tsx:496-504
Timestamp: 2025-12-03T18:11:08.682Z
Learning: In the AddTorrentDialog component (web/src/components/torrents/AddTorrentDialog.tsx), temporary path settings (useDownloadPath/downloadPath) should be applied per-torrent rather than updating global instance preferences. The UI/UX is designed to suggest that these options apply to the individual torrent being added.

Applied to files:

  • web/src/components/torrents/CrossSeedDialog.tsx
📚 Learning: 2025-11-06T12:11:04.963Z
Learnt from: Audionut
Repo: autobrr/qui PR: 553
File: internal/services/crossseed/service.go:1045-1082
Timestamp: 2025-11-06T12:11:04.963Z
Learning: The autobrr/qui project uses a custom go-qbittorrent client library (github.com/autobrr/go-qbittorrent) that supports both "paused" and "stopped" parameters when adding torrents via the options map. Both parameters should be set together when controlling torrent start state, as seen in internal/services/crossseed/service.go and throughout the codebase.

Applied to files:

  • internal/services/crossseed/service.go
📚 Learning: 2025-11-25T22:46:03.762Z
Learnt from: s0up4200
Repo: autobrr/qui PR: 632
File: internal/backups/service.go:1401-1404
Timestamp: 2025-11-25T22:46:03.762Z
Learning: In qui's backup service (internal/backups/service.go), background torrent downloads initiated during manifest import intentionally use a fire-and-forget pattern with the shared service context (s.ctx). Per-run cancellation is not needed, as orphaned downloads completing after run deletion are considered harmless and acceptable. This design prioritizes simplicity over per-run lifecycle management for background downloads.

Applied to files:

  • internal/services/crossseed/service.go
🧬 Code graph analysis (1)
web/src/pages/CrossSeedPage.tsx (2)
web/src/components/ui/label.tsx (1)
  • Label (29-29)
web/src/components/ui/switch.tsx (1)
  • Switch (34-34)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Run tests
🔇 Additional comments (20)
web/src/components/torrents/CrossSeedDialog.tsx (1)

540-541: New skipped_recheck status mapping is consistent and clear

The "skipped_recheck" branch cleanly surfaces the new outcome with an explicit “Skipped - recheck required” label and a high‑visibility variant, which aligns with how other non-success outcomes are presented.

internal/database/migrations/035_add_cross_seed_skip_recheck.sql (1)

1-1: Migration adds skip_recheck safely

Adding skip_recheck BOOLEAN NOT NULL DEFAULT 0 ensures all existing cross_seed_settings rows get a safe default of false and keeps future rows non-nullable. This looks straightforward and compatible with the new automation setting.

web/src/types/index.ts (1)

1410-1447: Type additions for skipRecheck correctly mirror the API

skipRecheck is required on CrossSeedAutomationSettings and optional on CrossSeedAutomationSettingsPatch, which matches the PUT vs PATCH semantics and the backend JSON field name. This should let the UI both display and modify the new flag without type mismatches.

Also applies to: 1449-1484

internal/api/handlers/crossseed.go (2)

31-46: Request/patch structs cleanly expose SkipRecheck

The additions of SkipRecheck on automationSettingsRequest and *SkipRecheck on automationSettingsPatchRequest, plus the update to isEmpty(), mean clients can now both fully set and selectively patch this flag. JSON tag skipRecheck matches the schema and web types, so decoding will be consistent across layers.

Also applies to: 48-84, 142-175


176-283: SkipRecheck is correctly merged into persisted automation settings

applyAutomationSettingsPatch now applies patch.SkipRecheck to settings.SkipRecheck when present, and UpdateAutomationSettings initializes SkipRecheck from the PUT request. This keeps the new flag flowing end-to-end through the API into models.CrossSeedAutomationSettings without affecting existing validation logic.

Also applies to: 647-662

internal/web/swagger/openapi.yaml (1)

3959-3962: OpenAPI schemas for skipRecheck are aligned and descriptive

Adding skipRecheck to both CrossSeedAutomationSettingsPatch and CrossSeedAutomationSettings with a clear description keeps the API contract in sync with the handler, models, and frontend types, and documents the new behavior for generated clients and users.

Also applies to: 4025-4027

internal/services/crossseed/service.go (2)

429-450: SkipRecheck plumbing through search/completion options looks consistent

SearchRunOptions.SkipRecheck plus its use in executeCompletionSearch and StartSearchRun correctly propagate the automation-level setting into all seeded-search/completion paths, mirroring how StartPaused and SkipAutoResume* are handled. No functional concerns here.

Also applies to: 1132-1143, 1188-1229


2488-2511: Entry-point wiring of SkipRecheck into CrossSeedRequest is coherent

The additional skipRecheck local in AutobrrApply, the similar wiring in ApplyTorrentSearchResults, and the SkipRecheck field passed from searchRunState.opts in executeCrossSeedSearchAttempt all correctly route the global automation setting into CrossSeedRequest. This keeps behavior consistent across autobrr webhooks, manual apply, and seeded search runs without introducing new edge cases.

Also applies to: 4638-4853, 5836-5882

internal/models/crossseed.go (7)

68-68: LGTM! Field addition is well-placed.

The SkipRecheck field is logically grouped with other skip settings and follows consistent naming conventions.


122-122: LGTM! Safe default value.

Setting SkipRecheck to false by default preserves existing behavior and makes this an opt-in feature, which is appropriate for a new capability that changes cross-seed processing.


302-302: LGTM! Query correctly extended.

The skip_recheck column is properly added to the SELECT query following database naming conventions.


350-350: LGTM! Scan operation is correct.

The scan correctly reads skip_recheck into settings.SkipRecheck, maintaining alignment with the SELECT query.


555-556: LGTM! UPDATE clause correctly modified.

The skip_recheck column is properly added to the ON CONFLICT DO UPDATE clause with correct syntax.


602-602: LGTM! Parameter correctly bound.

The settings.SkipRecheck value is properly passed to ExecContext in the correct position.


520-523: The placeholder count verification is complete. The VALUES clause contains 32 placeholders, and the ExecContext call passes exactly 32 parameters, including the newly added settings.SkipRecheck parameter. The counts match correctly.

web/src/pages/CrossSeedPage.tsx (5)

87-87: LGTM! Interface correctly extended.

The skipRecheck field is properly typed and logically grouped with other skip settings.


131-131: LGTM! Default value is consistent.

The frontend default value matches the backend, ensuring consistency across the stack.


437-437: LGTM! Safe initialization with proper fallback.

The nullish coalescing operator ensures a safe default if the API doesn't return the field, which is good defensive programming.


533-533: LGTM! Patch builder correctly includes the field.

The skipRecheck field is properly included in both the fallback source and the final patch object, maintaining consistency with other skip settings.

Also applies to: 558-558


2118-2136: LGTM! Clear and well-structured UI section.

The new "Recheck behavior" panel follows existing patterns and provides clear labeling. The helper text "Skip matches needing rename alignment or extra files" accurately describes the scenarios mentioned in the PR objectives.

The placement after auto-resume settings is logical, as both control post-match behavior.

Comment thread internal/models/crossseed.go
@s0up4200
s0up4200 merged commit 03a147e into main Dec 21, 2025
11 checks passed
@s0up4200
s0up4200 deleted the feat/crossseed-skip-recheck branch December 21, 2025 17:42
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Jan 4, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/autobrr/qui](https://github.com/autobrr/qui) | minor | `v1.11.0` → `v1.12.0` |

---

### Release Notes

<details>
<summary>autobrr/qui (ghcr.io/autobrr/qui)</summary>

### [`v1.12.0`](https://github.com/autobrr/qui/releases/tag/v1.12.0)

[Compare Source](autobrr/qui@v1.11.0...v1.12.0)

#### Changelog

##### New Features

- [`202e950`](autobrr/qui@202e950): feat(automations): Add `free_space` condition ([#&#8203;1061](autobrr/qui#1061)) ([@&#8203;Barcode-eng](https://github.com/Barcode-eng))
- [`3b106d6`](autobrr/qui@3b106d6): feat(automations): make conditions optional for non-delete rules and add drag reorder ([#&#8203;939](autobrr/qui#939)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0684d75`](autobrr/qui@0684d75): feat(config): Add QUI\_\_OIDC\_CLIENT\_SECRET\_FILE env var ([#&#8203;841](autobrr/qui#841)) ([@&#8203;PedDavid](https://github.com/PedDavid))
- [`dac0173`](autobrr/qui@dac0173): feat(config): allow disabling tracker icon fetching ([#&#8203;823](autobrr/qui#823)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`dc10bad`](autobrr/qui@dc10bad): feat(crossseed): add cancel run and opt-in errored torrent recovery ([#&#8203;918](autobrr/qui#918)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`cd1fcc9`](autobrr/qui@cd1fcc9): feat(crossseed): add custom category option for cross-seeds ([#&#8203;907](autobrr/qui#907)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d189fe9`](autobrr/qui@d189fe9): feat(crossseed): add indexerName to webhook apply + fix category mode defaults ([#&#8203;916](autobrr/qui#916)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`03a147e`](autobrr/qui@03a147e): feat(crossseed): add option to skip recheck-required matches ([#&#8203;825](autobrr/qui#825)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`edae00a`](autobrr/qui@edae00a): feat(crossseed): add optional hardlink mode for cross-seeding ([#&#8203;849](autobrr/qui#849)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0938436`](autobrr/qui@0938436): feat(crossseed): add source aliasing for WEB/WEB-DL/WEBRip precheck matching ([#&#8203;874](autobrr/qui#874)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`65f6129`](autobrr/qui@65f6129): feat(crossseed): show failure reasons, prune runs, and add cache cleanup ([#&#8203;923](autobrr/qui#923)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`e10fba8`](autobrr/qui@e10fba8): feat(details): torrent details panel improvements ([#&#8203;884](autobrr/qui#884)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`6921140`](autobrr/qui@6921140): feat(docs): add Docusaurus documentation site ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`6a5a66c`](autobrr/qui@6a5a66c): feat(docs): add Icon and webUI variables to the Unraid install guide ([#&#8203;942](autobrr/qui#942)) ([@&#8203;BaukeZwart](https://github.com/BaukeZwart))
- [`281fce7`](autobrr/qui@281fce7): feat(docs): add local search plugin ([#&#8203;1076](autobrr/qui#1076)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`566de08`](autobrr/qui@566de08): feat(docs): add qui logo, update readme, remove v4 flag ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`b83ac5a`](autobrr/qui@b83ac5a): feat(docs): apply minimal.css theme to Docusaurus ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`fe6a6df`](autobrr/qui@fe6a6df): feat(docs): improve documentation pages and add support page ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`62a7ad5`](autobrr/qui@62a7ad5): feat(docs): use qui favicon ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`5d124c0`](autobrr/qui@5d124c0): feat(orphan): add auto cleanup mode ([#&#8203;897](autobrr/qui#897)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`3172ad9`](autobrr/qui@3172ad9): feat(settings): add log settings + live log stream ([#&#8203;876](autobrr/qui#876)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`3c1b34b`](autobrr/qui@3c1b34b): feat(torrents): add "torrent introuvable" to unregistered status ([#&#8203;836](autobrr/qui#836)) ([@&#8203;kephasdev](https://github.com/kephasdev))
- [`afe4d39`](autobrr/qui@afe4d39): feat(torrents): add tracker URL editing for single torrents ([#&#8203;848](autobrr/qui#848)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`76dedd7`](autobrr/qui@76dedd7): feat(torrents): update GeneralTabHorizontal to display limits and improve layout ([#&#8203;1078](autobrr/qui#1078)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`6831c24`](autobrr/qui@6831c24): feat(ui): unify payment options into single dialog ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`4dcdf7f`](autobrr/qui@4dcdf7f): feat(web): add local file access indicator to instance cards ([#&#8203;911](autobrr/qui#911)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`a560e5e`](autobrr/qui@a560e5e): feat(web): compact torrent details panel ([#&#8203;833](autobrr/qui#833)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`557e7bd`](autobrr/qui@557e7bd): feat: add issue/discussion template ([#&#8203;945](autobrr/qui#945)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8b93719`](autobrr/qui@8b93719): feat: add workflow automation system with category actions, orphan scanner, and hardlink detection ([#&#8203;818](autobrr/qui#818)) ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Bug Fixes

- [`b85ad6b`](autobrr/qui@b85ad6b): fix(automations): allow delete rules to match incomplete torrents ([#&#8203;926](autobrr/qui#926)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`ae06200`](autobrr/qui@ae06200): fix(automations): make tags field condition operators tag-aware ([#&#8203;908](autobrr/qui#908)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`ace0101`](autobrr/qui@ace0101): fix(crossseed): detect folder mismatch for bare file to folder cross-seeds ([#&#8203;846](autobrr/qui#846)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1cc1243`](autobrr/qui@1cc1243): fix(crossseed): enforce resolution and language matching with sensible defaults ([#&#8203;855](autobrr/qui#855)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`cefb9cd`](autobrr/qui@cefb9cd): fix(crossseed): execute external program reliably after injection ([#&#8203;1083](autobrr/qui#1083)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`867e2da`](autobrr/qui@867e2da): fix(crossseed): improve matching with size validation and relaxed audio checks ([#&#8203;845](autobrr/qui#845)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`4b5079b`](autobrr/qui@4b5079b): fix(crossseed): persist custom category settings in PATCH handler ([#&#8203;913](autobrr/qui#913)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`cfbbc1f`](autobrr/qui@cfbbc1f): fix(crossseed): prevent season packs matching episodes ([#&#8203;854](autobrr/qui#854)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c7c1706`](autobrr/qui@c7c1706): fix(crossseed): reconcile interrupted runs on startup ([#&#8203;1084](autobrr/qui#1084)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`7d633bd`](autobrr/qui@7d633bd): fix(crossseed): use ContentPath for manually-managed single-file torrents ([#&#8203;832](autobrr/qui#832)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d5db761`](autobrr/qui@d5db761): fix(database): include arr\_instances in string pool cleanup + remove auto-recovery ([#&#8203;898](autobrr/qui#898)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c73ec6f`](autobrr/qui@c73ec6f): fix(database): prevent race between stmt cache access and db close ([#&#8203;840](autobrr/qui#840)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`a40b872`](autobrr/qui@a40b872): fix(db): drop legacy hardlink columns from cross\_seed\_settings ([#&#8203;912](autobrr/qui#912)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`e400af3`](autobrr/qui@e400af3): fix(db): recover wedged SQLite writer + stop cross-seed tight loop ([#&#8203;890](autobrr/qui#890)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`90e15b4`](autobrr/qui@90e15b4): fix(deps): update rls to recognize IP as iPlayer ([#&#8203;922](autobrr/qui#922)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8e81b9f`](autobrr/qui@8e81b9f): fix(proxy): honor TLSSkipVerify for proxied requests ([#&#8203;1051](autobrr/qui#1051)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`eb2bee0`](autobrr/qui@eb2bee0): fix(security): redact sensitive URL parameters in logs ([#&#8203;853](autobrr/qui#853)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`40982bc`](autobrr/qui@40982bc): fix(themes): prevent reset on license errors, improve switch performance ([#&#8203;844](autobrr/qui#844)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`a8a32f7`](autobrr/qui@a8a32f7): fix(ui): incomplete torrents aren't "Completed: 1969-12-31" ([#&#8203;851](autobrr/qui#851)) ([@&#8203;finevan](https://github.com/finevan))
- [`5908bba`](autobrr/qui@5908bba): fix(ui): preserve category collapse state when toggling incognito mode ([#&#8203;834](autobrr/qui#834)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`25c847e`](autobrr/qui@25c847e): fix(ui): torrents with no creation metadata don't display 1969 ([#&#8203;873](autobrr/qui#873)) ([@&#8203;finevan](https://github.com/finevan))
- [`6403b6a`](autobrr/qui@6403b6a): fix(web): column filter status now matches all states in category ([#&#8203;880](autobrr/qui#880)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`eafc4e7`](autobrr/qui@eafc4e7): fix(web): make delete cross-seed check rely on content\_path matches ([#&#8203;1080](autobrr/qui#1080)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d57c749`](autobrr/qui@d57c749): fix(web): only show selection checkbox on normal view ([#&#8203;830](autobrr/qui#830)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`60338f6`](autobrr/qui@60338f6): fix(web): optimize TorrentDetailsPanel for mobile view and make tabs scrollable horizontally ([#&#8203;1066](autobrr/qui#1066)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`aedab87`](autobrr/qui@aedab87): fix(web): speed limit input reformatting during typing ([#&#8203;881](autobrr/qui#881)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`df7f3e0`](autobrr/qui@df7f3e0): fix(web): truncate file progress percentage instead of rounding ([#&#8203;919](autobrr/qui#919)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`2fadd01`](autobrr/qui@2fadd01): fix(web): update eslint config for flat config compatibility ([#&#8203;879](autobrr/qui#879)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`721cedd`](autobrr/qui@721cedd): fix(web): use fixed heights for mobile torrent cards ([#&#8203;812](autobrr/qui#812)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`a7db605`](autobrr/qui@a7db605): fix: remove pnpm-workspace.yaml breaking CI ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c0ddc0a`](autobrr/qui@c0ddc0a): fix: use prefix matching for allowed bash commands ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Other Changes

- [`fff52ce`](autobrr/qui@fff52ce): chore(ci): disable reviewer ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`7ef2a38`](autobrr/qui@7ef2a38): chore(ci): fix automated triage and deduplication workflows ([#&#8203;1057](autobrr/qui#1057)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d84910b`](autobrr/qui@d84910b): chore(docs): move Tailwind to documentation workspace only ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`37ebe05`](autobrr/qui@37ebe05): chore(docs): move netlify.toml to documentation directory ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`e25de38`](autobrr/qui@e25de38): chore(docs): remove disclaimer ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c59b809`](autobrr/qui@c59b809): chore(docs): update support sections ([#&#8203;1063](autobrr/qui#1063)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`b723523`](autobrr/qui@b723523): chore(tests): remove dead tests and optimize slow test cases ([#&#8203;842](autobrr/qui#842)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`662a1c6`](autobrr/qui@662a1c6): chore(workflows): update runners from 4vcpu to 2vcpu for all jobs ([#&#8203;859](autobrr/qui#859)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`46f2a1c`](autobrr/qui@46f2a1c): chore: clean up repo root by moving Docker, scripts, and community docs ([#&#8203;1054](autobrr/qui#1054)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`2f27c0d`](autobrr/qui@2f27c0d): chore: remove old issue templates ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`04f361a`](autobrr/qui@04f361a): ci(triage): add labeling for feature-requests-ideas discussions ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`f249c69`](autobrr/qui@f249c69): ci(triage): remove needs-triage label after applying labels ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`bdda1de`](autobrr/qui@bdda1de): ci(workflows): add self-dispatch workaround for discussion events ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`a9732a2`](autobrr/qui@a9732a2): ci(workflows): increase max-turns to 25 for Claude workflows ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d7d830d`](autobrr/qui@d7d830d): docs(README): add Buy Me a Coffee link ([#&#8203;863](autobrr/qui#863)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`266d92e`](autobrr/qui@266d92e): docs(readme): Clarify ignore pattern ([#&#8203;878](autobrr/qui#878)) ([@&#8203;quorn23](https://github.com/quorn23))
- [`9586084`](autobrr/qui@9586084): docs(readme): add banner linking to stable docs ([#&#8203;925](autobrr/qui#925)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`e36a621`](autobrr/qui@e36a621): docs(readme): use markdown link for Polar URL ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`9394676`](autobrr/qui@9394676): docs: add frontmatter titles and descriptions, remove marketing language ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`ba9d45e`](autobrr/qui@ba9d45e): docs: add local filesystem access snippet and swizzle Details component ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`4329edd`](autobrr/qui@4329edd): docs: disclaimer about unreleased features ([#&#8203;943](autobrr/qui#943)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`735d065`](autobrr/qui@735d065): docs: improve external programs, orphan scan, reverse proxy, tracker icons documentation ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`78faef2`](autobrr/qui@78faef2): docs: remove premature tip and fix stat command ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`eaad3bf`](autobrr/qui@eaad3bf): docs: update social card image in Docusaurus configuration ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`02a68e5`](autobrr/qui@02a68e5): refactor(crossseed): hardcode ignore patterns for file matching ([#&#8203;915](autobrr/qui#915)) ([@&#8203;s0up4200](https://github.com/s0up4200))

**Full Changelog**: <autobrr/qui@v1.11.0...v1.12.0>

#### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.12.0`
- `docker pull ghcr.io/autobrr/qui:latest`

#### What to do next?

- Join our [Discord server](https://discord.autobrr.com/qui)

Thank you for using qui!

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/3060
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature Request]Give us a way to skip recheck with Cross seed ( for lower hardware users )

1 participant