38 KiB
38 KiB
Mobile Progress
Last updated: 2026-05-05
This file is the resumable working log for Tolaria mobile. The strategy and roadmap live in MOBILE_STRATEGY.md; this file records the current execution state.
Current State
- Branch:
codex/mobile - Active phase: Phase 4 - Editor V1
- Active slice: Markdown editor durability and frontmatter round-trip
- Push policy: commit locally; do not push unless explicitly requested
- Validation target: iPad/iOS simulator first
Completed
- Created high-fidelity iPhone mobile mockups in
design/mobile-mockups/. - Documented the production mobile strategy in
docs/MOBILE_STRATEGY.md. - Installed and authenticated Codacy MCP for this Codex environment.
- Confirmed Codacy MCP can access
refactoringhq/tolaria. - Recorded GitHub OAuth App as the first mobile GitHub auth path.
- Created ADR-0109 for Expo React Native production mobile.
- Superseded ADR-0005, the earlier Tauri iOS prototype ADR.
- Created
@tolaria/markdownas the first shared workspace package. - Moved
compactMarkdownintopackages/markdownand kept the existing desktop import path as a compatibility export. - Added package-local Vitest and TypeScript scripts for the shared Markdown package.
- Added
scripts/run-tests.mjssopnpm testruns desktop and shared-package tests, while targeted test arguments remain targeted. - Updated the pre-commit branch guard to allow local commits on
codex/mobilefor this isolated mobile worktree. - Split
src/utils/wikilinks.tsinto shared@tolaria/markdownmodules for frontmatter, wikilink block transforms, outgoing links, backlink context, snippets, and word counts. - Moved note-title derivation helpers into
@tolaria/markdown, leaving the existing desktop import path as a compatibility export. - Added
apps/mobileas an Expo React Native workspace package. - Added root mobile scripts:
mobile:start,mobile:ios,mobile:test, andmobile:typecheck. - Configured Expo for a universal light-mode app with a development bundle identifier (
com.tolaria.mobile.dev) and iPad support enabled. - Added the first iPad-first/phone-ready shell using fixture notes, shared Markdown title/snippet helpers, Phosphor React Native icons, and responsive panels for sidebar, note list, editor, and properties.
- Split mobile styles into small panel-specific StyleSheet modules so new mobile code starts at CodeScene
10.0. - Pinned Expo runtime dependencies to the versions expected by Expo 55 after the initial generated versions failed iOS bundle export (
react-native@0.83.6,react@19.2.0, matching safe-area/svg versions). - Extracted compact phone navigation into a pure tested state machine so future swipe gestures can dispatch explicit events instead of mutating panels ad hoc.
- Extracted mobile note projection into a pure module that turns raw vault-like note records into the list/editor shape used by the mobile shell.
- Added a minimal mobile vault repository contract plus fixture implementation so app-local vault storage and git sync can plug in behind
listNotes/readNotelater. - Updated
scripts/run-tests.mjsso fullpnpm testruns desktop, mobile, and shared package tests, while targetedapps/mobile/...andpackages/markdown/...paths route to the correct workspace Vitest config. - Updated
.husky/pre-committo usepnpm test -- --silentso local commits include the new mobile test suite. - Added
react-native-gesture-handlerat Expo's SDK-compatible version. - Wrapped the mobile root in
GestureHandlerRootView. - Added a tested compact gesture mapper and
SwipeSurfacewrapper so phone panels can transition through swipe gestures while keeping panel behavior in the reducer. - Re-tested the iPad simulator path; the app now launches in Expo Go on
iPad Pro 13-inch (M4). - Added a pure mobile Git remote parser that codifies the auth choice: GitHub remotes use the GitHub OAuth App path, arbitrary Git remotes use the SSH-key path.
- Added a pure mobile vault configuration model that keeps vault storage app-local, distinguishes local-only vs remote-backed sync, and derives the required Git auth path from the parsed remote.
- Extracted the mobile editor surface behind
MobileEditorAdapterwith a tested document projection so TenTap can replace the placeholder surface without changing shell navigation. - Installed TenTap and Expo-compatible
react-native-webview, then wired TenTap intoMobileEditorAdapterwith tested HTML generation from the mobile editor document projection. - Created ADR-0110 for the TenTap mobile editor spike and its acceptance gates.
- Added a TenTap draft callback boundary that captures editor HTML but explicitly marks it non-persistable until Markdown serialization exists, preventing HTML from becoming canonical vault content by accident.
- Added the first supported TenTap HTML-to-Markdown serializer for H1, paragraph, and unordered-list output; unsupported HTML remains blocked from persistence.
- Added a mobile vault storage driver contract plus memory implementation, and connected the mobile vault repository to app-local markdown files behind that storage interface.
- Added Expo FileSystem as the first app-local mobile vault storage implementation behind the storage driver contract.
- Created ADR-0111 to record the mobile filesystem dependency and app-local vault storage path.
- Added a mobile vault seeding boundary that writes starter Markdown files only when the app-local vault is empty.
- Wired the mobile shell to load its starter notes through the native Expo FileSystem storage driver and stored repository path, with fixture notes retained as the fallback while storage initializes.
- Expanded supported TenTap HTML serialization to include H1-H6 headings, ordered lists, task-list markers, inline strong/emphasis/code, and links while continuing to block unsupported block HTML.
- Split the mobile editor HTML serializer into its own CodeScene-10 module so the draft boundary stays small.
- Added a mobile editor draft save boundary that writes persistable canonical Markdown drafts to vault storage and refuses blocked drafts.
- Wired mobile editor draft changes to the app-local demo vault save path and added visible editor save states: Ready, Saving, Saved, Blocked, and Save failed.
- Split editor save-state styles into a separate style module to keep mobile style files at CodeScene
10. - Added a debounced mobile autosave queue that coalesces rapid TenTap draft changes, marks edited drafts as queued, and ignores stale save results when newer drafts supersede them.
- Refreshed the in-memory mobile note projection after the latest successful editor save so the note list, editor source, properties words, and snippets update from canonical Markdown.
- Added the first app-local mobile note creation path and wired the compose button to write a new Markdown note, prepend it to the current list, and select it through the shared compact navigation reducer.
- Added create-note UX state so the compose button disables during app-local creation and displays a compact failure message if storage creation fails.
- Added a title-entry prompt for mobile note creation so new notes are named before they are written to app-local storage.
- Added app-managed mobile state storage for the active vault and last selected note, then restored and persisted note selection across launches.
- Added delete support for app-managed mobile notes through the storage driver, Expo FileSystem adapter, repository boundary, demo vault facade, and editor toolbar.
- Extracted mobile note deletion orchestration into a small hook so the app shell stays at CodeScene
10.0. - Added app-local mobile vault metadata and metadata storage boundaries so vault id/name/remote URL can live in persisted app state instead of being hardcoded in the app shell.
- Replaced the demo vault's hardcoded identity with the shared default vault metadata boundary.
- Wired mobile runtime loading through the persisted vault metadata catalog boundary, so app state, note loading, autosave, note creation, and deletion all operate against the active vault metadata.
- Extracted runtime loading into a hook plus tested pure loader to keep
MobileApp.tsxat CodeScene10.0. - Added first-class runtime vault load failure state with a visible retry notice in the note list, replacing the previous silent failure path.
- Completed the Phase 3 app-managed vault storage path for the current single-vault mobile app: app-local metadata, seeded markdown files, note listing, open, autosave, create, delete, last selection restore, runtime retry, and iPad/iPhone simulator render validation.
- Deferred archive as a first-class mobile note state until the mobile vault schema/frontmatter model is explicit; implementing archive now as file movement would create throwaway semantics that may conflict with desktop-compatible metadata.
- Added mobile frontmatter metadata parsing for stored markdown notes, including type, icon, date, and inline tags, so app-local vault scans can project note metadata instead of hardcoding every stored note as a generic file.
- Added mobile frontmatter serialization helpers that can create/update supported type/status/date/icon/tags fields while preserving unknown metadata lines.
- Added a mobile frontmatter save boundary that updates persisted note metadata through the vault storage driver and exposes the same path through the demo vault facade for future properties UI calls.
Next Action
Continue Phase 4 with editor durability:
- Wire the mobile properties panel to the frontmatter save boundary for type/date/status/icon/tags.
- Expand TenTap Markdown serialization coverage for common writing constructs and preserve unsupported blocks without corrupting files.
- Add simulator interaction coverage for create/open/edit/autosave/delete using a development-client path or another route that avoids Expo Go's overlay controls.
Verification Log
tool_searchexposed Codacy MCP tools after Codex restart.codacy_get_repository_with_analysissucceeded forrefactoringhq/tolaria.- Current branch verified as
codex/mobile. - CodeScene before extraction:
src/utils/compact-markdown.tsscored10. - CodeScene after extraction:
packages/markdown/src/compactMarkdown.tsscored10;packages/markdown/src/compactMarkdown.test.tsscored10; tiny export/config files returned no scorable code and no findings. pnpm --filter @tolaria/markdown testpassed: 29 tests.pnpm --filter @tolaria/markdown typecheckpassed.pnpm test -- src/utils/compact-markdown.test.tspassed and ran only that desktop test file: 29 tests.pnpm testpassed and ran the full desktop suite plus package tests: 309 desktop test files / 3639 desktop tests, then 29 package tests.pnpm lintpassed with one pre-existing warning insrc/components/tolariaBlockNoteSideMenu.tsx.npx tsc --noEmitpassed.pnpm buildpassed.- CodeScene before wikilink extraction:
src/utils/wikilinks.tsscored9.09. - CodeScene after wikilink extraction: new shared wikilink/frontmatter/content files scored
10; small export surfaces returned no scorable code and no findings. pnpm --filter @tolaria/markdown testpassed after wikilink extraction: 40 tests.pnpm test -- src/utils/wikilinks.test.ts src/utils/noteTitle.test.tspassed: 91 desktop tests.pnpm --filter @tolaria/markdown typecheckpassed after wikilink extraction.pnpm lint,npx tsc --noEmit, andpnpm buildpassed after wikilink extraction.- CodeScene before note-title extraction:
src/utils/noteTitle.tsscored9.68. - CodeScene after note-title extraction:
packages/markdown/src/noteTitle.tsandpackages/markdown/src/noteTitle.test.tsscored10; the desktop compatibility export returned no scorable code and no findings. pnpm --filter @tolaria/markdown testpassed after note-title extraction: 56 tests.pnpm test -- src/utils/noteTitle.test.tspassed: 14 desktop tests.pnpm --filter @tolaria/markdown typecheckpassed after note-title extraction.pnpm --filter @tolaria/mobile typecheckpassed.pnpm --filter @tolaria/mobile testpassed: 1 file / 2 tests.pnpm --filter @tolaria/mobile exec expo install --checkpassed after pinning Expo-compatible dependency versions.pnpm --filter @tolaria/mobile exec expo config --type publicpassed and shows iOS bundle identifiercom.tolaria.mobile.dev, Android packagecom.tolaria.mobile.dev, andsupportsTablet: true.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed and produced the iOS bundle.pnpm lintpassed with one pre-existing warning insrc/components/tolariaBlockNoteSideMenu.tsx.npx tsc --noEmitpassed.pnpm testpassed after the mobile scaffold: 309 desktop test files / 3639 desktop tests plus 56 shared package tests.- CodeScene mobile shell scores:
apps/mobile/App.tsx,apps/mobile/src/MobileApp.tsx,apps/mobile/src/NamedIcon.tsx,apps/mobile/src/demoData.ts,apps/mobile/src/demoData.test.ts, and all scorable style modules scored10; tiny config/export/theme files returned no scorable code. - CodeScene pre-commit safeguard passed for the current change set.
- Codacy MCP can read repository analysis and security items for
refactoringhq/tolaria; local Codacy CLI analysis is currently blocked because the Codacy CLI binary is not installed in this environment. - iOS simulator validation was initially blocked locally: Xcode is installed (
Xcode 26.3), butxcrun simctl list ...hung indefinitely even after opening/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app. pnpm --filter @tolaria/mobile testpassed after compact navigation extraction: 2 files / 6 tests.pnpm --filter @tolaria/mobile typecheckpassed after compact navigation extraction.- CodeScene after compact navigation extraction:
apps/mobile/src/compactNavigation.ts,apps/mobile/src/compactNavigation.test.ts, and the touchedapps/mobile/src/MobileApp.tsxscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after compact navigation extraction.pnpm --filter @tolaria/mobile testpassed after note projection extraction: 3 files / 8 tests.pnpm --filter @tolaria/mobile typecheckpassed after note projection extraction.- CodeScene after note projection extraction:
apps/mobile/src/mobileNoteProjection.tsandapps/mobile/src/mobileNoteProjection.test.tsscored10;apps/mobile/src/demoData.tsreturned no scorable code and no findings. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after note projection extraction.pnpm --filter @tolaria/mobile testpassed after mobile vault repository extraction: 4 files / 11 tests.pnpm --filter @tolaria/mobile typecheckpassed after mobile vault repository extraction.- CodeScene after mobile vault repository extraction:
apps/mobile/src/mobileVaultRepository.tsandapps/mobile/src/mobileVaultRepository.test.tsscored10;apps/mobile/src/demoData.tsstill returned no scorable code and no findings. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after mobile vault repository extraction.pnpm test -- apps/mobile/src/mobileVaultRepository.test.tspassed and ran only the mobile repository test file.pnpm test -- packages/markdown/src/noteTitle.test.tspassed and ran only the shared Markdown note-title test file.pnpm test -- --silentpassed after runner/hook updates: 309 desktop files / 3639 desktop tests, 4 mobile files / 11 mobile tests, 3 shared Markdown files / 56 shared tests.- CodeScene after test-runner update:
scripts/run-tests.mjsscored10;.husky/pre-commitis unsupported by CodeScene file analysis because it has no supported extension. xcrun simctl list devices availablenow responds with available iPhone/iPad devices.xcrun simctl boot 40724AA3-A793-41D8-9C66-79745DA28DE4bootediPad Pro 13-inch (M4).pnpm --filter @tolaria/mobile exec expo start --iosinstalled/opened Expo Go and launched Tolaria on the booted iPad simulator.- Simulator screenshot captured at
/tmp/tolaria-mobile-ipad.png; the Tolaria shell renders behind Expo Go's first-run tools modal. pnpm --filter @tolaria/mobile testpassed after adding gesture support: 5 files / 15 tests.pnpm --filter @tolaria/mobile typecheckpassed after adding gesture support.- CodeScene after gesture support:
apps/mobile/src/compactGestures.ts,apps/mobile/src/compactGestures.test.ts,apps/mobile/src/SwipeSurface.tsx, touched app/root files, and touched style module scored10;apps/mobile/index.tsreturned no scorable code. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after adding gesture support.- Simulator screenshot after gesture support captured at
/tmp/tolaria-mobile-gestures-ipad.png; no red runtime error overlay appeared. pnpm --filter @tolaria/mobile testpassed after Git remote auth parsing: 6 files / 20 tests.pnpm --filter @tolaria/mobile typecheckpassed after Git remote auth parsing.- CodeScene after Git remote auth parsing:
apps/mobile/src/mobileGitRemote.tsandapps/mobile/src/mobileGitRemote.test.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after Git remote auth parsing.pnpm --filter @tolaria/mobile test -- src/mobileVaultConfig.test.tspassed after vault config extraction: 7 files / 24 tests.pnpm --filter @tolaria/mobile typecheckpassed after vault config extraction.- CodeScene after vault config extraction:
apps/mobile/src/mobileVaultConfig.tsandapps/mobile/src/mobileVaultConfig.test.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after vault config extraction.pnpm --filter @tolaria/mobile test -- src/mobileEditorDocument.test.tspassed after editor adapter extraction: 8 files / 27 tests.pnpm --filter @tolaria/mobile typecheckpassed after editor adapter extraction.- CodeScene after editor adapter extraction:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/MobileEditorAdapter.tsx,apps/mobile/src/mobileEditorDocument.ts, andapps/mobile/src/mobileEditorDocument.test.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after editor adapter extraction.- TenTap package check:
@10play/tentap-editor@1.0.1requiresreact,react-native, andreact-native-webview; Expo installedreact-native-webview@13.16.0. pnpm --filter @tolaria/mobile test -- src/mobileEditorDocument.test.tspassed after TenTap wiring: 8 files / 28 tests.pnpm --filter @tolaria/mobile typecheckpassed after TenTap wiring.- CodeScene after TenTap wiring:
apps/mobile/src/MobileEditorAdapter.tsx,apps/mobile/src/mobileEditorDocument.ts,apps/mobile/src/mobileEditorDocument.test.ts, andapps/mobile/src/styles/editorStyles.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after TenTap wiring; iOS bundle size is now about 11 MB and includes TenTap toolbar assets.pnpm --filter @tolaria/mobile exec expo start --ios --clearlaunched oniPad Pro 13-inch (M4); screenshot captured at/tmp/tolaria-mobile-tentap-ipad.png. The app rendered with the TenTap-backed editor behind Expo Go's first-run Tools modal and no red runtime error overlay appeared.pnpm test -- src/components/SearchPanel.test.tsxpassed after a transient full-hook failure in the unrelated desktop SearchPanel arrow-key test.pnpm --filter @tolaria/mobile test -- src/mobileEditorDocument.test.tspassed after the TenTap draft boundary: 8 files / 29 tests.pnpm --filter @tolaria/mobile typecheckpassed after the TenTap draft boundary.- CodeScene after the TenTap draft boundary:
apps/mobile/src/MobileEditorAdapter.tsx,apps/mobile/src/mobileEditorDocument.ts, andapps/mobile/src/mobileEditorDocument.test.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after the TenTap draft boundary.pnpm --filter @tolaria/mobile test -- src/mobileEditorDraft.test.ts src/mobileEditorDocument.test.tspassed after supported Markdown serialization: 9 files / 32 tests.pnpm --filter @tolaria/mobile typecheckpassed after supported Markdown serialization.- CodeScene after supported Markdown serialization:
apps/mobile/src/mobileEditorDraft.ts,apps/mobile/src/mobileEditorDraft.test.ts,apps/mobile/src/mobileEditorDocument.ts, andapps/mobile/src/MobileEditorAdapter.tsxscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after supported Markdown serialization.pnpm --filter @tolaria/mobile test -- src/mobileVaultStorage.test.ts src/mobileVaultRepository.test.tspassed after storage boundary extraction: 10 files / 35 tests.pnpm --filter @tolaria/mobile typecheckpassed after storage boundary extraction.- CodeScene after storage boundary extraction:
apps/mobile/src/mobileVaultStorage.ts,apps/mobile/src/mobileVaultStorage.test.ts,apps/mobile/src/mobileVaultRepository.ts, andapps/mobile/src/mobileVaultRepository.test.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after storage boundary extraction.expo-file-system@55.0.17is now an explicit@tolaria/mobiledependency.pnpm --filter @tolaria/mobile test -- src/mobileExpoVaultStorage.test.tspassed after Expo storage adapter extraction: 11 files / 38 tests.pnpm --filter @tolaria/mobile testpassed after Expo storage adapter extraction: 11 files / 38 tests.pnpm --filter @tolaria/mobile typecheckpassed after Expo storage adapter extraction.- CodeScene after Expo storage adapter extraction:
apps/mobile/src/mobileExpoVaultStorage.ts,apps/mobile/src/mobileExpoVaultStorage.test.ts, andapps/mobile/src/mobileNativeVaultStorage.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after Expo storage adapter extraction.pnpm --filter @tolaria/mobile test -- src/mobileVaultSeed.test.tspassed after app-local demo vault seeding: 12 files / 40 tests.pnpm --filter @tolaria/mobile testpassed after app-local demo vault seeding: 12 files / 40 tests.pnpm --filter @tolaria/mobile typecheckpassed after app-local demo vault seeding.- CodeScene after app-local demo vault seeding:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/mobileDemoVault.ts,apps/mobile/src/mobileExpoVaultStorage.ts,apps/mobile/src/mobileVaultSeed.ts, andapps/mobile/src/mobileVaultSeed.test.tsscored10;apps/mobile/src/demoData.tsreturned no scorable code and no findings. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after app-local demo vault seeding.pnpm --filter @tolaria/mobile exec expo start --ios --clear --port 8087launched oniPad Pro 13-inch (M4)after app-local demo vault seeding; screenshot captured at/tmp/tolaria-mobile-seeded-ipad.png. The app rendered via the stored repository path behind Expo Go's first-run Tools modal with no red runtime error overlay.pnpm --filter @tolaria/mobile test -- src/mobileEditorDraft.test.tspassed after expanded TenTap serialization: 12 files / 42 tests.pnpm --filter @tolaria/mobile testpassed after expanded TenTap serialization: 12 files / 42 tests.pnpm --filter @tolaria/mobile typecheckpassed after expanded TenTap serialization.- CodeScene after expanded TenTap serialization:
apps/mobile/src/mobileEditorDraft.ts,apps/mobile/src/mobileEditorDraft.test.ts, andapps/mobile/src/mobileEditorHtmlMarkdown.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after expanded TenTap serialization.pnpm --filter @tolaria/mobile test -- src/mobileEditorDraftSave.test.tspassed after editor draft save boundary: 13 files / 44 tests.pnpm --filter @tolaria/mobile testpassed after editor draft save boundary: 13 files / 44 tests.pnpm --filter @tolaria/mobile typecheckpassed after editor draft save boundary.- CodeScene after editor draft save boundary:
apps/mobile/src/mobileEditorDraftSave.tsandapps/mobile/src/mobileEditorDraftSave.test.tsscored10. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after editor draft save boundary.pnpm --filter @tolaria/mobile test -- src/mobileEditorSaveState.test.ts src/mobileEditorDraftSave.test.tspassed after editor save UI wiring: 14 files / 46 tests.pnpm --filter @tolaria/mobile testpassed after editor save UI wiring: 14 files / 46 tests.pnpm --filter @tolaria/mobile typecheckpassed after editor save UI wiring.- CodeScene after editor save UI wiring:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/MobileEditorAdapter.tsx,apps/mobile/src/mobileDemoVault.ts,apps/mobile/src/mobileEditorSaveState.ts,apps/mobile/src/mobileEditorSaveState.test.ts,apps/mobile/src/styles/editorStyles.ts, andapps/mobile/src/styles/editorSaveStateStyles.tsscored10;apps/mobile/src/styles.tsreturned no scorable code. pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after editor save UI wiring.pnpm --filter @tolaria/mobile exec expo start --ios --clear --port 8088launched oniPad Pro 13-inch (M4)after editor save UI wiring; screenshot captured at/tmp/tolaria-mobile-save-state-ipad.png. The app rendered theReadysave state with no red runtime error overlay.pnpm --filter @tolaria/mobile test -- src/mobileAutosaveQueue.test.ts src/mobileEditorSaveState.test.tspassed after debounced autosave: 15 files / 49 tests.pnpm --filter @tolaria/mobile typecheckpassed after debounced autosave.- CodeScene after debounced autosave:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/MobileEditorAdapter.tsx,apps/mobile/src/mobileAutosaveQueue.ts,apps/mobile/src/mobileAutosaveQueue.test.ts,apps/mobile/src/mobileEditorSaveState.ts,apps/mobile/src/mobileEditorSaveState.test.ts, andapps/mobile/src/styles/editorSaveStateStyles.tsscored10. pnpm --filter @tolaria/mobile testpassed after debounced autosave: 15 files / 49 tests.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after debounced autosave.pnpm --filter @tolaria/mobile exec expo start --ios --clear --port 8089launched oniPhone 15after debounced autosave; screenshots captured at/tmp/tolaria-mobile-autosave-iphone.pngand/tmp/tolaria-mobile-autosave-iphone-loaded.png. The app rendered behind Expo Go's first-run Tools modal with no red runtime error overlay.pnpm --filter @tolaria/mobile test -- src/mobileAutosaveQueue.test.ts src/mobileSavedDraftProjection.test.tspassed after saved note projection refresh: 16 files / 51 tests.pnpm --filter @tolaria/mobile typecheckpassed after saved note projection refresh.- CodeScene after saved note projection refresh:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/mobileAutosaveQueue.ts,apps/mobile/src/mobileAutosaveQueue.test.ts,apps/mobile/src/mobileSavedDraftProjection.ts, andapps/mobile/src/mobileSavedDraftProjection.test.tsscored10. pnpm --filter @tolaria/mobile testpassed after saved note projection refresh: 16 files / 51 tests.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after saved note projection refresh.pnpm --filter @tolaria/mobile test -- src/mobileNoteCreate.test.ts src/mobileVaultRepository.test.tspassed after local note creation: 17 files / 53 tests.pnpm --filter @tolaria/mobile typecheckpassed after local note creation.- CodeScene after local note creation:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/mobileDemoVault.ts, andapps/mobile/src/mobileNoteCreate.test.tsscored10;apps/mobile/src/mobileNoteCreate.tsreturned no scorable code and no findings. pnpm --filter @tolaria/mobile testpassed after local note creation: 17 files / 53 tests.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after local note creation.pnpm --filter @tolaria/mobile test -- src/mobileNoteCreate.test.tspassed after create-note UX state: 17 files / 53 tests.pnpm --filter @tolaria/mobile typecheckpassed after create-note UX state.- CodeScene after create-note UX state:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/styles/noteListStyles.ts, andapps/mobile/src/styles/noteCreateStyles.tsscored10. pnpm --filter @tolaria/mobile testpassed after create-note UX state: 17 files / 53 tests.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after create-note UX state.pnpm --filter @tolaria/mobile test -- src/mobileNoteCreate.test.tspassed after title-entry note creation: 17 files / 54 tests.pnpm --filter @tolaria/mobile typecheckpassed after title-entry note creation.- CodeScene after title-entry note creation:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/MobileNoteCreatePrompt.tsx,apps/mobile/src/useMobileNoteCreateFlow.ts,apps/mobile/src/mobileDemoVault.ts,apps/mobile/src/mobileNoteCreate.test.ts, andapps/mobile/src/styles/noteCreateStyles.tsscored10. pnpm --filter @tolaria/mobile testpassed after title-entry note creation: 17 files / 54 tests.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after title-entry note creation.pnpm --filter @tolaria/mobile test -- src/mobileAppStateStorage.test.ts src/mobileNoteCreate.test.tspassed after saved app state storage: 18 files / 57 tests.pnpm --filter @tolaria/mobile typecheckpassed after saved app state storage.- CodeScene after saved app state storage:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/mobileAppStateStorage.ts,apps/mobile/src/mobileAppStateStorage.test.ts, andapps/mobile/src/mobileNativeAppStateStorage.tsscored10. pnpm --filter @tolaria/mobile testpassed after saved app state storage: 18 files / 57 tests.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after saved app state storage.pnpm --filter @tolaria/mobile test -- src/mobileVaultStorage.test.ts src/mobileExpoVaultStorage.test.ts src/mobileVaultRepository.test.ts src/mobileNoteDelete.test.tspassed after local note deletion: 19 files / 62 tests.pnpm --filter @tolaria/mobile typecheckpassed after local note deletion.- CodeScene after local note deletion:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/useMobileNoteDeleteFlow.ts,apps/mobile/src/mobileNoteDelete.ts,apps/mobile/src/mobileNoteDelete.test.ts,apps/mobile/src/mobileVaultStorage.ts,apps/mobile/src/mobileVaultStorage.test.ts,apps/mobile/src/mobileExpoVaultStorage.ts,apps/mobile/src/mobileExpoVaultStorage.test.ts,apps/mobile/src/mobileVaultRepository.ts,apps/mobile/src/mobileVaultRepository.test.ts, andapps/mobile/src/mobileDemoVault.tsscored10. pnpm --filter @tolaria/mobile testpassed after local note deletion: 19 files / 62 tests.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after local note deletion.pnpm --filter @tolaria/mobile test -- src/mobileVaultMetadata.test.ts src/mobileVaultMetadataStorage.test.tspassed after vault metadata storage: 21 files / 68 tests.pnpm --filter @tolaria/mobile typecheckpassed after vault metadata storage.- CodeScene after vault metadata storage:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/mobileDemoVault.ts,apps/mobile/src/mobileVaultMetadata.ts,apps/mobile/src/mobileVaultMetadataStorage.ts,apps/mobile/src/mobileNativeVaultMetadataStorage.ts,apps/mobile/src/mobileVaultMetadata.test.ts, andapps/mobile/src/mobileVaultMetadataStorage.test.tsscored10. pnpm --filter @tolaria/mobile testpassed after vault metadata storage: 21 files / 68 tests.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after vault metadata storage.pnpm --filter @tolaria/mobile test -- src/mobileVaultRuntime.test.ts src/mobileVaultMetadata.test.ts src/mobileVaultMetadataStorage.test.tspassed after runtime vault metadata wiring: 22 files / 70 tests.pnpm --filter @tolaria/mobile typecheckpassed after runtime vault metadata wiring.- CodeScene after runtime vault metadata wiring:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/mobileDemoVault.ts,apps/mobile/src/mobileVaultRuntime.ts, andapps/mobile/src/mobileVaultRuntime.test.tsscored10;apps/mobile/src/useMobileVaultRuntimeLoader.tsreturned no scorable code and no findings. pnpm --filter @tolaria/mobile testpassed after runtime vault metadata wiring: 22 files / 70 tests.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after runtime vault metadata wiring.pnpm --filter @tolaria/mobile test -- src/mobileVaultRuntime.test.tspassed after runtime load retry UI: 22 files / 70 tests.pnpm --filter @tolaria/mobile typecheckpassed after runtime load retry UI.- CodeScene after runtime load retry UI:
apps/mobile/src/MobileApp.tsx,apps/mobile/src/styles/noteListStyles.ts, andapps/mobile/src/styles/vaultLoadStyles.tsscored10;apps/mobile/src/useMobileVaultRuntimeLoader.tsreturned no scorable code and no findings. pnpm --filter @tolaria/mobile testpassed after runtime load retry UI: 22 files / 70 tests.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after runtime load retry UI.pnpm --filter @tolaria/mobile exec expo start --ios --clear --port 8090launched the runtime metadata/retry build in Expo Go.- iPhone simulator screenshot captured at
/tmp/tolaria-mobile-runtime-iphone.png; the note list rendered from app-local storage with no red runtime error overlay, but Expo Go's gear overlay still blocks clean interaction screenshots. - iPad simulator screenshot captured at
/tmp/tolaria-mobile-runtime-ipad-loaded.png; the iPad split layout rendered stored notes and TenTap content with theReadysave state and no red runtime error overlay. pnpm --filter @tolaria/mobile test -- src/mobileNoteFrontmatter.test.ts src/mobileVaultRepository.test.ts src/mobileEditorDraft.test.tspassed after mobile frontmatter metadata parsing: 23 files / 74 tests.pnpm --filter @tolaria/mobile typecheckpassed after mobile frontmatter metadata parsing.- CodeScene after mobile frontmatter metadata parsing:
apps/mobile/src/mobileNoteFrontmatter.ts,apps/mobile/src/mobileNoteFrontmatter.test.ts,apps/mobile/src/mobileVaultRepository.ts, andapps/mobile/src/mobileVaultRepository.test.tsscored10. pnpm --filter @tolaria/mobile testpassed after mobile frontmatter metadata parsing: 23 files / 74 tests.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after mobile frontmatter metadata parsing.pnpm --filter @tolaria/mobile test -- src/mobileNoteFrontmatterWrite.test.ts src/mobileNoteFrontmatter.test.tspassed after mobile frontmatter serialization helpers: 24 files / 78 tests.pnpm --filter @tolaria/mobile typecheckpassed after mobile frontmatter serialization helpers.- CodeScene after mobile frontmatter serialization helpers:
apps/mobile/src/mobileNoteFrontmatterWrite.tsandapps/mobile/src/mobileNoteFrontmatterWrite.test.tsscored10. pnpm --filter @tolaria/mobile testpassed after mobile frontmatter serialization helpers: 24 files / 78 tests.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after mobile frontmatter serialization helpers.pnpm --filter @tolaria/mobile test -- src/mobileNoteFrontmatterSave.test.ts src/mobileNoteFrontmatterWrite.test.tspassed after mobile frontmatter save boundary: 25 files / 80 tests.pnpm --filter @tolaria/mobile typecheckpassed after mobile frontmatter save boundary.- CodeScene after mobile frontmatter save boundary:
apps/mobile/src/mobileNoteFrontmatterSave.ts,apps/mobile/src/mobileNoteFrontmatterSave.test.ts, andapps/mobile/src/mobileDemoVault.tsscored10. pnpm --filter @tolaria/mobile testpassed after mobile frontmatter save boundary: 25 files / 80 tests.pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-exportpassed after mobile frontmatter save boundary.
Risks / Watch Items
- Editor quality remains the largest mobile risk; TenTap must pass the quality gates before becoming accepted.
- Shared package extraction must not destabilize active desktop work.
- Desktop alpha release currently triggers on every push to
main; this branch is safe, but release path filters should be added before mobile work merges tomain. - Codacy analyzes committed/pushed repository state; local edits still need local lint/test/CodeScene discipline before remote checks exist.
- TenTap's package graph currently reports a
react-dompeer warning because its bundled web editor path depends on React DOM 18 while the native app uses React 19; simulator launch and iOS export pass, but this should be tracked during the editor spike.