TJ Droid is an Android-first Expo/React Native app for local field service organization. The product is local-first: there is no backend and no authentication. The main domains are Reports, Stopwatch, People, Territories, Settings, and Backup.
Current architecture:
- bootstrap in
index.jsandApp.tsx - navigation in
src/routes/index.tsx - screens in
src/screens - business logic and persistence in
src/controllers - shared components in
src/components - persistence via
src/services/AsyncStorageMethods.ts - theme via
src/contexts/Theme.tsx+styled-components
cmd /c yarn startcmd /c yarn androidcmd /c yarn androidnvmcmd /c yarn lint
Android builds:
cmd /c yarn apkcmd /c yarn bundlecmd /c yarn release
Notes:
- In the audited environment, running
yarndirectly in PowerShell failed due to policy. Prefercmd /c yarn .... - The repository does not have an
ios/folder, even though theiosscript exists.
Minimum validation:
- run
cmd /c yarn lint
Additional validation when applicable:
- open the changed flow on Android
- if storage is changed, validate reading old data
- if backup is changed, generate and restore a
.zip - if stopwatch is changed, validate start, pause, resume, and stop
- if native Android is changed, validate Android build
Known baseline from audit 2026-04-03:
lintpasses with existing warnings; do not assume a clean baseline
- Domain changes must go through existing controllers.
- Do not access
@tjdroid:*directly from a screen if a domain controller already exists. - Preserve current formats:
- UI:
dd/MM/yyyyandHH:mm - storage: ISO dates when persisted as events
- monthly logical key:
moment(...).locale("pt").format("MMMM yy")
- UI:
- New text must be added to i18n.
- New colors/styles must come from the theme when they are part of the main UI.
- If a mutation affects persisted data, evaluate backup/restore impact.
- Storage keys
@tjdroid:* - Persisted structures in
src/types - Central save flow in
Header - Persisted stopwatch state in
CronometroComp relatoriosControllerlogic that correlates reports with people- Android signing, Firebase, and Manifest files
Especially sensitive areas:
src/components/Header/index.tsxsrc/components/CronometroComp/index.tsxsrc/controllers/territoriosController.tssrc/controllers/relatoriosController.tssrc/controllers/pessoasController.tssrc/controllers/backupController.ts
expo-routeris installed/configured, but it is not the current real navigationandroid/app/google-services.jsonis required locally and ignored by gitandroid/gradle.propertiescontains release signing configuration
A task in this repository should only be considered done when:
- the change respects the domain controller/flow
- it does not break existing storage formats
- i18n was updated if there is new text
- theme was respected if there is new UI
- backup was considered if persisted data changed
cmd /c yarn lintwas executed- residual risks were explicitly stated if manual validation was not enough
- Identify the affected domain.
- Read the corresponding screen and controller before editing.
- Map involved storage keys, types, and navigation.
- Discover whether the flow passes through
Header,Contador, orVisitBox. - Implement the smallest coherent change following the existing pattern.
- Validate the functional flow and run lint.
In the current project state, AGENTS.md is enough for most tasks. A skill or sub-agent should only be created if real repetition appears in:
- Android/Firebase build diagnostics
- backup and storage migration checklist
- recurring screen implementation that reuses
Header,VisitBox, andContador