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.
A personal operating system
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.
Today
Sunday, November 1 — 2 entries today, ₱1,284.50 spent this month, 3 of 4 habits ticked today.
The exercise
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.
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.
Every system tracks whether it's working — metrics it records on its own, reflections I write, and a history of what changed and why.
Web-first, built for the phone too. The expense tracker is designed to be used one-handed in a store aisle.
Systems
Each system is a self-contained module with its own data, interface, and logic. They share a platform, not code.
A daily micro-log of what I'm building, learning, and working on.
What an outing costs, captured while it happens. It replaced a two-column Google Sheet.
A weekly tracker where each day is off, partial, or complete.
Architecture
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.
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.
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
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.