Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ActionBrief

Turn messy notes into a clear action plan — entirely on your iPhone.

Swift iOS Apple Intelligence SwiftUI License: MIT Privacy

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.


Demo

To embed the video: Go to github.com/devendrabhumca12/ActionBrief, click the pencil ✏️ to edit this README, drag screenshots/actionBrief_compressed.mp4 into 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.


Screenshots

Welcome Input Methods Extract Actions Editor
Welcome screen Add your notes Extract actions tutorial Editor with AI banner
Onboarding with value props Four input modes explained AI extraction capabilities Live editor, On-Device AI Ready

The Problem It Solves

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.


Features

  • 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 + NSDataDetector on 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

Tech Stack

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+

Architecture

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]
Loading

Key Components

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

AI Workflow

Primary Path (iOS 26+, Apple Intelligence enabled)

  1. Check SystemLanguageModel.default.availability
  2. Create a LanguageModelSession with structured instructions
  3. Generate typed output using @Generable — no prompt engineering hacks
  4. Map GeneratedBrief[ActionItem] models with confidence scores

Fallback Path (iOS 18–25 or AI disabled)

  1. Tokenize text into sentences with NLTokenizer
  2. Detect action verbs and date phrases with NSDataDetector
  3. Infer owner and priority via lightweight heuristics
  4. 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.


Requirements

  • 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.


Getting Started

1. Clone

git clone https://github.com/devendrabhumca12/ActionBrief.git
cd ActionBrief

2. Open in Xcode

open ActionBrief.xcodeproj

3. Configure signing

  1. Select the ActionBrief target
  2. Open Signing & Capabilities
  3. Choose your Apple developer team
  4. Update the bundle identifier if needed

4. Run

  1. Choose an iPhone 15 Pro simulator or physical device
  2. Press ⌘R to build and run
  3. Tap Sample on the editor screen to load demo notes
  4. Tap Extract Actions

5. Simulate AI availability states

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

Project Structure

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

Privacy

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.


Key Engineering Decisions

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.


Roadmap

  • 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.


Contributing

Contributions are welcome! Please open an issue before submitting a pull request for anything beyond small bug fixes.

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/my-feature
  3. Commit your changes: git commit -m 'Add my feature'
  4. Push to the branch: git push origin feature/my-feature
  5. Open a pull request

Why This Project

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

License

This project is licensed under the MIT License. See LICENSE.


Built by Devendra Kumar

LinkedIn Email

If this project helps you, give it a ⭐

About

Turn messy notes into a clear action plan — entirely on your iPhone. Privacy-first iOS app using Apple Foundation Models.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages