Skip to content

feat(ui): Use 4 column grid for dashboard instances on 2xl screens - #1195

Merged
s0up4200 merged 2 commits into
autobrr:developfrom
ewenjo:dashboard-instances-grid-cols
Jan 10, 2026
Merged

feat(ui): Use 4 column grid for dashboard instances on 2xl screens#1195
s0up4200 merged 2 commits into
autobrr:developfrom
ewenjo:dashboard-instances-grid-cols

Conversation

@ewenjo

@ewenjo ewenjo commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

Tested with both xl:grid-cols-4 and 2xl:grid-cols-4, but found that 4 columns can be too small on the lower end of xl sizes.

Before
firefox_v7l5EK2oY8

After

riUZkQug7W firefox_A543w7Af6J

Summary by CodeRabbit

  • Style
    • Improved Instance grid responsiveness with an additional breakpoint for very large screens, now displaying four columns instead of three on extra-wide displays.

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

@coderabbitai

coderabbitai Bot commented Jan 10, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

The Dashboard component's Instance grid layout is enhanced with an additional responsive breakpoint, adding support for four-column layouts on extra-large (2xl) screens. The grid classes are extended from three responsive sizes to four, enabling better use of wider displays.

Changes

Cohort / File(s) Summary
Grid Layout Enhancement
web/src/pages/Dashboard.tsx
Extended Instance grid responsive breakpoints: added 2xl:grid-cols-4 to display four columns on extra-large screens. Tailwind CSS classes updated from sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 to sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~2 minutes

Poem

🐰✨ A grid that grows with screens so wide,
Four columns now stand side by side,
On 2xl lands where space runs free,
The Dashboard dances gracefully! 🎨

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: adding a 4-column grid layout for dashboard instances on 2xl screens, which directly aligns with the file modifications and PR objectives.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bffecbd and e2480e0.

📒 Files selected for processing (1)
  • web/src/pages/Dashboard.tsx
🔇 Additional comments (1)
web/src/pages/Dashboard.tsx (1)

2334-2334: LGTM! Well-considered responsive enhancement.

The addition of 2xl:grid-cols-4 provides better use of wider displays while maintaining a logical responsive progression. The choice of 2xl over xl (as mentioned in the PR description) demonstrates thoughtful UX consideration.


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 merged commit e0d2bb4 into autobrr:develop Jan 10, 2026
11 checks passed
@ewenjo
ewenjo deleted the dashboard-instances-grid-cols branch January 10, 2026 16:42
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Jan 27, 2026
This PR contains the following updates:

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

---

### Release Notes

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

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

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

#### Highlights

- Native RSS support for feeds
- Cross-seed upgrades: directory scanning for data-based matching and category affix (prefix/suffix) modes
- Automations improvements: Move action support, uncategorized filter option, hasMissingFiles condition, include-cross-seeds mode, configurable FREE\_SPACE source
- UI improvements: inline pieces progress bar, clickable dashboard error counts, better mobile workflow modal
- Orphan scan safeguards for shared save paths
- External programs: new {comment} placeholder

##### Notable bug fixes:

- More stable sorting for timestamp fields and last\_activity
- Tracker icon fetching reliability and timeout cooldown handling
- Cross-seed matching fixes (anime/pack matching, size mismatch handling, V2 hash recheck)
- Orphan scan ignores .parts files and OS/NAS artifacts
- qBittorrent tracker-down matching improvements and magnet redirect handling

#### Changelog

##### New Features

- [`9acd789`](autobrr/qui@9acd789): feat(automations): add Move action to Automations ([#&#8203;1079](autobrr/qui#1079)) ([@&#8203;Barcode-eng](https://github.com/Barcode-eng))
- [`80aaf22`](autobrr/qui@80aaf22): feat(automations): add hasMissingfiles condition ([#&#8203;1081](autobrr/qui#1081)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`f942a71`](autobrr/qui@f942a71): feat(automations): add import button to empty state ([#&#8203;1111](autobrr/qui#1111)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`6b2831e`](autobrr/qui@6b2831e): feat(automations): add include-cross-seeds mode with hardlink support, fix free-space projection ([#&#8203;1116](autobrr/qui#1116)) ([@&#8203;Barcode-eng](https://github.com/Barcode-eng))
- [`b152a6a`](autobrr/qui@b152a6a): feat(automations): add tooltips to disabled conditions ([#&#8203;1286](autobrr/qui#1286)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`f36eb76`](autobrr/qui@f36eb76): feat(automations): add uncategorized category filter option ([#&#8203;1268](autobrr/qui#1268)) ([@&#8203;aulterego](https://github.com/aulterego))
- [`d7dcb58`](autobrr/qui@d7dcb58): feat(automations): configurable FREE\_SPACE source (qBit or path) ([#&#8203;1181](autobrr/qui#1181)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d685bee`](autobrr/qui@d685bee): feat(backups): add tooltips and restore from lastest button ([#&#8203;1258](autobrr/qui#1258)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`4c5a975`](autobrr/qui@4c5a975): feat(crossseed): add category affix with prefix/suffix modes ([#&#8203;1296](autobrr/qui#1296)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`28cd96d`](autobrr/qui@28cd96d): feat(crossseed): add directory scanner for data-based matching ([#&#8203;1203](autobrr/qui#1203)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`fe84eb0`](autobrr/qui@fe84eb0): feat(dirscan): resumable scans with per-run limit ([#&#8203;1274](autobrr/qui#1274)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1af2a12`](autobrr/qui@1af2a12): feat(dockerfile): add bash to Dockerfile ([#&#8203;903](autobrr/qui#903)) ([@&#8203;ryanwalder](https://github.com/ryanwalder))
- [`5c84c3f`](autobrr/qui@5c84c3f): feat(docs): add browser extension links and URL shorteners ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`13c5461`](autobrr/qui@13c5461): feat(linking): add option to fallback on linking failure ([#&#8203;1056](autobrr/qui#1056)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`5f7031f`](autobrr/qui@5f7031f): feat(orphanscan): protect shared save paths across instances ([#&#8203;1197](autobrr/qui#1197)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`341092d`](autobrr/qui@341092d): feat(rss): add native rss support ([#&#8203;801](autobrr/qui#801)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8d2a371`](autobrr/qui@8d2a371): feat(sort): add stable fallback sorting for timestamp fields ([#&#8203;1317](autobrr/qui#1317)) ([@&#8203;aulterego](https://github.com/aulterego))
- [`28cf4ad`](autobrr/qui@28cf4ad): feat(torrents): use custom tracker names in table ([#&#8203;1120](autobrr/qui#1120)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`e0d2bb4`](autobrr/qui@e0d2bb4): feat(ui): Use 4 column grid for dashboard instances on 2xl screens ([#&#8203;1195](autobrr/qui#1195)) ([@&#8203;ewenjo](https://github.com/ewenjo))
- [`7bc98e1`](autobrr/qui@7bc98e1): feat(ui): add inline pieces progress bar visualization ([#&#8203;1050](autobrr/qui#1050)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0154226`](autobrr/qui@0154226): feat(web): Improve performance for torrents with large file counts ([#&#8203;1252](autobrr/qui#1252)) ([@&#8203;0rkag](https://github.com/0rkag))
- [`a91df70`](autobrr/qui@a91df70): feat(web): allow merging trackers into existing groups ([#&#8203;1175](autobrr/qui#1175)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`132c512`](autobrr/qui@132c512): feat(web): improve workflow modal mobile ([#&#8203;1302](autobrr/qui#1302)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`a7f59ab`](autobrr/qui@a7f59ab): feat(web): make dashboard error counts clickable ([#&#8203;937](autobrr/qui#937)) ([@&#8203;Gykes](https://github.com/Gykes))

##### Bug Fixes

- [`c6f86e2`](autobrr/qui@c6f86e2): fix(auth): recover cleanly behind upstream SSO ([#&#8203;1142](autobrr/qui#1142)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0c19899`](autobrr/qui@0c19899): fix(automations): handle -1 value for incomplete torrent completion\_on ([#&#8203;1186](autobrr/qui#1186)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`59a9120`](autobrr/qui@59a9120): fix(automations): include Move action in `rulesUseCondition` ([#&#8203;1079](autobrr/qui#1079)) ([#&#8203;1287](autobrr/qui#1287)) ([@&#8203;Barcode-eng](https://github.com/Barcode-eng))
- [`618d945`](autobrr/qui@618d945): fix(automations): not being able to enter multiple tags in tag action ([#&#8203;1131](autobrr/qui#1131)) ([@&#8203;Winter](https://github.com/Winter))
- [`bffecbd`](autobrr/qui@bffecbd): fix(automations): restore preview API and add loading state ([#&#8203;1194](autobrr/qui#1194)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`9b3975b`](autobrr/qui@9b3975b): fix(automations): speed up delete hardlink-copy expansion ([#&#8203;1187](autobrr/qui#1187)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1549bcf`](autobrr/qui@1549bcf): fix(automations): support qBittorrent global/unlimited limits ([#&#8203;1134](autobrr/qui#1134)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`e31d4aa`](autobrr/qui@e31d4aa): fix(automations): validate local access for hasMissingFiles ([#&#8203;1281](autobrr/qui#1281)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`dba3419`](autobrr/qui@dba3419): fix(crossseed): allow extra files in size mismatch check ([#&#8203;1149](autobrr/qui#1149)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`f7dced6`](autobrr/qui@f7dced6): fix(crossseed): correct match type for episode-from-pack cross-seeding ([#&#8203;1250](autobrr/qui#1250)) ([@&#8203;neelmehta247](https://github.com/neelmehta247))
- [`007d87e`](autobrr/qui@007d87e): fix(crossseed): normalize ampersand to "and" for title matching ([#&#8203;1202](autobrr/qui#1202)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`048c034`](autobrr/qui@048c034): fix(crossseed): prevent automation search stalls ([#&#8203;1272](autobrr/qui#1272)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`5c48ccb`](autobrr/qui@5c48ccb): fix(crossseed): prevent false cross-seed delete warnings ([#&#8203;1148](autobrr/qui#1148)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`eda0eee`](autobrr/qui@eda0eee): fix(crossseed): reduce false negatives for anime matching ([#&#8203;1243](autobrr/qui#1243)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8b08b87`](autobrr/qui@8b08b87): fix(crossseed): restore reuse matched category option ([#&#8203;1150](autobrr/qui#1150)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`b69682d`](autobrr/qui@b69682d): fix(crossseed): support v2 hashes for recheck ([#&#8203;1237](autobrr/qui#1237)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8fb16c1`](autobrr/qui@8fb16c1): fix(database): remove noisy stmt cache promotion log ([#&#8203;1307](autobrr/qui#1307)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c8d068b`](autobrr/qui@c8d068b): fix(docs): correct autobrr integration documentation ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c6f4a4a`](autobrr/qui@c6f4a4a): fix(docs): use absolute URLs for extension links ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`48510e9`](autobrr/qui@48510e9): fix(instances): auth bypass persistence in instance form ([#&#8203;1219](autobrr/qui#1219)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0b71b46`](autobrr/qui@0b71b46): fix(makefile): make fmt target only format changed files ([#&#8203;1200](autobrr/qui#1200)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1f13b0e`](autobrr/qui@1f13b0e): fix(orphanscan): avoid duplicate inode entries in scans ([#&#8203;1212](autobrr/qui#1212)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`fecfebd`](autobrr/qui@fecfebd): fix(orphanscan): gate scans until qBittorrent settled ([#&#8203;1193](autobrr/qui#1193)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`77b2fd6`](autobrr/qui@77b2fd6): fix(orphanscan): ignore .parts files from qBittorrent partial downloads ([#&#8203;1264](autobrr/qui#1264)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0f7e646`](autobrr/qui@0f7e646): fix(orphanscan): ignore OS/NAS/k8s artifacts ([#&#8203;1259](autobrr/qui#1259)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`b55881c`](autobrr/qui@b55881c): fix(orphanscan): reduce MaxFilesPerRun and fix accordion chevrons ([#&#8203;1095](autobrr/qui#1095)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0cb682c`](autobrr/qui@0cb682c): fix(qbittorrent): force sync+retry in BulkAction ([#&#8203;1097](autobrr/qui#1097)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`aba9b7e`](autobrr/qui@aba9b7e): fix(qbittorrent): strip URLs before tracker-down pattern matching ([#&#8203;1224](autobrr/qui#1224)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`a60076f`](autobrr/qui@a60076f): fix(reflinktree): fall back to FICLONERANGE when FICLONE unsupported ([#&#8203;1221](autobrr/qui#1221)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d79a0db`](autobrr/qui@d79a0db): fix(search): handle magnet redirects from indexer downloads ([#&#8203;1211](autobrr/qui#1211)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1e920c4`](autobrr/qui@1e920c4): fix(sort): truncate `last_activity` to 60s for stability ([#&#8203;1318](autobrr/qui#1318)) ([@&#8203;aulterego](https://github.com/aulterego))
- [`931d720`](autobrr/qui@931d720): fix(torznab): respect per-indexer caps limits ([#&#8203;1265](autobrr/qui#1265)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`6fe91e8`](autobrr/qui@6fe91e8): fix(trackericons): apply failure cooldown on timeouts ([#&#8203;1322](autobrr/qui#1322)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`35a50b5`](autobrr/qui@35a50b5): fix(web): add max-height to import workflow dialog ([#&#8203;1207](autobrr/qui#1207)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`5bd2706`](autobrr/qui@5bd2706): fix(web): hide redundant actions dropdown ([#&#8203;1305](autobrr/qui#1305)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`307907f`](autobrr/qui@307907f): fix(web): improve Reannounce In column display ([#&#8203;1320](autobrr/qui#1320)) ([@&#8203;soggy-cr0uton](https://github.com/soggy-cr0uton))
- [`7881bdc`](autobrr/qui@7881bdc): fix(web): make Add Instance dialog scrollable on small viewports ([#&#8203;1232](autobrr/qui#1232)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`bec5433`](autobrr/qui@bec5433): fix(web): make dialogs scrollable on small viewports ([#&#8203;1233](autobrr/qui#1233)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0e47b9e`](autobrr/qui@0e47b9e): fix(web): prevent nested scroll containers on iOS ([#&#8203;1229](autobrr/qui#1229)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`f2f0616`](autobrr/qui@f2f0616): fix(web): redirect already authenticated users to dashboard ([#&#8203;1127](autobrr/qui#1127)) ([@&#8203;burritothief](https://github.com/burritothief))
- [`7a633cf`](autobrr/qui@7a633cf): fix(web): toast message when searching then adding cross-seeds ([#&#8203;1290](autobrr/qui#1290)) ([@&#8203;rybertm](https://github.com/rybertm))
- [`da14100`](autobrr/qui@da14100): fix(web): use fixed px for sidebar width instead of rem ([#&#8203;1313](autobrr/qui#1313)) ([@&#8203;soggy-cr0uton](https://github.com/soggy-cr0uton))

##### Other Changes

- [`c93a326`](autobrr/qui@c93a326): chore(deps): bump the golang group across 1 directory with 16 updates ([#&#8203;1261](autobrr/qui#1261)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`d3de074`](autobrr/qui@d3de074): chore(docs): clarify tracker pattern necessity in documentation ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`2351097`](autobrr/qui@2351097): chore(lint): Add Linting workflow to CI ([#&#8203;1270](autobrr/qui#1270)) ([@&#8203;Barcode-eng](https://github.com/Barcode-eng))
- [`e8436e3`](autobrr/qui@e8436e3): chore(lint): update linting base branch from main to develop ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`e36afc8`](autobrr/qui@e36afc8): chore: add Ko-fi funding and pre-commit config ([#&#8203;1315](autobrr/qui#1315)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`df4375e`](autobrr/qui@df4375e): chore: update copyright headers to 2025-2026 ([#&#8203;1303](autobrr/qui#1303)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`7a6f2d1`](autobrr/qui@7a6f2d1): docs(automations): clarify tag behavior ([#&#8203;1260](autobrr/qui#1260)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`05e2028`](autobrr/qui@05e2028): refactor(build): cross platform building ([#&#8203;1060](autobrr/qui#1060)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`6355f4f`](autobrr/qui@6355f4f): refactor(crosssed): require full recheck for disc based content ([#&#8203;1168](autobrr/qui#1168)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`7466a98`](autobrr/qui@7466a98): refactor(filesmanager): improve logging messages for orphan cleanup process ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`ad90209`](autobrr/qui@ad90209): refactor(orphan): improve disc based content handling ([#&#8203;1167](autobrr/qui#1167)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`3b85f8a`](autobrr/qui@3b85f8a): refactor(web): use TanStack Query for path autocomplete ([#&#8203;1309](autobrr/qui#1309)) ([@&#8203;soggy-cr0uton](https://github.com/soggy-cr0uton))

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

#### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.13.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/3540
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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants