Skip to content

Add MARC iOS app scaffold with screenshot ingestion, OCR, embeddings, and semantic search#2

Open
xoxoskeleton wants to merge 2 commits into
mainfrom
codex/build-complete-ios-app-marc
Open

Add MARC iOS app scaffold with screenshot ingestion, OCR, embeddings, and semantic search#2
xoxoskeleton wants to merge 2 commits into
mainfrom
codex/build-complete-ios-app-marc

Conversation

@xoxoskeleton
Copy link
Copy Markdown
Owner

Motivation

  • Provide a local-first iOS MVP that turns screenshots into a searchable personal memory index using on-device OCR and embeddings.
  • Deliver the core ingestion pipeline (detect screenshots, OCR, embedding generation, auto-tagging, storage) so new screenshots are processed automatically and stored locally.
  • Ship a minimal but complete UI flow (onboarding, timeline, search, detail, settings, reminders) so the app can be imported into an Xcode iOS 17 target and iterated on.

Description

  • Added a full MARC/ source tree with app entry and tab navigation in MARC/App/ and a dark electric-blue visual foundation.
  • Implemented data models and persistence with SwiftData: Memory and Tag models plus MemoryStore for import, compression, thumbnailing and saving.
  • Built services for ingestion and retrieval: ScreenshotMonitor (PhotoKit observer), OCRService (Vision .accurate), EmbeddingService (on-device NLEmbedding), AutoTagger (rule-based), VectorSearchService (cosine similarity), VectorMath (Accelerate vDSP), and ReminderService (UserNotifications).
  • Implemented SwiftUI views: TimelineView, MemoryCardView, SearchView + SearchResultView, MemoryDetailView + ReminderSheet, SettingsView, and OnboardingView.
  • Added MARC/README.md with setup, privacy notes, and optional Core ML conversion guidance for upgrading embeddings.

Testing

  • Verified file layout and created sources with find MARC -type f | sort and inspected key files. (succeeded)
  • Confirmed Swift toolchain availability with swiftc --version to ensure environment has Swift installed. (succeeded)
  • Ran a basic repository status check with git status --short to confirm working tree state. (succeeded)
  • Note: full Xcode/iOS 17 compilation and simulator device validation were not run in this environment due to lack of the Apple SDKs, so on-device build/test should be performed in Xcode as the next step.

Codex Task

@vercel
Copy link
Copy Markdown

vercel Bot commented Feb 11, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
xy-0ors Ready Ready Preview, Comment Feb 11, 2026 9:21pm

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5f6ccaf161

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +46 to +48
for index in 0..<result.count {
let asset = result.object(at: index)
await ingest(asset: asset, context: context)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Deduplicate screenshot ingestion by asset identifier

ingestRecentScreenshots re-imports every screenshot from the last 7 days each time it runs, and start() invokes it on every app launch (plus pull-to-refresh can invoke it again). Because Memory IDs are random UUIDs and no PHAsset.localIdentifier is stored/checked, the same screenshot is inserted repeatedly, which quickly creates duplicate timeline/search entries and unnecessary storage growth.

Useful? React with 👍 / 👎.

Comment on lines +64 to +66
Task {
try? await reminderService.scheduleReminder(for: memory, at: date)
memory.reminderDate = date
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Request notification permission before scheduling reminders

The reminder flow calls scheduleReminder directly without first requesting authorization, and ReminderService.requestPermission() is never called in this codebase. On fresh installs (or after denial), users can set a reminder and persist reminderDate, but iOS will not deliver notification alerts, so the feature appears to succeed while silently failing.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant