Skip to content

Data Model

Cards are stored in Firebase Realtime Database at:

/cards/{projectName}/{cardType}_{projectName}/{firebaseId}/
Card TypeSection PathID Prefix
Tasktask-card_{project}TSK
Bugbug-card_{project}BUG
Epicepic-card_{project}PCS
Sprintsprint-card_{project}SPR
Proposalproposal-card_{project}PRP
QAqa-card_{project}QAI

Card IDs are auto-generated using Firestore counters:

{PROJECT_ABBREVIATION}-{TYPE_CODE}-{PADDED_NUMBER}

Counter key: {abbreviation}-{typeCode} (e.g., PLN-TSK) Counter stored in: Firestore > projectCounters > {key} > lastId

{
"name": "Planning Game",
"abbreviation": "PLN",
"version": "1.153.0",
"scoringSystem": "1-5",
"repoUrl": "https://github.com/manufosela/planning-game-xp",
"developers": [
{ "id": "dev_001", "name": "Mánu Fosela", "email": "..." }
],
"stakeholders": ["stk_001"],
"iaEnabled": true,
"archived": false
}
/developerBacklogs/{developerId}/
├── order: ["cardKey1", "cardKey2"] # Ordered list
└── items/
└── {cardKey}/
├── cardId: "PLN-TSK-0042"
├── projectId: "PlanningGame"
├── cardType: "task"
├── title: "..."
└── status: "To Do"

Backlog updates automatically when:

  • Task with “To Do” is assigned → added
  • Task moves to “In Progress” → removed (shown in WIP)
  • Task completed → removed
  • Developer unassigned → removed

All cards have a year field for filtering:

  • Tasks/Bugs: year from creation date
  • Sprints: year from start/end dates
  • Backlog migration: incomplete tasks can move to next year

Cards can have relations:

{
"relatedTasks": [
{
"id": "PLN-TSK-0043",
"projectId": "PlanningGame",
"title": "...",
"type": "blocks"
}
]
}

Relation types:

  • related — Bidirectional link
  • blocks / blockedBy — Dependency chain