One-time setup. Your tasks and lists will live in your own self-hosted NocoDB base — synced across your phone, laptop, and tablet, with no monthly API-call cap.
First time? Set up NocoDB once:
Deploy NocoDB on your own infrastructure, e.g. via Docker: docker run -d --name nocodb -p 8080:8080 -v nc_data:/usr/app/data nocodb/nocodb:latest Put it behind your own reverse proxy with HTTPS so your phone can reach it over the internet.
In NocoDB, create a Base named Focus Board, then create 9 tables with these exact names and fields (see table below). Use NocoDB's Number, Single Line Text, Long Text, Date, Checkbox, and Single Select field types as noted.
Get your Base ID: open the base → the "API Docs" / Swagger link in the base's context menu — the Base ID is shown at the top (starts with p_).
Create an API Token: Account menu (top right) → API Tokens → Create Token.
Paste your NocoDB URL, Base ID, and token above and click Connect.
Table
Fields (type)
Tasks
AppId (Single Line Text), Name (Single Line Text), Priority (Number, 1–100), Context (Single Select: Anywhere/Office/Home/Car/Phone), DueDate (Date), EstMinutes (Number), RemainingMinutes (Number), InToday (Checkbox), Done (Checkbox), ProjectId (Single Line Text), Sequence (Number), Assignee (Single Line Text), GoalId (Single Line Text)
Projects
AppId (Single Line Text), Name (Single Line Text), Status (Single Select: Active/Done)
Goals
AppId (Single Line Text), Text (Single Line Text), Horizon (Single Select: Day/Week/Month/Year), PeriodKey (Single Line Text), Done (Checkbox)
GoalSteps
AppId (Single Line Text), GoalId (Single Line Text), Text (Single Line Text), Done (Checkbox), Sequence (Number)
Inbox
Text (Single Line Text), CapturedAt (Date)
WaitingFor
Text (Single Line Text), WaitingOn (Single Line Text), Since (Date)
SomedayMaybe
Text (Single Line Text), AddedAt (Date)
TodayPlan
DateKey (Single Line Text), WorkStart (Single Line Text), WorkEnd (Single Line Text), GoalsJSON (Long Text), BlocksJSON (Long Text)
WeeklyReview
WeekKey (Single Line Text), ItemsJSON (Long Text)
If Connect fails with a network/CORS error:
Self-hosted NocoDB doesn't always send permissive cross-origin headers by default. If your reverse proxy is nginx, add this to the location block for NocoDB and reload: add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Headers' 'xc-token,Content-Type' always; add_header 'Access-Control-Allow-Methods' 'GET,POST,PATCH,DELETE,OPTIONS' always;
For Caddy or Traefik, the equivalent is adding the same three headers in your proxy config.
Upgrading from v6? Three changes in your existing base:
Goals — add three fields: Horizon (Single Select: Day/Week/Month/Year), PeriodKey (Single Line Text), Done (Checkbox). Existing goal rows will show up under Day once you set their Horizon, or you can simply delete them and re-enter.
Add a new table GoalSteps with: AppId, GoalId, Text (all Single Line Text), Done (Checkbox), Sequence (Number).
Tasks — add one field: GoalId (Single Line Text).
Migrating from Airtable?
Same tables and fields as your Airtable base — recreate them in NocoDB with the types above, then re-enter your data (there's no automatic Airtable→NocoDB import built into Focus Board). Your token and connection details will be different since this now points at your own server instead of Airtable.
Inbox
Capture anything on your mind — decide what it is later.
Add task
Backlog
Filter by where you are now:
Filter by assignee:
Projects
Multi-step outcomes — only the next action shows in your backlog.
Waiting For
Delegated or blocked — not on you right now.
Someday / Maybe
Not actionable yet — a parking lot for ideas.
Weekly review
Goals
End of day
Take a few minutes to close today's loops and set up tomorrow, so you don't have to work out how to start.
1. Loose ends — empty your head
Anything still rattling around. Each line goes to your Inbox to sort out later.
2. Tomorrow's goals
Max 3. For each one, add 3–5 concrete sub-steps so tomorrow starts without thinking.
Set up today
Select backlog tasks above with "Add to today", then generate the schedule. Regenerating always replans from the current time — finishing your highest-priority task first — so it's safe to hit this any time the day drifts off track.
Log an interruption
Now
Today's timeline
Opened as a local file
This page is running from file://. On Android that blocks installing it as an app,
and some browsers won't reach your NocoDB server from here. Host these files on your own
server (alongside NocoDB) and open it over https:// instead — then it installs and behaves like a normal app.