diff --git a/docs/superpowers/specs/2026-08-02-furni-import-hotel-source-design.md b/docs/superpowers/specs/2026-08-02-furni-import-hotel-source-design.md new file mode 100644 index 0000000000..bf3c65254f --- /dev/null +++ b/docs/superpowers/specs/2026-08-02-furni-import-hotel-source-design.md @@ -0,0 +1,40 @@ +# Furni import hotel source + +## Problem + +The furni import already fetches furnidata through the CMS setting +`habbo_gamedata_hotel`, but its public and internal language still refers to +Habbo Italy. This makes the active source unclear and gives the impression +that the importer is hardcoded to `habbo.it`. + +## Design + +The import page will read `habbo_gamedata_hotel` on the server and pass the +normalized hotel value and label to the client. The page will display the +active official furnidata source near the import controls, including the +resolved `habbo.` host. + +Import enrichment warnings will use the resolved hotel label rather than the +literal `habbo.it`. Internal furnidata cache APIs and types will be renamed +from Italy-specific names to generic official-Habbo names while retaining +temporary aliases only where needed to avoid an unsafe all-at-once migration. + +Furniture SWF and icon downloads remain on `images.habbo.com`. That host is +Habbo's global asset CDN and must not be derived from the gamedata locale. + +## Data flow + +1. Admin settings stores `habbo_gamedata_hotel`. +2. Server-side import code normalizes the value through + `getHabboGamedataHotel()`. +3. Furnidata and external texts use `www.habbo.`. +4. The import UI and enrichment messages display the same resolved hotel. +5. The in-memory cache remains keyed by hotel, so changing the setting loads + the selected locale rather than reusing another locale's data. + +## Verification + +Tests will cover normalized locale URL generation, cache separation after a +hotel change, dynamic enrichment text, and the source information passed to +the import UI. Existing furni import tests, typecheck, full tests, and the +production build must pass.