(Nil) => {To.Dev;}

· 업데이트

.Ember (DotEmber) 제작 과정

올인원 생산성 맥 앱


.Ember (DotEmber)는 macOS용 올인원 생산성 앱입니다. 저널, 할 일, 캘린더, 타이머, 뉴스 리더, 통계 — 하루의 모든 부분을 미니멀한 한 화면에 담았습니다.

아래 페이지는 디자인 결정과 그 이유에 대한 이야기입니다.

만들게 된 이유

Journal 화면
Journal 화면

많은 분들과 마찬가지로, 저는 평소에 저널, 할 일, 캘린더, 타이머, 그리고 RSS를 각각 다른 앱으로 사용하고 있었습니다. 이런 흐름은 필연적으로 비용이 쌓였습니다 — 다섯 개의 다른 환경, 다섯 가지의 다른 방식. 아침에 세 개를 열어보고 네 번째로 넘어갈 즈음에는 이미 집중력을 잃었습니다.

고도화된 단일 앱이 아니라, 제 하루에 맞는 앱이 필요했습니다. 그래서 .Ember를 만들기 시작했습니다.

디자인 — 최대한 미니멀하게

Todo + Calendar 화면
Todo + Calendar 화면

디자인 언어는 제가 매일 사용하는 앱들에서 영감을 받았습니다. Obsidian의 vault 모델과 단순함, macOS 네이티브의 차분함. 좁은 간격, 두 톤 보라 액센트, 장식적인 크롬은 없음. 좁은 창에서는 사이드바가 아이콘만 남도록 접혀서, macOS의 traffic light 버튼 클러스터가 사이드바 안쪽 가장자리에 깔끔하게 들어맞습니다. 모든 애니메이션은 100–200ms — 반응이 느껴질 만큼 빠르게.

모든 디자인 결정의 바탕에 있는 한 가지: 픽셀을 점유할 가치가 있는 것만 화면에 둡니다.

ADHD 친화적 — 마찰을 최소한으로

Focus Daily Entry
Focus Daily Entry

제게 가장 필요했던 건 새 기능이 아니라 시작 시점의 마찰을 줄이는 것이었습니다. 그래서 Focus Daily Entry 라는 모드가 있습니다. 그날 처음 앱을 열면 풀스크린 저널 + 할 일 작성 화면이 뜨고, 사이드바도 탭도 어떤 화면을 봐야 할지의 결정도 없이 — 그냥 쓰고, 오늘 할 일을 적습니다.

작은 것들도 그만큼 중요합니다. 블럭(Block) 기능으로 할 일을 맥락별로 묶고 이를 타이머로 진행할 수 있습니다 (Routine, Work, Personal — 본인이 만드는 대로). 명령 팔레트 (Cmd+K)는 어디서든 단축키 한 번에 열립니다. 반복 규칙으로 만들어진 할 일은 매일 아침 자동으로 생성되지만, “오늘 아무것도 못했다”는 느낌에는 반영되지 않도록 했습니다 — 시스템이 자동 갱신된 습관과 본인이 직접 입력한 일을 구분할 수 있기 때문입니다.

Local-first — 데이터는 언제나 당신의 것

Sync 설정
Sync 설정

많은 Obsidian 사용자분들과 마찬가지로, 저는 데이터를 직접 소유하는 것이 마음이 편합니다. .Ember는 모든 것을 사용자가 선택한 폴더 안의 plain Markdown으로 저장합니다 — iCloud Drive 안의 폴더, Documents 하위 폴더, USB 스틱 모두 동일하게 동작합니다. Markdown이 항상 원본이고, 그 옆에 있는 SQLite 데이터베이스는 언제든 다시 빌드할 수 있는 검색 인덱스 캐시일 뿐입니다.

iCloud 동기화는 선택적이며, Apple CloudKit의 비공개 DB를 통해 사용자의 iCloud 계정 안에 데이터가 저장됩니다. NilToDev가 운영하는 서버는 없습니다. RSS 피드는 게시자에게서 직접 가져옵니다. AI 기능은 사용자 본인의 API 키를 사용하며 기본 OFF 입니다.

Obsidian 사용자라면. 선택 사항인 Obsidian Sync 기능이 있지만, 두 vault는 반드시 서로 다른 폴더여야 합니다 — 하나는 .Ember의 vault, 하나는 Obsidian의 vault, 같은 경로를 가리키시면 안 됩니다. Sync 엔진이 설정하신 주기로 두 vault 사이의 Markdown을 미러링하며, 첫 실행 시 dry-run 미리보기를 띄우고, 충돌이 발생한 파일은 자동으로 보존됩니다. 이미 .obsidian/ 작업공간이 있는 폴더를 .Ember의 vault로 지정하는 사용 방식은 지원하지 않습니다. Q&A의 “Obsidian과 함께 사용할 수 있나요?” 항목을 참고해 주십시오.

스택

첫 맥 앱이다보니, 가장 익숙한 스택을 선택했습니다.

  • Electron + electron-vite — 크로스 플랫폼 확장 가능성 (모바일 컴패니언은 1.0 이후 로드맵) 과, pnpm dev 한 번으로 도는 빌드 파이프라인.
  • React 19 + TypeScript — 단순하게 가장 정보가 많아 선택.
  • Tailwind 4 + custom CSS 변수 — 모든 색이 var(--accent-*) 라서, 사용자의 액센트 컬러 선택 한 번이 100여 개 컴포넌트를 한 번에 다시 칠함.
  • Zustand — 기능별 단일 store, 보일러플레이트도 provider 트리도 없음.
  • Tiptap (ProseMirror) — Markdown 에디터 표면, 그 위에 직접 만든 툴박스.
  • better-sqlite3 — 동기, 네이티브, FTS5 검색이 즉시 반환될 만큼 빠름.
  • Apple CloudKit JS — 백엔드를 직접 만들지 않고도 동기화.

이 앱을 다시 만든다면 SwiftUI를 시도해볼 것 같습니다.