A personal operating system

Software for one life.

Polaris is where I build my own productivity systems — each one shaped to exactly how I work, in code I can rewrite the day that stops being true.

Polaris›Today

Today

Sunday, November 1 — 2 entries today, ₱1,284.50 spent this month, 3 of 4 habits ticked today.

Journal2 entriestoday
Expenses₱1,284.50November so far
Habits3 of 4ticked today
The Today dashboard, with sample numbers

The exercise

Build the tool instead of bending to one

Productivity apps are built for everyone, so they fit no one exactly. You adapt your routine to their data model, ignore most of their features, and keep a spreadsheet on the side for the one thing they can't do.

AI-assisted development changes that trade-off. When software is cheap to write and cheap to rewrite, it's reasonable to build a system for each part of life that needs one — sized to the actual problem — and to rebuild it when the problem changes. Polaris is that exercise, run on one person: me.

Personal

One user. No multi-tenancy, no plugin API, no settings pages. The platform supplies sign-in, data, and navigation; everything else is a system I edit directly.

Continuously improving

Every system tracks whether it's working — metrics it records on its own, reflections I write, and a history of what changed and why.

Where I need it

Web-first, built for the phone too. The expense tracker is designed to be used one-handed in a store aisle.

Systems

What's built so far

Each system is a self-contained module with its own data, interface, and logic. They share a platform, not code.

Engineering journal

systems/journal · since Apr 2026

A daily micro-log of what I'm building, learning, and working on.

  • Short, timestamped entries filed under topics
  • Inline #tags and [[topic]] links
  • Markdown editor with checklists
  • Full-text search across every entry

Activity expenses

systems/expenses · since Jun 2026

What an outing costs, captured while it happens. It replaced a two-column Google Sheet.

  • One tap to start a grocery run or a night out
  • Phone-first capture with a running total
  • Items save instantly and sync through dead zones
  • Monthly trends by activity type

Habit tracker

systems/habits · since Jul 2026

A weekly tracker where each day is off, partial, or complete.

  • Partial days still keep a streak alive
  • Consistency trend, streaks, and heatmaps
  • Every habit keeps its own journal topic
  • Logs show up as diamonds under the day

Architecture

How the pieces connect

Systems don't import each other. Each one registers with the platform through a manifest, and the platform handles everything that cuts across them. There is one deliberate exception.

Activity expensessystems/expenses
Engineering journalsystems/journal
Habit trackersystems/habits
Platformmanifest.ts · dashboard.tsx
  • Sign-in
  • Data
  • Command palette
  • Today dashboard
  • Feedback
Three systems on one platform. Habits writes logs into the journal and reads them back; the others stand alone.
Habits and journal
The one direct tie between systems. Creating a habit creates a journal topic with the same name, and renames and archives stay in step. A log written from the tracker is a journal entry in that topic — and it comes back as a diamond under the day it was written.
Command palette
Each manifest declares searchable layers. ⌘K jumps to any system, drills from a topic down to a single note, or searches every system at once.
Today dashboard
Each system registers a card and a one-line summary. The dashboard stitches them into a single sentence, so the day starts from one view instead of three.
Feedback loop
Systems record metrics as a side effect of use — entries written, items per activity, what each outing cost. Reflections and an iteration history sit beside them, so each rebuild starts from evidence.

Adding a system

A new system starts as a copy of systems/_template. Its manifest is the whole contract — listing it in systems/index.ts puts it in the sidebar and the command palette. No plugin API, no config file.

systems/expenses/manifest.ts
export const manifest: SystemManifest = {
  name: "expenses",
  displayName: "Activity Expenses",
  description: "Track what an activity costs while it happens",

  nav: {
    label: "Expenses",
    icon: "receipt",
    href: "/expenses",
  },

  palette: {
    layers: [palette.activitiesLayer],
  },
};

Under the hood

Built to be rebuilt

The tech stack is chosen for low-friction rewrites. The backend is moving from Postgres to Convex one system at a time — expenses first, then journal and habits — with an Expo app to follow.

  • TypeScript
  • Next.js 16
  • React 19
  • Convex
  • Bun workspaces