An iOS app focused on “collecting good sentences”. Capture what you see and think in the most convenient way: scan photos (OCR), type manually, or collect from share links. Everything is presented as cards for reviewing. Cards support per-note colors, tags, and fonts. Widgets help you revisit at a glance.
This open-source repo focuses on the app-side implementation and best practices. All external domains and private endpoints are disabled by default for out‑of‑the‑box experience and easier customization.
中文 README: README.zh-CN.md
- Custom background: set a global background (with cropping), widgets can mirror it
- Colorful cards: per-note foreground/background color and tags for categorization
- Typography: multiple built-in fonts (e.g., Alimama DongFangDaKai, Source Han Serif)
- Bulk edit: long-press in Outline to multi-select and batch update color/tags
- Share cards: export images with QR codes for easy collection by others
- Sort & review: sort by modified/created time, title, tag, tag color
- Security & sync: optional FaceID/TouchID; optional iCloud sync
- Accessibility: VoiceOver-friendly hints and actions
See the in-app “New Version: Colorful” guide for more details.
- Requirements: Xcode 14+, iOS 15+
- Install dependencies
# If CocoaPods is not installed yet:
brew install cocoapods # or: gem install cocoapods
pod install- Open workspace
open ZhuJian.xcworkspace- Code signing
- In Xcode Targets (App / Share Extension / Widgets), set your Signing Team.
- If you don’t need iCloud sync or Widgets, you can temporarily disable the capabilities to run quickly.
- Run
- Choose a simulator or device, then Run.
- The first build may trigger Swift Package dependency resolution (network dependent).
The project runs with “zero external dependency” by default. If you want link handling, share-collection, or remote toggles, add these optional keys in the app’s Info.plist:
- ZJ_ALLOWED_URL_HOSTS: comma-separated HTTPS hosts allowed in URL handling
e.g.,share.example.com, app.example.com - ZJ_SHARE_BASE_URL: base URL for share-collection (used for links and QR)
e.g.,https://share.example.com - ZJ_HELP_URL: in-app “Help” page URL
- ZJ_FONTS_INFO_URL: fonts info & license page
- ZJ_HOME_URL: project home page
- ZJ_API_MEMORIAL_URL: memorial-day toggle endpoint (GET, returns
{"MemorialDay":true|false}) - ZJ_API_SUPPORTS_URL: support/upvote endpoint (PUT, LeanCloud-style)
- ZJ_LEANCLOUD_ID / ZJ_LEANCLOUD_KEY: headers for the above APIs
If these keys are not set, related features are hidden or safely downgraded; no external requests are made.
Additionally, log uploading to COS is disabled by default. To enable, configure in Info.plist:
- ZJ_QCLOUD_TOKEN_URL: backend endpoint that returns temporary credentials
- ZJ_QCLOUD_REGION: COS region (e.g.,
ap-beijing) - ZJ_QCLOUD_BUCKET: COS bucket name
Once set, LogManager/AppDelegate will initialize the SDK using these values.
- UI: SwiftUI (iOS 15+)
- Data: Core Data (via
PersistenceManager); optional iCloud sync (SyncKit + CloudKit) - Widgets: WidgetKit (colors and fonts mirrored)
- Accessibility: VoiceOver & Dynamic Type friendly (labels, hints, events wired)
- Sharing: card image export with QR code; link-based collection configurable
- Fonts & theme: multiple built-in fonts and palettes; per-note customization and bulk edit
- Architecture: “Manager” objects for cross-screen state (
StorageManager,SettingsManager,FontManager, …) injected viaEnvironmentObject; views lean on unidirectional data flow with side effects pushed down to managers
- No secrets or private endpoints are included. By default, the app makes no external requests.
- For App Store distribution, replace bundle id, signing, and configure capabilities accordingly.
Issues and PRs are welcome. For larger changes, please discuss the direction in an issue first.
MIT License — see LICENSE.







