Epi-Collect uses location data from Google Takeout to build an open source contact tracing dataset.
Current Engineering Milestone | Current Researchers |
---|---|
Pre-launch (2 active contributors) | Become our first researcher |
- Establish privacy-respecting best practices for data donation
- Create a community-driven dataset standard for contact tracing
- Enable researchers and city health departments to investigate the spread of COVID-19 and other diseases using donated data
Is my data kept safe and private?
Yes, and we empathize with your concern. The biggest problem with recent contact tracing solutions is that they may be a gateway to surveillance capitalism in the name of public safety. There is a shrinking window of opportunity available today to set a precedent for privacy-respecting contact tracing. As an open source project with all documentation in the open, Epi-Collect is in a unique position to do that. No one has scaled open source data donation before, and we're excited to test its potential.
Check out our Privacy living document to see how we think about this and how we hope others will too.
Is my data anonymized?
Yes.
- Weβve designed our database such that there is no possible way to associate location data with your identity. If youβre an engineer, you can see our very simple database schema here.
- During data ingestion, we ask users to review every data point and delete those that they believe are personally identifiable. We also give hints about what data points may be personally identifiable.
- We do not make the dataset available to a researcher unless they pass certain verification requirements.
Make sure you have yarn
and virtualenv
installed.
git clone git@github.com:epicollect/epi-collect.git
cd epi-collect
yarn install
virtualenv --python=python3.6 venv
./venv/bin/activate
source ./venv/bin/activate
pip install -r requirements.txt
To start:
make run-dev
export PYTHONPATH="$PWD"
make run-db-local
To stop:
make stop-dev
make stop-db-local
If you want to test using the docker containers (which is closer to deployment):
make build-docker
make run-docker-local
The frontend is built in React with TypeScript. We use React Bootstrap for the UI.
The backend is built using Flask and uses GeoAlchemy (GIS extension on top of SQLalchemy) to communicate with a PostGIS database for persistent storage.
Locally you can run in two ways:
-
Using
yarn
andflask
(make start-dev
), in which case all traffic on/api
is routed toflask
. In this setup,make run-db-local
will spin up a local PostGIS instance with the correct schema. -
Using
docker-compose
in which case the same docker containers as in the actual deployment are created, but they are span up locally usingdocker-compose
. The database doesn't work in this setup.
A Google Takeout zip file with location data is located unter tests/data/sample_location_history.zip
.
See tests/test_api.py
.
We deploy using make deploy
(you need AWS access for this) which builds the following docker containers:
nginx
container to serve the frontend React app.gunicorn
container to serve the Python backend.
These are pushed to Docker Hub. We then deploy this to AWS Elastic Beanstalk, where we have a nginx
reverse proxy
behind AWS' load balancer, which routes all traffic on /api
to the gunicorn
container and all other traffic to the
frontend nginx
container.
There is also a PostGIS database running in AWS RDS (Postgres with PostGIS extensions enabled).