🚗 Hantoor · Project Management

Mission control for the Hantoor platform

No product code — just the map of every repo, the initiatives we’re driving, and the tickets we’re tracking across them.

type repo projects tracking agent

NOTE

Hantoor is a car-rental platform connecting providers (rental agencies and individual car owners) with renters. The product is split across several repositories — this one coordinates them.


🧭 At a glance

🗂️ Registryconfig/projects.yml — every repo’s URL, local path & metadata
🎯 Initiativesinitiatives/ — cross-cutting goals, one folder each
🎫 Ticket boardstracking/tickets/ — status of each repo’s tickets
📊 Portfolio viewtracking/initiatives.md — all initiatives at once
🗂️ Repo statetracking/repos.md — latest commit + date per repo, and when it was last synced
🤖 Agent skills.claude/skills/ — 7 slash commands (see below)
📖 How Claude works hereCLAUDE.md

🌐 The ecosystem

flowchart TD
    L["🖥️ landing<br/><i>marketing site</i>"]
    M["📱 mobile · hantoor-kmp<br/><i>Android / iOS</i>"]
    D["🧑‍💼 dashboard<br/><i>admin + provider web</i>"]
    W["🌐 web · hantoor-web<br/><i>renter marketplace</i>"]
    X["🏷️ white-label · hantoor-web-white-label<br/><i>provider storefronts (single-tenant trial → multi-tenant)</i>"]
    B[("⚙️ backend<br/><i>GraphQL API + PostgreSQL</i>")]
    M -->|GraphQL| B
    D -->|GraphQL| B
    W -->|GraphQL| B
    X -->|GraphQL| B
KeyRepoRoleStatus
backendhantoor-backendKotlin / Spring Boot GraphQL API🟢 active
mobilehantoor-kmpKMP + Compose MP app (Android/iOS)🟢 active
dashboardhantoor-dashboardAdmin / provider web dashboard🟢 active
landinghantoor-landingMarketing landing page🟢 active
webhantoor-webRenter web marketplace (host TBD — see the initiative)🟢 active
white-labelhantoor-web-white-labelWhite-label provider booking storefronts (single-tenant Najeb trial; being evolved into the multi-tenant template, decided 2026-10-06)🟢 active

TIP

Other repos (hantoor-demos, hantoor-android legacy, hantoor-creative-content, hantoor-vehicle-image-catalog) live in docs/ecosystem.md and can be registered when we want to track them.


🎯 Initiatives & 🎫 tickets — how work is tracked

Two altitudes, both file-based in git:

  • Initiative — a goal spanning one or more repos (a launch, a feature program, an ops rescue). One folder under initiatives/: a charter (initiative.md), a living tracker.md (milestones, linked tickets, log), and optional docs/. Lifecycle: proposed → active → blocked → done (+ parked, cancelled).
  • Ticket — an implementation-level spec that lives in each repo’s own docs/tickets/ (ticket-<n>-<slug>.md). The coordinator never duplicates it — it mirrors only the status on ticket boards, keyed by <project-key>#<number> (e.g. backend#19).
flowchart LR
    A["📝 create-ticket<br/><i>author into a repo</i>"] --> B["🔄 sync-tickets<br/><i>reconcile boards</i>"]
    B --> C["🎯 track-initiative<br/><i>link across repos</i>"]
    C --> D["⛴️ sync-initiatives<br/><i>infer progress from main</i>"]
    D --> E["📊 program-status<br/><i>one-glance snapshot</i>"]
    E -.-> A

🤖 Agent skills

Run from Claude Code inside this repo as /name:

SkillWhat it does
/create-ticketDraft a ticket and write it into a linked project’s docs/tickets/ (following that repo’s convention), then register it on the board
/sync-ticketsReconcile the boards against each repo’s docs/tickets/ — add new, flag removed, never clobber a set status
/track-initiativeScaffold / update an initiative folder and link tickets across repos
/sync-initiativesReview what merged to main in each linked repo and propose milestone / ticket / initiative status updates
/program-statusOne-shot snapshot: git state + ticket counts + active initiatives
/skills-catalogShow a catalog of available skills — this repo’s, or all to include every linked project’s
/refresh-docsReconcile the README, docs/ecosystem.md, badges & indexes with the sources of truth (run after adding a project/skill/initiative)

🗂️ What lives here

hantoor-project-management/
├── config/
│   ├── projects.yml         # THE registry: repo URL + local path + metadata
│   └── taxonomy.yml         # initiative type + tag vocabularies
├── initiatives/             # cross-cutting efforts, one FOLDER each
│   ├── README.md            #   lifecycle + index
│   ├── TEMPLATE/            #   copy to start a new initiative
│   └── <slug>/              #   initiative.md (charter) + tracker.md + docs/
├── tracking/
│   ├── initiatives.md       # portfolio roll-up across all initiatives
│   ├── repos.md             # GENERATED: last-known git state per repo
│   └── tickets/             # per-project status boards
├── docs/ecosystem.md        # deeper map of how the repos fit together
├── scripts/
│   ├── status.sh            # live git status across all local repos
│   ├── repo-state.sh        # regenerate tracking/repos.md
│   └── build-site.sh        # build the browsable docs site (Quartz)
├── site/                    # docs-site config + staging script
├── .claude/skills/          # the 7 agent skills above
├── CLAUDE.md                # how Claude Code operates as program manager here
└── README.md                # you are here

⚡ Quick start

See the state of everything at once — branch, dirty files, ticket count & last commit for every registered repo on this machine:

./scripts/status.sh

Record it — refresh tracking/repos.md, the committed snapshot of each project’s latest commit, its date, and when the coordinator last synced that repo:

./scripts/repo-state.sh --fetch

Browse it as a website — the same Markdown, rendered with search, a folder sidebar, backlinks and a link graph (built by Quartz; deployed to Cloudflare Pages on every push to main). Local preview on http://localhost:8080:

./scripts/build-site.sh --serve

Drive it from Claude Code — open this repo and use the skills above. Claude reads config/projects.yml to resolve where each project lives, and prefers subagents for work that spans multiple repos.


📐 Conventions

  • This repo tracks and coordinates; it never contains product source.
  • config/projects.yml is the only place local paths are defined. local_dir is relative to workspace_root — edit workspace_root when you change machines, nothing else.
  • One initiative = one folder. Keep it short; link out to the real work.
  • Status is set by humans/Claude. The sync skills propose from git, they never flip a status silently.