Your workspace, As The Geek Learns it β a Notion-style macOS desktop app with pages, databases, and a calendar that schedules itself.
Built with the ASTGL brand: Inter, burnt orange (#E9724C) on warm gray in light mode, vivid orange (#FF6B35) on deep navy (#1A1A2E / #16213E) in dark mode.
- Notion-style block editor (BlockNote/ProseMirror): type
/for the block menu β headings, lists, to-dos, toggles, quotes, code, tables, images - Markdown shortcuts (
#,-,[],>), drag handles, nesting - Image uploads stored in Convex file storage
- Infinite page nesting in the sidebar, emoji icons, favorites, trash with restore
- Property types: title, text, number (incl. minutes/progress formats), select, multi-select, status with To-do / In Progress / Complete groups, date (optional time + end date), checkbox, URL, relation (two-way synced, incl. same-database pairs), rollup (count/sum/avg/min/max/% complete), created/updated time
- Views per database: Table (inline editing), Board (drag cards between status columns), List, Calendar (drag items between days), Timeline (drag/resize Gantt bars with dependency arrows)
- Per-view filters (and/or rules, incl. filter-by-relation), sorts, hidden properties
- Every row opens as a full page with its own block content
- Sub-tasks (Parent task β Sub-tasks) and dependencies (Blocked by β Blocking) β and unlike Notion, dependencies aren't just visual: the auto-scheduler won't place blocked work before its blockers finish
- Sprints: two-week iterations with progress rollups, a current-sprint board, a backlog view, and a Complete sprint automation that closes the sprint, spins up the next one, and rolls unfinished tasks forward
- Seeded template:
Projects β Tasks β Sprintswired with relations +Progressrollups
The headline feature, modeled on Notion Calendar + Motion/Reclaim:
- Fixed events (appointments) are immovable; any database can be a task source (status + due date + estimate + priority)
- The engine packs task time blocks into your working hours around fixed events:
- earliest-deadline-first, then priority (Urgent β Low), then size
- chunking between your min/max block sizes, buffer minutes between items
- everything reflows automatically when an event moves, a task changes, a block is dragged, or settings change
- Drag a block β it locks (engine schedules around it); unlock to hand it back
- Started/past blocks are frozen history; remaining work is recomputed from what's left
- Can't-fit and past-due tasks surface in the needs attention panel β nothing silently drops
- Week grid: drag to create events, drag to move, resize from the bottom edge, 15-min snapping, now-line; month overview with β‘ block counts
- Keyboard:
Ttoday Β·J/Knext/prev Β·W/Mviews
- Chat with ARCHITECT in-app (Agent in the sidebar): it designs, creates, and configures pages/databases/projects/tasks for you, and changes appear live
- Two lanes, one toolset (toggle in the panel header):
- Local (default) β a local Ollama model (prefers
qwen3-coder; override withGEEKSPACE_LOCAL_MODELin.env.local) drives the same workspace tools for free. Right for routine asks: what's overdue, add a task, create a page. - Claude β the Claude Agent SDK lane for complex design work (multi-database structures, reorganizations). From 2026-06-15, SDK calls bill a separate per-user credit pool at API rates, so spend it where frontier judgment matters.
- Local (default) β a local Ollama model (prefers
- The Claude lane runs entirely on this Mac via the Agent SDK in the Electron main process, using your Claude Code sign-in (
~/.claude/.credentials.json) β no API key, no external service - Powered by
geekspace-mcp(mcp/index.mjs): a standard MCP server exposing the workspace (name-keyed properties, option validation, schedule awareness, template instantiation). Because it's a standard server, any MCP client can drive your workspace too βclaude mcp add geekspace --env CONVEX_URL=http://127.0.0.1:3210 -- node mcp/index.mjs - Create/edit only β no delete tools by design
- Knowledge page + βK section searching your local
mcp-astgl-knowledgeserver β semantic results with scores + an explicit sourced-Answer mode; pluggable connector design for future sources
- Stamp out projects with offset due dates + pre-wired dependency chains; tasks auto-schedule the moment they're created
- 3 built-ins (ASTGL Article, Podcast Episode, Home-Lab Project) + save your own from any project
- Drag-drop file library with in-app previews (PDF/images/AV/markdown/code), project linking, βK search, and default-app handoff for everything else
- One-click meeting recording with a floating recorder (pause/resume, live level meter)
- whisper.cpp transcription + local Ollama summarization β audio never leaves the Mac
- Summaries tailored by meeting type (standup / 1:1 / client / interview / brainstorm): narrative summary, key points, decisions, and action items
- Auto-generated, searchable notes page per meeting; action items become tasks in one click; audio replay + full transcript kept; failed AI runs are re-runnable (audio is saved first)
- Link recordings to calendar events; tool status + model selection in Settings
- Calendar sync: pick your Calendar.app calendars and they mirror into Geekspace (read-only, dotted edge) β and become fixed busy time the auto-scheduler plans around. Syncs at launch, on focus, and every 5 minutes
- Mail inbox on Home: recent Mail.app messages with unread dots, open-in-Mail deep links, and one-click email β task (the task links back to the message)
- One-time macOS Automation permission per app on first use
- Home: today's agenda, My Tasks (Overdue / Today / Upcoming) with one-click done + β blocked chips, Mail inbox, schedule warnings, recent pages
βKcommand palette: full-text search across pages and rows + quick actions (βNnew page,β1home,β2calendar)
π Full walkthrough: docs/USER-GUIDE.md (a condensed copy lives in the app sidebar).
flowchart TD
subgraph mac [macOS app]
E[Electron shell<br/>hiddenInset titlebar] --> R[React 19 + Vite renderer]
R --> BN[BlockNote editor]
R --> Views[Table / Board / List / Calendar / Timeline]
R --> Week[Week & Month planner]
end
R <-->|reactive queries & mutations<br/>WebSocket| C[(Convex local deployment<br/>127.0.0.1:3210)]
C --> S[convex/lib/scheduler.ts<br/>pure auto-scheduling engine]
M[Any mutation that touches<br/>tasks, events, blocks, settings] -->|runReflow| S
S -->|rewrites unlocked future blocks| C
Key decisions
| Decision | Why |
|---|---|
| Convex anonymous local deployment | No account, no auth, data stays on this Mac, still fully reactive (dev: repo .convex/; packaged: ~/Library/Application Support/Geekspace/) |
| Electron owns the backend lifecycle (packaged) | The app spawns the bundled convex-local-backend on launch and stops it on quit β self-contained, no terminal |
| Pure scheduler module shared by server + tests | Deterministic, 16 unit tests, no UI coupling |
| Reflow inside every relevant mutation | The cascade can never be forgotten; UI updates reactively for free |
| Drag = lock | Matches Motion/Reclaim mental model: a manual placement is a promise the engine must respect |
| Date-only values stored as UTC-midnight calendar dates | Timezone-proof dates (like Notion); timed values are real epochs |
| Fixed tz-offset scheduling with constant reflow | Near-term blocks always correct; DST drift self-heals on every reflow |
npm install
npm run dev # Convex backend + Vite + Electron, all at onceFirst run only:
npm run seed # Projects/Tasks template + sample week (idempotent)npm run package # β self-contained Geekspace.app + .dmg in release/
npm run migrate:local-data # one-time: copy your dev workspace into the appnpm run package bundles the Convex backend binary and a pre-baked seed
(functions already deployed + starter template) into the app. The built
Geekspace.app starts its own backend on launch β no terminal, no repo, no
npx convex dev. Data lives in ~/Library/Application Support/Geekspace/.
First open of the unsigned build: right-click β Open. After you change backend
functions and repackage, run npm run deploy:local (with the app open) to push
them onto your existing data β an app update never overwrites your workspace.
Other scripts:
| Script | What |
|---|---|
npm run dev:web |
backend + browser dev (no Electron) |
npm run test |
scheduler engine test suite (vitest) |
npm run verify |
typecheck + tests |
npm run package |
build self-contained Geekspace.app + .dmg into release/ |
npm run migrate:local-data |
copy your dev .convex workspace into the packaged app |
npm run deploy:local |
push function changes onto the running standalone app |
In dev,
npm run devruns the backend (data in the repo's.convex/). The packaged app is self-contained: Electron starts the bundled backend itself and keeps data in~/Library/Application Support/Geekspace/.
convex/ # backend: schema, functions, the scheduling engine
lib/scheduler.ts # pure engine β buildDayWindows / computeSchedule
scheduling.ts # runReflow β gathers tasks+busy, rewrites blocks
seed.ts # PM template + sample data
src/
components/ # sidebar, page editor, database views, calendar, home
lib/ # view filter/sort logic, dates, theme palette
state/ # zustand UI state, theme provider
electron/ # main.mjs, preload.cjs, convexBackend.mjs (backend lifecycle) β no build step
scripts/ # prebake-seed, migrate-local-data, deploy-local, afterPack
tests/ # scheduler test suite
- Single user, no auth, no cloud sync β by design
- Packaged app is signed with a Developer ID but not notarized (personal use; right-click β Open the first time)
- macOS Calendar sync is one-way (Calendar β Geekspace) and needs Calendar.app running; Mail widget needs Mail.app running
- Far-future blocks across a DST switch can sit an hour off until any reflow corrects them
- Deleting a row leaves dangling relation ids on the other side; cells skip them gracefully
MIT β see LICENSE. A personal learning project, shared as-is; no support or warranty implied.
An As The Geek Learns build β 2026.