尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Life Wrapped records audio throughout your day, transcribes it locally on your device, and helps you discover insights about how you spend your time.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A private audio journal for iPhone and iPad. Record your day, get it transcribed on your device, read a summary of every recording and every month, and look back with a Year Wrap.
Download on the App Store · Website · Privacy policy · Support · Terms of service
| Platform | iOS and iPadOS 18.0 or later |
| App version in this repo | 1.3 (build number set by Xcode Cloud) |
| Language | Swift 6 (language mode 6.0, strict concurrency) |
| UI | SwiftUI |
| Toolchain | Xcode 26.1 or later |
| Bundle ID | com.jsayram.lifewrapped (widget: com.jsayram.lifewrapped.widget) |
| License | MIT |
lifewrapped://record, lifewrapped://home, lifewrapped://history, lifewrapped://overview, lifewrapped://settings (record links accept a category query parameter)requiresOnDeviceRecognition = true, so audio is never sent off the deviceFour summary qualities. The app falls back automatically when the chosen one is not available.
| Quality | Engine | Where it runs | Fallback order |
|---|---|---|---|
| Key Sentences | BasicEngine: extractive summaries with TF-IDF ranking and Apple's NaturalLanguage framework (NLEmbedding, NLTokenizer, NLTagger) | On device | Key Sentences |
| Offline AI | LocalEngine: Qwen3 4B Instruct 2507, 4-bit (mlx-community/Qwen3-4B-Instruct-2507-4bit, pinned to one commit) run with MLX. One-time download of about 2.3 GB from Hugging Face. Devices with 4 GB of memory (iPhone 12, 12 mini, 13, 13 mini, SE 3rd gen) get Qwen3 1.7B, 4-bit (mlx-community/Qwen3-1.7B-4bit, about 1.0 GB, thinking turned off) instead, and devices with 3 GB don't offer Offline AI. The app checks free memory before loading the model and falls back instead of crashing. Updating from a version that used Phi-3.5, or that downloaded the other Qwen3 size, deletes the old model | On device | Offline AI, then Key Sentences |
| Apple Intelligence | AppleEngine: Apple Intelligence through the Foundation Models framework, always SystemLanguageModel.default (the on-device model). Needs iOS 26 or later on a device with Apple Intelligence turned on | On device | Apple Intelligence, then Offline AI, then Key Sentences |
| Cloud AI | ExternalAPIEngine: OpenAI (Chat Completions API) or Anthropic (Messages API) with the user's own API key. The model ID is free text; defaults are gpt-6-luna and claude-sonnet-5 | Cloud | Cloud AI, then Offline AI, then Key Sentences |
com.jsayram.lifewrapped.smartestai). There is no subscription: the user pays their provider directly through their own keykSecAttrAccessibleAfterFirstUnlock)com.jsayram.lifewrapped.finalize-months) that iOS runs while the device chargessummary_versions table, schema v4). Recordings, months and the Year Wrap have an Earlier versions sheet that restores one, and restoring keeps the replaced text tooGraphite design language: warm off-white and near-black surfaces, ink as the only accent, serif (New York) titles, SF Symbols, hairline borders and no gradients. Light and dark mode are supported. Colors live in App/Constants/AppTheme.swift.
On iPad, screens keep their content in a centered, readable column instead of stretching across the display. History shows the list and the chosen recording side by side, and a recording, the Overview's Today and Yesterday cards and the Year Wrap sections switch to two columns when there's room. The helpers (readableColumn, readableMargins, AppTheme.twoColumnWidth) are in AppTheme.swift.
https://www.apple.com before using Cloud AI. With no key saved it makes no request.group.com.jsayram.lifewrapped. The database directory uses FileProtectionType.completeUntilFirstUserAuthentication. The widget only receives a few numbers: the streak, and today's recording count, words, minutes and last recording time.The full policy is at jsayram.github.io/life-wrapped/privacy.
# 1. Clone
git clone https://github.com/jsayram/life-wrapped.git
cd life-wrapped
# 2. Create the local secrets file (required: Config/Debug.xcconfig includes it)
cp Config/Secrets.example.xcconfig Config/Secrets.xcconfig
# 3. Open the workspace
open LifeWrapped.xcworkspace
Select the LifeWrapped scheme and an iPhone simulator, then Run. Swift packages (MLX, swift-transformers and their dependencies) resolve automatically on first open.
The LifeWrapped scheme uses Config/StoreKitConfiguration.storekit, so the Cloud AI purchase can be tested in the simulator without a real payment.
Tests use Swift Testing, except LocalLLM, which uses XCTest. Xcode creates a scheme for each local package. Select a package scheme (for example Summarization or Storage) and choose Product, then Test.
| Package | Test files |
|---|---|
| AudioCapture | AudioCaptureTests.swift |
| InsightsRollup | InsightsRollupTests.swift |
| LocalLLM | LocalLLMTests.swift |
| SharedModels | SharedModelsTests.swift, JournalDigestsTests.swift, MonthDigestTextTests.swift, YearWrapDataTests.swift |
| Storage | StorageTests.swift, PDFExportPreviewTests.swift (writes sample PDFs to TestResults/pdf-preview/, which git ignores) |
| Summarization | SummarizationTests.swift, EngineRoutingTests.swift, ExternalModelSettingsTests.swift, FidelityProtectionTests.swift, BasicEngineShortTranscriptTests.swift, SessionTitlerTests.swift, MonthDigestTests.swift, YearWrapBuilderTests.swift, AppleIntelligenceLiveTests.swift (skips itself where Apple Intelligence is unavailable) |
| Transcription | TranscriptionTests.swift |
| WidgetCore | WidgetCoreTests.swift |
life-wrapped/
├── App/ # iOS app target (SwiftUI)
│ ├── LifeWrappedApp.swift # Entry point, deep links, appearance
│ ├── ContentView.swift # Tab bar: Record, History, Overview, Settings
│ ├── Components/ # Reusable views: AI, Cards, Layouts, Loading, Recording, Rows, Shared
│ ├── Constants/ # AppTheme (design tokens and shared components), StopWords
│ ├── Coordinators/ # AppCoordinator, DataCoordinator, LocalModelCoordinator,
│ │ # PermissionsCoordinator, RecordingCoordinator, SummaryCoordinator,
│ │ # TranscriptionCoordinator, WidgetCoordinator
│ ├── Helpers/ # Extensions, KeychainHelper and other utilities
│ ├── Models/ # View-level models such as TimeRange
│ ├── Resources/ # Info.plist, entitlements, asset catalog (app icon)
│ ├── Settings/ # Settings screens (AI & Summaries, Recording, Statistics, Data, Privacy)
│ ├── Store/ # StoreKit purchase handling
│ ├── Views/ # Tabs, Details, Overview, Insights, AI, Components, Utility,
│ │ # onboarding (PermissionsView) and data management
│ └── appDocs/ # Internal notes (architecture, App Store, Xcode Cloud, testing)
├── WidgetExtension/ # WidgetKit extension (Quick Record, Today's Sessions)
├── Packages/ # Local Swift packages (swift-tools-version 6.0)
│ ├── SharedModels/ # Data models, constants, feature flags, logging
│ ├── Storage/ # SQLite (SQLite3) persistence, repositories, migrations,
│ │ # JSON/Markdown/PDF export, JSON import
│ ├── AudioCapture/ # Recording, part splitting, file management, playback
│ ├── Transcription/ # On-device speech recognition and language detection
│ ├── Summarization/ # Key Sentences, Offline AI, Apple Intelligence and Cloud AI engines, routing and fallback
│ ├── LocalLLM/ # MLX model loading and Hugging Face download for Offline AI
│ ├── InsightsRollup/ # Streaks, goals, insights
│ └── WidgetCore/ # Data shared with the widget through the App Group
├── Config/ # Debug/Release xcconfig, secrets template, StoreKit configuration
├── Scripts/ # Shell helpers (see below)
├── docs/ # GitHub Pages site: home, privacy, support, terms
├── Images/ # App Store and marketing screenshots
├── Logo/ # Logo source files
├── LifeWrapped.xcodeproj
├── LifeWrapped.xcworkspace # Open this
└── project.yml # XcodeGen spec (version 1.3, but it doesn't list the LocalLLM package; build from the .xcodeproj)
Resolved versions from LifeWrapped.xcworkspace/xcshareddata/swiftpm/Package.resolved:
| Package | Version |
|---|---|
| mlx-swift | 0.29.1 |
| mlx-swift-lm | d9f46e3 (pinned) |
| swift-transformers | 573e5c9 |
| swift-jinja | 2.2.0 |
| swift-collections | 1.3.0 |
| swift-numerics | 1.1.1 |
All are used only by the LocalLLM package for the Offline AI engine.
| Script | What it does |
|---|---|
Scripts/build.sh packages | Runs swift build in each local package |
Scripts/build.sh ios | Builds the LifeWrapped scheme with xcodebuild |
Scripts/build.sh clean | Removes build output and package .build folders |
Scripts/lint.sh [--fix] | SwiftLint and swift-format checks (uses .swiftlint.yml and .swift-format) |
Scripts/format.sh [path] | Formats Swift files with swift-format |
Scripts/verify-privacy.sh | Lists network and cloud API usage in the source so it can be reviewed |
Some script options (watch, widgets, and the integration, ui and performance test targets) refer to schemes that do not exist in this project.
main is production. Pushing to main starts the Xcode Cloud workflow, which builds, archives and uploads to TestFlight and App Store Connect.dev is the integration branch. Feature branches start from dev.More detail is in App/appDocs/XCODE_CLOUD_BUILD.md and App/appDocs/WORKFLOW.md.
| Document | Contents |
|---|---|
docs/ | Public website, privacy policy, support and terms (served at jsayram.github.io/life-wrapped) |
App/appDocs/ | Internal notes on the AI architecture, local AI, App Store submission, privacy labels, in-app purchases, StoreKit testing, widgets and Xcode Cloud |
Questions, bugs and feature requests: open an issue.
The source code in this repository is released under the MIT License. Copyright (c) 2025-2026 Jose Ramirez-Villa.
The MIT License covers the code. Use of the Life Wrapped app from the App Store is governed by the terms of service. The Life Wrapped name and app icon are not licensed for use as your own branding.