A private, local-first journaling app with on-device AI.
- Local-first - All data stays on your device. No accounts, no cloud sync required.
- Encrypted storage - Your journal is encrypted at rest using SQLCipher.
- AI conversations - Chat with a local AI assistant (runs entirely on-device).
- Rich text editing - Write with headings, lists, checkboxes, code blocks, tables, and more.
- Fast search - Full-text search across all your entries.
Note: The sync server is currently in beta. It's functional but may have breaking changes.
An optional self-hosted sync server for multi-device sync. Run it on a home server, VPS, or any machine on your network.
Features:
- Yjs sync - Real-time collaborative document sync via Hocuspocus
- TLS support - HTTPS is required for Android clients (Tailscale certs, Let's Encrypt, or bring your own)
- REST API - Server status and session management
- LLM inference - Server-side AI chat (planned, currently stubbed)
Quick Install:
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/deca-inc/jot/main/apps/server/install.sh | bash
# Windows (PowerShell)
irm https://raw.githubusercontent.com/deca-inc/jot/main/apps/server/install.ps1 | iex
# Start the server
jot-server startSetup Guides:
- Linux Setup - Ubuntu/Debian with systemd and Tailscale
- macOS Setup - launchd service with Tailscale
- Windows Setup - Windows Service with Tailscale
See the server README for full documentation.
- Framework: Expo 54 + React Native 0.81
- Build System: pnpm workspaces + Turborepo
- Database: SQLite with FTS5 full-text search (encrypted via SQLCipher)
- State: React Query (@tanstack/react-query)
- AI: On-device LLM inference via ExecuTorch (react-native-executorch)
- Editor: Quill-based rich text editor (react-native-cn-quill)
- Security: Argon2 key derivation, secure keychain storage
- Node.js (v18+)
- pnpm
- Xcode (for iOS/macOS builds)
- Android Studio (for Android builds)
pnpm install
cd apps/app
pnpm ios
# or
pnpm androidFor detailed setup help, see the Expo documentation.
jot/
├── apps/
│ ├── app/ # Main Expo mobile app
│ │ ├── lib/ # Main TypeScript/React source code
│ │ │ ├── ai/ # AI/LLM functionality
│ │ │ ├── analytics/ # PostHog telemetry (optional)
│ │ │ ├── attachments/ # File attachment handling
│ │ │ ├── components/ # Reusable React components
│ │ │ ├── db/ # Database layer (SQLite, migrations)
│ │ │ ├── encryption/ # Encryption and key management
│ │ │ ├── navigation/ # Navigation logic
│ │ │ ├── screens/ # Screen components
│ │ │ ├── theme/ # Theming and styling
│ │ │ ├── utils/ # Utility functions
│ │ │ └── widgets/ # Widget data bridge
│ │ ├── modules/ # Expo native modules
│ │ │ ├── platform-ai/ # Platform-specific AI (Swift/Kotlin)
│ │ │ ├── keyboard-module/# Custom keyboard handling
│ │ │ └── widget-bridge/ # Widget communication bridge
│ │ ├── scripts/ # Development scripts
│ │ ├── targets/ # iOS widget targets (@bacons/apple-targets)
│ │ ├── packages/ # Swift packages
│ │ │ └── widget-utils/ # Shared widget utilities
│ │ └── native/ # Native widget source code
│ └── server/ # Sync server (Beta)
│ ├── src/ # Server source code
│ │ ├── cli.ts # CLI entry point
│ │ ├── server.ts # Express + WebSocket server
│ │ ├── db/ # SQLite database layer
│ │ ├── sync/ # Yjs sync via Hocuspocus
│ │ ├── llm/ # LLM service (stub)
│ │ └── api/ # REST API routes
│ └── __tests__/ # Server tests
├── packages/ # Shared packages (future)
├── pnpm-workspace.yaml # Workspace configuration
├── turbo.json # Turborepo task definitions
└── package.json # Workspace root
From the root directory (runs across all packages via Turborepo):
pnpm turbo lint # Run ESLint across all packages
pnpm turbo typecheck # TypeScript type checking
pnpm turbo test # Run tests across all packagesFrom apps/app/ directory:
# Start development
pnpm start # Start Expo dev server
pnpm ios # Run on iOS simulator
pnpm android # Run on Android emulator
# Code quality
pnpm lint # Run ESLint
pnpm lint:fix # Auto-fix lint issues
pnpm typecheck # TypeScript type checking
# Testing
pnpm test # Run all TypeScript tests
pnpm test:swift # Run Swift tests
pnpm test:kotlin # Run Kotlin tests
pnpm test:all # Run all tests
pnpm coverage # Generate coverage report
# Database
pnpm create:migration <name> # Create a new migration
pnpm test:migrations # Test migrations (up/down/reset)
# AI Models
pnpm download:models # Download AI models for on-device inferenceFrom apps/server/ directory (sync server - Beta):
# Start server
pnpm dev # Start server in development mode (port 3000)
pnpm jot-server start # Same as above
# Server commands
pnpm jot-server status # Show server status (documents, sessions)
pnpm jot-server devices # List connected sessions
pnpm jot-server models list # List available AI models (stub)
# Code quality
pnpm lint # Run ESLint
pnpm typecheck # TypeScript type checking
pnpm test # Run server testsThe project uses husky + lint-staged to automatically lint and fix staged files before each commit.
This project is source-available under a restrictive license.
Permitted:
- Personal, non-commercial use
- Forking and local modification for personal use
- Learning and reference
Not permitted:
- Redistribution (modified or unmodified)
- Commercial use
- Derivative works for distribution
See LICENSE for full terms.