Feature/v3.0.0#74
Merged
Merged
Conversation
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>
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Lots of stuff that honestly I’m just too lazy to type so see the change log