Skip to content

About locali

locali is a private side project — born from a concrete problem and a clear conviction: local communities deserve their own, independent digital infrastructure. Digital self-determination is not a technical hobby — it is a prerequisite for lived local democracy.


Why this project

Local communication in Germany is fragmented. Municipalities use their website, clubs post on Facebook, initiatives send newsletters — and the resident who simply wants to know what's happening in their community has to monitor dozens of channels.

The existing platforms are not the problem — they work. But they were not built for local communities. They were built for reach, advertising, and growth. And they are run by companies that are neither based in Europe nor have local democracy as a goal.

This is not an abstract problem: whoever controls the communication infrastructure of a community has influence over what is visible — and what is not. Local clubs, initiatives, and municipalities that organise their public presence through external platforms make themselves dependent on algorithms, terms of service, and decisions made elsewhere.

locali is an attempt to change that: a platform built explicitly for local communities — self-hosted, designed for data-sovereign operation, and without dependency on a central platform. Digital independence as the foundation for local agency.


Stance

Local public discourse is a prerequisite for democracy. Not in the abstract — but very concretely: a community that cannot inform itself cannot make decisions. A community that communicates only through platforms that monetise attention is structurally at a disadvantage.

Commercial platforms are optimised for engagement. Engagement rewards outrage, polarisation, and oversimplification — not because operators explicitly want that, but because the incentive structure rewards it. Disinformation, escalation, and hostility emerge more easily where attention is the central currency.

locali is built differently: no commercial engagement algorithm that allocates reach, no feed optimised for outrage. Someone who writes calmly and factually should not be put at a structural disadvantage. That is an architectural decision — and a stance.

Responsibility for the quality of discourse lies with the community and its operators — not with the platform. But the platform is built so that it does not work against them.


Who is behind it

locali is a solo project. No company, no team, no investor. Built in spare time — out of genuine interest in the problem and a desire to build something useful.

That also means: no roadmap guarantees, no SLA, no support contract. What there is: direct communication, genuine interest in feedback, and a willingness to develop the product together with early operators.

That is also why locali is currently best suited for technical evaluation, pilot projects, and early feedback — not for mandatory production communication.


Open source — planned

The source code is not yet public. A release as open source is planned once the software reaches a stable state and a clean setup guide exists.

The goal: a project that every municipality, club, and initiative can run themselves — without depending on a central service.

Tech stack at a glance

Layer Technology
Frontend Angular 19, Angular Material, NgRx Signal Store
Backend ASP.NET Core 10, Clean Architecture, Domain-driven Design
Database PostgreSQL 16, EF Core, pgvector
Auth Keycloak (OIDC / OAuth 2)
AI Ollama (local) + OpenAI-compatible cloud providers
Build Nx monorepo, Docker Compose

The full architecture documentation — ADRs, bounded contexts, ingestion pipeline, Semantic Intelligence Layer — lives in the repository on GitHub and is maintained there.


Hosting and infrastructure

The current test environment runs on netcup in Karlsruhe — a German hosting provider. No American hyperscaler, no data outside the EU.

AI integration

For AI-assisted features (e.g. automatic tagging, semantic routing, content search), locali supports two approaches:

  • Ollama (default, local): AI models run directly on your own server — fully local AI processing, no content or queries are sent to external services for analysis. This is the recommended configuration for anyone who takes data sovereignty seriously. Requires more capable hardware.
  • External cloud providers (opt-in): Operators who want to use cloud models configure this explicitly — and take on the associated data-protection responsibility themselves. Currently supported providers:
Provider Origin Note
Mistral AI France (EU) Option with EU data processing; legal review is still needed
Azure OpenAI EU regions available Own Azure resource; can help with data-residency requirements
OpenAI USA Data processed by the provider in the USA
Google AI (Gemini) USA Data processed by the provider in the USA
Cohere Canada Canada has an EU adequacy decision; not an EU provider

The architecture is open for additional providers. Cloud configuration is deliberately not the default — it must be actively enabled.


Open source components used

locali would not be possible without a strong foundation of open-source software. Thank you to all communities and maintainers of these projects:

Frontend

Project Use Licence
Angular Web framework MIT
Angular Material UI components (Material Design 3) MIT
NgRx Signals Reactive state management MIT
ngx-translate Multilingual support MIT

Backend

Project Use Licence
.NET / ASP.NET Core Backend framework and API MIT
Entity Framework Core Database access and ORM MIT
Mediator Command/query pattern MIT
ErrorOr Error handling without exceptions MIT

Infrastructure

Project Use Licence
PostgreSQL Database PostgreSQL
Keycloak Identity and access management Apache 2.0
Traefik Reverse proxy MIT
Grafana Monitoring dashboards AGPL 3.0
Prometheus Metrics collection Apache 2.0
OpenTelemetry Distributed tracing Apache 2.0
Ollama Local AI models MIT
Docling PDF extraction for municipal bulletins MIT

Ideas, feedback, involvement

If something is missing, you have an idea, or you're simply interested in the project — get in touch. Contact: Imprint.