![]()
18 Oct 2026 NicAI CC, the NicAI Command Centre, is the native macOS app where the work of my AI comes back to me. I run about 50 Claude Code sessions at a time. Each one leaves something for me: a file to review, a question it can't answer alone, a step in a plan, a batch of messages to send, a prompt I started and didn't send. NicAI CC shows all of it in 1 window, and I act on each item with 1 key.
I started it on 14th October 2026 under the name Taskee, next to my other -ee tools. 3 days later it had grown from a task list into the console for all of What is NicAI, so I renamed it. 5 days and 109 commits later, I used it all day.
02 Nov 2026 19 days in, it has 262 commits and about 36,000 lines of Swift. Since the first version of this note it gained a single Needs you inbox, reminders, a Health page, Call Briefs, an Opps section, my local web apps and an agent CLI. The full list is in All features.
The screenshots show the version of 18th October. They come from my real data, with client names, people, file names and messages blurred. The Sessions screenshot comes from the test copy of the app, which runs on made-up sessions.

From a chat window to a command centre
The app is the 4th step of the same problem: how do I work with more AI than I can watch?
| Step | How I worked | What broke |
|---|---|---|
| 1. The Claude desktop app | 1 conversation at a time. I copied the results out by hand | 1 conversation is 1 task. My files stayed outside |
| 2. Terminal windows | Claude Code, 1 Ghostty window per session, tiled by Tilee: my own tiling window manager in Hammerspoon | With many windows, I couldn't see which one waited on me |
| 3. A terminal multiplexer | All sessions in Herdr: they survive, and each pane has a state | The state was there, but the work was still in 5 places |
| 4. NicAI CC | 1 native window over sessions, files, questions and tasks | Still growing |
1. The Claude desktop app
The chat app was where I started. It is good for 1 question, 1 document, 1 draft. But my work lives in files and databases on my Mac. Every answer meant copy, paste and save by hand, and nothing ran while I wasn't looking.
2. Terminal windows
Claude Code changed the model. A session reads and writes my files, runs my scripts and keeps going on its own. So I opened 1 Ghostty window per task, and my tiling window manager put them in columns.
It worked for a few sessions. With more, I spent my time looking for the window that had asked a question a while ago. A session that waits is invisible: it sits quietly behind the others.
3. A terminal multiplexer
herdr is tmux rebuilt for coding agents. A server owns the terminals, so sessions survive a closed lid, and every pane carries a state: working, blocked or idle. Its socket API lets other programs read a pane and type into it.
That fixed "which session needs me". It didn't fix the rest. The work my sessions handed back still sat in 5 places:
| Where | What waited for me | How I saw it |
|---|---|---|
| Claude Code sessions | Questions, permission prompts, "go on" | herdr, 1 pane at a time |
| Output folders | Drafts, decks, documents to review | Finder |
TASKS.md files |
Decisions NicAI needs before it goes on | Nowhere: I opened the files by hand |
| Task dashboards | Plan steps, people to contact, warnings | 1 HTML page per task, in a browser |
| Claude Code transcripts | How much I use NicAI, and on what | Nowhere |
4. NicAI CC
NicAI CC reads all 5 and gives me 1 inbox per kind of work. Its job: show what needs me in 1 place, let me act in 1 key, and hand anything that needs NicAI back to NicAI in 1 key.
How it fits together
NicAI CC reads every source directly. It changes nothing directly: every write goes through the tool that owns the data.
02 Nov 2026 The same rule holds for the sources added since: the opp brief and pipeline tables, the call brief folders, the health checks of Pulsee and my local web apps in Portee, see Portee: one page for all my local apps. NicAI CC reads them, and writes only through the script or API that owns each one.
All features
02 Nov 2026 The sidebar now holds Overview and Activity, Needs you, Health, Sessions (All plus 1 row per workspace), Artifacts (1 entry per workspace), Calls, Opps, the task dashboards, Shopping and Local apps. Each part below lists what it does today.
Overview
How I use NicAI, read from the Claude Code transcripts on disk.
- 1 card per workspace (work, personal, lab, my company): prompts today, sessions that need me, idle sessions, files to review.
- 6 metric cards: prompts, sessions, active hours, output tokens, artifacts and deliveries a day. Each card shows today, the 7-day and 30-day averages, and the average since the start.
- The chart:
1to6picks a metric,←→steps through them. 14 days, stacked by workspace, with the 7-day average as a line. - By workspace: the last 7 days as a table.
- Now: the sessions that need me, the Waiting count, the newest files to review and the shopping items that are ready.
Claude Code deletes a transcript 30 days after its last change, so NicAI CC keeps its own daily counts and the history survives.
Sessions

Every Claude Code session, live over herdr's socket.
- Tabs: All, Needs you, Working, Idle, Review, Pending, Queued and Not in herdr (
⌘1to⌘8). The heading counts the active sessions and the total. - 1 sidebar row per workspace 02 Nov 2026: Sessions has its own sidebar section, with All and 1 row per herdr workspace. Each row counts the sessions that need me, in red while one is blocked.
- Sort (
S): by state, by the most recent change, or A-Z. A workspace emoji starts each row. The state sort groups the sessions under coloured bands, in my order: Working, Needs an answer, Unread, To review, Pending, Queued, Not in herdr, Idle. - The screen: the selected session's terminal sits under the list, in my Ghostty theme and font, 3 pt larger than Ghostty by default (
⌥⌘=and⌥⌘-per pane). A scroll up reads the scrollback.Fgives the terminal the whole window. - Answer a question:
1to9picks a choice of a blocked session, and only while herdr still shows the question I saw. - The prompt bar: each session keeps its own unsent text.
↩sends now, or queues the prompt for the next pause while the session works.⇧↩adds a line,⌃↩waits until the usage limit on the screen resets,⎋cancels a prompt just sent, as in Ghostty. Files dropped or pasted from Finder go in as paths. - The queue as tiles 02 Nov 2026: the queued prompts of a session sit above the bar, oldest at the bottom, each with a chip that says when it goes.
✕cancels one, a click takes it back to edit. - Away 02 Nov 2026:
⌥↩holds a prompt until I step out. 1 trigger sends every held prompt:⇧A, the global key⌃⌥⌘A, or a key on my Stream Deck. Each session then takes its prompts 1 by 1. - Read and unread: a finished turn makes a session unread (green, bold).
⌘Ttoggles read,Emarks it read and moves on. - Pending: a session where I typed and didn't send gets an orange bar and a "Pending" chip, also when I click away without
⎋. NicAI CC also reads each session's own input box every 20 s. - To review (
⌘R) turns the row's icon into an orange eye. A session that starts working again loses the flag. - Exit session (
⇧⌘⌫, the red button): the row leaves the list at once. Behind it, the session runs/document-session, then/exit, then its tab closes. - Its artifacts: "8 files" on a row, the newest in the detail panel,
Alists every file the session made. - Everything else:
Oopens it in herdr,⇧Rrenames the tab,Ccopies the resume command,⇧⎋interrupts,Nstarts a new session,⇧⌘Rrefreshes, notifications on blocked and done. - Sessions outside herdr (another terminal, the Claude app) show as read-only rows, with their last prompt and reply from the transcript.
Safety first: no key reaches a session unless I pressed it. NicAI CC refuses to type into a session that holds my own unsent draft.
Needs you

02 Nov 2026 On 31st October, 1 page replaced Waiting and Next. Needs you lists everything that waits on me, from every source:
- What's in it: sessions blocked on a question, the "Waiting On Nic" items of every
TASKS.md, reminders on their day, my plan steps due within 2 days, late or blocked, deliveries I must send or decide on, today's calls whose brief I haven't opened, and red health checks I must fix. - Tabs: Now (in 4 groups: Answer, Today, Send or decide, No day yet), Later (items with a day to come) and Stale (undated items 14 days old or more, out of the badge).
- Rows: the ask, a due chip ("2 d late", "Today"), the verb, NicAI's recommendation, the reason, the workspace and the age.
- Recommended answers: an agent can only ask me a question with a recommended answer.
Yaccepts it with 1 key. - Keys:
↩answers or opens the item where it lives,Ddone,Xdrop,⇧Nno,⌘Tgives it a day,Hhands it back to NicAI with "decide it yourself",Gopens the source. - Answers go back by themselves: an answer moves the item to Active and hands it at once to a Claude Code session in that
TASKS.mdfolder. The prompt bar keys work here too: now, held for Away, or after the limit resets. - Reminders: "remind me on Monday to send the quote" becomes a dated line. It stays hidden until that day, then comes first with a notification at 08:30, and optionally an iMessage to my phone.
Rsets one from the keyboard. - Safe writes: near-identical items fold into 1 group row. Every write is hash-checked against the file and undoes with
⌘Z.
The old Next page, the open plan steps of every task dashboard, still opens from ⌘K. Its due steps now join Needs you.
Artifacts

Every file NicAI made for me, 1 entry per workspace.
- How files arrive: a session hands a file over with 1 command, a hook catches the files a turn wrote, and a sweep every 10 minutes catches the rest.
- Tabs: To review, Updates and System, plus a filter by file type. Files stay unread until I press
⌘T. - Grouped by session: 1 group per Claude Code session, then 1 group per background job, so I review a task's files together.
- The preview: Markdown in the style of this site, HTML pages, reveal.js decks (
→changes slide), PDFs and Office files.Fgives it the full width,⌥⌘=and⌥⌘-zoom it, and I drag the split to resize the list. - Email drafts:
Eopens a Markdown draft ready to send: a work draft as an Outlook draft through my browser agent, a personal one in Emailee: building my own mail app. Nothing is sent without me. - Save to Dropbox (
S): the folder is suggested. For a client account, it picks the right subfolder (contracts, meetings, proposals, delivery, decks) and a client-facing or internal name. The copy is verified and never moves the source. - Tidy lists:
Mmarks a file reviewed,!flags it,⇧Xhides files by name, extension, folder or session, and an HTML page with a PDF twin shows only the PDF. - Hand back:
Hsends notes to the session that made the file,Ggoes to that session,⌥Ccopies a Markdown file as formatted text for Teams and Outlook, and a row drags out as its file.
Task dashboards

My task dashboards are JSON specs with an HTML page each. NicAI CC shows each task with tabs: Overview, Plan, 1 tab per tracker of people, Files and Activity.
- Filters: chips for status and facets,
/to find, a group menu. - The send loop:
↩copies the prepared text and opens the person's page in my browser. When I come back, a bar asks "Sent?":↩ticks it and moves on,⌘↩ticks and opens the next one. 1 key per person in a batch. - Steps:
1to9toggle a step of the selected row,⇧1to⇧9tick it with a date,Eticks the next step,Xdismisses,Nadds a note. - Writes: every tick goes to the dashboard server as an op, queued, retried and verified. The HTML pages keep working.
- Ongoing and families: dashboards with no end (follow-ups, the unread email list) sit in their own Ongoing group. A dashboard can name a parent, and the parent then gets its own sidebar section with its children under it.
- Email dashboards:
↩on an email row opens the drafted reply in Outlook, ready to send. The tabs count the emails left in orange. - Decision lists: on a review board each step is an answer (1 accept, 2 reject), with NicAI's recommendation first.
- Rename: a right-click renames a dashboard in the sidebar, without touching its spec.
Activity

The logs of every task and every delivery to Artifacts, last 14 days, newest first. Lines since my last visit are marked new.
Shopping

- Research:
+takes my guidance (budget, must-haves) and starts a session that returns 3 to 6 options, each with its link, price and shop, the pick marked.Hsends notes such as "cheaper" or "only in black". - Shopping list: I email an item to a shopping address, or press
+. Only my own addresses count, checked with DKIM or DMARC. A new item starts a research session at once. - States: New, Researching, Recommendation ready, In basket, Bought (read from my order history), Dropped, Later.
- Bought: its own tab, latest first.
Bmoves an item there and back. - Results: every result my shopping sessions found, with
Gto go to the session andHto send it notes.
Health
02 Nov 2026 The checks of Pulsee, my app that watches the NicAI stack (background jobs, sign-ins, servers), in 1 page.
- Problems and All: red, amber and blocked checks first, worst and oldest first. A blocked check sits under its cause.
- Each check: its state, since when, the error lines, the fix and what it depends on, plus its last 10 changes.
- Keys:
Fruns the fix,Hhands it to a Claude Code session in the right repo,Rruns the check now,Ssnoozes it for 4 hours,Ppauses all fixes and alerts for 1 hour. - A red check I must fix by hand also shows in Needs you.
Calls
02 Nov 2026 Call Briefs shows the folder my call prep skill writes for each meeting: the brief, the follow-up after the call and links to the files I need.
- To come and Earlier: 1 group per call, today's in blue, with chips for "No brief yet", "Updated 14:05", "Follow-up" and broken links.
- The detail: the goal, the must-asks, how to close, open commitments (overdue in red), who attends and the CRM next step draft.
- Keys: the Artifacts keys on each file,
Ccopies the file to paste it in Teams,Hasks NicAI to update the brief.
Opps
02 Nov 2026 2 pages for my work deals. Names and figures stay out of this note on purpose.
- Opp Briefs: 1 living internal brief per opportunity, a 1-page PDF. Every version is kept with what changed and a coloured diff (
←→step through them), plus who got which version and who is behind.Srecords a share,Ccopies the PDF for a chat. - Salesforce Opps: my open opportunities, read from a Salesforce report in my browser every night at 05:30 and on demand. A table I sort and filter by quarter, forecast, stage and focus (closes this month, pushed, large deals).
↩opens the opportunity in Microsoft Edge. NicAI CC never writes to Salesforce.
Local apps
02 Nov 2026 My local browser apps, read from Portee: running, starting or stopped, port, PID and the last 40 log lines. ↩ opens an app (Portee starts it first if needed), S starts, X stops, R restarts, all through Portee's own API.
⌘K command center and Find

⌘Klists every command with its key.>commands,#tasks,@people,!Waiting items,/files.⇧⌘Ffinds things: tasks, people, steps, Waiting items, files and flags.⌃⌥⌘Tbrings NicAI CC to the front from any app, with⌘Kopen.
Across the app
- Keyboard first: every action has a key, and every button shows it. The status bar lists the keys of the current page,
?lists them all. - Undo: every write undoes with
⌘Z. - Hand to NicAI:
Hsends an item, a file or a step back to NicAI with my notes. It goes to the live session that made it, or to a new session in herdr, now, held for Away or after the usage limit resets. - 1 button per line: every inspector lists its actions 1 per line, in the same group order on every page (Respond, Hand to NicAI, Later, Open, View, Copy and share, Manage).
- The agent CLI:
taskeelets my agents read the state (status,waiting,deliveries,dashboards) and write only 3 things: deliver files, ask me a question with a recommended answer, and set a reminder. Every command takes--json. It never ticks, answers or sends for me. - Global keys:
⌃⌥⌘Tbrings the app forward with⌘K,⌃⌥⌘Asends the prompts held for Away. - Colour roles: blue is mine to act on, green validates, orange waits, red warns. Nothing else gets a colour.
- 1 text size:
⌘+and⌘-zoom the whole window. Light and dark with⌃⌘L. - Presenting mode (
⌃⌘P) hides my private workspaces and tasks before I share my screen. - Notifications and the Dock badge for new Waiting items, deliveries, and blocked or finished sessions.
- A Settings window, a key map file and a URL scheme that only navigates.
- Read-only mode blocks every write, for tests on my real data.
For business people
NicAI CC solves an attention problem, not an AI problem. The AI already does the work. What I lost was the overview: which session waits for me, which file needs my eyes, which decision blocks a task.
- The gain: 1 place to look, and 1 key per decision. A batch of 50 messages takes 50 key presses plus the sending, not 50 rounds of copy, switch, paste, tick.
- The cost: about 5 days to build the first version, in Claude Code sessions, then 2 more weeks of additions as I used it. It fits 1 person and 1 set of tools. That is the point.
- The risk: an app that can type into 50 sessions can do damage. So the rules come first: no key without me, no write except through the owner of the data, and every test on copies.
For technical people
Architecture
- Swift and AppKit. The only outside code is the Markdown renderer it shares with Notee: my own Markdown editor for macOS.
TaskeeCoreis a Swift package with no UI: the dashboard resolver, theTASKS.mdgrammar, the output log, the session index, fuzzy search and the herdr client. - The dashboards stay Python. NicAI CC ports their read side to Swift. A parity test compares Swift and Python on every real dashboard: ids, order, states, counts, texts.
- herdr over its socket: 1 snapshot, then events, at most 4 page refreshes a second. The session screen is a
visibleread every second (about 1 ms), in ANSI, drawn in my Ghostty colours. - Transcripts by byte search, never a JSON parse: 16 GB of transcripts on disk.
- Every write has 1 owner: herdr for prompts, the dashboard server for ticks, a hash-checked temp file and rename for
TASKS.md, the shopping script for the shopping database, the opp brief script, the Pulsee CLI and Portee's API for theirs.
QA
qa.pyruns a parity check and 29 end-to-end suites in about 7 minutes (22 suites in about 3 minutes on 18th October). Each suite drives the app from a JSON script and checks the screen, the state and the files.- QA runs a copy with its own bundle id, on copies of my dashboards, with its own dashboard server, its own herdr server and a small C program that plays Claude Code. At the end it checks that my real databases didn't change.
- Screenshots in QA use
screencapture -lon the window id, so the app never needs Screen Recording.
Lessons from the build
- Python habits matter in a port: stable sorts, code point string order,
str()of a float ("4.0") and banker's rounding all showed up as parity failures first. - An autorelease pool can cost 400 MB. Reading transcripts in 1 background block kept every chunk alive: 136 MB became 536 MB. 1 pool per chunk fixed it.
- Test apps must not fight the window manager. Every QA window got tiled into my columns and reflowed my screen. The QA copy now has a
.benchbundle id that the window manager leaves alone. - A synthetic key event is not a real one.
NSApp.currentEventnever sees it, so the test for⌘↩calls the bar's submit directly.
Performance review
I asked NicAI for a read-only review of the running app on 18th October 2026, 78 minutes after launch, with Sessions open.
| Measure | Value |
|---|---|
| CPU at rest | 0.1 to 0.3%, 0 idle wakeups, 4 threads |
| Memory footprint | 151 MB (98 MB of small allocations, 76 MB of it reclaimable) |
| Main thread over 5 s | Busy in about 9% of samples, mostly drawing table rows and SF Symbols |
| herdr queue | Busy 43% of the time, almost all of it waiting for screen reads |
| QA launch suite under load | Failed: 186 MB at rest against 175, 236 MB after 20 reloads against 200 |
| Biggest dashboard, cached | About 300 ms normally; 3.3 s in 1 run on a machine with a load average of 18 |
The app is light at rest. The cost shows when sessions are busy and when data changes.
Further reading



- What is NicAI: the AI system this app serves.
- Herdr: my note on herdr.
- Tilee: my own tiling window manager in Hammerspoon: the window manager the app had to learn to live with.
- My Claude Code setup: the hooks that hand every file to NicAI CC.
- Emailee: building my own mail app: my mail app, built the same way.