Ezequiel Menor
← Proyectos
Case study

CoreOS

Capture first. Organize later.

v0.1.0 · V1 personal · En desarrollo activo

Expo SDK 57React Native 0.86TypeScript (strict)expo-routerZustandexpo-sqlite + FTS5expo-secure-storeReanimated 4LLM: endpoint compatible OpenAI
Pantalla Today de CoreOS
Today — tareas pendientes y capturas sin clasificar.
Pantalla Capture de CoreOS
Capture — un único campo de texto libre.
Pantalla Library de CoreOS
Library — notas por recencia con búsqueda full-text.

El problema

La mayoría de apps de notas y tareas te obligan a decidir dónde va algo antes de guardarlo: elige cuaderno, proyecto, lista, etiqueta. Ese coste de decisión es lo que frena la mayoría de capturas. CoreOS lo elimina: escribes texto libre, se persiste en el dispositivo y la IA lo organiza después — nunca antes, nunca a costa del original.

Decisiones técnicas clave

01

Persistir antes de clasificar

El insert en SQLite ocurre antes de cualquier llamada a la IA. Si el modelo falla, la captura queda pending y se reintenta desde Today: el texto crudo nunca se pierde.

02

raw_text es canónico

El LLM solo emite metadatos (tipo, título sugerido, tags): nunca reescribe, resume ni parte el texto del usuario. En notas, el original se guarda verbatim.

03

Local-first sin backend

Sin servidor, sin cuentas, sin sync en la nube. SQLite vive en el dispositivo y las API keys en expo-secure-store (iOS Keychain / Android EncryptedSharedPreferences).

04

Búsqueda real: FTS5

Tabla virtual notes_fts con tokenizer porter unicode61 y ranking bm25, sincronizada por triggers en INSERT/UPDATE/DELETE.

Qué construí realmente

  • —Una V1 personal con tres pestañas: Today (tareas con overdue-first y capturas pendientes con reintento), Capture (un único campo de texto) y Library (notas agrupadas por recencia con búsqueda full-text).
  • —Un clasificador asíncrono que despacha capturas a cinco tipos (nota, gasto, tarea, hábito, sueño), con schema forzado en cliente y lock optimista en la misma transacción.
  • —Captura desde fuera de la app: share sheet de iOS y deeplink coreos://capture.
  • —Editor Markdown con autosave, pin, soft-delete con undo y normalización de fechas en texto libre (hoy, mañana, d/m/y, ISO).
  • —Pipeline con invariantes documentadas: procesado secuencial, funciones exportadas que nunca lanzan excepciones y mutex contra lotes concurrentes.

Trade-off

Datos sin UI (por ahora). El clasificador ya escribe las tablas de gastos, hábitos y sueño, pero sus pantallas de gestión quedan fuera de la V1 a propósito: prefiero capturar el dato estructurado hoy y diseñar la UI después, antes que retrasar el pipeline central. El coste es honesto: hay datos que aún no se pueden consultar desde la app.

Estado actual

v0.1.0 · V1 personal en desarrollo activo. No es un producto comercial. Todavía no hay suite de tests automatizada: la calidad se apoya en TypeScript strict, ESLint y typecheck antes de cada cambio.

Enlaces

Cómo trabajo aquí: definir antes de construir — AGENTS.md con límites explícitos para agentes, TypeScript strict y ESLint. CoreOS trabaja en main sin PRs; la evidencia es la definición previa.Ver proyectos →