Skip to content

Coming to macOS

Stop paying three subscriptions to run your agency.

nokko is a native Mac app for projects, time tracking and invoices — and your data is plain Markdown files on your own disk, working offline. When there's more than one of you, sharing runs through your own GitHub — not through us.

We'll only use this to tell you nokko is out. Privacy

See what it does

macOS 26 · Apple silicon · Windows in development · Built by a two-person agency, for itself first — not for a corporation.

nokko — Project management. In Markdown. On your terms. | Product Hunt

The Timeline view: ten client projects drawn as bars across August and September, milestones as diamonds on the bars, and a violet today line down the middle of the month.

順 — jun · order · sequence · flow

No account. No telemetry. No service in the middle. No seats. No lock-in.

The mark is the kanji 順 — jun: order, sequence, things proceeding smoothly. We read its two components as the product. 川, a river: workflow lanes, movement. 頁, a page: structured rows on a leaf of paper. Ordered flow, drawn as one character.

Project management. In Markdown. On your terms.

1
Markdown file per project
0
accounts required
11
surfaces over the same files
100%
of your bytes preserved

Everything in one

Three subscriptions. One app.

Projects, timeline, calendar, time tracking and invoices in one place. No paying for ClickUp, then Toggl on top, then copying hours into an invoice by hand. Track the time, draft the invoice from it. One app.

What you probably pay for now

  • A project tool, per seat, per month
  • A separate time tracker, per month
  • Something else again for invoices
  • And the copying between all three

What nokko is

  • Projects, boards, calendar and Gantt
  • A timer and Pomodoro, logged into your files
  • Invoices drafted from the hours you tracked
  • One app, on your Mac, offline

8h30m

this week

StorefrontHalden Coffee2h50m
App OnboardingMeridian Health40m
StorefrontLantern Books5h

Your files, your disk

It only ever changes the characters you changed.

Every project is one Markdown file on your Mac. Not a database, not a cloud, not a locked format. Move a due date in the app and it rewrites that date — not the file. Your line endings, your indentation, your blank lines, your own notes, even the emoji it doesn't recognise: all of it survives, byte for byte.

Client Work/Halden Coffee/Storefront.md
---
type: project
status: active
client: Halden Coffee
start: 2026-07-20
due: 2026-09-04
color: "#5A82D6"
columns:
- "Budget: number"
tags: [web, nextjs]
---
 
# Storefront
 
Freeform notes. nokko never rewrites this prose.
 
## Milestones
 
- [ ] Design sign-off with Halden 🎯 📅 2026-08-12
- [ ] Staging deploy 🎯 📅 2026-09-01
 
## Build
 
- [/] Homepage hero and the bag grid [Budget:: 900] [est:: 3h] 🛫 2026-08-03 📅 2026-08-14 #frontend
- Client wants the oven photo above the fold.
- [x] Pick the type scale
- [ ] Cut the mobile breakpoint
- ⏱ 2026-08-11 09:20–10:55 (1h35m) — hero layout
- [ ] Wire the newsletter signup [est:: 2h] 📅 2026-08-10 #backend
- [>] Copy review from Halden [Assignee:: Ema] 📅 2026-08-07
- [x] Audit the old Shopify storefront #ops
 

The file as it sits on disk. Pick a date above and only the highlighted characters will move.

Homepage hero and the bag grid

Storefront

Due
Fri
Start
2026-08-03
Priority
High
Estimate
3h
Budget
900
Logged
2h50m
Subtasks
1 of 2

Change the due date and watch what moves.

If you ever stop using nokko, nothing happens to your work. It was never anywhere else.

One file, eleven surfaces

Every view. The same file underneath.

Headings in the file are the groups you see. An indented task is a subtask. Nothing here is app state — change a view and you have changed the text on disk.

One lane per state. Drag a card between lanes — the file's checkbox character changes, nothing else.

Eight of the eleven, here. Time gets its own band below; Completed and Invoices are the rest — every one reading the same files.

The Storefront board for Halden Coffee — four lanes holding To Do 7, In Progress 2, Waiting 1 and Done 4, each card carrying its own due date and time estimate.

The morning screen

A plan, in the order you decided.

The day's sequence is arranged by hand, because the order to tackle things in is a decision. A list that re-sorts itself under the hand that arranged it is not a plan. Drag it once and it stays; a task that arrives at eleven joins the end rather than jumping the queue.

The Today screen: four tasks in the order they were arranged by hand, 2h30m spent against 4h45m planned, with Overdue, Next 7 Days and Waiting collapsed beneath.

Overdue you can act on

Anything more than a fortnight past due drops out of the count and goes grey. Nothing here escalates on its own — a task that survived two weeks has proven it wasn't urgent.

Waiting is not late

Tasks handed to someone else sit in their own place and are never counted as overdue while they wait.

Capture from anywhere

⌥Space opens a capture box over whatever you were doing. Type a tag, a priority, a project and a date in one line; it files itself and gets out of the way.

Send the stationery proof #print !high >Lantern fri

Client Work/Lantern Books/Storefront.md — - [ ] Send the stationery proof ⏫ 📅 2026-08-14 #print
#tag
a tag, anywhere in the line
!high
priority
>project
which file it lands in
fri · 3d · 2w
a date, in words

Hours become invoices

Track the time. Draft the invoice from it.

A timer on any task, a Pomodoro if you want one, and every session logged as a line in the same Markdown file the task lives in. When the month ends, the invoice is drafted from those hours — rates, VAT, totals — as another file you own.

The Time view: 21 hours logged across August, grouped by client — Halden Coffee 8h40m, Meridian Health 3h10m, Lantern Books 2h, and 7h10m against no client at all.
Client Work/Halden Coffee/Storefront.md
## Build
 
- [/] Homepage hero and the bag grid [Budget:: 900] [est:: 3h] 🛫 2026-08-03 📅 2026-08-14 #frontend
- ⏱ 2026-08-11 09:20–10:55 (1h35m) — hero layout
- ⏱ 2026-08-12 14:05–15:20 (1h15m)
 

Logged where the work is

A session becomes a ⏱ line under its task. Open the file in a text editor in ten years and it still reads.

Totals that can't lie

An invoice recomputes its numbers on every read rather than trusting what's written. A hand-edited figure can drift; a total can't.

Time by client

Where the hours went, grouped by client and project, exportable. Hours stay hours — money appears only inside an invoice.

Invoice

INV-2026-031

Issued 2026-08-12

Due 2026-08-26

To

Halden Coffee

DescriptionHoursRateAmount
Homepage hero and the bag grid2.83€75.00€212.25
Product detail template5.00€75.00€375.00
Roastery photography edit0.67€75.00€50.25
Net€637.50
VAT 21%€133.88
Total€771.38

Native Mac

Not a web app in a window.

A real Mac app — SwiftUI, built against macOS 26, with desktop widgets, a menu bar popover, a global hotkey and full keyboard control. It works with no internet at all. Your work doesn't stop when the connection does.

The same Today screen in the light appearance, following whatever the Mac itself is set to.The Today screen: four tasks in the order they were arranged by hand, 2h30m spent against 4h45m planned, with Overdue, Next 7 Days and Waiting collapsed beneath.
The same screen, the same morning, in both appearances. Neither is a re-skin of the other.
The menu bar popover: a timer running at 1:24:04 on “Homepage hero and the bag grid”, today's 2h30m of entries beneath it, and the next four tasks.

Widgets on the desktop

The glanceable half: what's next, the month, the shape of the quarter. Always there, never asking for anything.

The whole thing from the keyboard

Every action is reachable without the mouse, and ⌘/ shows the map.

Light, dark, or whatever the Mac is doing

Themes apply before the first window draws, so a chosen appearance never flashes the other one at you.

⌥Space
capture from anywhere on the Mac
⌘1 … ⌘7
Today · Calendar · Timeline · All Tasks · Time · Invoices · Clients
⌘N / ⇧⌘N
new task · new project
J / K
select the next · previous task
S
start or stop the timer on the selected task
⌘Z
undo — every edit is exactly one step

Sharing

Share through your own GitHub.

A private repository on your own GitHub account holds the workspace. Every change syncs as a commit in the person's own name — and there is no git anywhere: none on your Mac, none inside the app. nokko speaks to GitHub directly, and the commits happen on their own, one per change.

Your Mac

Studio iMac

Your GitHub

Private repo

Ema's Mac

Laptop

Nothing of ours sits between them. The one account in the path is yours, with GitHub.

A code, not a password

Sign in by typing a short code on github.com. No password or token ever passes through the app, and there is nothing that expires.

A conflict keeps both

If two people change the same file at once, both versions survive on every machine — a marked pair, not a merge to untangle. Nothing is ever resolved by discarding work.

Invited by username

Invite a teammate from inside the app; the invitation is waiting in their own join sheet. A free GitHub account is all they need.

Deleted isn't gone

A file you delete stays in the repository's history, recoverable — never one slip from nowhere.

Or your own server

The same sharing, over SFTP.

Multiple Macs, one folder on a host you already pay for. No GitHub account, no third party at all — your files move across your own infrastructure.

Any host with SFTP

A VPS, a NAS, ordinary shared hosting. Nothing new to rent.

Keys in the Keychain

The first connection shows the server's fingerprint and asks. Keys are kept in your macOS Keychain, not in your files.

Deletes go to a trash

To the server's own 30-day trash and this Mac's Trash — never straight to nowhere.

The same conflict rule

Two edits to one file keep both versions, marked. Nothing discarded here either.

A workspace with no sharing set up opens zero network sockets — a number the app's own tests assert. Sharing is something you switch on, not something that is on; and forgetting a connection always leaves a fully working local folder.

The record

The history answers for itself.

Because every synced change is a commit in someone's name, the workspace carries its own record. The clock button in the sidebar opens it: who changed what, when — file by file, down to the minute — and every line clicks through to the document it describes.

In each person's name

Changes are recorded as the person who made them — Ema's edit says Ema, not "sync" or "server". Nobody writes a log entry; the log is what syncing is.

Read, not kept

The feed is read from the repository's own history, not from a second database — so it cannot disagree with the files, and it reaches back as far as the repository does.

The audit trail you didn't set up

When a client asks what happened on Tuesday, the answer is already written. Nobody kept minutes; the history kept itself.

ActivityWed 12 Aug

Client Work/Meridian Health/App Onboarding.md

YYou logged 40m onSearch and filters14:10

Client Work/Halden Coffee/Storefront.md

EEma completedPick the type scale14:02
YYou logged 1h15m onHomepage hero and the bag grid13:47
EEma completedAudit the old Shopify storefront11:31
YYou addedCut the mobile breakpoint09:14

Notices

It speaks up only when asked.

One notice log per Mac, behind a bell in the toolbar. The unread count clears the moment you open it — a record you consult, not a score you owe. Three kinds of notice exist, and each one reaches macOS notifications only if you switch it on.

Notices3
Overlap17m claimed twice: Homepage hero and the bag grid and Search and filters (13:30–13:47)14:10
TeamEma completed 2 tasks in Storefront14:02
OverdueOverdue this morning: Wire the newsletter signup · Send the stationery to print09:00
Notification settings…

Overdue, once

The digest announces each overdue task exactly once, ever. No daily drumbeat, no re-escalation — a task you have been told about is a task you know about.

Double-claimed minutes

If two timers claim the same minutes, a notice names the span. The Time view carries the same annotation — the overlap is computed, not smoothed over.

Teammate activity

When a sync brings changes, one line says what arrived: "Ema completed 2 tasks in Storefront." A note when something happened; silence when nothing did.

Switching

Bring what you already have.

Export from ClickUp or Todoist and import the CSV; or copy tasks out of Things, Notion or Apple Notes and paste them straight in. Anything that can't be mapped is listed rather than quietly dropped.

Import
ClickUpTodoistClipboard

tasks.csv — 4 spaces, 11 boards, 213 tasks

Client Work/

Halden Coffee/Storefront.md · 38 tasks

Meridian Health/App Onboarding.md · 64 tasks

3 warnings — every unmapped field is listed, never silently dropped.
  • ClickUp

    CSV export — spaces, folders and lists arrive as they were

  • Todoist

    CSV export — sections become headings, indentation becomes subtasks

  • Anything else

    Copy bulleted text and paste. Things, Notion, Apple Notes, a plain list

The rest of it

Everything else it does.

Workspaces

A separate root folder per client, switched from the top bar.

Spaces & folders

Derived from the folders on disk. Make one in Finder and it appears.

People & team

Assignees as plain labels — no accounts, no passwords inside nokko. Sharing invites are GitHub's, not ours.

Clients

First-class records that invoices and reports both read from.

Custom columns

Declared in frontmatter, stored on the task line, readable by Dataview.

Docs

Any Markdown file without tasks is a doc, and nokko reads and writes it.

Dependencies

Blocked-by links drawn on the timeline, in Obsidian's own notation.

Templates

Save a project as a template; new ones are byte copies with a new title.

Recurring tasks

`🔁 every week` — completing one writes the next.

Reminders

A field on the task line. macOS shows it once, at the minute you wrote.

Task types

Bug, feature, idea, meeting. A name and a glyph — no sprints, no points.

Undo everything

Every edit is exactly one ⌘Z, including the drags.

Interoperable by construction

Opens in Obsidian. Opens in TextEdit. Opens in ten years.

The task format is the Obsidian Tasks convention, and custom fields are Dataview's. Point nokko at a vault you already have and both apps read the same files. You do not need Obsidian to use nokko — but nothing stops you having both open at once.

  • Obsidian

    the same vault

  • Git

    diff it, version it

  • Your server

    sync over SFTP

  • Any text editor

    now or in ten years

- [ ]
open · [/] in progress · [>] waiting · [x] done · [-] cancelled
📅
due date — the only date that can make a task overdue
🛫 ⏳
start · scheduled
✅ / ❌
completed / cancelled on this date
🔁
repeat rule
⏫ 🔼 🔽
priority
🎯
milestone
a logged session, as a sub-bullet under its task
[Budget:: 900]
a custom column's value, Dataview style
#tag
tags, anywhere in the description

Honestly

Why nokko, and not the stack you already pay for?

nokko compared with NotePlan and with ClickUp plus Toggl
CapabilitynokkoNotePlanClickUp + Toggl
Your files, on your diskYesYesNo
Works fully offlineYesYesNo
Project managementYesBasicYes
Timeline / GanttYesNoYes
Time trackingYesNoSeparate tool
Invoices from tracked hoursYesNoIn their cloud
Native Mac appYesYesNo
Sync without a service in the middleYesNoNo
Share through your own GitHubYesNoTheir cloud
Per-person change historyYesNoPartial

Swipe sideways for the other columns.

NotePlan has the same plain-text comfort, and it is a good app — but it doesn't track time or draft invoices. ClickUp and Toggl do both, between them, in someone else's database.

Questions

The things people ask first.

What is nokko?

nokko is a native Mac app for project management, time tracking and invoicing, built for freelancers and small studios. Everything lives as plain Markdown files on your own disk — it works offline, has no account, and you buy it once rather than subscribing.

Do I need Obsidian to use nokko?

No. nokko is a complete Mac app that reads and writes the files itself. Obsidian compatibility just means you can open the same files there, or in any text editor, if you want to. There is nothing else to install.

Does it work offline?

Fully. There is no nokko server and nothing to log in to. The only time it touches the network is when you switch on sharing — to your own GitHub repository or your own server. On a plane, on a train, on bad hotel wifi — it behaves identically.

Where is my data kept?

On your Mac, as plain Markdown files in a folder you choose. The app has no servers and no account — there is nowhere else for it to go. You can open, copy, move, back up or edit those files with anything, at any time, including when nokko isn't running.

Can I sync between multiple Macs?

Yes — two ways. Through a private repository on your own GitHub account, or through your own server over SFTP: a VPS, a NAS, ordinary shared hosting. Either way there is no nokko cloud and no nokko account — your files move between your machines and infrastructure you chose. If two machines edit the same file at once, both versions are kept.

Can it sync through GitHub?

Yes — it's the primary way to share. A private repository on your GitHub account holds the workspace, and every synced change becomes a commit in your own name, so the history shows who changed what, when. There is no git on your Mac and none inside the app — nokko talks to GitHub directly, and nobody ever types a commit. Sign-in is a short code you type on github.com; no password or token ever passes through the app.

Do I need a GitHub account?

Only for GitHub sharing, and the free tier is enough. Working locally needs no account of any kind, and sharing over SFTP needs only your server. nokko itself still has no accounts at all.

Is my data on GitHub private?

Repositories are created private, visible only to the people you invite. If you point nokko at a public repository instead, it warns you loudly and names exactly what would be exposed.

Do my teammates pay GitHub?

No. A free GitHub account is all a teammate needs — GitHub's free tier covers private repositories and the collaborators you invite to them.

Is this for a big team?

Not a big one, and that's deliberate: there are no permissions, no roles and no admin console, and it isn't trying to grow into them. But it isn't solo-only either. A small studio sharing one workspace through its own GitHub repository — or a folder on its own server — works well: everyone sees every project, assignees are names on the task line, and each person mostly drives their own files. Invitations and access run through GitHub's own sharing, so there is nothing of ours to administer. The day a team needs access control and approval chains is the day it has outgrown nokko.

What about Windows?

A native Windows build is in development. The file format is the same on both, so a vault made on either one opens on the other. There is no date yet, and the waitlist is where the announcement will go.

Next

Windows, natively.

Not a port of a web app, and not Electron — the same argument as the Mac build, made again properly. The format doesn't change, so a vault written on one opens on the other. It's in development; there's no date, and you'll hear it here first.

macOS

First to ship

Windows

In development

One format, two apps. A vault written on either will open on the other with nothing to convert.

Waitlist

Be there when it ships.

One email when it's ready. Nothing else — no drip sequence, no newsletter, no sharing it with anyone.

Which builds are you waiting for?

Pick as many as apply.

We'll only use this to tell you nokko is out. Privacy