Skip to content

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,
});
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 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.