Context
Place currently has no visual identity beyond its name. On the frontend this is filled by a deterministic colored-initial placeholder (PlaceAvatar in the frontend repo). We want users to pick a curated icon (from a Lucide preset) and a palette color per place, persisted server-side so the choice follows the user across devices.
This issue covers only the contracts side. Backend and frontend changes are tracked in sibling issues.
Changes
Extend contracts/proto/places.proto with two optional string fields on:
CreatePlaceRequest
GetPlaceResponse
PlaceSummary
UpdatePlaceRequest
Fields:
icon — curated key string (e.g. home, building, warehouse). Kept as an opaque string for forward-compatibility; the frontend maps it to a Lucide component. Do not hardcode an enum server-side.
icon_color — palette key string (e.g. blue, green). Never a hex — palette is defined in the frontend CSS variables for proper light/dark theme support.
Bump contracts/pyproject.toml to the next minor version and push. Follow the standard contracts update workflow from the root CLAUDE.md.
Acceptance
- Proto updated, version bumped, CI publishes to PyPI.
- No Kafka event changes: icons are UI metadata; consumers (
devices, collector) do not need them.
Blocks
Context
Place currently has no visual identity beyond its name. On the frontend this is filled by a deterministic colored-initial placeholder (
PlaceAvatarin the frontend repo). We want users to pick a curated icon (from a Lucide preset) and a palette color per place, persisted server-side so the choice follows the user across devices.This issue covers only the contracts side. Backend and frontend changes are tracked in sibling issues.
Changes
Extend
contracts/proto/places.protowith two optional string fields on:CreatePlaceRequestGetPlaceResponsePlaceSummaryUpdatePlaceRequestFields:
icon— curated key string (e.g.home,building,warehouse). Kept as an opaque string for forward-compatibility; the frontend maps it to a Lucide component. Do not hardcode an enum server-side.icon_color— palette key string (e.g.blue,green). Never a hex — palette is defined in the frontend CSS variables for proper light/dark theme support.Bump
contracts/pyproject.tomlto the next minor version and push. Follow the standard contracts update workflow from the rootCLAUDE.md.Acceptance
devices,collector) do not need them.Blocks