GitHub - zli117/RUOK: Track goals. Connect your data. Query your life — with the help of AI.

4 min read Original article ↗

image

A self-hosted personal OKR system with built-in time tracking, data integrations such as Fitbit, and a programmable analytics engine — write JavaScript or let AI write it for you.

Screenshot 2026-03-01 at 17-23-27 Week 9 2026 - RUOK

What Makes RUOK Different

Most productivity tools give you a checklist. RUOK gives you a programmable system.

Plan at every level. Set yearly objectives, break them into monthly key results, plan weekly initiatives, and track daily tasks with a built-in time tracker. Everything rolls up — completing today's work moves the needle on this year's goals.

Query anything. Write JavaScript against your own life data — tasks, metrics, sleep patterns, activity levels, objective scores — in a sandboxed code editor. Render results as markdown, tables, or interactive charts. Use queries to power dashboard widgets and automatically score key results.

Let AI write the code. Don't know where to start? Describe what you want to see in plain English, and the AI assistant generates the query for you. Supports Claude, GPT, Gemini, local models via Ollama, and any OpenRouter provider.

Own your data. SQLite on your own hardware. No cloud accounts, no subscriptions, no telemetry. Export everything as JSON anytime.


Features

Multi-Level Planning

Set yearly objectives, break them into monthly key results, plan weekly initiatives, and track daily tasks with a built-in time tracker. Everything rolls up — objectives are scored automatically based on their key results, measured by manual sliders, checklists, or custom JavaScript queries that compute progress from your actual data.

AI-Powered Analysis

Query your own life data — daily records, tasks, time logs, objective scores, and more — in a sandboxed JavaScript editor with full autocomplete and interactive Plotly charts. Don't want to write code? Describe what you want in plain English and let AI write it for you. Save queries as dashboard widgets or use them to automatically score your key results.

Generate Custom Dashboard Widgets

Widget.mp4

Generate Queries for Key Result Scoring

2026-03-01.21-04-26.mp4

Play Around a Query in Query Builder

QueryBuilder2-small.mp4

Built in Time Tracker

Track time spent on any task, compare estimates against actuals, and query it all later in the analytics engine.

2026-03-01.18-01-47.mp4

Custom Metrics

Define what you track each day — numbers, times, booleans, or text you log manually, computed formulas derived from other metrics, and external data pulled automatically from plugins like Fitbit. Metrics are versioned, so you can change your tracking template anytime without losing historical data. Screenshot 2026-03-01 at 20-53-01 Metrics Template - Settings - RUOK

Plugins & Integrations

Connect external data sources via an extensible plugin system. Currently supported: Fitbit (sleep duration, bed/wake times, steps, resting heart rate, cardio load, readiness score), syncing automatically every hour via OAuth2. The Plugin Development Guide covers everything needed to add a new integration — it also doubles as an AI coding skill for Claude Code or Cursor.

Screenshot 2026-03-01 at 17-30-20 Plugin Settings - RUOK

Multi-User & Friends

Run a single instance for your family and friends. Each person gets a private workspace. Add friends to view each other's dashboards — see progress without exposing task details. Great for accountability partners or families sharing a home server.

Screenshot 2026-03-01 at 17-27-07 Friends RUOK

Admin Tools

User management, query execution logs, security monitoring, and system configuration — all from the browser.

Screenshot 2026-03-01 at 17-29-31 Admin Dashboard RUOK Screenshot 2026-03-01 at 17-29-22 Admin Dashboard RUOK

Desktop + Mobile

RUOK is a progressive web app — install it on your phone's home screen for a native-like experience, or use it in any desktop browser. One codebase, no app store, always in sync.

image

Quick Start (Development)

cd okr-app
export ADMIN_USERNAME=admin  # You still need to create this user
export DATA_DIR=data
npm install
npm run db:push
npm run dev

Opens on http://localhost:5180/.

Environment Variables

Variable Default Description
DATABASE_PATH /app/data/okr.db Path to SQLite database inside the container
ADMIN_USERNAME (none) Username that gets admin privileges on login

Note that you still need to create the admin user.


Deployment

RUOK runs on modest hardware. A Raspberry Pi 4 with 2GB RAM is plenty.

Guide What it covers
Setup Guide Raspberry Pi deployment with Docker, Caddy, HTTPS, DNS, backups
Maintenance Playbook Reverse proxy configs, monitoring, troubleshooting
Query API Reference Complete JavaScript query sandbox API

Tech Stack

Layer Technology
Framework SvelteKit 5 with Svelte 5 runes
Database SQLite + Drizzle ORM
Query Sandbox QuickJS (WebAssembly)
AI Providers Anthropic, OpenAI, Gemini, OpenRouter, Ollama
Charts Plotly.js
Code Editor Monaco Editor
Auth Session cookies + bcrypt
Deployment Docker, systemd, or bare Node.js

License

AGPL-3.0