oxi · macOS · Tauri 2 · Rust

oximemo

생각이 사라지기 전에 잡아라. macOS에서 ⌘⇧N(기본 안내 단축키) — 또는 더블탭(Accessibility 권한 필요) — 한 번이면 1프레임(≤16ms) 안에 떠오르는 카드 메모. 사람은 GUI로, AI 에이전트는 같은 CLI로 같은 vault를 다룬다.

oximemo 데스크탑 — 8개 메모가 populated된 상태. 좌측에 '모든 메모 8 / 즐겨찾기 3' 카운트와 'All inbox todo idea bookmark snippet' 카테고리 필터, 상단에 태그 #agent #oxi #rust #portfolio 등, 메인에 oxi 생태계 메모 카드 8장
oximemo 데스크탑 — 카드 그리드. 카테고리·태그·즐겨찾기로 즉시 필터링.
역할
설계·구현·공개 (4개 workspace 멤버)
언어
Rust 2024 (rust 1.89+)
스택
Tauri 2 · redb · tantivy · blake3 · notify · React (GUI)
정보
MIT · macOS 14+ Apple Silicon

1. 핵심 약속

"생각을 잡는 속도"가 이 프로젝트가 보호하는 유일한 가치다. AI 요약·자동 태깅·챗봇은 그 속도와 신뢰성을 끌어내리므로 일부러 두지 않는다.

인간 시나리오

macOS 어디서든 ⌘⇧N → 한 줄 입력 → Esc로 dismiss → 작업으로 복귀. (보조: 더블탭 — press+release 1쌍을 threshold 350ms 이내로 2회)

에이전트 시나리오

코딩 에이전트/로컬 스크립트가 같은 vault를 CLI로 안전하게 읽고 쓴다 (중복 방지).

2. 아키텍처: 3계층 스토리지

oximemo 3-tier storage: plain .md files → redb metadata index → tantivy BM25 full-text index
파일이 진실의 원천. 인덱스는 캐시일 뿐 — oximemo reindex로 언제든 재구축. 인덱스 레이어에 SQLite/C 의존성 없음.

oximemo-core

도메인 로직 · plain .md I/O · redb 인덱스 · tantivy BM25 · TOML frontmatter

oximemo-cli

CLI — human은 table, agent는 JSON/NDJSON

oximemo-capture

오버레이 캡처 윈도우 — off-screen warm-up으로 1프레임 표시. 더블탭 트리거 (Accessibility 권한 필요)

apps/desktop (Tauri 2)

macOS 네이티브 데스크탑 셸 — core 위의 얇은 표현 계층. ⌘⇧N 전역 단축키를 tauri-plugin-global-shortcut으로 항상 등록 (권한 불필요 — 기본 안내 단축키)

3. CLI 우선

CLI는 권위 있는 인터페이스다 — 데스크탑 앱과 동일한 oximemo-core를 사용한다.

# 한 줄 메모
oximemo new "Ship the redb bump before the freeze" --tag backlog --category todo

# 최근 메모 (table for humans, ndjson for agents)
oximemo list --limit 10
oximemo list --favorites --format ndjson

# 한 개 읽기 (JSON 기본, --md로 raw 파일)
oximemo get 019fa927-a897-7e12-9102-8a8c7ebbb594 --md

# BM25 전문 검색
oximemo search "redb upgrade" --limit 5 --format ndjson

# 동기화 (에이전트용 — body-less manifest)
oximemo export --since <cursor>
# → { id, hash, updated_at, deleted }[]

4. Hash-based 동기화

oximemo export는 본문 없는 매니페스트({id, hash, updated_at, deleted})를 출력한다. 에이전트가 해시를 비교해 변경된 것만 가져오고 cursor를 전진시킨다. ARG_MAX(대용량 ID 리스트 한계)는 --ids-file/--ids-stdin으로 우회.

5. 캡처 속도 최적화

"트리거에서 1프레임"을 만들기 위해 캡처 윈도우는 항상 떠 있되 화면 밖에 parked 상태로 유지된다. cold-start 비용 없이 warm한 윈도우가 즉시 보인다. 두 트리거(⌘⇧N 단축키 / 더블탭) 어느 쪽이든 같은 capture:show 이벤트를 emit한다. 다음은 트리거 → dismiss까지의 4단계:

oximemo 빠른 캡처 4단계: 1) idle 상태에서 capture 윈도우는 off-screen에 parked, 2) 사용자가 ⌘⇧N 또는 ⌥ 더블탭으로 트리거 → capture:show 이벤트 emit, 3) Tauri 이벤트 핸들러가 capture 윈도우를 16ms 안에 show, 4) 한 줄 입력 후 Esc → 윈도우는 hidden으로 복귀 (destroy 안 됨)
Step 1 idle — capture NSWindow는 화면 밖 parked 상태로 떠 있음 (warm). Step 2 사용자가 ⌘⇧N (또는 더블탭) → capture:show 이벤트 emit. Step 3 Tauri 메인 스레드 핸들러가 capture 윈도우를 1프레임(≤16ms) 안에 show(). Step 4 한 줄 입력 → Esc로 dismiss. 윈도우는 다시 hidden으로 parked (destroy 아님).

6. 시스템 요구사항 & 비범위

7. 레포지토리

⬡ github.com/project-oxi/oximemo