尚未检测到更新。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.