73 lines
1.7 KiB
Markdown
73 lines
1.7 KiB
Markdown
# CivicSwarm
|
|
|
|
Privacy-preserving neighborhood deliberation router for participatory politics.
|
|
|
|
## What It Does
|
|
|
|
CivicSwarm stores proposals, comments, resident profiles, preference signals, and deliberation ledger entries in SQLite. It then:
|
|
|
|
- clusters comments with TF-IDF + KMeans
|
|
- summarizes discussion by detected language
|
|
- routes proposal fragments to relevant residents by geography, interests, experience, and language
|
|
- aggregates preferences with optional differential-privacy noise
|
|
- ingests offline capture batches from mobile, SMS, and field canvassing with audit-friendly idempotency
|
|
- exports a civic brief with provenance and audit trail
|
|
|
|
## Stack
|
|
|
|
- Python 3.11
|
|
- FastAPI
|
|
- SQLAlchemy Core + SQLite
|
|
- scikit-learn
|
|
- langdetect
|
|
|
|
## Install
|
|
|
|
```bash
|
|
python3 -m pip install -e .
|
|
```
|
|
|
|
For development:
|
|
|
|
```bash
|
|
python3 -m pip install -e ".[dev]"
|
|
```
|
|
|
|
## Run
|
|
|
|
```bash
|
|
python -m civicswarm
|
|
```
|
|
|
|
Environment variables:
|
|
|
|
- `CIVICSWARM_DB_PATH` defaults to `civicswarm.sqlite`
|
|
- `CIVICSWARM_HOST` defaults to `127.0.0.1`
|
|
- `CIVICSWARM_PORT` defaults to `8000`
|
|
|
|
## API
|
|
|
|
- `POST /proposals`
|
|
- `POST /residents`
|
|
- `POST /proposals/{proposal_id}/comments`
|
|
- `POST /proposals/{proposal_id}/preferences`
|
|
- `POST /capture-batches`
|
|
- `GET /proposals/{proposal_id}/route`
|
|
- `GET /proposals/{proposal_id}/dashboard`
|
|
- `GET /proposals/{proposal_id}/brief`
|
|
- `GET /proposals/{proposal_id}/ledger`
|
|
- `GET /capture-batches/{batch_key}`
|
|
|
|
## Testing
|
|
|
|
```bash
|
|
bash test.sh
|
|
```
|
|
|
|
That runs `pytest` and `python3 -m build`.
|
|
|
|
## Notes
|
|
|
|
- Resident identity is kept pseudonymous through `resident_key`.
|
|
- The current codebase is backend-first and designed for mobile, SMS, and field-capture integrations.
|