原生 App,而不是套殼

很多到處都能跑的 App,其實是同一個網頁,在每台裝置上套了不同的外框。Caliu 選擇了比較遠的那條路:每個 App 都是用其平台原本就為它設計的工具打造的。這要多花不少功夫,而這正是捲動、輸入、鍵盤快速鍵和輔助使用功能都符合你裝置習慣的原因。

網頁版

網頁版以 TypeScript 和 React 撰寫。它是一個 Progressive Web App:Service Worker 會在你的裝置上保留整個 App 的副本,所以它沒有網路也能啟動和運作,你也可以像安裝其他 App 一樣從瀏覽器安裝它。發布新版本時,它絕不會打斷你:App 會提示有更新,並在你選擇時才套用。

iPhone、iPad 和 Mac

Apple 的 App 以 Swift 和 SwiftUI 撰寫,iPhone、iPad 和 Mac 共用同一套程式碼庫。每個平台依然有自己的版面和習慣:Mac 上是側邊欄和鍵盤快速鍵,iPhone 上是觸控手勢,iPad 上兩者都有。

正因為它們是真正的原生 App,所以能和系統的其他部分緊密整合:小工具、分享表單、捷徑和 Spotlight。Apple Watch App 也是以 Swift 撰寫,它本身就是一個完整的同步用戶端,直接和伺服器溝通,所以就算手機不在身邊,你的筆記也在手腕上。

Android

Android App 以 Kotlin 和 Jetpack Compose 撰寫,後者是 Google 為 Android 介面打造的官方工具組。它是對 Apple App 的一次細心移植:相同的結構、相同的行為、相同的測試,一個案例一個案例地轉換過來,所以一則筆記在兩邊的表現完全一致。

讓四個 App 步調一致

四個 App 很容易漸行漸遠。幾個習慣讓它們保持一致:

  • 共用的規則,共用的測試。 那些絕對不能有差異的規則,例如如何辨識一個 #tag、如何讀取筆記的標題、如何整理同步佇列,在每種程式語言裡各寫一次,並在每個平台上對照同一組測試案例進行驗證。
  • 外觀只有一個來源。 主題、字型和 Caliu 自己的圖示集只定義一次,再為每個 App 產生,所以同一個主題在 Mac 上和在 Android 手機上看起來一模一樣。
  • 一份翻譯,到處通用。 每個 App 都支援相同的語言,而 Android App 的文字是從 Apple App 的翻譯產生的,所以各裝置上的用詞都一致。

工作留在你的裝置上

因為每個 App 都是完整的 App,而不是通往伺服器的一扇窗,吃重的工作都在你的裝置上完成:搜尋、匯出成各種格式,以及呈現你的筆記,全都能離線進行。