Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
239 commits
Select commit Hold shift + click to select a range
b454085
fix: remove unused import
jordanlambrecht Mar 27, 2026
add5c23
perf: dynamically import DashboardSettingsSheet
jordanlambrecht Mar 27, 2026
011f725
perf: streamline Mousehole URL validation in PATCH and POST functions
jordanlambrecht Mar 27, 2026
b32cb9c
feat: add searchParams handling and initialTab prop to TrackerDetailPage
jordanlambrecht Mar 27, 2026
d4132cf
perf: dynamically import EmojiPicker
jordanlambrecht Mar 27, 2026
49482ba
fix: make validateHttpUrl function use dynamic error labels
jordanlambrecht Mar 27, 2026
d233542
perf: dynamically import TorrentAgeScatter3D
jordanlambrecht Mar 27, 2026
6f31fdb
perf: dynamically import QRCodeSVG
jordanlambrecht Mar 27, 2026
ae47380
perf: dynamically import ChangelogContent
jordanlambrecht Mar 27, 2026
7651b5a
Merge pull request #108 from jordanlambrecht/main
jordanlambrecht Mar 27, 2026
4d80294
Merge branch 'development' of github.com:jordanlambrecht/tracker-trac…
jordanlambrecht Mar 27, 2026
7aec2ee
fix: unify error handling in SetupForm
jordanlambrecht Mar 27, 2026
a971c64
fix: ensure loading state is reset after API calls in AddTrackerDialog
jordanlambrecht Mar 27, 2026
11c303a
fix: improve error handling in backup password operations
jordanlambrecht Mar 27, 2026
1b6080e
refactor: unified text sizes
jordanlambrecht Mar 27, 2026
32a177d
fix: optimize deletion of old checkpoints
jordanlambrecht Mar 27, 2026
56ee982
fix: optimize database queries
jordanlambrecht Mar 27, 2026
4cf6dba
fix: ensure default value reference is used in useLocalStorage hook
jordanlambrecht Mar 27, 2026
4dd01ad
fix: replace useEffect with useLayoutEffect
jordanlambrecht Mar 27, 2026
673ed48
fix: simplify shouldMount logic in ChartCard component
jordanlambrecht Mar 27, 2026
b2cea74
perf: optimize sortOrder update logic
jordanlambrecht Mar 27, 2026
f847941
fix: use EMPTY_TRACKERS and EMPTY_TRACKER_TAGS constants
jordanlambrecht Mar 27, 2026
5fd11e8
chore: remove unused API route from PUBLIC_PREFIX constant
jordanlambrecht Mar 27, 2026
588a0ad
feat: extend change-password API to handle notification target re-enc…
jordanlambrecht Mar 27, 2026
8debdd2
fix: enforce character limits on proxy username, password, and mouseh…
jordanlambrecht Mar 27, 2026
3d65083
style: standardize z-indexes
jordanlambrecht Mar 27, 2026
a5aa9cb
style: removed arbitrary -[xyz] tailwind classes
jordanlambrecht Mar 27, 2026
d6eb084
style: standardize ghost-link classes
jordanlambrecht Mar 27, 2026
fb20902
refactor: new SlotLabel component
jordanlambrecht Mar 27, 2026
365dbf9
style: update help icon classes
jordanlambrecht Mar 27, 2026
a256134
style: standardize timestamp classes
jordanlambrecht Mar 27, 2026
bb73e76
style: standardized table cell styling
jordanlambrecht Mar 27, 2026
99f8a70
style: added minimal button variant
jordanlambrecht Mar 27, 2026
0171372
refactor: new DataCell component
jordanlambrecht Mar 27, 2026
1858308
refactor: collapsed card headers into card component
jordanlambrecht Mar 27, 2026
640e517
feat: implement SectionToggle and ProgressWidget components
jordanlambrecht Mar 27, 2026
01b3ee5
feat: add ConfirmRemove and SaveDiscardBar components
jordanlambrecht Mar 27, 2026
4ec91a2
feat: new formatSpeed formatter
jordanlambrecht Mar 27, 2026
710b7b1
feat: implement useActionStatus hook for managing action states
jordanlambrecht Mar 27, 2026
b7e49f3
feat: refactor dirty detection to buildPatch function
jordanlambrecht Mar 27, 2026
8e6be1f
feat: add lazy loading support to Card component
jordanlambrecht Mar 27, 2026
6682219
perf: torrentsTab component to use lazy loading for Card components
jordanlambrecht Mar 27, 2026
91af8f0
feat: add hint support to Input component and update BackupsSection t…
jordanlambrecht Mar 27, 2026
42f8f81
refactor: update action status terminology from "testing" to "pending"
jordanlambrecht Mar 28, 2026
1951931
refactor: update chart color constants to use theme colors
jordanlambrecht Mar 28, 2026
deb6360
refactor: enhance backup history retrieval
jordanlambrecht Mar 28, 2026
ce33279
refactor: silence logging for non-critical errors
jordanlambrecht Mar 28, 2026
08c2f6e
refactor: improve mount logic
jordanlambrecht Mar 28, 2026
ef3979a
refactor: migrate interactive surfaces to nm-interactive classes
jordanlambrecht Mar 28, 2026
8003d72
refactor(typography): replace inline label spans with H2 component
jordanlambrecht Mar 28, 2026
37c1ac9
style: transition-all to transition-colors on filter pills
jordanlambrecht Mar 28, 2026
aa47790
refactor: add formatRatioDisplay, formatCount, formatPercent, formatD…
jordanlambrecht Mar 28, 2026
813aaeb
refactor: replace inline formatting with centralized formatters
jordanlambrecht Mar 28, 2026
d26656a
refactor: buttons!
jordanlambrecht Mar 29, 2026
f95f56c
fix: persist showTodayAtAGlance setting, serialize dates
jordanlambrecht Mar 29, 2026
6bdf5dd
refactor: type parsePlatformMeta return as PlatformMeta union, fix bi…
jordanlambrecht Mar 29, 2026
0d79466
fix: duplicate TrackerSummary export
jordanlambrecht Mar 29, 2026
684f758
refactor: named Drizzle type aliases
jordanlambrecht Mar 29, 2026
6400e33
refactor: notificationTarget and downloadClient
jordanlambrecht Mar 29, 2026
c2979fd
refactor: make routeContext type
jordanlambrecht Mar 29, 2026
a6df957
refactor: extract DayRange, DeltaDisplay, API response types
jordanlambrecht Mar 29, 2026
0c1cbf3
refactor: type alert pruning
jordanlambrecht Mar 29, 2026
5d5a5cc
refactor: eliminate fleetTorrentsResponse, export discordEmbed, add p…
jordanlambrecht Mar 29, 2026
bea7e2e
refactor: extract more props
jordanlambrecht Mar 29, 2026
b2b6e8c
style: adjust gaps
jordanlambrecht Mar 29, 2026
80eb425
refactor: better notification/torrent handling, add type guards, and …
jordanlambrecht Mar 29, 2026
90003b8
refactor: replace hex color regex with isValidHex
jordanlambrecht Mar 29, 2026
d29e391
fix: chart content not hiding on card collapse (closes #34)
jordanlambrecht Mar 29, 2026
b933e13
style: update color variables
jordanlambrecht Mar 29, 2026
02fc0f8
feat: new useAnimatedPresence and useEscapeKey hooks
jordanlambrecht Mar 29, 2026
fcfb33c
refactor: swap buttons with saveDiscardBar in settings
jordanlambrecht Mar 29, 2026
6e750d2
refactor: helpers, validators, and formatters oh my
jordanlambrecht Mar 29, 2026
de90cd4
refactor: helpers, validators, and formatters oh my pt 2
jordanlambrecht Mar 29, 2026
41f03d8
refactor: helpers, validators, and formatters oh my pt 3
jordanlambrecht Mar 29, 2026
5fef730
refactor: helpers, validators, and formatters oh my pt 4
jordanlambrecht Mar 29, 2026
ad3ad57
feat: added support for the avistaz network (closes #112)
jordanlambrecht Mar 29, 2026
8f94cac
feat: add download_disabled + vip_expiring for AvistaZ plat, rename m…
jordanlambrecht Mar 29, 2026
ca9e1fa
fix: wrong Content-Type for cached avatar images
jordanlambrecht Mar 29, 2026
0b0de15
feat: added confirmAction ui comp
jordanlambrecht Mar 29, 2026
5a89c58
feat: useCrudCard hook
jordanlambrecht Mar 30, 2026
793ebf9
style: cleaned css classnames
jordanlambrecht Mar 30, 2026
fe2bea2
feat: add support for luminarr and darkPeers (closes #113 and #114)
jordanlambrecht Mar 30, 2026
d458f62
chore: linting
jordanlambrecht Mar 30, 2026
c36a0bd
refactor: update notification circuit breaker state handling
jordanlambrecht Mar 30, 2026
92151f0
refactor: slimmed down sidebar
jordanlambrecht Mar 30, 2026
d9c700d
feat: new notice component
jordanlambrecht Mar 30, 2026
572a95a
test: removed silly tests, made some tests stronger
jordanlambrecht Mar 30, 2026
a07d62c
refactor: replace manual data fetching with react-query
jordanlambrecht Mar 30, 2026
f9a7054
feat: new skeleton loaders
jordanlambrecht Mar 30, 2026
462ea57
refactor: switched a lot of stuff to clsx and cva
jordanlambrecht Mar 30, 2026
8b1edc7
fix: boundaryGap bug on charts
jordanlambrecht Mar 30, 2026
748b851
fix: bad styling
jordanlambrecht Mar 30, 2026
b6eea34
fix: x-axis was showing wrong values, zoom bug
jordanlambrecht Mar 30, 2026
fd9b6fa
fix: make footer logo load eagerly
jordanlambrecht Mar 30, 2026
4ab51da
chore: wipe next cache on pnpm dev
jordanlambrecht Mar 30, 2026
d9a7834
refactor: lots of hook extractions
jordanlambrecht Mar 30, 2026
2780d5e
perf: bg blur on dialog open was sexy but caused too much lag
jordanlambrecht Mar 30, 2026
9f8606b
fix: minor placeholder bug
jordanlambrecht Mar 30, 2026
35e3caa
fix: removed unnecessary lazy loading from Elder Torrents section
jordanlambrecht Mar 30, 2026
829973d
feat: new heatmap in torrent fleet on dashboard!
jordanlambrecht Mar 30, 2026
e0884d7
fix: don't show editable user joined date for avistaz platform
jordanlambrecht Mar 30, 2026
a603b35
fix: add notice for TOTP disabled during backup restore
jordanlambrecht Mar 30, 2026
826c566
fix: make nextjs happy with image components
jordanlambrecht Mar 30, 2026
d865622
feat: new info tip icon system thing
jordanlambrecht Mar 30, 2026
5150fbf
refactor: qbt delta sync migration (wow)
jordanlambrecht Mar 30, 2026
e7fe1df
fix: avistaZ platform-based trackers not fetching user avatars
jordanlambrecht Mar 30, 2026
b329e26
feat: beefed up Dialog component
jordanlambrecht Mar 30, 2026
f4ba2e4
feat: add AvistaZ slots for activity and badges
jordanlambrecht Mar 30, 2026
8355e72
refactor: add useMemo for crossSeedTags
jordanlambrecht Mar 30, 2026
cb87cda
feat: removed gravatar fluff
jordanlambrecht Mar 31, 2026
cb75800
refactor: optimize polling logic
jordanlambrecht Mar 31, 2026
7616408
perf: prevent unnecessary re-renders
jordanlambrecht Mar 31, 2026
955cce3
perf: improved query stability
jordanlambrecht Mar 31, 2026
4cd9f40
chore: linting
jordanlambrecht Mar 31, 2026
cd5f957
feat(trackers): added support for DarkPeers (closes #114, thanks @DGe…
jordanlambrecht Mar 31, 2026
e593117
feat(trackers): added support for DarkPeers (closes #114, thanks @DGe…
jordanlambrecht Mar 31, 2026
fe9e801
fix: oops
jordanlambrecht Mar 31, 2026
d140679
fix: json parsing error
jordanlambrecht Mar 31, 2026
9407bcd
Merge branch 'development' of github.com:jordanlambrecht/tracker-trac…
jordanlambrecht Mar 31, 2026
f5a0d1a
fix: oops 2
jordanlambrecht Mar 31, 2026
fe4b46a
fix: add tabIndex to InfoTip
jordanlambrecht Mar 31, 2026
95024aa
perf: clear timer on unmount
jordanlambrecht Mar 31, 2026
e8b7728
refactor: switched to node-html-parser
jordanlambrecht Mar 31, 2026
b3b304c
chore: remove unused onSave prop from SaveDiscardBar
jordanlambrecht Mar 31, 2026
42b4c25
feat: parseIntClamped
jordanlambrecht Mar 31, 2026
bf7645a
fix: better error handling for setup response messages
jordanlambrecht Mar 31, 2026
fed8fe8
refactor: better error handling in settings comps
jordanlambrecht Mar 31, 2026
e064700
chore(release): 2.7.0
jordanlambrecht Mar 31, 2026
ca6496d
fix: minor stuff
jordanlambrecht Mar 31, 2026
5345d62
chore(release): 2.7.1
jordanlambrecht Mar 31, 2026
b3b621b
feat(trackers): details for digitalcore and luminarr (thanks @DGeyzer)
jordanlambrecht Mar 31, 2026
a28d229
chore(release): 2.7.2
jordanlambrecht Mar 31, 2026
3c41fc5
feat(trackers): update user classes requirements for animez tracker
jordanlambrecht Mar 31, 2026
75fca6c
test(trackers): update API token limit check for non-avistaz tracker
jordanlambrecht Mar 31, 2026
18b5e85
chore(release): 2.7.3
jordanlambrecht Mar 31, 2026
546d824
style: css glow fix
jordanlambrecht Mar 31, 2026
459beee
refactor(sheets): simplified dialog handling
jordanlambrecht Mar 31, 2026
81198be
style: tweaked some neomorph stuff, gave a few charts a makeover
jordanlambrecht Apr 1, 2026
a1b4409
perf(api): clamp returned ints
jordanlambrecht Apr 1, 2026
8ea8ae9
test: update polling logic in tracker routes tests for atomic cooldow…
jordanlambrecht Apr 1, 2026
124de48
fix(nuke): reset backfill status after scrub and delete
jordanlambrecht Apr 1, 2026
3c84c7e
perf(dashboard): simplified snapshot handling for detectRankChanges
jordanlambrecht Apr 1, 2026
9144441
perf(alerts): better alert pruning
jordanlambrecht Apr 1, 2026
4e45f4d
perf(dashboard): better query handling
jordanlambrecht Apr 1, 2026
bb5e441
perf(schema): add brin index on polledAt for clientSnapshots
jordanlambrecht Apr 1, 2026
85ef6d0
test: alert test update
jordanlambrecht Apr 1, 2026
9a69d49
perf(auth): auth status projection
jordanlambrecht Apr 1, 2026
27e9a25
perf: tab hoisting
jordanlambrecht Apr 1, 2026
d05fa26
perf: slotContext cleanup
jordanlambrecht Apr 1, 2026
f144ec3
perf: guard flags to globalThis
jordanlambrecht Apr 1, 2026
e29d376
fix: emoji enum leak
jordanlambrecht Apr 1, 2026
a23eee1
perf: column projections for poll cycle and client routes
jordanlambrecht Apr 1, 2026
2e77cbc
perf: batch-fetch heartbeat clients, skip writes when healthy, merge …
jordanlambrecht Apr 1, 2026
7c57f10
perf: parallelize backup queries and drop cachedTorrents
jordanlambrecht Apr 1, 2026
4a6f353
perf: stop torrent polling on inactive tab, dedupe update check via T…
jordanlambrecht Apr 1, 2026
252ca7d
perf: memoize chart data transforms, lazy-load react-markdown
jordanlambrecht Apr 1, 2026
1a14aab
perf: return updated tracker from `PATCH` instead of requiring follow…
jordanlambrecht Apr 1, 2026
3a91b03
perf(auth): login parallelizationismer
jordanlambrecht Apr 1, 2026
86e8e31
perf: remove redundant sort
jordanlambrecht Apr 1, 2026
fc32b3f
perf: stable select reference
jordanlambrecht Apr 1, 2026
91617e6
perf: readonly return type on speed cache
jordanlambrecht Apr 1, 2026
bae70f0
perf: dashboard loader 3-query `Promise.all`
jordanlambrecht Apr 1, 2026
99175d5
perf(auth): parallel queries
jordanlambrecht Apr 1, 2026
7387b95
perf: unmount debug dialog on close
jordanlambrecht Apr 1, 2026
a3ec1f4
perf: useMemo for tracker theme colors
jordanlambrecht Apr 1, 2026
adb291b
feat: add `getFilteredTorrents` function
jordanlambrecht Apr 1, 2026
ee495d1
perf(tag-groups): batch tag-group save
jordanlambrecht Apr 1, 2026
8c0bffd
perf: torrent filtering, tab hoisting, barrel import fix
jordanlambrecht Apr 1, 2026
4d25bcd
fix: tag group batch validation
jordanlambrecht Apr 1, 2026
7fb6993
feat: retention notice! dashboard alert when unconfigured, setup wiza…
jordanlambrecht Apr 1, 2026
ed66f70
perf(dashboard): handle `PUT` request errors and resync dashboard set…
jordanlambrecht Apr 1, 2026
6f6030a
perf(settings): migrate settings components to tanstack
jordanlambrecht Apr 1, 2026
976eab0
feat(tracker platforms): add `metaFor` function and `PlatformMetaMap`…
jordanlambrecht Apr 1, 2026
fc4f05e
perf(db): create indexes for `tracker_snapshots`
jordanlambrecht Apr 1, 2026
071d197
perf(charts): disabled animation for `FleetSizeJitter` and `ParallelT…
jordanlambrecht Apr 1, 2026
420bf02
perf(tracker-info-tab): lazy markdown comp initialization
jordanlambrecht Apr 1, 2026
6939074
perf(events): optimized pagination
jordanlambrecht Apr 1, 2026
1e91fdb
chore: linting
jordanlambrecht Apr 2, 2026
8bd0dd2
chore: package bumps
jordanlambrecht Apr 2, 2026
8f7589a
chore(deps): bump next from 16.2.1 to 16.2.2
dependabot[bot] Apr 2, 2026
73769c6
Merge pull request #122 from jordanlambrecht/dependabot/npm_and_yarn/…
jordanlambrecht Apr 2, 2026
a49b748
chore: package bumps
jordanlambrecht Apr 2, 2026
57d10a4
chore: minor hygeine tweaks
jordanlambrecht Apr 2, 2026
eb39124
perf(dashboard): slimmed down dl client shape
jordanlambrecht Apr 4, 2026
a398ced
perf(fleet): server-side aggregation, sync store reads, JSONB slimming
jordanlambrecht Apr 5, 2026
7b55e70
chore: codebase organizaton
jordanlambrecht Apr 5, 2026
6d3da91
refactor: constants and shared helpers
jordanlambrecht Apr 6, 2026
6130e55
refactor: download client adapter system in prep for rtorrent
jordanlambrecht Apr 6, 2026
c751b6e
refactor: download client adapter system in prep for rtorrent
jordanlambrecht Apr 6, 2026
408575c
Merge branch 'development' of github.com:jordanlambrecht/tracker-trac…
jordanlambrecht Apr 7, 2026
0dbbdf9
chore: package bumps
jordanlambrecht Apr 7, 2026
24e3e95
chore: package bumps
jordanlambrecht Apr 7, 2026
2acf207
fix: ssr issue
jordanlambrecht Apr 7, 2026
87abaa0
feat(backups): security hardening
jordanlambrecht Apr 7, 2026
67e4517
fix(login): bug where submit button would reset styling
jordanlambrecht Apr 7, 2026
ac693e6
fix(security-audit): upper-bound pw length check
jordanlambrecht Apr 7, 2026
b3d253b
docs: formatting and simplification
jordanlambrecht Apr 7, 2026
a91ba8a
feat: better logging, less silent failures, more try/catches
jordanlambrecht Apr 7, 2026
561b4a4
feat: better API limits for snapshots
jordanlambrecht Apr 7, 2026
f903fff
fix(alerts): reject unknown alert types
jordanlambrecht Apr 7, 2026
d9121e5
fix(trackers): force unique ids and boost validation in PATCH handler
jordanlambrecht Apr 7, 2026
8b4c87a
test(security): add auth test for db-size route
jordanlambrecht Apr 7, 2026
de9a2f5
chore: biome ignore
jordanlambrecht Apr 7, 2026
6b2d6b4
fix(auth): reject pending/setup tokens in getSession function
jordanlambrecht Apr 8, 2026
8fc07f9
fix(backup): better validation for tracker baseUrl
jordanlambrecht Apr 8, 2026
303b3a3
ci: remove continue-on-error from dependency review step
jordanlambrecht Apr 8, 2026
a27f5bd
feat(scheduler): add SIGTERM handler
jordanlambrecht Apr 8, 2026
461589c
feat(security): add checks for adapter cookie injection and credentia…
jordanlambrecht Apr 8, 2026
e201804
feat(trackers): added support for DigitalCore (closes #111, closes #110)
jordanlambrecht Apr 8, 2026
1f105bf
chore: making gitguardian happy
jordanlambrecht Apr 8, 2026
e598228
chore(release): 2.8.0
jordanlambrecht Apr 8, 2026
25db38b
feat(charts): chart components now use useMemo
jordanlambrecht Apr 9, 2026
3b67a72
feat(fleet): added bucketed queries
jordanlambrecht Apr 9, 2026
f2d86b3
perf(charts): add 'sampling: lttb' to line charts
jordanlambrecht Apr 9, 2026
04c2540
perf(trackers): improve query structure
jordanlambrecht Apr 9, 2026
de4cd7b
perf(api): shared query options
jordanlambrecht Apr 9, 2026
4225252
chore(release): 2.8.1
jordanlambrecht Apr 9, 2026
78d2094
chore: pkg bumps
jordanlambrecht Apr 9, 2026
e9416a3
chore: package bumps
jordanlambrecht Apr 9, 2026
450bf7d
chore(release): 2.8.2
jordanlambrecht Apr 9, 2026
73285c3
fix(sidebar): filter and sort dropdowns were clipping
jordanlambrecht Apr 9, 2026
477b2a6
feat(logging): added classifyFetchError for better error messages
jordanlambrecht Apr 9, 2026
1ffe6fc
fix(proxy): proxy now works with test connection endpoint
jordanlambrecht Apr 9, 2026
b1ddf37
fix(trackers): tooltip extraction in parseAvistazProfile
jordanlambrecht Apr 9, 2026
ccb14c3
fix(circuit-breaker): reset consecutiveFailures on resume, add lastEr…
jordanlambrecht Apr 9, 2026
2b133e0
chore(release): 2.8.3
jordanlambrecht Apr 9, 2026
453a256
chore(ci): added scope rules to changelog gen
jordanlambrecht Apr 9, 2026
9d12dd6
feat(settings): log files now batch in the events tab
jordanlambrecht Apr 9, 2026
7cca5c5
feat: new "What's New" dialog
jordanlambrecht Apr 9, 2026
2ab4c50
chore(release): 2.8.4
jordanlambrecht Apr 9, 2026
a994854
fix: changelog now shows all missed releases not just latest
jordanlambrecht Apr 9, 2026
40e02b7
fix(trackers): add batch tolerance for overdue checks to prevent drift
jordanlambrecht Apr 9, 2026
a7fc921
chore(release): 2.8.5
jordanlambrecht Apr 9, 2026
aa81605
fix(trackers): profile parsing
jordanlambrecht Apr 9, 2026
56c0f87
chore(release): 2.8.6
jordanlambrecht Apr 9, 2026
d2a56c5
feat(trackers): detects truncated cookies
jordanlambrecht Apr 10, 2026
fcad954
fix(events): update event categories and improve error logging
jordanlambrecht Apr 10, 2026
28f89a9
fix(trackers): missing profile parsing items for AnimeZ
jordanlambrecht Apr 10, 2026
4ce4232
chore(release): 2.8.7
jordanlambrecht Apr 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
52 changes: 4 additions & 48 deletions .github/instructions/*.instructions.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copilot Instructions — Tracker Tracker
# Copilot PR Review Instructions

## Project

Expand All @@ -8,12 +8,6 @@ Self-hosted single-user dashboard for monitoring private tracker stats. Next.js

pnpm only. Never use npm or yarn. Node.js >= 22 required.

## Linting and Formatting

- Biome for linting (`pnpm lint` runs `pnpm tsc && biome check .`). No ESLint.
- Prettier for formatting (`pnpm format`). Biome's formatter is disabled.
- TypeScript strict mode. Check with `pnpm tsc`.

## File Conventions

- First line of every JS/TS file: `// relative/path/to/file.tsx`
Expand Down Expand Up @@ -79,10 +73,11 @@ Single-user app with master password auth. No third-party providers.
- **Public routes:** defined in `proxy.ts` as `PUBLIC_EXACT` and `PUBLIC_PREFIX` arrays. All other routes require the cookie.

Route handler pattern:

```ts
const auth = await authenticate()
if (auth instanceof NextResponse) return auth // 401
const key = decodeKey(auth) // Buffer
if (auth instanceof NextResponse) return auth // 401
const key = decodeKey(auth) // Buffer
// use key to decrypt DB fields
```

Expand All @@ -92,26 +87,8 @@ const key = decodeKey(auth) // Buffer
- Suppress findings with `// security-audit-ignore: <reason>` on the line above. A bare suppression without a reason is itself a critical failure.
- URL inputs are validated against SSRF via `isUnsafeNetworkHost()` in `src/lib/network.ts`.

## Design System

- Dark neumorphic aesthetic. No hex values in component files — use Tailwind semantic tokens.
- Depth: `nm-raised`, `nm-raised-sm` for raised elements. `nm-inset`, `nm-inset-sm` for recessed elements.
- Colors: `text-upload` (cyan), `text-download` (amber), `text-positive` (lime), `text-negative` (red).
- Per-tracker colors are the only allowed inline `style={{ backgroundColor }}` values.
- Chart colors come from `CHART_THEME` in `src/components/charts/lib/theme.ts`. Never hardcode hex in chart files.
- Typography: `font-mono` (JetBrains Mono) for data values. `font-sans` (Archivo) for UI text. Use `tabular-nums` on numeric data for column alignment.
- Chart axis labels use `textTertiary` (not `textMuted`). Chart tooltip HTML must escape user data with `escHtml()`.
- Border radius tokens: `rounded-nm-sm` (8px), `rounded-nm-md` (12px), `rounded-nm-lg` (20px), `rounded-nm-pill` (9999px).
- No shadcn/ui. This project uses a fully custom component library with `cva` (class-variance-authority) for variants and `clsx` for class merging.

## Component Patterns

- `StatCard` has 3 variants (basic, stacked, ring) — they render different JSX structures, not just different classes.
- `ProgressBar` in `src/components/ui/ProgressBar.tsx` — reusable neumorphic progress bar matching the Toggle track/knob depth pattern.
- `MarqueeText` for long torrent/tracker names instead of CSS `truncate`.
- `Tooltip` accepts `ReactNode` content, not just strings. Use JSX with `flex-col` for multi-line tooltips.
- Never use native `<input type="checkbox">` — use the `<Checkbox>` component.
- Never use native `<select>` — use the `<Select>` component.
- Component anatomy: internal sub-components are unexported functions within the file. Single public export at the bottom. Types exported with `export type { ... }`.
- Use React 19's ref-as-prop pattern (direct `ref` prop), not `forwardRef`.
- SVG path calculations with floating-point geometry should round to 2 decimal places for SSR hydration safety.
Expand All @@ -125,13 +102,6 @@ All module-level singletons (cron tasks, DB client, qBT SID cache) must be store
- Framework: Vitest.
- Test mocks must match real API response shapes. Do not add fields (i.e., `isPrivate: true`) that the real API does not return — this masks bugs.
- Do not add test-only methods to production classes. Put test utilities in test files.
- qBittorrent's API returns snake_case fields (`is_private`, `added_on`). The `QbtTorrent` TypeScript type uses camelCase for some fields but there is no automatic mapping — raw API responses have snake_case.

## Commit Messages

- Never mention AI, Claude, or LLMs in commit messages.
- Use conventional commits: `feat(scope):`, `fix(scope):`, `style(scope):`, `chore(scope):`.
- One-line commit messages only.

## Code Organization

Expand All @@ -142,23 +112,11 @@ All module-level singletons (cron tasks, DB client, qBT SID cache) must be store
## SSR / Hydration

- NEVER read `localStorage` in `useState` initializers — causes hydration mismatch. Initialize with a server-safe default, then hydrate in `useEffect`.
- Page components (`page.tsx`) should be thin wrappers. Business logic, UI sections, and data fetching belong in extracted components and hooks.

## Writing Style

- Always use "i.e." never "e.g." in comments, documentation, and UI text.
- Do not use em dashes, en dashes, curly quotes, or other non-ASCII punctuation in comments, strings, or error messages. Stick to plain ASCII: commas, periods, hyphens, straight quotes. IDEs and terminals choke on fancy Unicode punctuation.

## Adapter Pattern

- Tracker platforms use an adapter pattern: `TrackerAdapter` interface with `getAdapter()` factory. UNIT3D, Gazelle, and GGn are implemented. Adding a new platform means adding a new adapter file in `src/lib/adapters/`, not modifying existing ones.

## qBittorrent Integration

- The qBT Web API returns snake_case field names (`is_private`, `added_on`). The `QbtTorrent` TypeScript interface uses camelCase for some fields but `getTorrents()` returns raw JSON with NO field mapping. Do not assume camelCase fields exist on raw API responses.
- Tag matching must be case-insensitive. The aggregator lowercases map keys. `parseTorrentTags()` lowercases by default.
- The heartbeat loop (5s) must NOT update `lastPolledAt` — only the deep poll (5min) writes it. Otherwise the deep poll's overdue check never triggers.

## Precision Concerns

- Daily upload/download deltas are computed as BigInt subtraction. Converting daily deltas to Number for percentage calculations is safe — `Number.MAX_SAFE_INTEGER` (~9 PiB) vastly exceeds any realistic daily transfer. Do not over-engineer BigInt arithmetic for percentage computations on daily deltas.
Expand Down Expand Up @@ -191,7 +149,6 @@ All module-level singletons (cron tasks, DB client, qBT SID cache) must be store

## Things NOT to Do

- Do not use the terms "Production-Ready" or "Enterprise" anywhere.
- Do not use ESLint. It has been deprecated for this project.
- Do not use `npm` or `yarn` — `pnpm` only.
- Do not create raw SQL migration files. Use `drizzle-kit push`.
Expand All @@ -204,4 +161,3 @@ All module-level singletons (cron tasks, DB client, qBT SID cache) must be store
- Do not use `JSON.parse()` without a try/catch wrapper.
- Do not use `console.log` in API routes — use the `log` instance from `@/lib/logger`.
- Do not use `db.execute()` in API routes (raw SQL is banned except for the health check `SELECT 1`).
- Do not use function names like "enhanced", "wrapper", or "util" — be specific and descriptive.
1 change: 0 additions & 1 deletion .github/workflows/dependency-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ jobs:
- uses: actions/checkout@v6

- name: Review dependencies
continue-on-error: true
uses: actions/dependency-review-action@v4
with:
fail-on-severity: high
1 change: 1 addition & 0 deletions .github/workflows/dev-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ jobs:
context: .
push: true
platforms: linux/amd64,linux/arm64
build-args: NEXT_PUBLIC_RELEASE_CHANNEL=development
tags: |
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:development
docker.io/jordyjordy/tracker-tracker:development
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ docs/audit/
docs/superpowers/*
docs/superpowers/specs/
.claude/
CLAUDE.md
.history/
.vscode/
.serena/
Expand Down
6 changes: 5 additions & 1 deletion .prettierignore
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
# docs/**/*.md
docs/**/*.md
CHANGELOG.md
LICENSE
README.md
pnpm-lock.yaml
5 changes: 1 addition & 4 deletions .versionrc.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
{
"header": "# Changelog\n",
"skip": {
"tag": true
},
"writerOpts": {
"commitPartial": "- {{#if scope}}**{{scope}}:** {{/if}}{{#if subject}}{{{subject}}}{{else}}{{{header}}}{{/if}}{{~#if hash}} ({{#if @root.linkReferences}}[{{shortHash}}]({{@root.host}}/{{@root.owner}}/{{@root.repository}}/commit/{{hash}}){{else}}{{shortHash}}{{/if}}){{/if}}{{~#each references}}, closes {{#if @root.linkReferences}}[{{prefix}}{{issue}}]({{@root.host}}/{{@root.owner}}/{{@root.repository}}/issues/{{issue}}){{else}}{{prefix}}{{issue}}{{/if}}{{/each}}\n"
"commitPartial": "- {{#if scope}}**{{scope}}:** {{/if}}{{#if subject}}{{{subject}}}{{else}}{{{header}}}{{/if}}\n"
},
"types": [
{ "type": "feat", "section": "Features" },
Expand Down
Loading
Loading