Rank
Interactive feature prioritization tool for rank.friborg.uk.
Product definition
Rank is a fast intake and prioritization board for product ideas from Jimmi and agents.
Core loop:
Capture idea → score impact/effort/confidence/urgency → drag into milestone → revisit top-ranked work
Chosen subdomain: rank.friborg.uk — short, memorable, and honest about the job.
UX principles
- One-screen capture, no modal ceremony.
- Keyboard-first:
/focuses capture, Enter saves. - Plain sharp visual system: zero rounded corners, dark space/glass, high contrast.
- Milestones are customizable lanes, not a rigid roadmap prison.
- Agents can post ideas through the same API endpoint as the UI.
Architecture
- Node/Express app on port
3045 - Static SPA in
public/ - Appwrite TablesDB persistence
- Docker deploy on Unraid
- Gitea remote repo
- Nginx Proxy Manager routes
rank.friborg.uk→192.168.30.100:3045
Appwrite schema
Database: priority_rank
Tables:
ideas— title, description, source, sourceName, milestoneId, impact, effort, confidence, urgency, score, rank, labels, notes, archivedmilestones— name, description, horizon, color, position, activeactivity— small append-only UX feed
Scattermind → Ranker bridge
Ranker's continuation job is narrow:
Snapshot / Concept Map → candidate feature/action set → Rank-ready build order
POST /api/rank-feedback accepts a prioritix-feature-set-v1-style payload from Scattermind and returns ranked items plus buildOrder.doFirst / validateNext / defer / park. Keep this contract action-first; do not use it as a reason to add generic dashboard, auth, billing, or workspace layers before the bridge has proof.
Recommended payload shape:
{
"schema": "prioritix-feature-set-v1",
"sourceName": "Scattermind",
"artifactId": "snapshot_or_concept_map_id",
"snapshotTitle": "Plain idea title",
"conceptMapId": "optional_concept_map_id",
"originalPrompt": "The user's starting prompt, trimmed for provenance",
"idea": "What Scattermind clarified",
"context": "Important constraints: solo builder, non-AI-native user, avoid dashboard swamp, etc.",
"mode": "mvp",
"featureSet": {
"features": [
{
"id": "build-order-preview",
"title": "Build order preview",
"description": "Show do first, validate next, defer, and park with reasons.",
"userValue": "A tired builder sees the next move without opening a dashboard.",
"evidenceNeeded": "Can 3 non-AI-native users understand the first recommended action?",
"proofSteps": ["Show a static result screen to 3 people"],
"dependencies": [],
"risk": "May become generic roadmap UI if the source context is lost.",
"recommendedLane": "validate-next",
"sourceSection": "concept-map.nextMoves"
}
]
}
}
Commands
npm run setup:appwrite
npm run check
PORT=3045 node server.js
npm run smoke
Agent idea post:
curl -X POST https://rank.friborg.uk/api/ideas \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $RANK_AGENT_TOKEN" \
-d '{"title":"Add public roadmap export","source":"agent","sourceName":"Rook","impact":8,"effort":3,"confidence":7,"urgency":5}'