Skip to content

Feature/v3.0.0#74

Merged
taylorcox75 merged 89 commits into
mainfrom
feature/v3.0.0
Mar 28, 2026
Merged

Feature/v3.0.0#74
taylorcox75 merged 89 commits into
mainfrom
feature/v3.0.0

Conversation

@taylorcox75
Copy link
Copy Markdown
Owner

Lots of stuff that honestly I’m just too lazy to type so see the change log

cursoragent and others added 30 commits March 14, 2026 08:43
Covers 5 categories across 40+ actionable items:
- Architectural improvements (feature-based structure, TanStack Query, API client)
- Maintainability (mega-component decomposition, i18n, tests, linting, error handling)
- Performance (memoization, FlashList, Reanimated migration, context optimization)
- Design gaps (7 critical bugs, accessibility, Android compat, type safety)
- Missing features (RSS, search, scheduling, notifications, API key auth, widgets)

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Apollo/Things 3-inspired redesign plan covering:
- Honest critique of current UI (rainbow buttons, mixed design languages, no hierarchy)
- New design system (4 semantic colors, SF Pro typography, grouped inset lists)
- Screen-by-screen redesign for all 6 screens
- Interaction & motion design (springs, haptics, swipe gestures, native context menus)
- 7 specific 'wow factor' moments (shared element transitions, completion celebration, etc.)
- Phased implementation roadmap (4 phases, ~10 weeks)

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Identifies specific landmines in the redesign plan:
- Onboarding is dead code (not wired up, no route gate)
- Color reduction would break the color picker contract + user overrides
- SF Symbols swap requires native deps (kills Expo Go workflow)
- 180+ relative imports make file restructuring high-risk
- Alert.prompt is used in 13 places (all broken on Android)
- FlashList + TorrentCard local state = recycling bugs
- Proposes safe 5-wave implementation order with golden rule

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Identifies 9 problems that slow down AI coding agents:
- 10 files over 900 lines (settings.tsx is 1957 lines)
- No AGENTS.md or .cursorrules
- Untyped preferences bag (Record<string, any>)
- Zero tests (no verification loop)
- 7 duplicated code patterns
- Implicit contracts (string keys, no enums)
- No file-level documentation
- No path aliases (relative import errors)
- 15 dead/unused files wasting context window

Proposes top 5 actions ordered by impact-per-effort

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Replaces plan.md, v3-redesign.md, v3-risks.md, ai-maintainability.md
with a single PLAN.md organized into:

Phase 1 (AI infrastructure): 9 parallelizable tasks
  - AGENTS.md, typed preferences, path aliases, bug fixes,
    Alert.prompt→InputModal, deduplication, file headers, tests, linting

Phase 2 (UI redesign): 7 parallelizable tasks
  - Design system, TorrentCard, torrent detail, swipe actions,
    FAB removal, transfer screen, settings sub-screens

Phase 3 (architecture): 5 tasks
  - Import migration, type safety, i18n, TanStack Query, dead code

Each task includes: files to read, files to modify, risks, acceptance criteria.
Appendices cover future features and risk quick-reference.

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
- Dead code files are deleted outright, not moved to _unused/. Git history preserves them.
- Added naming conventions section: PascalCase components, camelCase utils, kebab-case services, tests/ at root (not __tests__/)
- Explained (tabs) is Expo Router framework syntax, not a naming choice
- Updated AGENTS.md template and test task to match conventions

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Critical fixes:
1. Task 2.2 removed context menu with NO replacement — now specifies ActionMenu.tsx
   (a bottom-anchored modal, no native modules needed)
2. Task 1.5 / 2.2 conflict — skip TorrentCard Alert.prompt fix (2.2 rewrites it)
3. Added missing Confetti hooks-in-loop fix (Task 1.4e)
4. Added missing ActionSheetIOS Android fix (Task 1.4f)
5. Added missing react-native-gesture-handler install (Task 1.4g)
6. Phase 2 tasks are NOT independent — added dependency graph
7. New code must use @/ aliases immediately (not wait for Task 3.1)
8. Settings sub-screens may need _layout.tsx for Expo Router
9. Task 1.7 scoped to files >200 lines only (was all 70 files)
10. Added QuickConnectPanel to Task 1.6 dedup (was only utility functions)

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
- iOS-first clarification:
  - Task 1.4c removed (haptics iOS guard is intentional)
  - Task 1.4f removed (ActionSheetIOS acceptable; also dead code)
  - Alert.prompt critical rule softened to preference for InputModal
  - expo-* packages (incl. expo-symbols) explicitly approved
  - Native module risk updated: expo-* OK, third-party need approval
  - Task 2.2 context menu note updated (no longer blocked)
  - AGENTS.md Cursor Cloud instructions updated for iOS-first

- Factual corrections from codebase grep:
  - Alert.prompt: 14 total (TorrentDetails has 6, not 5); Task 1.5 = 13 callsites
  - react-native-gesture-handler: imported in 1 component, not 2
    (DraggableTorrentList does not import it directly)
  - ActionSheetIOS showTrackerMenu is dead code (never called from JSX)
    — moved cleanup to Task 3.5

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
…ace from app name

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
… in TorrentContext

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
…Ref-in-loop with useMemo

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
… dependencies

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
…entDetails.tsx

- Added allowEmpty prop to InputModal to support '0' for unlimited values
- Replaced 7 Alert.prompt calls in app/torrent/[hash].tsx:
  handleSetDownloadLimit, handleSetUploadLimit, handleSetCategory,
  handleAddTags, handleRemoveTags, handleSetLocation, handleRenameTorrent
- Replaced 6 Alert.prompt calls in components/TorrentDetails.tsx:
  handleAddCategory, handleShareLimit, handleSetLocation,
  handleRenameTorrent (handleSetName), handleAddPeers, handleRenameFile
- Used keyboardType='numeric' for limit inputs
- Used allowEmpty for limit/category inputs that accept empty/zero
- Skipped TorrentCard.tsx (rewritten in Task 2.2)

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
…TAR_PALETTE

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
…and getStateLabel

Reconciled from three diverged implementations:
- TorrentCard.tsx (switch-based, most complete — used as base)
- torrent/[hash].tsx (if-else chain, string-based matching)
- ExpandableTorrentCard.tsx (ternary chain, color only)

Colors passed as parameter to avoid hook dependency.

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Extracted the 'not connected' server list UI duplicated in both
index.tsx and transfer.tsx. Uses useTranslation() for all strings
(transfer.tsx had hardcoded English). Takes onConnect and onAddServer
callbacks.

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Replaced 3 duplicated inline network-error checks with a single
exported isNetworkError(error) function.

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
- index.tsx: Replaced inline avatarColor/serverAddress/AVATAR_PALETTE
  and ~100 lines of quick-connect JSX with QuickConnectPanel
- transfer.tsx: Same — removed avatarColorT/serverAddressT and
  ~100 lines of quick-connect JSX
- [hash].tsx: Import getStateColor/getStateLabel from utils/torrent-state
- TorrentCard.tsx: Import getStateColor/getStateLabel from utils/torrent-state
- ExpandableTorrentCard.tsx: Import getStateColor from utils/torrent-state

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
…heme manager

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
cursoragent and others added 28 commits March 14, 2026 11:39
…mport in [hash].tsx

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
…ish placeholders

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
- Removed deprecated eslint v8, @typescript-eslint/parser, @typescript-eslint/eslint-plugin,
  eslint-plugin-react (not needed for RN), eslint-plugin-react-hooks v4
- Installed eslint v9, @eslint/js, typescript-eslint, eslint-plugin-react-hooks v5,
  eslint-config-prettier (current versions)
- Converted .eslintrc.js to eslint.config.js (ESLint v9 flat config format)
- Pre-existing code patterns set to warn (not error): react-hooks/refs,
  immutability, purity, set-state-in-effect, preserve-caught-error
- 0 errors, 125 warnings (all pre-existing)

Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Initial plan

* Implement all 6 issues from IMPLEMENTATION_PLAN.md

Issue 1: Alt speed limits shown in transfer screen with ALT badge
Issue 2: Pause/resume button on torrent cards
Issue 3: Full-width progress bar, percent+ETA in status line
Issue 4: Pause-on-add syncs with server preference
Issue 5: Expanded card view with detail rows
Issue 6: Search bar reordered (Sort | Search | Add)

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* Address code review feedback: rename variable, extract helper, use async/await

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* Update IMPLEMENTATION_PLAN.md with completion status and remaining gaps

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* fix: downgrade @eslint/js from ^10.0.1 to ^9.18.0 to resolve ERESOLVE conflict with eslint 9.x

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* fix: show verified bytes for "Downloaded" instead of raw wire bytes (#59)

* Initial plan

* fix: use torrent.completed instead of torrent.downloaded for Downloaded display

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* merge PLAN.md and IMPLEMENTATION_PLAN.md into single consolidated document

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* UX: state-colored progress bars, alt speed subtitle, Apple-style tags modal (#60)

* Initial plan

* Add TagsModal, show alt speed limits subtitle, progress bar already uses state colors

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Initial plan

* Implement all 6 issues from IMPLEMENTATION_PLAN.md

Issue 1: Alt speed limits shown in transfer screen with ALT badge
Issue 2: Pause/resume button on torrent cards
Issue 3: Full-width progress bar, percent+ETA in status line
Issue 4: Pause-on-add syncs with server preference
Issue 5: Expanded card view with detail rows
Issue 6: Search bar reordered (Sort | Search | Add)

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* Address code review feedback: rename variable, extract helper, use async/await

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* Update IMPLEMENTATION_PLAN.md with completion status and remaining gaps

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* fix: downgrade @eslint/js from ^10.0.1 to ^9.18.0 to resolve ERESOLVE conflict with eslint 9.x

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* Initial plan

* Add TagsModal, show alt speed limits subtitle, progress bar already uses state colors

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* Fix merge conflict: remove IMPLEMENTATION_PLAN.md consolidated into PLAN.md (#62)

* Initial plan

* Fix merge conflict: delete IMPLEMENTATION_PLAN.md (consolidated into PLAN.md on base branch)

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
…r/codebase-improvement-plan-8686 (#63)

* Initial plan

* Initial plan for detailed torrent view fixes

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* Fix detailed torrent view formatting and settings toggle logic

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* Merge cursor/codebase-improvement-plan-8686 and resolve all conflicts

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* Remove orphaned compactCardView locale keys

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
…esponsive toggles (#65)

* Initial plan

* Update torrent detail: merge tags UI, category badge, reannounce icon, optimistic toggles, toast on reannounce

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

* Fix toggle re-entry guards and remove dead handleRemoveTags handler

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
…nimation feedback (#67)

* Initial plan

* Fix alt-speed display, category UI, and reannounce animation

- Issue 2: Fix alt-speed display showing Unlimited when a limit IS set.
  getEffectiveLimit now passes dl/up_rate_limit directly (already reflects
  alt limits when active). formatAltLimitLabel uses rate limits when alt
  speed is on, prefs values when off.
- Issue 1: Replace Category Alert.alert with OptionPicker (same custom-modal
  style as TagsModal). Both the Quick Actions button and the inline Category
  button in the General Info section now call handleSetCategory -> OptionPicker.
  Add New Category… is a special picker entry that opens InputModal.
- Issue 3: Add spinning Animated.View around the refresh icon on the
  Reannounce button so users see visual confirmation when the action fires.

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Initial plan

* Fix speed limit display when alt speed ON; add more stats to detailed card view

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Initial plan

* Fix alt speed limit display; add UI to edit alternative speed limit values

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
)

* Initial plan

* Fix alt upload limit not updating: use correct preferences key alt_ul_limit

Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
@taylorcox75 taylorcox75 merged commit 159beaa into main Mar 28, 2026
@taylorcox75 taylorcox75 deleted the feature/v3.0.0 branch March 31, 2026 09:34
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.

4 participants