Kapable starter template: Feedback / Feature Board (auth, data, board)
  • TypeScript 69.2%
  • CSS 25.9%
  • JavaScript 4.9%
Find a file
kbot-feedback e5fefdb3da feat: Feedback / Feature-Request Board
Public idea submission + upvotes + a status board (Under Review →
Planned → In Progress → Done), built on kapable-board (ideas as stories,
columns as custom no-specialist lanes) + kapable-data (vote counts in
feedback_votes). All platform IO server-side via the org key; the
board status-board pattern uses setLanes + updateStory(status), not the
Routa /transition path.
2026-06-21 21:25:22 +00:00
app feat: Feedback / Feature-Request Board 2026-06-21 21:25:22 +00:00
public feat: Feedback / Feature-Request Board 2026-06-21 21:25:22 +00:00
.gitignore Add .gitignore 2026-06-21 21:24:33 +00:00
.npmrc feat: Feedback / Feature-Request Board 2026-06-21 21:25:22 +00:00
bun.lock feat: Feedback / Feature-Request Board 2026-06-21 21:25:22 +00:00
env.d.ts feat: Feedback / Feature-Request Board 2026-06-21 21:25:22 +00:00
package.json feat: Feedback / Feature-Request Board 2026-06-21 21:25:22 +00:00
react-router.config.ts feat: Feedback / Feature-Request Board 2026-06-21 21:25:22 +00:00
README.md feat: Feedback / Feature-Request Board 2026-06-21 21:25:22 +00:00
seed.ts feat: Feedback / Feature-Request Board 2026-06-21 21:25:22 +00:00
tsconfig.json feat: Feedback / Feature-Request Board 2026-06-21 21:25:22 +00:00
vite.config.ts feat: Feedback / Feature-Request Board 2026-06-21 21:25:22 +00:00

Feedback / Feature-Request Board

A public idea board for the Kapable v2 platform: anyone can submit a feature request, upvote the ones they care about, and follow each idea through a status pipeline — Under Review → Planned → In Progress → Done.

Live: https://feedback.kapable-starters.kapable.run/

What it demonstrates

This is a kapable-board showcase (the status board) integrated with kapable-data (vote counts):

Concern Service How
Ideas + columns kapable-board One board Story per idea; a Product with four custom lanes.
Vote counts kapable-data Table feedback_votes (story_id, votes), keyed by story id.

Board pattern (important)

The board's /transition endpoint is the Routa agentic-coordination path — it enforces lane adjacency and dispatches a specialist (which needs a codebase ref). A plain status board must not use it. Instead this app:

  1. Creates a product, then sets columns with setLanes() (no specialist).
  2. Moves a card with updateStory({ status }) — a plain PATCH that bypasses the lane graph and dispatch.

Architecture

  • React Router 7 SSR. All platform IO is server-side (app/lib/*.server.ts); the org key never reaches the browser.
  • app/lib/feedback.ts — client-safe constants/types (columns, the Idea DTO).
  • app/lib/feedback.server.ts — the data layer (board + data via @kapable/sdk).
  • app/routes/home.tsx — the board UI: submit form, vote buttons, status columns, empty state. One route, intent-dispatched action (submit | upvote | move).

Credential

The app authenticates to the platform with a single long-lived org API key, provided as the server-only deploy secret KAPABLE_ORG_KEY (an sk_live_ key scoped {read, write}). It is never committed and never in the client bundle.

Develop

bun install
KAPABLE_ORG_KEY=sk_live_... bun run dev

Build

bun run build && bun run start   # serves on :3000