Apps
apps/assistant
Standalone full-page AI assistant application. Provides a single-route SvelteKit app that renders ChatCore in full-viewport mode.
Entry point: apps/assistant/src/routes/+page.svelte
Backend: celine-ai-assistant (port 8012)
Docker image: ghcr.io/celine-eu/celine-assistant
Environment:
| Variable | Default | Description |
|---|---|---|
PUBLIC_PRIVACY_POLICY_URL |
/privacy |
Privacy policy linked from the AI notice under the chat input. This app has no /privacy route, so set it in any deployment where that path is not served by another app on the same host |
PUBLIC_LEGAL_BASE_URL |
— | The legal host. When PUBLIC_PRIVACY_POLICY_URL is unset, the AI notice links <PUBLIC_LEGAL_BASE_URL>/privacy/, the page listing every community's privacy notice (this app does not know the user's community) |
Dev:
task dev:assistant
# http://localhost:3003
apps/webapp
REC participant webapp. A full SvelteKit application for community members, including energy overview, weather, forecast, suggestions, gamification, notifications, settings, feedback, and the embedded assistant.
Routes:
| Route | Description |
|---|---|
/ |
Energy overview — production, consumption, incentives |
/suggestions |
Flexibility window suggestions with accept/reject |
/assistant |
Embedded ChatCore in full mode |
/notifications |
Notification list and read/delete |
/settings |
User preferences (language, units) |
/profile |
User profile |
/privacy |
Privacy policy |
/terms |
Terms of service |
/accept-terms |
Terms acceptance flow |
/not-a-participant |
Non-participant landing |
/no-smart-meter |
No smart meter landing |
Key components: EnergyChart, ForecastCard, WeatherWidget, StatCard, SuggestionCard, GamificationPanel, PointsChart
Layout: The root layout loads GET /api/me (redirecting to /accept-terms when terms are required, except on /privacy, /terms and /accept-terms), then the community and unread notifications. There is no floating assistant widget: AskAssistantButtons on / and /suggestions navigate to /assistant?prompt=….
Installable (PWA): /manifest.webmanifest is a server route, not a static file: the installed app is named after the member's community (GET /api/community, falling back to REC). app.html links it with crossorigin="use-credentials", because behind oauth2-proxy an anonymous fetch gets the login redirect. Icons in static/icons/ are cropped from the CELINE logo on celineproject.eu. There is no offline caching: static/sw.js only handles push and is registered only when a member enables push.
Backend: celine-webapp BFF (port 8014)
Environment:
| Variable | Default | Description |
|---|---|---|
PUBLIC_PRIVACY_POLICY_URL |
/privacy |
Privacy policy linked from the AI notice under the assistant's chat input, when the member's community gives none. The first choice is the community's own privacy_url from GET /api/community, which the BFF resolves (registry link, then the legal host) |
Dev:
task dev:webapp
# http://localhost:3005
apps/grid
Grid resilience dashboard for DSO operators. Displays wind and heat risk maps, alert distributions, trend charts, substation topology, CIM asset topology, and manages alert rules and notification settings.
Routes:
| Route | Description |
|---|---|
/ |
Main grid dashboard — risk maps, filters, trends |
/management |
Alert rules and notification settings management |
/denied |
Access denied page (non-DSO users) |
Key components: AutocompleteSelect, FilterBar, LineInspectPanel, RiskDonut, TrendSparkline
Backend: celine-grid (port 8015)
Docker image: ghcr.io/celine-eu/celine-grid-ui
Dev:
task dev:grid
# http://localhost:3006
apps/community
REC Manager Dashboard. A SvelteKit application for the managers of a renewable energy community: energy overview, meters and data flow, flexibility, gamification, nudging, alerts, members and feedback. It is separate from apps/webapp, and follows the deployment and role-gate pattern of apps/grid.
Routes:
| Route | Description |
|---|---|
/ |
REC picker over the RECs GET /api/me returned; redirects straight into the only one |
/denied |
No REC managed, a REC that is not yours, or the REC registry unreachable |
/[community] |
Overview for the REC in the path |
/[community]/devices |
Meters (the IoT meters; "Misuratori" / "Medidores"): board and technical detail drawer, by device_id only. The path keeps its name |
/[community]/data-flow |
Interval coverage, gaps and pipeline freshness |
/[community]/flexibility |
Flexibility windows and the offered → points pathway |
/[community]/gamification |
Points distribution, anti-gaming flags, device ledgers |
/[community]/nudging |
Read-only nudging metrics |
/[community]/alerts |
Alert inbox with acknowledge, mute and assign |
/[community]/members |
Members by name, with invitation and password-reset sends, the measurements dialog (delivery point, read-only, and meter) and the role and area dialog with its area map |
/[community]/feedback |
Manager-dashboard and participant-dashboard feedback inbox |
Capabilities: each REC in GET /api/me carries the caller's capabilities, and a section or action the caller has none for is absent rather than offered and refused. The members page needs members.read; its actions need members.invite (sends), members.meter (review a member's measurements, attach and detach a meter) and members.edit (role and area). The BFF enforces every one of them again.
Key components: AreaMap, EnergyChart, ExportButtons, KpiCard, MemberSends. Outcome codes become sentences in src/lib/memberSend.ts, memberMeter.ts and memberProfile.ts, in en, it and es.
Map: the role and area dialog draws a read-only map of the REC's areas with leaflet on OpenStreetMap's public tiles (ADR-0001). The tile server sees the manager's IP address and the tiles shown; no member data is sent to it.
Privacy: member names and a member's delivery points (POD) and sensor ids live in page state only, never in browser storage, a URL or an export. The members list shows only whether a member has a POD and a meter. A POD is read-only here (onboarding owns it); a sensor id is typed as free text in the measurements dialog, and nothing lists or suggests meters.
Backend: celine-community BFF (port 8019). See apps/community/README.md for the routes the app reads and what each dialog does.
Docker image: ghcr.io/celine-eu/celine-frontend-community
Tests: pnpm --filter @celine-eu/community test (node --test), check and build; e2e/community-area-map.spec.ts renders the map in Chromium with the BFF and the tile server stubbed.
Dev:
task dev:community
# http://localhost:3007
apps/roi
PV installation ROI calculator. Single-page application for estimating the financial return of a photovoltaic installation, including production estimates, CER incentives, CAPEX, and financial analysis. Supports PDF export of results and map-based location selection.
Routes:
| Route | Description |
|---|---|
/ |
ROI calculator — input form, map picker, results |
Package dependency: Uses @celine-eu/roi-ui (RoiCore, RoiWidget) from packages/roi-ui.
Backend: celine-roi (port 8013)
Dev:
task dev:roi
# http://localhost:3004