Overview
OpenCouncil models the complex organizational structure of municipal governance in Greece and other regions. The system distinguishes between cities (municipalities/regions), administrative bodies (councils, committees, communities), political parties, and individual people with specific roles.Organizational hierarchy
Municipal governance follows a clear hierarchical structure:Cities
ACity represents a municipality or region—the top-level governance entity.
City types
- Municipality
- Region
Type:
municipalityExample: Municipality of Athens (Δήμος Αθηναίων)Characteristics:- Local city government
- Municipal council and committees
- Direct services to residents
City configuration
prisma/schema.prisma
City status
Administrative bodies
Administrative bodies represent the various councils, committees, and communities within a city.Body types
Council
Greek: ΣυμβούλιοExample: Δημοτικό Συμβούλιο (Municipal Council)Primary legislative body
Committee
Greek: ΕπιτροπήExample: Δημοτική Επιτροπή (Municipal Committee)Specialized working groups
Community
Greek: ΚοινότηταExample: 5η Δημοτική Κοινότητα (5th Municipal Community)Geographic subdivisions
Administrative body model
prisma/schema.prisma
Notification behavior
Each administrative body controls how notifications are handled:- Approval required
- Automatic
- Disabled
Setting:
NOTIFICATIONS_APPROVALBehavior: Notifications created but require admin approval before sendingUse case: New bodies or those wanting review controlPolitical parties
Parties represent political organizations within a city.prisma/schema.prisma
Parties are city-specific—the same political organization in different cities has separate
Party records.Party display
Parties are visually distinguished by:- Color: Hex color code for badges and UI elements
- Logo: Optional party logo image
- Short name: Abbreviated form for space-constrained displays
People and roles
People (council members, mayors, etc.) are connected to organizational entities through theRole model.
Person model
prisma/schema.prisma
Role model
TheRole model provides flexible role assignments:
prisma/schema.prisma
Role patterns
OpenCouncil supports two valid patterns for storing roles (see/guides/roles-reference for details):
- Pattern A: Explicit city
- Pattern B: Implicit city
All roles include
cityId for explicit context:- City role:
{cityId, partyId: null, administrativeBodyId: null} - Party role:
{cityId, partyId, administrativeBodyId: null} - Body role:
{cityId, partyId: null, administrativeBodyId}
Example role combinations
A single person could have multiple simultaneous roles:Meetings and bodies
Council meetings are linked to administrative bodies:prisma/schema.prisma
Administrative body is optional—some meetings may not be associated with a specific body.
External integrations
Diavgeia integration
Diavgeia is Greece’s government transparency portal. Cities and bodies can configure integration:City-level
City-level
Field:
diavgeiaUidPurpose: Organization identifier for decision pollingExample: 99222206 for Municipality of AthensBody-level
Body-level
Field:
diavgeiaUnitIdsPurpose: Array of unit IDs for more precise matchingExample: ["81689"] for specific committeeYouTube integration
Field:youtubeChannelUrl
Purpose: Link to administrative body’s YouTube channel for meeting videos
Email integration
Field:contactEmails
Purpose: Array of emails to receive meeting transcripts and notifications
Geographic data
Cities store geographic boundaries using PostGIS:- Map visualization of city boundaries
- Proximity calculations for notifications
- Geographic search and filtering
People ordering
Cities can configure how people are displayed:- Default ordering
- Party rank ordering
Setting:
peopleOrdering: defaultBehavior: Alphabetical by nameCreating administrative structures
Import script example
OpenCouncil includes import scripts for bulk creation:scripts/insert_athens_communities.ts
Manual creation via admin UI
Administrators can create structures through the admin interface at/admin (requires super admin rights).
Best practices
Use explicit city scope (Pattern A)
Use explicit city scope (Pattern A)
When creating roles, always include
cityId for consistency and simpler queries.Configure notification behavior carefully
Configure notification behavior carefully
Start with
NOTIFICATIONS_APPROVAL for new bodies until the notification process is tested.Maintain bilingual naming
Maintain bilingual naming
Always provide both Greek and English names for international accessibility.
Link Diavgeia IDs
Link Diavgeia IDs
Configure Diavgeia integration to enable automatic decision fetching.
File reference
Key implementation files
prisma/schema.prisma- Data models (City: lines 16-57, AdministrativeBody: lines 92-111, Party: lines 113-134, Person: lines 136-163, Role: lines 760-793)scripts/insert_athens_communities.ts- Import script examplesrc/lib/db/cities.ts- City query functionsdocs/roles.prd.md- Role system documentation