Changelog
0.0.1 (2026-04-22)
Bug Fixes
admin-ai: increase spacing between form fields (7d70cde )
admin-sources: add missing onSuccess callbacks to store calls (ef440b0 )
admin-sources: make onSuccess optional in store to avoid empty-function lint errors (e80a481 )
admin-sources: show polling schedule only for Municipal sources (7179d14 )
admin-sources: show schedule for all source types and save pollingCron for all kinds (47f5a95 )
admin: reset saveStatus on dialog open to prevent immediate close on re-open (ea70a66 )
ai: bail out of ReloadAsync when API key cannot be decrypted instead of throwing (1a6976b )
ai: harden AI client factory and provider factory (543f096 )
ai: persist Data Protection keys to Redis so API key survives container restarts (8157ca1 )
ai: reload after transaction commit via async outbox handler (db051ab )
ai: reload DB config on startup so container restarts don't revert to Ollama fallback (841c524 )
align suspend/rejectPending dialog contract and add inline comment composer (#48 ) (60d17db )
api: install curl in runtime image for Docker healthcheck (3e55723 )
api: read Keycloak JWT claims correctly in UserContributor (894ce71 )
app: ensure NgIf works in AppComponent and improve initial UX (621d688 )
arch-test: add missing PollSourceCommandValidator (ce35d86 )
auth: add missing defaultClientScopes to locali-web Keycloak client (e221e2e )
auth: add missing defaultClientScopes to production Keycloak clients (fe52921 )
auth: consume auth_return_url after successful registration (19bea0f )
auth: prevent logout caused by refresh token rotation race condition (c66ab03 )
auth: prevent session loss after PWA background / short idle (17b3698 )
auth: prevent spurious session loss on background token renewal (1935b61 )
auth: redirect non-members to community join page via deep link (f0910dc )
auth: update angular-auth-oidc-client v19 loader Provider syntax (3fb6ca4 )
cd: run Docker build only after CI succeeds (db1d773 )
cd: sanitize version for Docker tag by replacing + with - (3323173 )
ci: add actions:read permission for nx-set-shas (0ba22a2 )
ci: add GHCR login before pulling instance images (bf54bdb )
ci: add lint-be job with dotnet restore for backend format checks (c1b6f0d )
ci: inline matrix image tags — env context not available in strategy.matrix (e7b47a4 )
ci: lint + test + arch-test failures (06289cc )
ci: pass solution path to dotnet restore in lint-be job (8a11fc4 )
ci: replace --projects with --exclude to prevent arg forwarding to dotnet (9dafee9 )
ci: resolve all 8 mkdocs strict-mode warnings (8e13ec4 )
ci: switch deploy to webfactory/ssh-agent pattern (3af8c38 )
ci: sync package-lock.json with package.json (09cb27b )
ci: use SSH port 2222 for deploy action (a3550f2 )
community settings navigation and guard consistency (b43ed67 )
community-home: use absolute route for 'View all events' link to include slug (15c4067 )
community: fix join-request-pending test mocks and async handling (ec346b9 )
community: persist ExternalUrl in RSS ingestion and fix view migrations (0decb08 )
community: regenerate AddSourcesView migration via dotnet ef tooling (8cd2467 )
community: use valid JSON '{}' as rawDataJson placeholder in ingestion (8eaada5 )
config: align docker-compose.dev.yml with AiOptions refactoring (6859b81 )
config: update .env.example comment — AI settings are now general, not municipal-specific (88d7693 )
correct author display for RSS/ICS feed items and weekend card timing (cc6da1f )
coverlet.msbuild->collector, clear invite codes in tests, suppress MSG0001/MSG0005 (fd08ade )
data: add HTML entities cleanup migration + fix lint (cdf3632 ), closes #xE4 #xF6 #xFC
deploy: add Docling to stacks, fix AI config env var naming (#50 ) (ebff4a5 )
deploy: add LOCALI_SETUP_TOKEN to beta.example.env (958ef05 )
deploy: complete new-instance.sh and update README for mail.joinlocali.de (dd4ba37 )
deploy: correct Mailpit relay defaults in env examples (f278409 )
deploy: correct Mailpit relay environment variable names (2e461b2 )
deploy: relax CSP for images and WebSockets in all modes (8f8f534 )
deps: upgrade MailKit 4.15.1 -> 4.16.0 to fix CVE GHSA-9j88-vvj5-vhgr (d32ccc4 )
dev: persist Keycloak user data across container restarts (6a5ce89 )
docker: copy scripts/ into web build stage (ecf7658 )
docs-docker: install requirements.txt in Dockerfile to support mkdocs-static-i18n plugin (095028f )
docs: install requirements.txt in mkdocs-material Docker CI for plugin support (i18n) (19517cd )
docs: remove navigation.instant to allow mkdocs-static-i18n strict build (bbc29a0 )
dotnet-presentation: add noRestore to lint target to fix dotnet format restore failure (a0d5d20 )
email: resolve CS8604 nullable warning in SmtpEmailSender (ca8dafa )
events-page: use dedicated events endpoint with server-side filtering (fc471e3 )
events: support edit dialog from detail page via submitFn callback (8a7c126 )
events: use database view for attendees query + remove HTML encoding (a9bf530 )
feature-home: update morning-brief-card spec for FeedDetailService (9004a22 )
feed-detail-sheet: prevent scroll reset on header tap and navigation (53dcadc )
feed: add MatTooltipModule + remove obsolete tests (99b29cc )
feed: announcement 409 shows snackbar, new post reactionCounts null-safe (c1fe15f )
feed: instant reaction display via linkedSignal, optional store on event card, notification translation keys (b4522aa )
feed: iOS Safari hero image rendering (aspect-ratio on img element) (6d8e214 )
feed: iOS Safari image height bug in hero cards (f0f54f2 )
feed: remove sticky from filter bar (overlapped sub-nav), fix event hover shadow corners (5bf63f5 )
feed: restore _searchTimeout field in FeedPageComponent (#51 ) (d8eafd8 )
feed: sort by PublishedAt DESC; fix iOS cross-origin image loading (5abe7c3 )
feed: use original published_at from RSS/ICS feed instead of import timestamp in vw_feed (eea8338 )
feed: use TranslateService for share mailto fallback subject (c7ce5e4 )
frontend: add error notifications for all silent API failures (b414659 )
gestures: rewrite directives with imperative TouchEvent handlers for iOS PWA (9c8d9dd )
health: add Hangfire, Docling, and Discovery health checks; fix CI (f04b41a )
health: downgrade Docling/Ollama health checks from Unhealthy to Degraded (1d04e40 )
i18n,shell: add missing role translations + fully floating nav (be38b0a )
i18n: replace 'instance' with 'hub' in legal NOT_CONFIGURED strings (DE + EN) (ea2a3bf )
ics: use stable occurrence ExternalId to prevent event duplication (192efc8 )
infra: add Mailpit relay SSL/STARTTLS flags for port 465 support (b237b68 )
infra: add traefik.docker.network label to all core services (a09db34 )
infra: correct 4-space indentation in OpenAiSectionAnalyzer.cs (fbb9173 )
infra: correct church-section location rule to use section titles instead of UNTERABSCHNITT markers (15bed11 )
infra: correct jaeger image tag from 1.65 to 1.62 (8597544 )
infra: fix keycloak healthcheck port 8080 -> 9000 (management interface) (2950566 )
infra: improve event location extraction for hierarchical church sections (ab6e2a1 )
infra: migrate jaeger v1 to v2 (EOL + badger permission fix) (b0df732 )
infra: pass acme email via cli flag instead of go template in traefik.yml (7ecfed1 )
infra: register all infrastructure INotificationHandlers so AI hot-reload works (13ba123 )
infra: remove security-headers middleware from keycloak router (f47f3fe )
infra: replace curl healthcheck with bash tcp check for keycloak (86fbbd1 )
infra: route locali traefik as shared reverse proxy for co-hosted stacks (7adddfc )
infra: run EF Core migrations on startup + add LOCALI_SETUP_TOKEN (f401c77 )
infra: share acme.json between le and letsencrypt resolvers (b18d13a )
infra: update jaeger image tag to 1.76.0 (c40de47 )
ingestion: correct EF Core LINQ translation in ImportedRecordByExternalIdSpecification (07f5cb8 )
ingestion: extract image from media:content with medium=image attribute (4e57719 )
ingestion: guard against null SelectNodes result in AmtsblattIndexScraper (cbbc639 )
ingestion: harden anti-hallucination rules for official documents (2fbcec9 )
ingestion: hash RSS external IDs > 500 chars to prevent orphan items and duplicates (1ed09cc )
ingestion: interpret Amtsblatt dates as Europe/Berlin, store as UTC (0e4680b )
ingestion: proportional body length - short source = short body, long = long (193a5ec )
ingestion: restore editor voice + add list/agenda formatting rule (28aef45 )
ingestion: Stadtteilnachrichten - consistency over hard article/event rule (4a8d0cf )
ingestion: treat AI-returned event times as wall-clock UTC (7b0049d )
ingestion: use primitive values in ImportedRecordByExternalIdSpecification (5f3ae03 )
ingestion: use Unicode bullets instead of Markdown for lists (79cc4eb )
ingestion: validate ExternalId before InsertAsync to prevent orphan items (360a577 )
lifecycle UI bugs, role-based notification groups, reinstate auth to moderator+ (d5a5770 )
lint, migration view drop-recreate, and startup errors (5115ae5 )
lint: add missing braces in SourceIngestionService (SA1503) (aa73cca )
lint: replace non-null assertions with optional chaining in scroll-state spec (d2cf5f4 )
local-pulse: add missing authorizer and validator for GetMorningBriefQuery (567fac3 )
local-pulse: use API_BASE_URL for LocalPulseApiService (f715dd5 )
mailpit: use correct binary path for conditional relay activation (2c9f12c )
migration: fill empty AddPollingScheduleToSource migration (f3d0f88 )
migration: recreate vw_sources with polling_day_of_week and polling_time_utc (7164b3c )
migrations: drop vw_sources view before dropping polling columns (3bb95b8 )
migrations: remove invalid UPDATE on non-existent notification_type_preferences table (d58b19a )
mobile: prevent iOS auto-zoom on search and filter inputs (2d5066b )
moderation: fix two dialog bugs (6257466 )
moderation: handle null author in moderation queue view for external content (4c21434 )
municipal-pipeline: also fix spaced RTL PDF artifacts (e.g. 'm i e h s l e d e i D') (f9241fa )
municipal-pipeline: improve article/event extraction quality (46bbfee )
municipal: parse Amtsblatt event times as Germany local time (CET/CEST) (59c1f8d )
notifications: correct two broken notification deep links (dff3ead )
notifications: guard VAPID key construction when keys are not configured (411e7d1 )
notifications: iOS push subscription and SignalR reconnect (6b6e9fe )
notifications: reconnect SignalR on tab resume for iOS Safari (13faab5 )
notifications: skip assignment notifications for non-native content imports (5209051 )
notifications: use /notifications/inbox as push notification fallback URL (abaec13 )
nx: add missing project.json for AI infrastructure libs (6317dc2 )
nx: add retries:2 for test target to handle transient dotnet compiler locks (6b57a44 )
observability: align instance metric names with locali_ namespace (198c469 )
observability: expose prometheus scrape endpoint on internal port 8081 (8be62ab )
observability: fix invalid PromQL in LocaliOutboxProcessingLagHigh alert rule (dd03e82 )
observability: fix Redis alert firing when maxmemory is unset (653148b )
observability: use actual OTel metric names in dashboards and alerts (4182a8c )
prevent closed-mode choose-username flash and activate IsFirstLogin lifecycle (79e3ae5 )
push: replace invalid dev VAPID keys and add try-catch guard (5653eea )
PWA Install i18n keys, PushNotificationService test mock, and translations (a9b9bcf )
pwa: handle external image 504s from service worker (9fefa0a )
pwa: remove external-images dataGroup from ngsw-config (42d3a9e )
pwa: restore external-images dataGroup with 30s timeout and 7d cache (13d9543 )
reinstate auth bug, invalid invite code in tests, add BE coverage (b202271 )
resolve CI build warnings and test failures (ade2fe4 )
resolve CI failures — Angular test DI, lint, .NET architecture/domain/API tests (#46 ) (b9991c3 )
resolve nullable VO EF Core convertsNulls, LINQ translation via search service, and add migration (f0682a2 )
resolve random 503 on hard reload — raise spa_server TCP backlog to 128, wait for port 9000 before Envoy starts (d1684d3 )
routing: /c redirect + events-page navigation (c9cb531 )
scroll-restore: pendingScrollTarget persists across ngOnDestroy (ff24b86 )
security: override vulnerable System.Security.Cryptography.Xml transitive dep (b8c7954 )
setup: stabilize bootstrap tests and satisfy architecture rules (5029e95 )
shell: equal vertical padding in mobile bottom nav tab items (f8db0c4 )
shell: remove double safe-area-inset on floating bottom nav (c58091d )
styles: set color-scheme:dark so native controls are readable in dark mode (1da522e )
test: add TranslateModule to CommentSection tests (58710da )
test: guard scrollIntoView with optional call for JSDOM compatibility (f154142 )
test: remove unused 'tick' import from feed-detail.component.spec.ts (0d13c04 )
tests: correct EventAttendeeDto constructor call in test (bdb5296 )
tests: fix 3 pre-existing integration test failures (ba7ce07 )
ui: event-mini-card slug in link, event-list width, sources mobile, export btn color (8c511d4 )
use bash shebang in start.sh so /dev/tcp readiness check works on Debian/envoy image (20a6023 )
ux: reactions optimistic update, back button, events i18n, attendee status (ae1b1fc )
ux: switch gesture directives from PointerEvent to TouchEvent (3fcafca )
ux: use @if to properly render mat-stroked/flat-button for join modes (9a87c85 )
versioning: base dev pre-release on next bumped version (c836b97 )
web-core: fix SignalR badge not updating in real-time (126f935 )
web-ui: add register() to PushNotificationService mock in shell-layout spec (5d2fb1f )
web-ui: call push.register() on login to enable Web Push homescreen notifications (b2baba6 )
web/admin: fix admin-community-settings spec and keyword-tag-rules component (7c90c72 )
web/feature-auth: ensure push notification section and tests only show on iOS standalone, fix signal usage and mocks, enable esModuleInterop for ts-jest (6b45ef8 )
web: add fonts.gstatic.com to CSP connect-src for Service Worker font caching (3e4fcbd )
web: add missing COMMON.DELETE i18n key (en + de) (848c70b )
web: blank page - NG0203 inject context, CSP fonts, disable inlineCritical (3d53b05 )
web: exclude config.json from SW cache and remove dataGroups API caching (d562fd8 )
web: extract theme-init inline script to comply with CSP script-src 'self' (6b12d0b )
web: hide push notification block on iOS browser and update tests (2304a0a )
web: install curl in runtime image for Docker healthcheck (cc82cf9 )
web: link 'view all events' widget to /events route instead of feed filter (8cd404a )
web: link 'view all events' widget to feed with events filter preselected (07f240e )
web: pre-load config.json before bootstrap to fix API_BASE_URL race condition (2bea202 )
web: prevent 503 cache poisoning by moving Cache-Control to spa_server.py (799ed1f )
web: redirect to setup wizard when instance not bootstrapped and no profile (add3895 )
web: remove duplicate CSP from Envoy — Traefik sets the authoritative CSP (6267e8c )
web: repair shared list integration and typings (0a8e139 )
web: resolve OIDC bootstrap deadlock and CSP blocking API calls (ba9ffa0 )
web: update moderation report tests for communitySlug parameter (5f58324 )
web: use ThreadingHTTPServer to fix random 503s on parallel chunk requests (163a7bd )
whitespace formatting in IngestionJobs + migration AlterColumn view conflict (0bb30db )
chore
release: prepare v0.1.0 — add versioning docs and commit convention (d314452 )
Features
#032: report content — ContentReport aggregate, auto-hide at >=5 reports, report dialog UI (7d04cda ), closes #032
#039: admin user management (d63cc69 ), closes #039
#047: Cache membership status & role in Redis (#12 ) (3bdcb29 ), closes #047 #047
#048: Frontend Feature Structure Consolidation — 8 lazy-loaded feature libraries (#13 ) (0952bd9 ), closes #048
041: implement Leave Community story (1eb2c3f )
042: implement Remove Member (permanent) story (0c83254 )
043: implement Reinstate Removed Member story (6e3ff71 )
044: implement Re-Join After Leave story (ea71b03 )
049b: post CRUD backend — create, list, detail, archive (506f779 )
049c: pin/unpin assignments + notification policy migration (7c18285 )
049d: add universal feed query endpoint with item type and pinned filters (1c75a52 )
049: migrate Post aggregate to Item/CommunityAssignment (22c0157 ), closes #049
065: source management admin UI (4094686 )
069: Local Pulse - You Missed banner (cecb0d5 )
add locali base backend code, initial draft of architecture, features and stories (f6d5d1a )
add Mailpit email infrastructure + SmtpEmailSender (b8f4615 )
admin: modernize admin UI — dialogs, cards, empty states, mobile layout (f0d7e5c )
admin: story 096 — source default tags/area, routing rules UI, keyword tag rules (8cc878c )
auth: add instance-setup page for first-time admin bootstrap (bef3078 )
auth: persist OIDC refresh token in localStorage for PWA session continuity (9bd0da2 )
ci: add workflow_dispatch for full CI runs, use run-many vs affected (b5d9595 )
comments: Story 012 – comment on a post (cacb96b )
community-domain: promote ImportedRecord to AggregateRoot (story-053) (329372f )
community-home: consistent title/author hierarchy and sourceKind-aware display (b93d829 )
community-settings: display page + edit dialog, profile-page pattern (daae281 )
community-settings: Story 017 – manage community settings (0a66194 )
community: add CommunityHomeComponent placeholder as default child route (dbe893a )
community: add content visibility lifecycle — author badges, member list filtering & status display (47302fb )
community: add ExternalUrl field to Item aggregate (4193982 )
community: add Guest role with configurable DefaultMemberRole (f8c3f49 )
community: add LocalPulse feature with this-weekend events query endpoint (fad7cc6 )
community: add member removal and reinstatement frontend (1b34fab )
community: add removed-reason to user membership projection (55db1c1 )
community: add vw_sources view and on-demand source polling (7cd119a )
community: enforce cross-aggregate read boundaries via DB views (3c24c45 )
community: expose ExternalUrl, ImageUrl and SourceName in feed and event DTOs (b05e143 )
community: implement recent posts and moderator route guard (d13f0df )
community: implement story 004 - join a community (open/request modes) (66e15e6 )
community: implement story 014 - promote/demote post to announcement (fd2dbe8 )
community: implement story 060 - edit upcoming event (a0be000 )
community: implement story 062 - RSVP attendee list (73aa1c4 )
community: introduce area-based content routing and admin handbook (29301ad )
community: restore scroll position and feed state when returning from detail (42767d5 )
community: story 015 - promote/demote member role inline in member list (39b64e3 )
community: Story 018 - create community (InstanceAdmin) (02eafb1 )
community: story 025 — create community event (33ac9ee )
community: story 026 — event RSVP (validator + authorizer tests) (0875ff7 )
community: story 027 — view events (48b6a19 )
community: story 056 — participation route corrections and EventRsvp aggregate (4b82794 )
community: story 057 — feed route, type-aware cards & event participation surface (b881ea0 )
community: story 058 — remove Posts surface, add feed filter pills (669b888 )
complete observability stack — business KPIs, infrastructure metrics, alerting, and Grafana dashboards (#2 ) (1eb36bb )
content: Story 013 – delete post and comment placeholder (a1bfebe )
docs: add MkDocs Material docs site with Docker + Traefik deployment (0a3925d )
docs: add nav structure with DE/EN placeholder pages (672e725 )
events: add dedicated events/calendar page (9eb4b07 )
feature-community: add PostsStore, PostsApiService, FeedApiService and update routing (story-049e) (80b2d82 )
feed-detail: responsive overlay — MatDialog on desktop, BottomSheet on mobile (7ff3ea8 )
feed: add 'Add to calendar' button on event detail pages (219d293 )
feed: add share button using Web Share API (04862b9 )
feed: enrich share text and fix post-login deep link redirect (5a2129a )
feed: implement story 010 — view feed with infinite scroll (773b8dd )
feed: implement story 011 - post reactions (3562f69 )
feed: implement story 066 — participation tests, filter & detail view (efbf9d8 )
feed: modern card design — initials avatar, hero image, shadow, sticky filters, shared badge component (1e69c1d )
feed: open feed detail as bottom sheet from all entry points (19d49b6 )
frontend: add GDPR account deletion & data export UI (Story 021) (b693374 )
gdpr: implement GDPR data export with Hangfire jobs and local file storage (c105aaf )
hangfire: add Basic Auth for dashboard in production (0e156b7 )
harmonize suspend UI with remove, add SignalR redirects, fix e2e (bfbae60 )
home: landing page, user home placeholder, conditional nav (1759d7d )
i18n: add runtime localisation with language switcher (en/de) (cac42e7 )
i18n: add translations for data export and legal info features (c819f0f )
i18n: rename community to place/ort across all UI translations (8deade3 )
ics: implement ICS calendar connector (Story 064) (56c300c )
identity: add username onboarding flow, checks, i18n parity guard (65bf2f7 )
identity: add verified username identity across backend and frontend (534049e )
identity: complete story 002 - edit profile (8229f16 )
identity: implement story 001 — first login & profile bootstrap (8109b88 )
identity: implement story 003 — register with instance invite (79915b0 )
identity: implement Story 021 — GDPR account deletion & data export (c9ec6b6 )
images: add image proxy for cross-origin PWA images (1f08def )
implement community settings (story 017) (66ed7bf )
implemented phase 0 (931d92e )
improve token handling, splitting large documents (1c5e073 )
info-shell: group legal/info pages under /info/* with sub-navigation (95c9ae5 )
infra: add production Docker Compose infrastructure (fce4b3c ), closes #infra-bootstrap
ingestion: add composable IContentMatcher with URL deduplication strategy (eee6c2f )
ingestion: add Locations field to AnalyzedArticle and improve Amtsblatt AI prompt (9271290 )
ingestion: health check, circuit breaker, and Prometheus alerts (ce9eba0 )
ingestion: implement stories 088 + 087 — IContentMatcher, NullContentMatcher, MaterializeItemJob (0c2feb1 )
ingestion: implement story 084 — ImportedRecord domain upgrades (1c1170f )
ingestion: implement story 085 — handlers stop at staging boundary (b4f638d )
ingestion: implement story 086 — EnrichImportedRecordJob + IUnifiedEnrichmentHandler (c82863b )
ingestion: improve Amtsblatt AI prompt quality (7687478 )
ingestion: improve municipal bulletin analysis prompt quality (90667c9 )
ingestion: story 090 — pipeline observability metrics and Grafana dashboard (4a1b0eb )
ingestion: story 100 - pass area+tag context into AI analysis prompt (3c947cb )
ingestion: update existing items on re-fetch (2819e8c )
instance: add legal info management for privacy policy and terms of service (e87d0c7 )
introduce CommentBody value object for Comment aggregate (052adbd )
introduce Community value objects and shared ImageUrl (c0c98fd )
introduce InstanceConfig value objects and RegistrationMode enum (393a944 )
introduce ModerationReason value object for CommunityMembership aggregate (c50ce40 )
introduce PostTitle and PostBody value objects for Post aggregate (1b997e5 )
introduce shared InviteCode value object for invite code aggregates (ca8d6a7 )
introduce UserProfile value objects (Username, DisplayName, Email) (41bd3fd )
introduce Value Objects for ContentReport aggregate (f0549de )
invite: validate invite code + pin-style code input (66db12e )
local-pulse: implement Morning Brief (story 068) (aafe0c9 )
local-pulse: implement story 067 — this weekend backend & frontend tests (91924ac )
mailpit: enable relay and --smtp-relay-all only in production (c060e7c )
membership: implement story 005 - approve/reject community join requests (1f1ea88 )
membership: implement story 045 — re-apply after rejected (79d8c54 )
members: Story 016 – Suspend / Reactivate Member (e034ca6 )
metrics: business metrics — 3-tier activity counters, ingestion pipeline, Grafana dashboard (41f5719 )
moderation: story 033 — moderation queue (ea800f8 )
moderation: story 033+034 - moderation queue + handle reports (54af0e3 )
municipal-intelligence: municipal gazette ingestion pipeline + architecture evolution (Cycles 1-25) (529d993 )
mvp-4: participation posts (HelpRequest/Offer/VolunteerNeed) (cd0acf6 )
notifications: add content notification policies (Story 023b) (6e49430 )
notifications: add notification backend infrastructure (story 022) (c88b2ca )
notifications: add notification bell UI, store, and frontend tests (story 022) (27f431c )
notifications: add notification preferences settings page (Story 024 frontend) (164e21e )
notifications: add notification preferences with enforcement (Story 024) (b1e08a6 )
notifications: add PushSubscription domain entity, EF mapping, and migration (40f2f6d )
notifications: add Web Push commands, services, and API endpoints (3b50743 )
notifications: delete push subscriptions during GDPR account purge (1b7ade1 )
notifications: implement Story 023 — membership & admin notification policies (72da8fc )
notifications: live nav badge and OS app badge via Web Push (67b0b27 )
notifications: Story 059 - new event notification (704d906 )
notifications: wire Web Push frontend — register, revoke, and foreground message handling (365407b )
observability: add production-grade Grafana dashboard suite (2095b33 )
observability: comprehensive alerts with Grafana-native runbooks (3139563 )
observability: sensible AlertManager defaults (b53b572 )
observability: story 097 - routing engine tests + metrics + grafana dashboard (f49f230 )
phase-03: community overview, home page, logo support, start page shortcuts (07a20e4 )
phase-03: story 007 — member list with cursor pagination + nav link (c96e888 )
phase-04: story 009 - create post (backend + frontend) (977ffab )
pwa: add inline boot spinner to index.html (257437c ), closes #6750a4
pwa: add VAPID key infrastructure and runtime config for Web Push (fb3fcae )
register: redirect /register?code to start page for pre-filled invite form (30e3c97 )
replace MailHog with Mailpit, wire alerting, document email infrastructure (5fde8aa ), closes #20
restore participation features (comments + reporting) in feed detail (#47 ) (428f83b )
routing: extend auto-routing policy for Rss/Ical items (Story 063b) (0cd1123 )
routing: implement story 091 — extend EnrichedItemData with routing metadata (19cf26e )
routing: implement story 092 — Source.DefaultTags + Source.DefaultArea (afc3862 )
routing: implement story 093 — ITagEnrichmentStep: source inheritance + keyword matching (4a1ae65 )
routing: implement story 094 — RoutingRule aggregate + persistence (d2e75f2 )
routing: implement story 095 — RoutingEngine evaluates rules -> N assignments (c8784d0 )
routing: routing engine with CRUD, metrics, and integration tests (8a8143d )
routing: story 098 - Community.AssociatedAreas + geo-routing phase 1 (acaa947 )
routing: story 099 - wire Municipal AI metadata into AreaHints + Tags (1de409c )
rss: implement RSS feed connector (Story 063) (968ef6f )
setup: implement SetupController with full bootstrap wizard backend (ec0bdb9 )
setup: replace token-only wizard with full multi-step bootstrap wizard (f51ff9e )
Source aggregate (Phase 14.2 — Item Architecture) (#25 ) (963d23c )
sources: replace weekday+time polling with cron expressions (73ddb25 )
stories: Story 028 — Cancel Event (c998edc )
Story 040 — disabled user authentication enforcement with HybridCache + SignalR push (31c1698 )
tagging: add TagQueryService and TagEnrichmentStep (1f33ff4 )
ui,auth: redesign auth/onboarding pages; extract RegistrationPanelComponent (5546bc7 )
ui: implement Material M3 theme, responsive shell, and page layouts (f21365d )
ui: InlineAlertComponent, NotificationService, ProfileEdit fixes (adbeda4 )
ui: modernize mobile UX — M3 tokens, glass nav, greeting hero (dd408d0 )
ui: paket-a -- nav-bar M3, pinned, fab, recent-posts, error-states (843eb5c )
ui: paket-b -- design-tokens, avatar size, rsvp button fix (cecfeeb )
ui: paket-c -- sticky back-bar, feed skeleton, welcome-banner, reaction touch-targets (5b0f809 )
ux: distinguish open join (filled) vs request join (outlined) button style (fbcc935 )
ux: floating bottom nav, viewport stability and gesture wiring (38d46b5 )
ux: improve join-flow, pending state visibility, start page redesign (377ff46 )
ux: redesign available place cards to show description and join mode upfront (415c8b8 )
ux: redesign explore page cards to show description and join mode upfront (00a797d )
ux: self-contained dialog save pattern with loading animation (236f44b )
ux: unified feed UX for posts and events (9aad19f )
versioning: automatic version, CHANGELOG and Docker image tagging (4b0f1b5 )
web: add i18n translations for LocalPulse and external source attribution (16fe699 )
web: add public pages for privacy policy, terms of service, about and impressum (8ca6f6e )
web: add skeleton loaders for notification inbox and member list (2393983 )
web: add this-weekend card to home page using LocalPulse API (6064a8a )
web: centralize shell headers, PWA badge API, and manifest improvements (ecf1b57 )
web: display external URL and source attribution on feed cards (f0a738b )
web: enhance EmptyState with optional subtitle and contextual hints (b066197 )
web: enrich Community Home dashboard with header identity section (a2538bc )
web: humanize recent dates and confirm comment deletion (f1e34f5 )
web: preserve line breaks in user-entered text display (4696cd7 )
web: proactive push permission request on first standalone iOS launch (a2309ac )
web: show 'Setup Required' notice for unauthenticated users on fresh instances (91f0662 )
web: show image and external link on feed detail page for RSS/ICS items (e27fc7b )
web: UX polish pass — unified banners, loading, layout consistency (186d01c )
ci: extract npm ci into shared install job with node_modules cache (cea3ef8 )
Reverts
ai: remove redundant AiChatClientStartupService (ConfigurePipeline already calls ReloadAsync) (493cf89 )
BREAKING CHANGES
versioning: / ! -> major bump
feat -> minor bump
fix / chore / etc. -> patch bump
release: syntax, examples — referenced from rule 13 in Section 4
src/AGENTS.md: add Commit Convention block so Nx workspace agents follow
the same convention
Zurück zum Seitenanfang