Turn messy notes into a clear action plan — entirely on your iPhone.
ActionBrief is a privacy-first iOS app that converts meeting notes, class notes, and personal brain dumps into a structured checklist — complete with owners, due dates, priorities, and a one-sentence summary. It uses on-device Apple Foundation Models when available, and falls back to local NaturalLanguage parsing when they are not.
This is not a chatbot. It solves one practical problem: extracting actionable tasks from unstructured text.
To embed the video: Go to github.com/devendrabhumca12/ActionBrief, click the pencil ✏️ to edit this README, drag
screenshots/actionBrief_compressed.mp4into the editor — GitHub will upload it and give you a URL to paste here.
https://github.com/devendrabhumca12/ActionBrief/raw/master/screenshots/actionBrief_compressed.mp4
Paste chaotic notes → get a clean action plan → everything stays on device.
| Welcome | Input Methods | Extract Actions | Editor |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Onboarding with value props | Four input modes explained | AI extraction capabilities | Live editor, On-Device AI Ready |
People leave meetings and lectures with rough notes but no clear next steps. Important tasks, dates, and follow-ups get buried in free-form text.
Before — raw notes:
Sprint planning - mobile launch
Raj to check budget before Friday.
I should send the final deck after he replies.
Need to book user testing for next Tuesday.
After — structured brief:
| Task | Owner | Due | Priority |
|---|---|---|---|
| Check budget | Raj | Friday | 🔴 High |
| Send final deck | Me | After Raj replies | 🔴 High |
| Book user testing | — | Next Tuesday | 🟡 Medium |
Summary: Prepare launch materials, validate budget, schedule user testing.
All processing stays on device. No account. No cloud AI. No analytics.
- Paste or type notes and extract action items in one tap
- Record a spoken transcript with on-device speech recognition
- Upload meeting transcript files (
.txt,.md, plain text) - Import from photos — OCR text from notes, screens, or whiteboards via
Vision - On-device AI via Apple Foundation Models with guided structured output (
@Generable) - Automatic fallback using
NaturalLanguage+NSDataDetectoron unsupported devices - Editable checklist with owners, due dates, and priority labels
- Local JSON persistence — saved briefs survive app restarts
- Native share sheet to export extracted actions
- Clear AI availability states — users always know what mode they're in
- Accessibility-first — VoiceOver labels and Dynamic Type throughout
- Zero permissions in v1.0 — no tracking, no network, no data collection
| Layer | Technology |
|---|---|
| UI Framework | SwiftUI |
| Architecture | MVVM |
| Concurrency | Swift async/await |
| On-device AI | Apple Foundation Models (@Generable, LanguageModelSession) |
| Fallback parsing | NaturalLanguage, NSDataDetector |
| Speech input | Speech framework (on-device recognition) |
| Photo OCR | Vision (VNRecognizeTextRequest) |
| File import | fileImporter (SwiftUI) |
| Storage | JSON in Application Support |
| Minimum iOS | 18.0 |
| Full AI support | iOS 26.0+ with Apple Intelligence |
| Xcode | 26+ |
Views → ViewModels → Services → Models
flowchart TD
UserInput[User enters notes] --> EditorVM[BriefEditorViewModel]
EditorVM --> AvailabilityCheck[AIAvailabilityService]
AvailabilityCheck -->|Available| AIService[FoundationModelExtractionService]
AvailabilityCheck -->|Fallback| FallbackService[FallbackExtractionService]
AIService --> Result[ExtractionResult]
FallbackService --> Result
Result --> ReviewUI[ActionReviewView]
ReviewUI --> Store[BriefStore]
Store --> SavedList[SavedBriefsView]
| File | Role |
|---|---|
BriefEditorViewModel |
Note input, extraction state machine, error handling |
ActionExtractionService |
Protocol that abstracts AI and fallback paths |
FoundationModelExtractionService |
Guided on-device structured generation (iOS 26+) |
FallbackExtractionService |
Sentence-level parsing + date detection (iOS 18+) |
AIAvailabilityService |
Maps platform availability to user-facing states |
BriefStore |
JSON persistence in Application Support |
ExtractionServiceFactory |
Chooses the right service at runtime |
- Check
SystemLanguageModel.default.availability - Create a
LanguageModelSessionwith structured instructions - Generate typed output using
@Generable— no prompt engineering hacks - Map
GeneratedBrief→[ActionItem]models with confidence scores
- Tokenize text into sentences with
NLTokenizer - Detect action verbs and date phrases with
NSDataDetector - Infer owner and priority via lightweight heuristics
- Return lower-confidence results with transparent messaging
The app never uses Private Cloud Compute, third-party AI APIs, or any network connection for note processing.
- macOS with Xcode 26 Beta or later
- iPhone or Simulator running iOS 18.0+
- Apple Intelligence-capable device for on-device AI extraction (iPhone 15 Pro or later)
- Apple Intelligence enabled in Settings → Apple Intelligence & Siri
The app gracefully falls back to local parsing on all other devices.
git clone https://github.com/devendrabhumca12/ActionBrief.git
cd ActionBriefopen ActionBrief.xcodeproj- Select the ActionBrief target
- Open Signing & Capabilities
- Choose your Apple developer team
- Update the bundle identifier if needed
- Choose an iPhone 15 Pro simulator or physical device
- Press ⌘R to build and run
- Tap Sample on the editor screen to load demo notes
- Tap Extract Actions
Edit the scheme (Product → Scheme → Edit Scheme) and set Foundation Models Availability to simulate:
| State | Behavior |
|---|---|
| Available | Full on-device AI extraction |
| Device not eligible | Falls back to local parser |
| Apple Intelligence disabled | Falls back with settings prompt |
| Model not ready | Shows "Model Loading" state |
ActionBrief/
├── ActionBrief.xcodeproj/ # Xcode project (shared scheme included)
├── ActionBrief/
│ ├── ActionBriefApp.swift # App entry point
│ ├── Models/
│ │ ├── Brief.swift # Core data model
│ │ ├── ActionItem.swift # Task model with owner/date/priority
│ │ ├── ActionPriority.swift # Priority enum (low/medium/high)
│ │ ├── ExtractionResult.swift # Service output wrapper
│ │ ├── AIAvailabilityState.swift
│ │ └── NoteImportError.swift
│ ├── Services/
│ │ ├── ActionExtractionService.swift # Protocol
│ │ ├── FoundationModelExtractionService.swift # AI path
│ │ ├── FallbackExtractionService.swift # Local parser
│ │ ├── ExtractionServiceFactory.swift
│ │ ├── AIAvailabilityService.swift
│ │ ├── BriefStore.swift # JSON persistence
│ │ ├── SpeechTranscriptionService.swift
│ │ ├── TranscriptFileImportService.swift
│ │ └── ImageTextExtractionService.swift # Vision OCR
│ ├── ViewModels/
│ │ ├── BriefEditorViewModel.swift
│ │ ├── ActionReviewViewModel.swift
│ │ ├── BriefDetailViewModel.swift
│ │ └── SavedBriefsViewModel.swift
│ ├── Views/
│ │ ├── RootView.swift
│ │ ├── BriefEditorView.swift
│ │ ├── ActionReviewView.swift
│ │ ├── SavedBriefsView.swift
│ │ ├── BriefDetailView.swift
│ │ ├── TranscriptRecorderView.swift
│ │ ├── SettingsView.swift
│ │ └── TutorialView.swift
│ ├── Components/
│ │ ├── ActionItemRow.swift
│ │ ├── AvailabilityBanner.swift
│ │ ├── InputSourceBar.swift
│ │ ├── PrimaryButton.swift
│ │ ├── EmptyStateView.swift
│ │ └── LoadingStateView.swift
│ ├── Utilities/
│ │ ├── DateParsing.swift
│ │ ├── AppConstants.swift
│ │ ├── SampleData.swift
│ │ └── TutorialStorage.swift
│ └── Resources/
│ └── PrivacyInfo.xcprivacy # Apple privacy manifest
├── docs/
│ ├── DEVELOPMENT.md # Roadmap and release checklist
│ ├── PRIVACY.md # Full privacy policy
│ └── APP_STORE_REVIEW_NOTES.md
├── screenshots/
├── LICENSE
└── README.md
ActionBrief is built privacy-first by design — not as an afterthought.
- Notes stay on your device — zero network calls for note processing
- No backend, account, or analytics — nothing to sign up for
- No sensitive permissions in v1.0 — no contacts, location, or camera (Photos import uses system picker only)
- Apple privacy manifest included at
ActionBrief/Resources/PrivacyInfo.xcprivacy - App Store label: No Data Collected
Read the full policy in docs/PRIVACY.md.
Why @Generable instead of raw prompt parsing?
Structured generation with Foundation Models guarantees typed Swift output — no JSON extraction, no hallucinated field names, no runtime crashes from unexpected model output.
Why a fallback service?
iOS 26 and Apple Intelligence are not universal. The protocol-based ActionExtractionService means the rest of the app has zero awareness of which path runs — the factory decides at startup, and the UI adapts via AIAvailabilityState.
Why local JSON storage instead of SwiftData?
SwiftData requires iOS 17+ and adds migration complexity. For a v1.0 single-entity store, Codable + JSONEncoder is simpler, portable, and trivially testable. SwiftData is a clear upgrade path.
- App Intent for clipboard extraction (Shortcuts integration)
- Export to Reminders or Calendar (explicit user permission)
- Priority grouping and search in saved briefs
- Home Screen widgets for upcoming action items
- Optional iCloud sync
- Final app icon artwork
- App Store release
See docs/DEVELOPMENT.md for the full checklist.
Contributions are welcome! Please open an issue before submitting a pull request for anything beyond small bug fixes.
- Fork the repository
- Create a feature branch:
git checkout -b feature/my-feature - Commit your changes:
git commit -m 'Add my feature' - Push to the branch:
git push origin feature/my-feature - Open a pull request
ActionBrief demonstrates practical on-device AI rather than a generic chatbot — a rarer and more interesting engineering story. It showcases:
- Structured generation with Apple Foundation Models (
@Generable) - Graceful degradation across the entire iOS 18–26 device spectrum
- Privacy-first product thinking baked into architecture, not bolted on
- Clean SwiftUI + MVVM + async/await with no third-party dependencies
- Production-minded handling of error, loading, empty, and unavailable states
This project is licensed under the MIT License. See LICENSE.



