래퍼가 아닌 네이티브 앱

어디서나 돌아가는 많은 앱은 사실 하나의 웹 페이지를 기기마다 다른 틀에 감싼 거예요. Caliu는 더 먼 길을 택했어요. 각 앱을 그 플랫폼을 위해 설계된 도구로 만들어요. 손이 더 많이 가지만, 스크롤, 입력, 키보드 단축키, 접근성이 기기에서 기대하는 대로 느껴지는 건 그 덕분이에요.

웹 앱

웹 앱은 TypeScript와 React로 작성됐어요. Progressive Web App이라서 서비스 워커가 앱 전체의 사본을 기기에 보관하고, 덕분에 연결이 없어도 실행되고 동작해요. 다른 앱처럼 브라우저에서 설치할 수도 있어요. 새 버전이 나와도 작업을 방해하지 않아요. 앱이 업데이트를 알려 주고, 원할 때 적용해요.

iPhone, iPad, Mac

Apple 앱은 Swift와 SwiftUI로 작성됐고, iPhone, iPad, Mac이 하나의 코드베이스를 함께 써요. 그래도 플랫폼마다 고유한 레이아웃과 습관이 있어요. Mac에는 사이드바와 키보드 단축키, iPhone에는 터치 제스처, iPad에는 둘 다 있어요.

진짜 네이티브 앱이기 때문에 시스템의 나머지 부분과 이어져요. 위젯, 공유 시트, 단축어, 그리고 Spotlight까지요. Apple Watch 앱도 Swift로 작성됐고, 그 자체로 완전한 동기화 클라이언트예요. 서버와 직접 이야기하기 때문에 휴대폰이 곁에 없어도 노트가 손목에 있어요.

Android

Android 앱은 Kotlin과, Android 인터페이스를 위한 Google의 공식 도구 모음인 Jetpack Compose로 작성됐어요. Apple 앱을 꼼꼼하게 옮겨 만들었어요. 같은 구조, 같은 동작, 같은 테스트를 하나하나 옮겼기 때문에, 노트는 양쪽에서 똑같이 동작해요.

네 개의 앱을 나란히

네 개의 앱은 쉽게 서로 어긋날 수 있어요. 몇 가지 습관이 앱들을 함께 묶어 줘요.

  • 공통 규칙, 공통 테스트. #tag를 알아보는 방법, 노트 제목을 읽는 방법, 동기화 대기열을 정리하는 방법처럼 절대 달라져서는 안 되는 규칙은 언어마다 한 번씩만 작성하고, 모든 플랫폼에서 같은 테스트 케이스로 검증해요.
  • 모양의 출처는 하나. 테마, 글꼴, Caliu만의 아이콘 세트는 한 번만 정의하고 모든 앱용으로 생성해요. 그래서 테마는 Mac에서도 Android 휴대폰에서도 똑같아 보여요.
  • 번역도 하나로, 어디서나. 모든 앱을 같은 언어로 쓸 수 있고, Android 앱의 텍스트는 Apple 앱의 번역에서 생성되기 때문에 기기가 달라도 표현이 같아요.

작업은 기기에서

각 앱은 서버를 들여다보는 창이 아니라 온전한 앱이기 때문에, 무거운 일은 기기에서 해요. 검색, 모든 형식으로 내보내기, 노트 렌더링 모두 오프라인에서 동작해요.