Spaces:
Running on CPU Upgrade
Running on CPU Upgrade
| sidebar_position: 15 | |
| # Council Data Project (CDP) Compatibility | |
| Open Navigator's data model is designed to be compatible with the [Council Data Project (CDP)](https://councildataproject.org/) backend schema, enabling interoperability with CDP instances deployed across cities nationwide. | |
| ## ποΈ About Council Data Project | |
| Council Data Project (CDP) is an open-source project that makes local government more accessible by providing infrastructure to index, archive, and make searchable city council meetings. CDP instances are deployed in cities across the United States. | |
| **Website:** https://councildataproject.org/ | |
| **Documentation:** https://councildataproject.org/cdp-backend/ | |
| **GitHub:** https://github.com/CouncilDataProject/cdp-backend | |
| ## π Data Model Mapping | |
| Our data model maps to CDP's core models while maintaining flexibility for additional data sources (YouTube, LocalView, Legistar, etc.): | |
| ### Event Model Mapping | |
| | CDP Field | Open Navigator Field | Notes | | |
| |-----------|---------------------|-------| | |
| | `event_datetime` | `event_datetime` | Combined date+time timestamp | | |
| | `body_ref` | `body_name` | Meeting body (e.g., "City Council") | | |
| | `agenda_uri` | `agenda_url` | Link to meeting agenda PDF | | |
| | `minutes_uri` | `minutes_url` | Link to meeting minutes PDF | | |
| | `external_source_id` | `external_source_id` | Cross-system tracking ID | | |
| | N/A | `video_url` | Extended field for YouTube/streaming | | |
| ### Session Model Mapping | |
| | CDP Field | Open Navigator Field | Notes | | |
| |-----------|---------------------|-------| | |
| | `video_uri` | `video_url` | Video URL for the meeting | | |
| | `session_content_hash` | `session_content_hash` | Hash for deduplication | | |
| | `session_datetime` | `event_datetime` | When the session occurred | | |
| | `event_ref` | `id` | Reference to parent event | | |
| ### Body Model Mapping | |
| | CDP Field | Open Navigator Field | Notes | | |
| |-----------|---------------------|-------| | |
| | `name` | `body_name` | "City Council", "Planning Commission" | | |
| | `description` | `body_description` | Full description of the body | | |
| | `external_source_id` | `external_source_id` | Source system identifier | | |
| ### Transcript Model Mapping | |
| | CDP Field | Open Navigator Field | Notes | | |
| |-----------|---------------------|-------| | |
| | `session_ref` | `event_id` (in events_text_ai) | Links to session/event | | |
| | `file_ref` | `video_id` | Reference to video file | | |
| | `confidence` | `transcript_quality` | Transcript quality score | | |
| | `generator` | `ai_model` | AI model used (Gemini, Whisper, etc.) | | |
| ## ποΈ Database Schema | |
| ### Bronze Layer (open_navigator_bronze) | |
| Our bronze tables include all CDP fields plus additional fields for YouTube and other sources: | |
| ```sql | |
| CREATE TABLE bronze_event ( | |
| -- CDP-compatible core fields | |
| event_datetime TIMESTAMP, | |
| body_name VARCHAR(200), | |
| body_description TEXT, | |
| agenda_url TEXT, -- CDP: agenda_uri | |
| minutes_url TEXT, -- CDP: minutes_uri | |
| external_source_id VARCHAR(255), | |
| -- Extended fields for multi-source ingestion | |
| video_url TEXT, -- YouTube, Granicus, etc. | |
| channel_id VARCHAR(50), -- YouTube channel tracking | |
| source VARCHAR(50), -- 'youtube', 'localview', 'legistar' | |
| jurisdiction_name VARCHAR(200), | |
| state_code VARCHAR(2), | |
| -- ... additional fields | |
| ); | |
| ``` | |
| ### Production Layer (event) | |
| The production `event` table (built via dbt) maintains CDP compatibility while providing a unified view across all data sources. | |
| ## π Data Flow | |
| ``` | |
| CDP Instance (e.g., Seattle) βββ | |
| YouTube (Municipal Channels) βββΌβββΊ Bronze Layer βββΊ dbt Staging βββΊ dbt Marts βββΊ event (CDP-compatible) | |
| LocalView Dataset ββββββββββββββ€ | |
| Legistar API βββββββββββββββββββ | |
| ``` | |
| ## π― Benefits of CDP Compatibility | |
| 1. **Interoperability**: Data can be shared with CDP instances in other cities | |
| 2. **Standardization**: Follows civic tech best practices for meeting data | |
| 3. **Community**: Leverage tools built by the CDP ecosystem | |
| 4. **Federation**: Potential to federate queries across CDP instances nationwide | |
| ## π CDP Models Reference | |
| ### Event | |
| An event can be a normally scheduled meeting, a special event such as a press conference or election debate, and can be upcoming or historical. | |
| **Key Fields:** | |
| - `event_datetime`: When the event occurs | |
| - `body_ref`: Reference to the meeting body | |
| - `agenda_uri`: Link to the agenda | |
| - `minutes_uri`: Link to the minutes | |
| ### Body | |
| A meeting body. This can be full council, a subcommittee, or "off-council" matters such as election debates. | |
| **Key Fields:** | |
| - `name`: Name of the body (e.g., "City Council") | |
| - `description`: Full description | |
| - `is_active`: Whether the body is currently active | |
| ### Session | |
| A session is a working period for an event. For example, an event could have a morning and afternoon session. | |
| **Key Fields:** | |
| - `video_uri`: Link to the video | |
| - `session_content_hash`: Hash for deduplication | |
| - `session_datetime`: When the session occurred | |
| ### Transcript | |
| A transcript is a document per-session. | |
| **Key Fields:** | |
| - `session_ref`: Reference to the session | |
| - `confidence`: Transcript confidence score | |
| - `generator`: What generated the transcript (e.g., "whisper-large-v3") | |
| ### Matter | |
| A matter is a specific legislative document (bill, resolution, initiative, etc.). | |
| **Key Fields:** | |
| - `name`: Matter identifier (e.g., "CB 120001") | |
| - `title`: Full title | |
| - `matter_type`: Type (bill, resolution, etc.) | |
| ### Vote | |
| A reference tying a specific person and an event minutes item together. | |
| **Key Fields:** | |
| - `person_ref`: Reference to the person voting | |
| - `event_minutes_item_ref`: What they voted on | |
| - `decision`: approve/reject/abstain | |
| ## π Querying CDP-Compatible Data | |
| ### Get all City Council meetings in 2024 | |
| ```sql | |
| SELECT | |
| event_datetime, | |
| body_name, | |
| title, | |
| agenda_url, | |
| minutes_url, | |
| video_url | |
| FROM event | |
| WHERE body_name = 'City Council' | |
| AND event_datetime BETWEEN '2024-01-01' AND '2024-12-31' | |
| ORDER BY event_datetime DESC; | |
| ``` | |
| ### Find meetings with transcripts | |
| ```sql | |
| SELECT | |
| e.event_datetime, | |
| e.body_name, | |
| e.title, | |
| t.transcript_quality, | |
| t.ai_model | |
| FROM event e | |
| JOIN events_text_search t ON e.id = t.event_id | |
| WHERE t.has_transcript = true | |
| ORDER BY e.event_datetime DESC; | |
| ``` | |
| ## π€ Contributing to CDP Ecosystem | |
| Open Navigator extends CDP's vision by: | |
| 1. **Multi-source ingestion**: YouTube, LocalView, Legistar, Granicus | |
| 2. **AI-powered transcription**: Gemini, Whisper for automatic transcripts | |
| 3. **Nationwide coverage**: 90,000+ jurisdictions tracked | |
| 4. **Policy analysis**: AI models for policy opportunity detection | |
| ## π Further Reading | |
| - [CDP Documentation](https://councildataproject.org/cdp-backend/) | |
| - [CDP GitHub Repository](https://github.com/CouncilDataProject/cdp-backend) | |
| - [CDP Database Models](https://councildataproject.org/cdp-backend/database_models.html) | |
| - [Open Navigator Data Sources](./citations) | |
| - [Events Bronze Migration Guide](../deployment/events-bronze-migration) | |
| ## π Citation | |
| When citing Council Data Project compatibility in Open Navigator: | |
| ```bibtex | |
| @software{council_data_project, | |
| title = {Council Data Project: Indexing City Council Meetings}, | |
| author = {{Council Data Project Team}}, | |
| year = {2020}, | |
| url = {https://councildataproject.org/}, | |
| note = {Open-source infrastructure for making local government more accessible} | |
| } | |
| ``` | |