This roadmap is optimized for AI-assisted development with context window efficiency in mind. Each phase is designed to be completable in a single session without requiring extensive context from previous phases.
- Self-contained phases - Each phase has clear inputs/outputs
- Minimal cross-phase dependencies - Read file structure, not conversation history
- Testable milestones - Each phase ends with something verifiable
- Progressive complexity - Simple foundations before complex detection
Session prompt: "Initialize the React Native project with TypeScript, React Native Paper, and the Dangerous Things theme system."
- None (greenfield)
- Initialize Expo project with TypeScript template
- Install core dependencies:
@anthropic-dangerous-things/react-native-theme(local link or npm)react-native-paperreact-native-safe-area-context@react-navigation/native+@react-navigation/native-stackreact-native-nfc-managerexpo-font(for Tektur)
- Install the DT theme package (
@dangerousthings/react-nativefrom npm, or../dt-design-system/packages/react-nativelocally) - Use DTThemeProvider from the theme package
colors.ts- DT color palettetypography.ts- Tektur font setuppaperTheme.ts- React Native Paper theme config
- Create basic navigation structure:
HomeScreen- Mode selection (just "Transponder to Implant" for now)ScanScreen- PlaceholderResultScreen- Placeholder
- Wrap app with providers (Paper, Navigation, SafeArea)
- Runnable app on both platforms
- DT-themed UI with working navigation
- No NFC functionality yet
npm run android # App launches with cyan/yellow theme
npm run ios # App launches with cyan/yellow themeSession prompt: "Implement the NFC service layer with platform permissions and the useScan hook."
- Phase 1 complete (check for
src/theme/paperTheme.ts)
- Configure Android NFC permissions:
AndroidManifest.xml- NFC permission + intent filters- Min SDK verification (21+)
- Configure iOS NFC entitlements:
- Add NFC capability in Xcode
Info.plist- Usage description + AID identifiers
- Create NFC service layer (
src/services/nfc/):NFCManager.ts- Wrapper with init/cleanup lifecycleplatforms.ts- Platform detection utilities
- Create scan hook (
src/hooks/useScan.ts):- States:
idle,scanning,success,error - Handle tag discovered callback
- Proper cleanup on unmount
- States:
- Update
ScanScreento use hook and display raw tag data
- NFC permissions working on both platforms
- Can detect any NFC tag and show UID
- Proper scan lifecycle management
- Scan any NFC tag → UID displayed
- Cancel scan → returns to idle state
- Error states shown for NFC disabled/permission denied
Session prompt: "Implement NTAG and MIFARE Classic detection with the chip identification framework."
- Phase 2 complete (check for
src/hooks/useScan.ts)
- Define detection types (
src/types/detection.ts):interface DetectionResult { chipType: ChipType; chipSubtype?: string; isCloneable: boolean; confidence: 'high' | 'medium' | 'low'; rawData: RawTagData; }
- Create detection framework (
src/services/detection/):detector.ts- Main orchestratortypes.ts- Chip type enums
- Implement NTAG detection (
src/services/detection/ntag.ts):- Send GET_VERSION (0x60)
- Parse response for 213/215/216/I2C variants
- Mark as cloneable
- Implement MIFARE Classic detection (
src/services/detection/mifare.ts):- Check SAK: 0x08 (1K), 0x18 (4K), 0x09 (Mini)
- Mark as cloneable
- Note Android-only for sector operations
- Update
ScanScreento show detection results
- NTAG213/215/216 correctly identified
- MIFARE Classic 1K/4K correctly identified
- Detection results displayed with chip info
- Scan NTAG215 → Shows "NTAG215, Cloneable: Yes"
- Scan MIFARE Classic 1K → Shows "MIFARE Classic 1K, Cloneable: Yes"
- Scan other tags → Shows "Unknown" with raw data
Session prompt: "Add detection for DESFire, MIFARE Plus, SLIX, and JavaCard chips."
- Phase 3 complete (check for
src/services/detection/ntag.ts)
- Implement ISO 14443-4 detection (
src/services/detection/iso14443.ts):- Parse ATS/historical bytes
- Route to specific detectors based on signatures
- Implement DESFire detection (
src/services/detection/desfire.ts):- Identify via ATS signature
- Send GET_VERSION for EV1/EV2/EV3 determination
- Mark as non-cloneable
- Implement MIFARE Plus detection:
- Security level detection if possible
- Mark as non-cloneable
- Implement ISO 15693 detection (
src/services/detection/iso15693.ts):- Get system info command
- Identify SLIX/SLIX2 variants
- Mark as cloneable
- Implement JavaCard detection (
src/services/detection/javacard.ts):- Parse historical bytes for JCOP signature
- GET DATA for CPLC
- AID probing for installed applets
- Mark as non-cloneable
- Handle platform differences gracefully:
- iOS: Use ISO 7816 wrapped commands
- Android: Use native tech classes
- All target chip types detected
- DESFire version (EV1/2/3) identified
- JavaCard identification via CPLC
- Platform-appropriate detection paths
- Scan DESFire EV2 → Shows "MIFARE DESFire EV2, Cloneable: No"
- Scan SLIX → Shows "SLIX, Cloneable: Yes"
- Scan J3R180 → Shows "JCOP4 (J3R180), Cloneable: No"
Session prompt: "Create the product catalog and matching algorithm, then build the results UI."
- Phase 4 complete (check for
src/services/detection/javacard.ts)
- Define product types (
src/types/products.ts):interface Product { id: string; name: string; compatibleChips: ChipType[]; description: string; features: string[]; formFactor: 'x-series' | 'flex' | 'other'; }
- Create product catalog (
src/data/products.ts):- xNT (NTAG216)
- xEM (T5577 - for EM/HID cloning)
- NExT (NTAG216 + T5577)
- xSIID (NTAG I2C + LED)
- xDF2 (DESFire EV2)
- flexDF2 (DESFire EV2 flex)
- xMagic (MIFARE Classic + Gen2 Magic)
- Apex (J3R180)
- Apex Flex (J3R180 flex)
- SLIX implants if available
- Implement matching algorithm (
src/services/matching/matcher.ts):- Match by chip type
- Rank by feature parity
- Handle cloneable vs native matches
- Create result components (
src/components/results/):TransponderInfo.tsx- Detected chip detailsProductMatch.tsx- Matching product cardNoMatchFound.tsx- Conversion service link
- Update
ResultScreenwith full flow
- Complete transponder-to-implant matching
- Product cards with descriptions
- "No match" redirects to dngr.us/conversion
- Scan NTAG215 → Shows xNT, NExT as matches
- Scan MIFARE Classic → Shows xMagic as match
- Scan unknown chip → Shows conversion link
Session prompt: "Add animations, error handling, and final UI polish for production readiness."
- Phase 5 complete (check for
src/services/matching/matcher.ts)
- Add scan animations:
- Pulsing scan indicator
- Success/failure transitions
- Card detection feedback
- Implement comprehensive error handling:
- NFC disabled state
- Permission denied flow
- Tag lost during scan
- Unsupported tag graceful fallback
- Add educational content:
- Chip type explanations
- Cloneability explanations
- "Why can't this be cloned?" info
- UI refinements:
- Beveled corner components (DT style)
- Proper loading states
- Empty states
- Platform testing:
- Test all chip types on Android
- Test all chip types on iOS (within CoreNFC limits)
- Edge case handling
- Production-ready UX
- Helpful error messages
- Educational chip information
- Consistent DT branding throughout
- Full flow feels polished
- Errors are helpful, not cryptic
- Works offline
- Matches DT website aesthetic
Details TBD with employer
- Local storage of past scans
- Favorites/bookmarks
- Direct product links (when store is live)
- Pricing display
If starting a new session mid-project:
-
Check current state:
ls src/services/detection/ # Which detectors exist? ls src/data/ # Product data present?
-
Identify phase:
- No
src/→ Start Phase 1 - No
useScan.ts→ Start Phase 2 - No
ntag.ts→ Start Phase 3 - No
javacard.ts→ Start Phase 4 - No
products.ts→ Start Phase 5 - All present → Phase 6 or done
- No
-
Read CLAUDE.md for technical context
-
Use phase-specific prompt from this document