denpa.config.ts
import { defineAppConfig, VERTICAL_SCOPES } from "@denpa/app-config";
export default defineAppConfig({ id: "hoops", name: "HOOPS", tagline: "Who reads the game?", signalLabel: "Signal", // required emptyText: "NO SIGNAL", // required domain: "hoops.tv", theme: { /* palette, heading font, accent */ }, markets: VERTICAL_SCOPES.sports,});Market scope
Section titled “Market scope”markets: { categories: string[], // REQUIRED (may be empty) category?: string, // protocol feed slice requested server-side: // sports | politics | fashion | music_culture includeKeywords?: string[], // in-fork narrowing (HOOPS = basketball) excludeKeywords?: string[], // exclude wins over include providers?: string[], // ["kalshi"] · ["polymarket", "kalshi"]}Prefer the shared presets VERTICAL_SCOPES.sports | .fashion | .music: hub classification consumes them too, so fork and hub stay in agreement.
The protocol-level verticalConfig
Section titled “The protocol-level verticalConfig”The app config is the fork’s slice of the wider verticalConfig the protocol defines:
verticalConfig = { id: "culture", label: "Culture", categories: ["music", "fashion", "film", "internet"], defaultTabs: ["watch", "markets", "signals", "profile"], signalCopy: "Signal", operatorCopy: "Operator", leaderboardCopy: "Signal Rank", fieldRecordCopy: "Field Record", primaryMarketProviders: ["polymarket", "kalshi", "manual"], walletRequired: false, scoringWeights: { correctness: 1, timing: 0.4, difficulty: 0.3, confidence: 0.2, streak: 0.2, mediaEngagement: 0.1 }, loop: "causal" | "core", legalMode: "social-signal-first", theme: "denpa-terminal",}A fork changes config, categories, copy, providers, scoring weights and theme. It must not require rewriting Signal, Market, User, Follow, Outcome or Field Record logic.