小柴。
每天一张中文小纸条,可以随手画一笔、生成分享图,也能在主屏幕 Widget 上安静出现。
A private-source, local-first iOS prototype for one daily Chinese note, focused drawing, shareable cards, local backup, and home-screen widgets.
- Role
- 独立 iOS 开发者 · 产品与工程实现
- Stage
- v0.0.9 · Simulator RC · 源码私有
- Core loop
- 每日纸条 → 全屏涂鸦 → 分享 / Widget
- Privacy
- 无登录 · 无云 · 无追踪 · 无第三方依赖
不是再造一个内容 Feed,而是让一天只出现一张纸条。
小柴把信息量主动压到最低:每天由本地资源决定一张纸条,用户可以读、画、分享,也可以什么都不做。最近 14 天的导航提供回看,但不制造无限下滑。
产品的信任前提同样简单:纸条、涂鸦和偏好不需要账户,不上传云端,也不依赖第三方分析服务。
UIKit 主应用与 WidgetKit 共用一个确定性的本地模型。
- Bundled JSON 提供 365 条常规纸条与 1 条闰日特例,本地文件保存用户涂鸦与偏好。
- UIKit 纯代码布局承载纸条、近 14 天日期、全屏涂鸦、撤销 / 重做、整笔橡皮、可恢复清空和主题交互。
- 分享面板实时预览竖版或方形卡片,确认后再生成高清图片并交给系统分享面板。
- 用户可以通过系统 Files provider 主动导出或导入版本化本地备份;导入先校验,再原子合并。
- WidgetKit 读取 App Group payload;共享容器不可用时显示 bundled deterministic fallback。
- 版本、隐私清单、发布标识、图标、iPhone / iPad 构建与 UI 测试进入统一 Makefile 门禁。
- Swift
- UIKit
- SwiftUI
- WidgetKit
- XCTest
- Privacy Manifest
- App Group
隐私不是说明文字,而是架构中没有网络层。
主 App 使用 UIKit,Widget 使用 SwiftUI
UIKit 负责需要手势、绘制和生命周期控制的主界面;WidgetKit 的 SwiftUI 声明式视图负责系统小组件。两种 UI 技术围绕共享模型协作,而不是强行统一。
共享失败时不悄悄写回普通偏好
App Group suite 不可用时,主应用不会回退到标准 UserDefaults;Widget 只展示可预测的 bundled fallback,避免两个进程看起来同步、实际数据分叉。
发布检查前置
App、Widget 与 Tests 的版本一致性、Privacy Manifest、标识和图标由脚本检查,减少“模拟器能跑但发布配置缺失”的后期返工。
本案例公开的验证证据。
- 模拟器画面本页截图来自 v0.0.9 RC,展示修订后的夜纸主题与分享预览链路。Visual proof
- 构建与测试Simulator RC 覆盖 iPhone、iPad、iOS 17.5 / 26.2 / 26.5,并通过单元测试、UI 测试、Sanitizer、静态分析与无签名 Release build。Private logs
- 隐私门禁App 与 Widget 各自包含 Privacy Manifest,并声明不追踪、不收集数据。Static checks
- 学习前置公开的 UIKitLifecycleDemo 记录 UIKit 生命周期、事件路由与测试工作流。Review ↗
原型边界与分发状态。
本案例只发布脱敏截图与工程说明,不公开源码仓库地址、签名信息、设备标识或构建日志。页面不提供下载,也不暗示已经上架。
当前 v0.0.9 已完成 Simulator RC,尚未开始真机签名、App Group 跨进程真机验收或 TestFlight / App Store Connect 分发。模拟器与无签名 Release build 可以验证产品主流程、编译和 fallback,但不能替代真实设备证据。