Lanebook: a team task board you can remix
Lanebook is a small, complete team board on Dodil: boards, lists and cards with drag and drop, owner / member / viewer roles, a change history on every card, and one MCP endpoint so Claude or ChatGPT can run the board for you ("what's on my plate this week?", "move card 12 to Done"). Remix it into your own Dodil organization and it is yours in minutes.
- Live demo: https://taskdeck-rahulpawar-8080.ignite.dodil.cloud
- Repo: https://git.dodil.io/rahulpawar/taskdeck (MIT)
- Built for the Dodil Boards Challenge.
What it does
| Area | In Lanebook |
|---|---|
| People | The board owner invites people by email as member (edits) or viewer (read only), changes roles and removes people. Nobody sees a board they are not on: on the web, over MCP, in search, in "overdue" and in "my plate". |
| Boards | Boards → lists → cards. New boards start with To do / Doing / Done; add and rename lists (the last list is the board's "done" list). A card has a number (#12), title, description, assignee, due date and labels. Drag cards between and within lists. |
| History | Every card change is recorded field by field: who, when, what (due date: none -> 2026-11-04, list: Doing -> Done). Per-card history in the card, board activity in its own panel. |
| MCP | 22 action tools at /mcp (below). Boards are named by title and cards by number, the way people talk. The AI acts as the signed-in person and sees only their boards. |
| Web | One page: sidebar of boards, My week and Overdue views, filters (mine / overdue / label / text), card editor, people panel. Viewers get the same page read-only. |
| Extras | Overdue cards flagged automatically (badge, red date, sidebar count). Blocked by links between cards with loop protection, and "what is blocking the launch?" (follows the whole chain). AI with Dodil Models: turn a card into a checklist, find similar cards by meaning (embeddings), and a daily board summary. |
Remix it (one command, one documented step)
dodil git remix rahulpawar/taskdeck --to-org <your-org> --name <repo, 18 chars max>
The remix creates in your org: the repo, a DataK3 bucket <repo>-data with the tables from
schema.sql, a user pool <repo>-users, and a service account that can read/write that bucket
and call Dodil Models. Dodil Git CI then tests, builds and deploys it to https://<repo>-<org>-8080.ignite.dodil.cloud.
The one post-remix step (sign-in): the app's sign-in callback must be on the pool. Recent
deploys register it themselves; check the deploy log. If it says the callback was
"not registered", run the command that line prints, once (it adds
https://<app host>/.dodil/auth/callback to <repo>-users). That is all; then open the app,
sign up with your email and create your first board. (Reference: dodil guide remix,
"After the remix: let people sign in".)
To use it from Claude.ai / ChatGPT, add https://<app host>/mcp as a custom connector and
sign in. The client registers itself and waits as PENDING; approve it once:
dodil appid client list <repo>-users
dodil appid client approve <repo>-users <client-id>
Talking to it (MCP tools)
my_plate, overdue, search_cards, my_boards, show_board, show_card, card_history,
board_activity, create_board, add_list, add_card, move_card, assign_card,
update_card, delete_card, set_blocked_by, what_is_blocking, add_member,
remove_member, checklist, board_summary, similar_cards.
| You say | The assistant calls |
|---|---|
| "What's on my plate this week?" | my_plate() → my unfinished cards: overdue, due within 7 days, undated |
| "Add a card 'Send invoice' to Doing on the Ops board" | add_card(board="Ops", title="Send invoice", list="Doing") |
| "Move card 12 to Done" | move_card(card="12", list="Done") (asks for the board if #12 exists on two of yours) |
| "What's overdue?" | overdue() |
| "Give card 7 to bo@acme.io, due Friday" | assign_card + update_card(due_date="friday") |
| "What is blocking the launch?" | what_is_blocking(card="launch's number") |
| "Turn card 4 into a checklist" | checklist(card="4", apply=true) |
Every tool calls the same use case as the web page, so the rules are identical: a viewer's assistant can read but not change anything, and a stranger's assistant can't even see the board.
How it is built
app/boards/
domain/model.py Board, BoardList, Card, Role and the rules (roles, assignees,
'done' list, overdue, field-by-field change descriptions)
application/use_cases.py every action: boards, people, lists, cards, blockers, my_plate,
overdue, search, history, AI; resolves "Ops" / "card 12"
application/ports.py what the use cases need: a repository and an AI assistant
infrastructure/dodil.py service-account token, DataK3 connection (reused per thread),
Dodil Models chat + embeddings
infrastructure/repository.py the tables in DataK3 (keyed upserts, no sequences)
doors/web.py, page.py JSON routes + the board page -> call the use cases
doors/mcp.py MCP tools for Claude / ChatGPT -> call the same use cases
doors/identity.py who is calling (the gateway's X-Dodil-User header)
main.py wiring, /mcp with the sign-in challenge, /healthz
tests/test_boards.py 14 tests: roles, visibility, moves, history, my plate, overdue,
blockers, AI, and both doors end to end (in-memory fakes)
schema.sql the tables, created by the remix
.dodil/remix.yaml what a remix creates; .dodil/deploy.yaml how CI deploys a copy
Dodil services only: DataK3 for all data, the appid pool for sign-in (no login code in
the app: the gateway signs people in and passes X-Dodil-User), Ignite runs it, Dodil
Models (kimi-k2.6, jina-embeddings-v4) for AI. No outside database or API keys.
Design notes: DESIGN.md.
Run the tests / run locally
cd app
python -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt pytest
python -m pytest -q ../tests # no Dodil account needed: fakes for data and AI
Against your remixed bucket: set BUCKET, DODIL_SERVICE_ACCOUNT_ID,
DODIL_SERVICE_ACCOUNT_SECRET and DEV_USER=you@example.com (acts as that person without the
gateway; local only), then uvicorn boards.main:app --port 8080.
What I would improve next
- Comments and attachments on cards (DataK3 objects for files).
- Board-level "workspaces" so a team shares one member list across many boards.
- Push the overdue flag out (a daily mail or chat digest) instead of only showing it.
- Keep the embeddings in DataK3's vector index instead of computing them per question.
- Real-time updates (two people on one board see each other's moves without a refresh).
Honest notes
- Built by Rahul Pawar with AI assistance (an AI coding assistant wrote much of the code with me), starting from the Dodil boards-challenge starter, and tested on the live deploy.
- Hard parts: DataK3 has no sequences, so card numbers are computed per board (MAX + 1);
the remix applies
schema.sqlonly to a bucket it creates, so schema changes on an already-remixed bucket are a manual step; and keeping web and MCP behaviour identical meant putting every rule (including "card 12" / "the Ops board" lookups) in the use cases.
Licence
MIT. See LICENSE.