The board can now be renamed and re-branded live
Any field on the board can get a new name and a new logo, and the change reaches every game already in progress — with no deploy and no restart.

In plain words
The forty fields of the opolyx board used to be fixed in the code. Changing one meant a code change, a review and a deployment — which made anything seasonal, promotional or simply mistaken far more expensive to fix than it should be.
Now a name and a logo can be set for any field from the admin area, and the change is live immediately — including in games that are already being played. It reaches every place opolyx runs online: the website, the embedded version on partner portals, and the replays used to make the highlight clips.
The offline downloadable build keeps its own built-in board, because it has no connection to fetch anything from.
For the technically curious
This works because of where names and logos are resolved. The board itself is code and stays code — the game server never reads it from the database, so game logic is untouched and replays of old games stay correct. Names and logos, though, are resolved at render time, so a global override map is enough to reach every surface at once.
// lib/board/overrides.ts — render-time resolution, engine untouched
export function useFieldName(slug: string, fallbackKey: string): string {
const overrides = useBoardOverrides(); // provider, fetched once per page
return overrides[slug]?.name ?? t(fallbackKey); // else the translated default
}The storage side is a small public-read table plus a public bucket for the uploaded images. Reads are open because the board is public anyway; writes are service-role only, enforced by revoking the defaults rather than relying on a policy — the same lesson three earlier migrations taught us.
