desk.md is a personal workspace for projects, tasks, documents, and meetings. It combines a calm interface for daily work with a plain-Markdown source of truth that remains accessible to both people and agents.
I built it for my own freelance and personal work, and I use it every day.
Workspaces, project overviews, task boards, documents, meetings, quick capture, and a weekly planner live in one coherent app. The work model is built in rather than assembled and maintained from plugins.
Work content is stored as Markdown with readable YAML frontmatter. Local agents can work with the folder directly; a self-hosted Desk server exposes the same information through an OAuth-protected MCP endpoint.
Desk is especially useful for freelancers, consultants, developers, makers, and other independent people who manage several streams of work and care about owning their data.
- Projects with orientation. Every workspace and project has a user-owned Markdown overview, plus its tasks, documents, meetings, and recent activity.
- Tasks and planning. Kanban and list views, priorities, due dates, quick capture, status filters, and a weekly time-block planner.
- Documents and meetings. A WYSIWYG Markdown editor, nested folders, meeting notes, and drag-and-drop conversion from Word, PDF, Excel, CSV, and HTML.
- A focused daily UI. Workspace switching, persistent editor tabs, global search, keyboard shortcuts, and protection for unsaved work.
- Files that remain files. Ordinary filesystem tools can open, back up, sync, search, and version the workspace. Hosted authentication uses SQLite; work content remains in Markdown.
Desk is intentionally a single-user product today. It is not a team PM system with assignments, permissions, or real-time collaboration.
Desk has no in-app chatbot. It organizes durable source material for external AI tools.
- Local filesystem access. Desk can generate
CLAUDE.md,AGENTS.md,GEMINI.md, and per-workspaceWORKSPACE_INDEX.mdfiles so local agents understand the structure and read the right overview first. - Hosted MCP access. A self-hosted server lets Claude, ChatGPT, Claude Code, and other MCP clients browse, search, and read the workspace over OAuth. MCP tools are read-only for now.
- Optional Smart Index. An Anthropic or OpenAI API key enables a summarized catalog that helps agents find relevant files quickly.
- Explicit boundaries.
.aiignoreexcludes content from the Smart Index and Desk's agent read layer, while generated local guidance carries the same boundary.author: airecords provenance without creating a separate AI content system.
Both modes use the same Markdown structure. The difference is where the files live and how they are reached.
| Local desktop | Self-hosted server | |
|---|---|---|
| Use it from | Native app on macOS, Windows, or Linux | Hosted web app, or the native app connected to the server |
| Data location | A folder on the local machine | A bind-mounted folder on the server |
| Network and login | Fully offline, no account | Account-protected, available across devices |
| Multi-device access | External sync if needed | One shared server-side copy |
| Agent connection | Filesystem plus generated agent files | OAuth-protected, read-only MCP |
| Smart Index key | Operating-system keychain | Server environment variable |
Moving between the two does not require a content migration. Hosting adds
.desk/auth.sqlite for accounts and sessions; workspaces remain Markdown files.
Desktop builds are available from the latest release. Desk keeps itself up to date after installation.
Desk is developed and tested primarily on macOS. Windows and Linux builds are beta, and the desktop builds are not code-signed yet.
Unsigned build notes
- macOS: Download
Desk_*.dmgand drag Desk into Applications. If macOS says the app is damaged, runxattr -dr com.apple.quarantine /Applications/Desk.apponce. - Windows: Download the
.exeinstaller. In the SmartScreen warning, choose More info → Run anyway. - Linux: Use the
.AppImage,.deb, or.rpm. Make an AppImage executable withchmod +x Desk_*.AppImage. AI keys require a desktop secret service such as GNOME Keyring or KWallet.
One Docker container serves the web app, domain API, OAuth server, and MCP endpoint while keeping work content as Markdown on the server:
cd deploy
cp .env.example .env
# set BETTER_AUTH_SECRET
docker compose up -dSee the self-hosting guide for HTTPS, reverse-proxy, AI, and MCP setup.
![]() Project home |
![]() Weekly planner |
![]() Documents |
![]() Meetings |
Ideas being explored:
- MCP write tools for explicitly requested notes and tasks
- Local-model support for the Smart Index
- Better mobile-web capture and review
- Lightweight project timelines, milestones, and task dependencies
Desk is an npm-workspaces monorepo: @desk/core contains the shared domain,
@desk/app contains the React/Tauri client, and @desk/server provides the
self-hosted web, API, OAuth, and MCP services.
npm install
npm run dev # browser with mock data
npm run tauri:dev # desktop app with the real filesystemUse Node 22. See CONTRIBUTING.md for the complete setup and project guidelines.
Bug reports, feature ideas, documentation improvements, and pull requests are welcome. See CONTRIBUTING.md.
GPL-3.0-or-later. Desk may be used, modified, and shared; distributed forks and derivatives must remain open source under the GPL.



