rgboards/rg-boards

Lanes, team task boards you run from the web or from Claude/ChatGPT (MCP). FastAPI + DataK3 + appid + Dodil Models.

A remix template · 0 remixes · Remix rgboards/rg-boards

schema.sql

-- Created once by the remix, in the bucket it makes. Natural keys only: DataK3 has no sequences.
-- The app also runs app/boards/infrastructure/migrations.py at start-up (additive only), so an
-- older bucket gains new tables and columns without anyone running SQL by hand.
CREATE TABLE IF NOT EXISTS boards (
  id TEXT PRIMARY KEY,            -- 12 hex chars
  title TEXT NOT NULL,
  owner_email TEXT NOT NULL,
  created_at TIMESTAMP,
  lists TEXT                      -- JSON array of list names, in order
);
CREATE TABLE IF NOT EXISTS memberships (
  id TEXT PRIMARY KEY,            -- board_id + ':' + email
  board_id TEXT NOT NULL,
  email TEXT NOT NULL,
  role TEXT NOT NULL              -- member | viewer (the owner lives on boards.owner_email)
);
CREATE TABLE IF NOT EXISTS cards (
  id TEXT PRIMARY KEY,            -- board_id + '-' + number, claimed by a plain INSERT
  board_id TEXT NOT NULL,
  list_name TEXT NOT NULL,
  title TEXT NOT NULL,
  assignee TEXT,
  due_date DATE,
  updated_at TIMESTAMP,
  number BIGINT,                  -- "card 12" on its board
  description TEXT,
  labels TEXT,                    -- comma separated, lower case
  position DOUBLE,                -- order inside a list (drag and drop)
  version BIGINT,                 -- optimistic concurrency: no lost updates
  archived BOOLEAN,
  created_by TEXT,
  created_at TIMESTAMP
);
CREATE TABLE IF NOT EXISTS activity (  -- the history: who, when, what changed
  id TEXT PRIMARY KEY,
  board_id TEXT NOT NULL,
  card_id TEXT,
  actor TEXT NOT NULL,
  action TEXT NOT NULL,
  event_at TIMESTAMP,
  field TEXT,
  old_value TEXT,
  new_value TEXT
);
CREATE TABLE IF NOT EXISTS card_links (  -- card_id is blocked by blocked_by
  id TEXT PRIMARY KEY,            -- card_id + '|' + blocked_by
  board_id TEXT NOT NULL,
  card_id TEXT NOT NULL,
  blocked_by TEXT NOT NULL,
  created_by TEXT,
  created_at TIMESTAMP
);
CREATE TABLE IF NOT EXISTS checklist_items (
  id TEXT PRIMARY KEY,
  board_id TEXT NOT NULL,
  card_id TEXT NOT NULL,
  text TEXT NOT NULL,
  done BOOLEAN,
  position BIGINT
);
CREATE TABLE IF NOT EXISTS card_vectors (  -- embedding cache for "find cards like this one"
  card_id TEXT PRIMARY KEY,
  board_id TEXT NOT NULL,
  text_hash TEXT NOT NULL,
  vector TEXT NOT NULL            -- JSON array from jina-embeddings-v4
);
CREATE TABLE IF NOT EXISTS board_summaries (  -- the day's AI summary of a board
  id TEXT PRIMARY KEY,            -- board_id + ':' + YYYY-MM-DD
  board_id TEXT NOT NULL,
  day TEXT NOT NULL,
  text TEXT,
  written_at TIMESTAMP
);