No description
  • PLpgSQL 99.5%
  • Java 0.3%
  • TypeScript 0.2%
Find a file
Johannes Reiter-Schwaighofer 981a34fb20
All checks were successful
Build and Deploy / build (push) Successful in 1m8s
updated import multiple times
2026-08-28 20:41:15 +02:00
.forgejo/workflows update forgejo action 2026-08-22 23:12:07 +02:00
backend Avoid stripping Ing from Ingrid 2026-08-24 14:33:58 +00:00
data updated import multiple times 2026-08-28 20:41:15 +02:00
docs fixed imports, added prototype 2026-08-24 12:34:24 +02:00
frontend Show dropped agenda result badge 2026-08-28 12:39:12 +00:00
infra Initial commit council-monitor 2026-08-22 19:01:42 +02:00
sample-data Initial commit council-monitor 2026-08-22 19:01:42 +02:00
.gitignore fix frontend build 2026-08-22 19:50:36 +02:00
FILELIST.txt Initial commit council-monitor 2026-08-22 19:01:42 +02:00
pom.xml fix frontend build 2026-08-22 19:50:36 +02:00
README.md Initial commit council-monitor 2026-08-22 19:01:42 +02:00

Council Monitor

Starter web application for structured publication and analysis of approved municipal council meeting minutes.

Stack

  • PostgreSQL
  • Java 21
  • Jakarta EE 10
  • TomEE 10
  • JAX-RS REST APIs
  • JPA / OpenJPA
  • Lombok
  • MapStruct
  • Angular 22 (standalone components)

Project structure

  • backend/ Jakarta EE WAR
  • frontend/ Angular frontend
  • infra/ local PostgreSQL environment
  • sample-data/ example import format
  • docs/ data model and API documentation

Quick start

1. Start PostgreSQL

cd infra
docker compose up -d

Default values:

  • Host: localhost
  • Port: 5432
  • Database: council_monitor
  • User: council_monitor
  • Password: council_monitor

2. Build backend

cd backend
mvn clean package

The WAR is created as backend/target/council-monitor.war and can be deployed to TomEE 10.

The JNDI datasource is jdbc/CouncilMonitorDS. An example TomEE configuration is available in backend/tomee.xml.example.

3. Start frontend

Angular 22 requires Node.js ^22.22.3, ^24.15.0 or >=26.0.0.

cd frontend
npm install
npm start

By default, the frontend expects the API under /api and uses a development proxy to http://localhost:8080/council-monitor/api.

Data model

Core structure:

Meeting -> AgendaItem -> Motion -> PersonVote

Additional entities:

  • Person
  • Party
  • Mandate
  • Speech
  • SourceDocument

Every individual vote stores a sourceType so the origin of the reconstructed vote remains transparent:

  • EXPLICIT person explicitly named in the minutes
  • FRACTION_DERIVED derived from a documented party-group vote
  • UNANIMOUS_DERIVED derived from unanimity plus documented attendance
  • MANUAL_CONFIRMED manually verified

Import workflow

Recommended flow:

  1. approved meeting minutes as OCR/text
  2. extraction into the JSON format in sample-data/meeting-import.example.json
  3. manual plausibility check
  4. import through POST /api/import/meetings
  5. presentation in the Angular frontend

The application provides a separate research page under /topics. It searches agenda-item titles using case-insensitive contains matching and supports council-period filters for 2015-2021, 2021-2027, or all. Each result links directly to the corresponding agenda item in the meeting's voting monitor.

Notes

This repository is intentionally structured as a solid starter. Authentication, role management, automated OCR/LLM import, full-text search, and additional analytics can be added later.