MK is a localhost Kanban board that uses your filesystem as its database. It's designed for developers who want the visualization of a Kanban board with the portability and version-control benefits of Markdown files.
This README covers installation and setup. For day-to-day usage — dragging cards, filters, table view, configuring columns, resolving CONFLICT/OTHER — see the User Guide.
- Single Binary: No Node.js, no Docker, no external database. Just one file.
- Filesystem Database: Your tasks are stored as
.mdfiles in adocs/folder. - Real-time Sync: Uses SSE (Server-Sent Events) to reflect file changes in the browser instantly (<200ms).
- Edit & Preview: Integrated Markdown editor and live preview within the web app.
- Dynamic Columns: Board columns come from a committed
docs/.kanban.yml, editable by hand; unrecognized or missing statuses collect in a diagnosticOTHERcolumn so no task is ever invisible. - Drag-and-Drop: Move cards between columns and reorder them within a column; both the status and position are saved automatically.
- Tag Filtering: Quickly focus on specific categories with a dynamic filter bar.
- Git Ready: Built-in detection for Git conflict markers.
- Auto-Port: Automatically finds an available port starting from
8080.
If you have Go installed, you can build the binary yourself. First, fetch the
dependencies (fsnotify for filesystem watching and yaml.v3 for parsing task
frontmatter):
go mod tidyThen build:
# macOS / Linux
go build -o mk main.go# Windows
go build -o mk.exe main.goMove the binary to your system path to use it in any project:
# macOS / Linux
sudo mv mk /usr/local/bin/mk# Windows — run PowerShell as Administrator
Move-Item mk.exe C:\Windows\System32\mk.exeAlternatively on Windows, move it to any folder already in your %PATH%, or add
a new folder via System Properties → Environment Variables.
Navigate to any project directory and run:
# macOS / Linux
mk# Windows — if installed globally
mk
# Windows — if running from the build directory
.\mk.exe-
-dir: Specify the directory containing your markdown tasks (default:docs).mk -dir my-tasks
-
-port: Manually specify a port. If not provided, MK will try8080and then search for the next available port automatically.mk -port 9000
Building a binary (go build) is not a required step for local development. go run
compiles and runs in one command, and every flag works the same way:
go run main.go
go run main.go -dir my-tasks -port 9000Use go build only when you want a standalone binary to keep around, install globally
(see "Install Globally" above), or hand to someone else who doesn't have Go installed.
There's no separate frontend build step, either. index.html is a single file — inline
<style> and <script>, no bundler, no npm, no node_modules — embedded directly into the
binary at compile time via //go:embed index.html (see the top of main.go). Edit it and
re-run go run main.go; there's no asset pipeline to run first. Note that this embedding
means a running mk/go run process serves whatever index.html looked like when it
started — editing it while the server is running doesn't hot-reload the page like task
file edits do (which use a real filesystem watcher, not go:embed). Restart the process to
pick up frontend changes.
.kanban/board.json (the generated task cache) and docs/.kanban.yml (the board's column
config, bootstrapped on first run if missing — see "Project Structure" below) are both
created automatically; you don't need to set up anything by hand before running against a
scratch docs/ folder for testing.
go test ./...
go vet ./...main_test.go covers the Go backend: config loading/bootstrap, /api/update request
handling (including the CONFLICT/OTHER write guards), and frontmatter parsing. There is no
frontend test harness by design — UI behavior (drag-and-drop, filters, the modal) is
verified manually in a browser; see USER_GUIDE.md for what "working"
looks like from that side.
test-docs/ holds a set of QA fixture tickets — each one deliberately shaped to exercise
an edge case (a live Git conflict, malformed frontmatter, no frontmatter at all, and so
on). Run scripts/reset-smoke-fixtures.sh to copy them into docs/, then follow
docs/document_smoke_test_plan.md (it shows up as a ticket on the board itself). Because
using the fixtures — dragging, tagging, saving — is the point, it also tends to repair
them; test-docs/ is the untouched source, docs/'s copies are disposable, and rerunning
the script resets them. Don't run MK against test-docs/ directly, and don't hand-edit the
fixtures in docs/ expecting the fix to stick.
<tasks_dir>/*.md: Your task files. Each file should have a YAML frontmatter.<tasks_dir>/.kanban.yml: Committed config listing board columns in display order. Bootstrapped automatically on first run if absent..kanban/board.json: A generated index file used for fast UI rendering.test-docs/: Pristine QA smoke-test fixtures — see "Manual smoke testing" above.scripts/reset-smoke-fixtures.sh: Copiestest-docs/fixtures intodocs/.
Each .md file in the docs/ folder should follow this format:
---
project: MK
status: TODO
epic: SETUP
tags: [backend, go]
order: 1
---
# Task Title
Task description goes here...order is optional and written automatically by the board when you drag a card
— you don't need to set it by hand.
- Plain Files First: Your tasks are markdown you own, legible to any editor; the board is one view of them.
- Zero Dependency: The tool should work on any machine without installing a runtime.
- Transparent State: No hidden database. If you want to move a task, you can move the file or edit the text.
Built with Go and Vanilla JS.