rahulpawar/taskdeck

Lanebook, a team task board (boards, lists, cards, roles, history) you run from the web or from Claude/ChatGPT over MCP. FastAPI + DataK3 + appid + Models.

A remix template · 0 remixes · Remix rahulpawar/taskdeck

README.md

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

AreaIn Lanebook
PeopleThe 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".
BoardsBoards → 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.
HistoryEvery 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.
MCP22 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.
WebOne 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.
ExtrasOverdue 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 sayThe 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.sql only 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.