Problem
studymap.config.ts exists specifically so a self-hoster can point StudyMap at their own dataset without touching any other file — that's the whole point of #30 ("data-source abstraction") and #29 ("config-driven region"), and SELF-HOSTING.md step 3 says exactly that: "places: swap the sample imports for your own data/places/*.json files".
That abstraction was never extended to competitions. src/lib/competitions.ts imports every category file directly and hardcodes it:
import artsDesign from "../../data/competitions/arts_design.json";
import business from "../../data/competitions/business.json";
import coding from "../../data/competitions/coding.json";
// ...12 more direct imports, one per category file
There is no competitions field in StudyMapConfig (studymap.config.ts) the way there is a places field. A self-hoster following SELF-HOSTING.md's pattern for places has no equivalent lever for competitions — forking the repo for a different competitions catalog means editing src/lib/competitions.ts directly, not the one config file the rest of the self-host story is built around.
Fix
Mirror the places pattern: add a competitions: Competition[] field to StudyMapConfig in studymap.config.ts, move the 15 category imports there, and have src/lib/competitions.ts read from the config the way src/lib/places.ts reads places from it.
Acceptance criteria
Problem
studymap.config.tsexists specifically so a self-hoster can point StudyMap at their own dataset without touching any other file — that's the whole point of #30 ("data-source abstraction") and #29 ("config-driven region"), andSELF-HOSTING.mdstep 3 says exactly that: "places: swap the sample imports for your owndata/places/*.jsonfiles".That abstraction was never extended to competitions.
src/lib/competitions.tsimports every category file directly and hardcodes it:There is no
competitionsfield inStudyMapConfig(studymap.config.ts) the way there is aplacesfield. A self-hoster followingSELF-HOSTING.md's pattern for places has no equivalent lever for competitions — forking the repo for a different competitions catalog means editingsrc/lib/competitions.tsdirectly, not the one config file the rest of the self-host story is built around.Fix
Mirror the places pattern: add a
competitions: Competition[]field toStudyMapConfiginstudymap.config.ts, move the 15 category imports there, and havesrc/lib/competitions.tsread from the config the waysrc/lib/places.tsreadsplacesfrom it.Acceptance criteria
studymap.config.tshas acompetitionsfield, populated the same wayplacesissrc/lib/competitions.tsno longer importsdata/competitions/*.jsondirectlySELF-HOSTING.mdupdated to mention swapping competitions the same way it already covers places