This file is the resumable working log for Tolaria mobile. The strategy and roadmap live in [MOBILE_STRATEGY.md](./MOBILE_STRATEGY.md); this file records the current execution state.
- Split `src/utils/wikilinks.ts` into shared `@tolaria/markdown` modules for frontmatter, wikilink block transforms, outgoing links, backlink context, snippets, and word counts.
- Added `apps/mobile` as an Expo React Native workspace package.
- Added root mobile scripts: `mobile:start`, `mobile:ios`, `mobile:test`, and `mobile: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.
- Added a minimal mobile vault repository contract plus fixture implementation so app-local vault storage and git sync can plug in behind `listNotes` / `readNote` later.
- Updated `scripts/run-tests.mjs` so full `pnpm test` runs desktop, mobile, and shared package tests, while targeted `apps/mobile/...` and `packages/markdown/...` paths route to the correct workspace Vitest config.
- Updated `.husky/pre-commit` to use `pnpm test -- --silent` so local commits include the new mobile test suite.
- Added `react-native-gesture-handler` at Expo's SDK-compatible version.
- Wrapped the mobile root in `GestureHandlerRootView`.
- Added a tested compact gesture mapper and `SwipeSurface` wrapper 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 `MobileEditorAdapter` with 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 into `MobileEditorAdapter` with tested HTML generation from the mobile editor document projection.
- Created [ADR-0110](./adr/0110-tentap-mobile-editor-spike.md) 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 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.
- 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 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.tsx` at CodeScene `10.0`.
- 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.
2. Expand TenTap Markdown serialization coverage for common writing constructs and preserve unsupported blocks without corrupting files.
3. 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.
- CodeScene before extraction: `src/utils/compact-markdown.ts` scored `10`.
- CodeScene after extraction: `packages/markdown/src/compactMarkdown.ts` scored `10`; `packages/markdown/src/compactMarkdown.test.ts` scored `10`; tiny export/config files returned no scorable code and no findings.
- CodeScene before wikilink extraction: `src/utils/wikilinks.ts` scored `9.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 test` passed after wikilink extraction: 40 tests.
-`pnpm test -- src/utils/wikilinks.test.ts src/utils/noteTitle.test.ts` passed: 91 desktop tests.
-`pnpm --filter @tolaria/markdown typecheck` passed after wikilink extraction.
-`pnpm lint`, `npx tsc --noEmit`, and `pnpm build` passed after wikilink extraction.
- CodeScene before note-title extraction: `src/utils/noteTitle.ts` scored `9.68`.
- CodeScene after note-title extraction: `packages/markdown/src/noteTitle.ts` and `packages/markdown/src/noteTitle.test.ts` scored `10`; the desktop compatibility export returned no scorable code and no findings.
-`pnpm --filter @tolaria/markdown test` passed after note-title extraction: 56 tests.
-`pnpm test -- src/utils/noteTitle.test.ts` passed: 14 desktop tests.
-`pnpm --filter @tolaria/markdown typecheck` passed after note-title extraction.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed and produced the iOS bundle.
-`pnpm lint` passed with one pre-existing warning in `src/components/tolariaBlockNoteSideMenu.tsx`.
-`npx tsc --noEmit` passed.
-`pnpm test` passed 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 scored `10`; 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`), but `xcrun simctl list ...` hung indefinitely even after opening `/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app`.
-`pnpm --filter @tolaria/mobile typecheck` passed after compact navigation extraction.
- CodeScene after compact navigation extraction: `apps/mobile/src/compactNavigation.ts`, `apps/mobile/src/compactNavigation.test.ts`, and the touched `apps/mobile/src/MobileApp.tsx` scored `10`.
-`pnpm --filter @tolaria/mobile typecheck` passed after note projection extraction.
- CodeScene after note projection extraction: `apps/mobile/src/mobileNoteProjection.ts` and `apps/mobile/src/mobileNoteProjection.test.ts` scored `10`; `apps/mobile/src/demoData.ts` returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile test` passed after mobile vault repository extraction: 4 files / 11 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after mobile vault repository extraction.
- CodeScene after mobile vault repository extraction: `apps/mobile/src/mobileVaultRepository.ts` and `apps/mobile/src/mobileVaultRepository.test.ts` scored `10`; `apps/mobile/src/demoData.ts` still returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after mobile vault repository extraction.
-`pnpm test -- apps/mobile/src/mobileVaultRepository.test.ts` passed and ran only the mobile repository test file.
-`pnpm test -- packages/markdown/src/noteTitle.test.ts` passed and ran only the shared Markdown note-title test file.
-`pnpm test -- --silent` passed 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.mjs` scored `10`; `.husky/pre-commit` is unsupported by CodeScene file analysis because it has no supported extension.
-`pnpm --filter @tolaria/mobile test -- src/mobileEditorDocument.test.ts` passed after TenTap wiring: 8 files / 28 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after TenTap wiring.
- CodeScene after TenTap wiring: `apps/mobile/src/MobileEditorAdapter.tsx`, `apps/mobile/src/mobileEditorDocument.ts`, `apps/mobile/src/mobileEditorDocument.test.ts`, and `apps/mobile/src/styles/editorStyles.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after TenTap wiring; iOS bundle size is now about 11 MB and includes TenTap toolbar assets.
-`pnpm --filter @tolaria/mobile exec expo start --ios --clear` launched on `iPad 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.tsx` passed after a transient full-hook failure in the unrelated desktop SearchPanel arrow-key test.
-`pnpm --filter @tolaria/mobile test -- src/mobileEditorDocument.test.ts` passed after the TenTap draft boundary: 8 files / 29 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after the TenTap draft boundary.
- CodeScene after the TenTap draft boundary: `apps/mobile/src/MobileEditorAdapter.tsx`, `apps/mobile/src/mobileEditorDocument.ts`, and `apps/mobile/src/mobileEditorDocument.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after the TenTap draft boundary.
-`pnpm --filter @tolaria/mobile typecheck` passed 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`, and `apps/mobile/src/mobileVaultSeed.test.ts` scored `10`; `apps/mobile/src/demoData.ts` returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile exec expo start --ios --clear --port 8087` launched on `iPad 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/mobileEditorDraftSave.test.ts` passed after editor draft save boundary: 13 files / 44 tests.
-`pnpm --filter @tolaria/mobile test` passed after editor draft save boundary: 13 files / 44 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after editor draft save boundary.
- CodeScene after editor draft save boundary: `apps/mobile/src/mobileEditorDraftSave.ts` and `apps/mobile/src/mobileEditorDraftSave.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after editor draft save boundary.
-`pnpm --filter @tolaria/mobile test -- src/mobileEditorSaveState.test.ts src/mobileEditorDraftSave.test.ts` passed after editor save UI wiring: 14 files / 46 tests.
-`pnpm --filter @tolaria/mobile test` passed after editor save UI wiring: 14 files / 46 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed 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`, and `apps/mobile/src/styles/editorSaveStateStyles.ts` scored `10`; `apps/mobile/src/styles.ts` returned no scorable code.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after editor save UI wiring.
-`pnpm --filter @tolaria/mobile exec expo start --ios --clear --port 8088` launched on `iPad Pro 13-inch (M4)` after editor save UI wiring; screenshot captured at `/tmp/tolaria-mobile-save-state-ipad.png`. The app rendered the `Ready` save state with no red runtime error overlay.
-`pnpm --filter @tolaria/mobile exec expo start --ios --clear --port 8089` launched on `iPhone 15` after debounced autosave; screenshots captured at `/tmp/tolaria-mobile-autosave-iphone.png` and `/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/mobileNoteCreate.test.ts src/mobileVaultRepository.test.ts` passed after local note creation: 17 files / 53 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after local note creation.
- CodeScene after local note creation: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/mobileDemoVault.ts`, and `apps/mobile/src/mobileNoteCreate.test.ts` scored `10`; `apps/mobile/src/mobileNoteCreate.ts` returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile test` passed after local note creation: 17 files / 53 tests.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after local note creation.
-`pnpm --filter @tolaria/mobile test -- src/mobileAppStateStorage.test.ts src/mobileNoteCreate.test.ts` passed after saved app state storage: 18 files / 57 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed 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`, and `apps/mobile/src/mobileNativeAppStateStorage.ts` scored `10`.
-`pnpm --filter @tolaria/mobile test` passed after saved app state storage: 18 files / 57 tests.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after saved app state storage.
-`pnpm --filter @tolaria/mobile test -- src/mobileVaultRuntime.test.ts src/mobileVaultMetadata.test.ts src/mobileVaultMetadataStorage.test.ts` passed after runtime vault metadata wiring: 22 files / 70 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed 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`, and `apps/mobile/src/mobileVaultRuntime.test.ts` scored `10`; `apps/mobile/src/useMobileVaultRuntimeLoader.ts` returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile test -- src/mobileVaultRuntime.test.ts` passed after runtime load retry UI: 22 files / 70 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after runtime load retry UI.
- CodeScene after runtime load retry UI: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/styles/noteListStyles.ts`, and `apps/mobile/src/styles/vaultLoadStyles.ts` scored `10`; `apps/mobile/src/useMobileVaultRuntimeLoader.ts` returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile exec expo start --ios --clear --port 8090` launched 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 the `Ready` save state and no red runtime error overlay.
-`pnpm --filter @tolaria/mobile test -- src/mobileNoteFrontmatter.test.ts src/mobileVaultRepository.test.ts src/mobileEditorDraft.test.ts` passed after mobile frontmatter metadata parsing: 23 files / 74 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed 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`, and `apps/mobile/src/mobileVaultRepository.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile test` passed after mobile frontmatter metadata parsing: 23 files / 74 tests.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after mobile frontmatter metadata parsing.
-`pnpm --filter @tolaria/mobile test -- src/mobileNoteFrontmatterWrite.test.ts src/mobileNoteFrontmatter.test.ts` passed after mobile frontmatter serialization helpers: 24 files / 78 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after mobile frontmatter serialization helpers.
- CodeScene after mobile frontmatter serialization helpers: `apps/mobile/src/mobileNoteFrontmatterWrite.ts` and `apps/mobile/src/mobileNoteFrontmatterWrite.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile test` passed after mobile frontmatter serialization helpers: 24 files / 78 tests.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after mobile frontmatter serialization helpers.
-`pnpm --filter @tolaria/mobile test -- src/mobileNoteFrontmatterSave.test.ts src/mobileNoteFrontmatterWrite.test.ts` passed after mobile frontmatter save boundary: 25 files / 80 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after mobile frontmatter save boundary.
- CodeScene after mobile frontmatter save boundary: `apps/mobile/src/mobileNoteFrontmatterSave.ts`, `apps/mobile/src/mobileNoteFrontmatterSave.test.ts`, and `apps/mobile/src/mobileDemoVault.ts` scored `10`.
-`pnpm --filter @tolaria/mobile test` passed after mobile frontmatter save boundary: 25 files / 80 tests.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after mobile frontmatter save boundary.
- 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 to `main`.
- 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-dom` peer 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.