A GitHub-backed Kanban board that reads and writes kanban.md + archive.md directly in a repository using the GitHub GraphQL API. The UI is a Masc (Go WASM) app, and the server handles GitHub OAuth.
Spectus is a port of MarkdownTaskManager, an HTML/JavaScript application, to a masc application.
- Load a repo + markdown paths from the UI.
- Edit tasks, subtasks, tags, and columns.
- Archive and restore tasks.
- Commit changes directly to the repo (default branch).
- Persist repo settings in localStorage per user.
- Go 1.25+
- A GitHub OAuth App (or GitHub App with OAuth flow) configured for this server.
- Build the WASM bundle:
make build
- Run the server:
or build a binary:
go run .make kanban ./bin/kanban
- Visit
http://localhost:8080, log in with GitHub, enter a repo (owner/name), and load your board.
Required:
CLIENT_ID: GitHub OAuth client ID.CLIENT_SECRET: GitHub OAuth client secret.
Recommended (persist sessions across restarts):
HASH_KEY: 32-byte hash key for secure cookies.BLOCK_KEY: 32-byte block key for secure cookies.
Suggested generation:
# 32-byte hash key (32 chars)
HASH_KEY=$(openssl rand -base64 24)
# 32-byte block key (32 chars; AES-256)
BLOCK_KEY=$(openssl rand -base64 24)Optional:
ADDR: Server listen address. Default:8080.PORT: Used ifADDRis not set.PUBLIC_URL: Base URL for OAuth callback and secure cookie flag. Default derived fromADDR.GITHUB_SCOPES: Comma-separated scopes. Defaultrepo,read:user.SESSION_COOKIE: Cookie name. Defaultspectus_session.KANBAN_REPO: Default repo inowner/nameform (shown in the UI).KANBAN_PATH: Default kanban path. Defaultkanban.md.ARCHIVE_PATH: Default archive path. Defaultarchive.md.GITHUB_WEBHOOK_SECRET: Secret for verifying GitHub webhook signatures (for real-time sync).
Create a GitHub OAuth App and set:
- Homepage URL:
PUBLIC_URL - Authorization callback URL:
PUBLIC_URL/auth/github/callback
Make sure the app has the scopes listed in GITHUB_SCOPES (the default includes repo).
To enable real-time sync when other users commit changes:
- In your GitHub App settings, enable webhooks
- Set the webhook URL to
PUBLIC_URL/webhook - Set a webhook secret and configure
GITHUB_WEBHOOK_SECRETto match - Subscribe to "Push" events
When another user commits changes to kanban.md or archive.md, all connected clients will automatically sync.
kanban.md- Active tasks organized by columnarchive.md- Archived tasksmasc/- Go WASM UItemplates/- HTML shellstatic/- CSS + WASM assets
- Commits go to the repo’s default branch using
createCommitOnBranch. - If
kanban.mdorarchive.mdis missing, defaults are generated and the board starts in a dirty state until you commit.