GitHunt
TO

Tomortec/ZhuJian

iOS app for collecting and reviewing sentences: OCR capture, card‑based browsing, colorful tags & fonts, widgets, optional iCloud sync. Minimal SwiftUI quotes notebook—scan, type or collect via link; personalized colors/fonts, QR sharing and widgets. 一款专注记录句子的 iOS App:OCR 扫描、卡片化整理、颜色与字体个性化、桌面小组件、iCloud 同步、多字体/多配色、批量编辑与可访问性优化

ZhuJian Banner

ZhuJian

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

Highlights (v1.3.0)

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

Screenshots

Board 01 Board 02 Board 03 Board 04

Board 05 Board 06 Board 07

Getting Started

  • Requirements: Xcode 14+, iOS 15+
  1. Install dependencies
# If CocoaPods is not installed yet:
brew install cocoapods   # or: gem install cocoapods

pod install
  1. Open workspace
open ZhuJian.xcworkspace
  1. 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.
  1. Run
  • Choose a simulator or device, then Run.
  • The first build may trigger Swift Package dependency resolution (network dependent).

Optional Configuration (Info.plist)

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.

Tech Stack & Architecture

  • 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 via EnvironmentObject; views lean on unidirectional data flow with side effects pushed down to managers

Privacy & Open Source

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

Contributing

Issues and PRs are welcome. For larger changes, please discuss the direction in an issue first.

License

MIT License — see LICENSE.

Languages

Swift98.7%HTML1.1%Ruby0.2%

Contributors

MIT License
Created May 12, 2022
Updated March 12, 2026
Tomortec/ZhuJian | GitHunt