Polis is an AI powered sentiment gathering platform. More organic than surveys and less effort than focus groups.
For a detailed methods paper, see Polis: Scaling Deliberation by Mapping High Dimensional Opinion Spaces.
If you're interested in using or contributing to Polis, please see the following:
- 📚 knowledge base: for a comprehensive wiki to help you understand and use the system
- 🌐 main deployment: the main deployment of Polis is at https://pol.is, and is free to use for nonprofits and government
- 💬 discussions: for questions (QA) and discussion
- ✔️ issues: for well-defined technical issues
- 🏗️ project board: somewhat incomplete, but still useful; We stopped around the time that Projects Beta came out, and we have a Projects Beta Board that we'll eventually be migrating to
- ✉️ reach out: if you are applying Polis in a high-impact context, and need more help than you're able to get through the public channels above
If you're trying to set up a Polis deployment or development environment, then please read the rest of this document 👇 ⬇️ 👇
Polis comes with Docker infrastructure for running a complete system, whether for a production deployment or a development environment (details for each can be found in later sections of this document).
As a consequence, the only prerequisite to running Polis is that you install a recent docker
(and Docker Desktop if you are on Mac or Windows).
If you aren't able to use Docker for some reason, the various Dockerfiles found in subdirectories (math
, server
, *-client
) of this repository can be used as a reference for how you'd set up a system manually.
If you're interested in doing the legwork to support alternative infrastructure, please let us know in an issue.
cp example.env .env
make start
That should run docker compose with the development overlay (see below) and default configuration values.
You may encounter an error on mac if AirPlay receiver is enabled, which defaults to port 5000 and collides with Polis API_SERVER_PORT. You can change this in your .env
file or disable AirPlay receiver in system settings.
Visit localhost:80/createuser
and get started.
Newer versions of docker
have docker compose
built in as a subcommand.
If you are using an older version (and don't want to upgrade), you'll need to separately install docker-compose
, and use that instead in the instructions that follow.
Note however that the newer docker compose
command is required to take advantage of Docker Swarm as a scaling option.
Many convenient commands are found in the Makefile. Run make help
for a list of available commands.
First clone the repository, then navigate via command line to the root directory and run the following command to build and run the docker containers.
Copy the example.env file and modify as needed (although it should just work as is for development and testing purposes).
cp example.env .env
docker compose --profile postgres up --build
If you get a permission error, try running this command with sudo
.
If this fixes the problem, sudo will be necessary for all other commands as well.
To avoid having to use sudo
in the future (on a Linux or Windows machine with WSL), you can follow setup instructions here.
Once you've built the docker images, you can run without --build
, which may be faster. Run
docker compose --profile postgres up
or simply
make start
Any time you want to rebuild the images, just reaffix --build
when you run. Another way to
easily rebuild and start your containers is with make start-rebuild
.
If you have only changed configuration values in .env, you can recreate your containers without
fully rebuilding them with --force-recreate
. For example:
docker compose --profile postgres down
docker compose --profile postgres up --force-recreate
To see what the environment of your containers is going to look like, run:
docker compose --profile postgres convert
Omit the --profile postgres
flag to use a local or remote database. You will need to set the DATABASE_URL
environment variable in your .env
file to point to your database.
When using make
commands, setting POSTGRES_DOCKER to true
or false
will determine whether to automatically include --profile postgres
when it calls out to docker compose
.
The commands in the Makefile can be prefaced with PROD. If so, the "dev overlay" configuration in docker-compose.dev.yml
will be ignored.
Ports from services other than the HTTP proxy (80/443) will not be exposed. Containers will not mount local directories, watch for changes,
or rebuild themselves. In theory this should be one way to run Polis in a production environment.
You need a prod.env
file:
cp example.env prod.env
(and update accordingly).
Then you can run things like:
make PROD start
make PROD start-rebuild
You can now test your setup by visiting http://localhost:80/home
.
Once the index page loads, you can create an account using the /createuser
path.
You'll be logged in right away; email validation is not required.
When you're done working, you can end the process using Ctrl+C
, or typing docker compose --profile postgres down
if you are running in "detached mode".
If you want to update the system, you may need to handle the following:
- ⬆️ Run database migrations, if there are new such
- Update docker images by running with
--build
if there have been changes to the Dockerfiles- consider using
--no-cache
if you'd like to rebuild from scratch, but note that this will take much longer
- consider using
While the commands above will get a functional Polis system up and running, additional steps must be taken to properly configure, secure and scale the system. In particular
- ⚙️ Configure the system, esp:
- the domain name you'll be serving from
- enable and add API keys for 3rd party services (e.g. automatic comment translation, spam filtering, etc)
- 🔏 Set up SSL/HTTPS, to keep the site secure
- 📈 Scale for large or many concurrent conversations
We encourage you to take advantage of the public channels above for support setting up a deployment. However, if you are deploying in a high impact context and need help, please reach out to us
Once you've gotten Polis running (as described above), you can enable developer conveniences by running
docker compose -f docker-compose.yml -f docker-compose.dev.yml --profile postgres up
(run with --build
if this is your first time running, or if you need to rebuild containers)
This enables:
- Live code reloading and static type checking of the server code
- A nREPL connection port open for connecting to the running math process
- Ports open for connecting directly to the database container
- Live code reloading for the client repos (in process)
- etc.
This command takes advantage of the docker-compose.dev.yml
overlay file, which layers the developer conveniences describe above into the base system, as described in the docker-compose.yml
file.
You can specify these -f docker-compose.yml -f docker-compose.dev.yml
arguments for any docker
command which you need to take advantage of these features (not just docker compose --profile postgres up
).
You can create your own docker-compose.x.yml
file as an overlay and add or modify any values you need to differ
from the defaults found in the docker-compose.yml
file and pass it as the second argument to the docker compose -f
command above.
We use Cypress for automated, end-to-end browser testing for PRs on GitHub (see badge above).
Please see e2e/README.md
for more information on running these tests locally.
A lot of issues might be resolved by killing all docker containers and/or restarting docker entirely. If that doesn't work, this will wipe all of your polis containers and volumes (INCLUDING THE DATABASE VOLUME, so don't use this in prod!) and completely rebuild them:
make start-FULL-REBUILD
see also make help
for additional commands that might be useful.
Due to past file re-organizations, you may find the following git configuration helpful for looking at history:
git config --local include.path ../.gitconfig
If you would like to run docker compose as a background process, run the up
commands with the --detach
flag, and use docker compose --profile postgres down
to stop.
If your development machine is having trouble handling all of the docker containers, look into using Docker Machine.
Sometimes npm/docker get in a weird state, especially with native libs, and fail to recover gracefully.
You may get a message like Error: Cannot find module .... bcrypt
.
If this happens to you, try following the instructions here.
You may find it necessary to install some dependencies, namely nodejs and postgres stuff, in a Rosetta terminal. Create an issue or reach out if you are having strange build issues on Apple computers.