Coder Social home page Coder Social logo

compdemocracy / polis Goto Github PK

View Code? Open in Web Editor NEW
721.0 27.0 170.0 30.92 MB

:milky_way: Open Source AI for large scale open ended feedback

Home Page: https://pol.is

License: GNU Affero General Public License v3.0

JavaScript 47.14% Shell 0.14% PLpgSQL 1.58% HTML 0.62% Dockerfile 0.26% Clojure 13.44% R 0.05% SCSS 4.87% Handlebars 4.34% Makefile 0.22% TypeScript 26.86% EJS 0.43% CSS 0.04%
data-science civic-tech deliberative-democracy participatory-democracy

polis's Introduction

Polis

Polis is an AI powered sentiment gathering platform. More organic than surveys and less effort than focus groups, Polis meets the basic human need to be understood, at scale.

For a detailed methods paper, see Polis: Scaling Deliberation by Mapping High Dimensional Opinion Spaces.

Docker Image Builds E2E Tests


๐ŸŽˆ ๐Ÿช Start here! ๐Ÿช ๐ŸŽˆ

If you're interested in using or contributing to Polis, please see the following:

If you're trying to set up a Polis deployment or development environment, then please read the rest of this document ๐Ÿ‘‡ โฌ‡๏ธ ๐Ÿ‘‡


โšก Running Polis

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.

Quick Start

cp example.env .env
make start

That should run docker compose with the development overlay (see below) and default configuration values.

Visit localhost:80/createuser and get started.

Docker & Docker Compose

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.

Building and running the containers

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 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 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 down
docker compose up --force-recreate

To see what the environment of your containers is going to look like, run:

docker compose convert

Production Mode Shortcuts

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

Testing out your instance

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 down if you are running in "detched mode".

Updating the system

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

๐Ÿš€ Production deployment

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

Support

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


๐Ÿ’ป Development tooling

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 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 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.

Testing

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.

Miscellaneous & troubleshooting

Docker Problems

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.

Git Configuration

Due to past file re-organizations, you may find the following git configuration helpful for looking at history:

git config --local include.path ../.gitconfig

Running as a background process

If you would like to run docker compose as a background process, run the up commands with the --detach flag, and use docker compose down to stop.

Using Docker Machine as your development environment

If your development machine is having trouble handling all of the docker containers, look into using Docker Machine.

Resolving problems with npm not finding libraries

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.

Issues with Apple Silicon (M1 & M2) chips

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.

ยฉ๏ธ License

AGPLv3 with additional permission under section 7

polis's People

Contributors

ajsmitha7 avatar audreyt avatar ballpointpenguin avatar colinmegill avatar crkrenn avatar dependabot[bot] avatar ebarry avatar factoidforrest avatar huulbaek avatar kenwheeler avatar mbjorkegren avatar metasoarous avatar micahstubbs avatar midgleyc avatar misscs avatar mjerkov avatar patcon avatar patrickas avatar paulathevalley avatar pitmonticone avatar ricardopoppi avatar rohanrichards avatar sebastianruan avatar simon-dirks avatar sirodoht avatar thatonebeagle avatar urakagi avatar virgile-dev avatar willcohen avatar xeeg avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

polis's Issues

Help with swagger docs' interactive features

So the best part about a swagger spec is that it creates interactive docs in the browser:
http://petstore.swagger.io/?url=https://patcon.github.io/polis-api-spec/swagger.json#!/Conversations/get_conversations

For the interactive docs to work, the endpoint needs to allow CORS support (since the docs page is hosted on a non-pol.is domain.) Usually, I'd get around this by setting up a simple Argo API proxy, like I've done here: https://github.com/patcon/polis-api-proxy

In the pol.is Swagger API docs, I've subbed in the proxy host, and you'll see that if you test it out here:
http://petstore.swagger.io/?url=https://patcon.github.io/polis-api-spec/swagger.json#!/Conversations/get_conversations

But I'm really confused why a 500 error is being thrown. I've confirmed that the proxy works via curl, and that only the web ui going through the proxy causes the error. And I've confirmed that that error is not from the proxy, but from the actual pol.is API.

Any idea what is happening on your end? I'm hitting this URL via the Swagger browser API explorer btw:
https://polis-api-proxy.herokuapp.com/api/v3/conversations?conversation_id=78nfpz

Auto-translate comments into reader's language

Most likely using the Google Translate API, or some other service.

Note: The UI itself has already been translated to some languages, and adjusts to whatever language it detects the browser is using. That is not the scope of this feature request.

This has come up in two contexts on Slack:

  1. For allowing speakers of other languages to follow the sometimes very interesting Pol.is conversations. (ie. English-speaking understanding Taiwan dynamics) [Private Chat Context]
  2. For allowing Pol.is to be used by government in jurisdictions with mandatory bilingualism requirements. (ie. Canadian federal gov initiatives) [Private Chat Context]

cc @derekhoward @laurawesley

Show degree of consensus across all comments in convo

There are three strains of thought here...

  • pol.is should grow into showing insights into 'all' comments in a number of ways, but not do so in list form because skimming means no data collection
  • pol.is should offer a snapshot view of how divided a conversation is
  • pol.is should better handle the special case of 'everyone agrees with each other on everything'

A distribution of % voted same way is one way to do this. Keep in mind that absolute consensus could also mean 100% disagreement.

image

Thus this one:

https://pol.is/2jruxfaxzc

Shows up quite differently than:

https://pol.is/3phdex2kjf

Allow "new comment" emails to link participants to website with embedded convo

Sometimes, admins may embed convos in the context of a surrounding site. This site may have useful information, that will be missing from the pol.is convo description field.

When participants subscribe, they get an email about new comments to vote on:
email screenshot

This direct links back to the pol.is url. This is perhaps not what the admin would prefer.

It would be great if there was a way to override this link, perhaps via a data-* attribute in the iframe :)

Allow "featured" participants to be "unfeatured"

Without thinking it through, I featured a conversation participant that I probably shouldn't have. I then couldn't "unfeature" them -- I could only hide their account from the visualization.

This would seem to be an oversight that is perhaps easy to correct? Thanks!

cc: @colinmegill

Markdown formatting loses bold/italics in embed vs site

Seems that the strong and emphasis tags don't work on embeds. (Links and divided lines work fine.)

Our upcoming project release for electoral reform could benefit from this being fixed (if not too much work), please and thank you!

Pol.is Website:
pol.is website

Embedded:
embedded

create pol.is/m/site_id

Create a route that displays the site_id of the logged in user.
Update the WordPress plugin to link to that.

Don't apply vote for seed comments submitted by admin

There was a previous issue for making seed comments anonymous, as they used to be attributed to the admin account.

It seems that seed comments are now anonymous, but that creation of the comment attributes an AGREE vote from the admin account.

To reproduce, create a new conversation, and add comments through the "Configure" page. Now, when going to the public url, instead of being able to vote on the new seed comments, the user sees the subscription card, as if they had already voted.

This seems non-ideal, as an admin participant can't submit comments for which they disagree, and must instead use convoluted negation in order to seed and participate properly.

Allow admin to disable built-in notification sign-up

The idea was that if the conversation moderators wanted to collect emails on the page/app in which the conversation was embedded, they wouldn't want the pol.is embed to then ask again for an email. It could be confusing to users.

screenshot of notification sign-up screen

So instead, the moderators would disable in-app subscriptions, and implement their own subscription method outside polis.

[Slack context]

Port open issues from other repos

Love the idea of having one main issue repo. Having said that, can someone manually port issues from the other repos. I recall that there were a few I cared about -- obviously my own, but I think some others. Buuuttt can't remember them... ;)

Expose "consensus bridge" personas in API

Every person that is:

  1. complicated (has a close/bridge position to groups that does not is part), AND
  2. agreed/disagreed (voted AGAINST majority) to any majority opinion within the whole conversation

Better call-to-action for connecting via social login

It's pretty clear from the data that popping the login buttons is an unwelcome surprise. Plenty of people still keep going, but plenty stop. We should ease people into this. A few ideas:

  • putting it after 3 votes
  • adding the word 'optionally'
  • put it after 7 votes and say 'now you've voted enough to be shown in the visualization! connect...'

We don't want to put it at the outset, because people need to know they can vote optionally.

image

image

Cannot agree/disagree without a keyboard

Looking at this implementation here https://mydem0cracy.ca/

I can't agree or disagree without a keyboard. This really should be a good old-fashioned HTML link which is much more broadly supported by all users. Just because you can add a mouse effect to a div doesn't mean that you should.

<div id="agreeButton" class="reactionButton">
        <i class="svgIcon" style="
          display: inline-block;
          position: relative;
          margin-right: 2px;
          top: 5px;
          width: 22px;
          fill: #2ecc71;
          "><svg viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1299 813l-422 422q-19 19-45 19t-45-19l-294-294q-19-19-19-45t19-45l102-102q19-19 45-19t45 19l147 147 275-275q19-19 45-19t45 19l102 102q19 19 19 45t-19 45zm141 83q0-148-73-273t-198-198-273-73-273 73-198 198-73 273 73 273 198 198 273 73 273-73 198-198 73-273zm224 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"></path></svg>
</i>
        Agree
      </div>

[Feature] help moderators to better understand "pass" rates on comments

With mydem0cracy.ca, we encourage participants to click "Pass / Unsure" if they find a question overly confusing, or disagree with a premise. One participant wondered what effect this would have, and asked if it pushed those comments to the bottom

I admitted that we had no way to act on it, but the plan was to review those comments and remove them if we judged them to be convoluted.

But there's no way to act on that from our end, aside from downloading the raw data and analyzing it every so often.

Might there be a moderator feature you could add to address this? Thanks!

Comment field should have a hard stop character limit

If someone doesn't notice the character limit (for instance, is on mobile and so can't see the text box), then they might conceivable invest 10 minutes in writing their first comment, not understanding the flow. (this actually happened to a friend).

When they then can't even submit it, that could be really frustrating.

The field should be hard-capped at maybe 20 characters over the soft limit, so the writer will realize.

This might require experimentation to see if it addresses the original UX problem as stated above. (Does android enforce hard caps on text fields in both portrait and landscape mode? etc)

[support]: insight on api error

I'm trying to put together an API proxy to help demo the direction I hope the API design will go in. I've done this before in a few other situations, using the same tool I'm using here, and didn't expect it to be very difficult.

Having said that, I'm running into some odd errors that are throwing me for a loop:

/non_encrypted/repos/polis-api-proxy (master โœ˜)โœนโœญ แ… http 'http://localhost:5000/api/v3/conversations/5mnfxu85hx' Authorization:pkey_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   
HTTP/1.1 403 Forbidden
CF-RAY: 319bff96bcb527c2-YYZ
Cache-Control: no-cache
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 240
Content-Type: text/html; charset=utf-8
Date: Sat, 31 Dec 2016 07:25:35 GMT
Server: cloudflare-nginx
Set-Cookie: __cfduid=d71127c3344a4a0d17972e0708a6a58191483169135; expires=Sun, 31-Dec-17 07:25:35 GMT; path=/; domain=.pol.is; HttpOnly
Transfer-Encoding: chunked
Vary: Accept-Encoding
Via: 1.1 vegur
X-Amz-Id-2: jcy9EdKNQOMKoSelIX4mNyhAmEIDYrwQFQ9W1nYRND2+CrW2umoxJTrUy+NH3TD9p5cP6LKjvHM=
X-Amz-Request-Id: 94ADFDDEBCE10DF3

<html>
<head><title>403 Forbidden</title></head>
<body>
<h1>403 Forbidden</h1>
<ul>
<li>Code: AccessDenied</li>
<li>Message: Access Denied</li>
<li>RequestId: 94ADFDDEBCE10DF3</li>
<li>HostId: jcy9EdKNQOMKoSelIX4mNyhAmEIDYrwQFQ9W1nYRND2+CrW2umoxJTrUy+NH3TD9p5cP6LKjvHM=</li>
</ul>
<hr/>
</body>
</html>

Do you have any insight on what might be causing this? It works fine with some of the features I've added, but not for others. For example:

  • using the proxy to send the api key in a header instead of basic auth username works
  • using the proxy to rewrite the conversation_id from the path into the param that you accept, this doesn't seem to work for some reason (even though it seems to be hitting the correct url)

Any insight into the error on your end would be greatly appreciated! Thanks! :)

Allow polis conversations to be locked/closed

We created a demo conversation pre-launch, to test some things out a pilot idea among friends:
https://pol.is/69fnuffbkm

We later launched our actual conversation on https://mydem0cracy.ca

We neglected to close down the old one, and subscribed folks confusingly (our fault) kept logging into the old one and participating there.

I only just noticed that some people are still responding to "new comment" emails and participating in the old conversation.

This is how I plan to shut it down:

  • disable comments
  • disable visualization
  • force auth to comment
  • force auth to vote
  • change the conversation description
  • notably, I can't easily disable voting in general (it's greyed out in config)

It would be really wonderful if there were a more straight-forward way to shut down or "lock" a previous or discontinue conversation, without disabling it's read-only features.

Brief wishlist for what a single "active" checkbox might do:

  1. disable commenting
  2. disable voting
  3. disable login
  4. continue to show viz
  5. continue to allow cycling
  6. continue to show description
  7. place a prominent marking or banner or icon to indicate that conversation has closed
  8. EDIT: stop sending any email updates (maybe this is a sure thing given the above, but just saying :) )

Thanks!

API key via querystring param in url

We currently only allow the api_key to be specified as the username in a basic auth approach (with password left blank).

swagger-api/swagger-ui#2555

It seems this may be somewhat non-standard, and so not supported by Swagger UI. (Still up in the air whether they'd be willing to support it, but we'll see...). The Swagger UI allows basic auth in browser, but won't allow password the be blank. Even if they relax this validation, I imagine this will require a change to the spec, to accommodate people who don't want password field to be able to be left blank.

Anyhow, it might be simpler to just move the api key into the header or a query param. Thoughts?

Allow comment placeholder text to be configured

I have some thoughts on "Write your perspective..." being a little too broad, and asking for a larger scale of thought than is actually being ask for (given character limit).

It would be great if this was configurable, and then perhaps the community could experiment and work toward finding a better phrase in English.

Comment Projections

Compute the projection of comments using the center of mass, and apply a scaling factor to the projection.

One way to structure that would be to do it just like like math_main > pca > comps, but call it comment-projection:
math_main > pca > comment-projection > 0
math_main > pca > comment-projection > 1

One idea for selecting the scaling factor is to scale all comments up so that they extend as far as possible without extending beyond the most extreme participants.

Fix /about routing

When I type https://pol.is/about into a browser, it redirects to https://pol.is/gov, as expected. However, there's a link out to it here (https://clojure.org/community/companies), and when I click it I get this:

image

This is rather bizzare; I've never seen anything quite like this. It would seem that it has something to do with the authorization, but I can't fathom why that would be different in the two situations. I can verify that I get the same behavior when using a private window (FWIW) so it doesn't have to do with being logged in.

I think it's a good idea to keep this route working, as it used to be our defacto lander, and there are bound to be plenty of references to it out there.

Use HTML5 for Semantic Markup

Right now, without a mouse you cannot navigate to:

  • Start a single conversation
  • Integrate polis into your site
  • Read the overview & documentation

as they are all spans and not semantic HTML. There are ways to provide the semantics for screen readers and other keyboard only users, but why not just use HTML?

<p style="font-weight:700;" data-reactid=".0.0.0.2.1.1:$/=11.0.$//=12/=1$/=012.$=1$=01$=0012.$/=10"><span name="align-left" style="margin-right:10px;" class="fa fa-align-left" data-reactid=".0.0.0.2.1.1:$/=11.0.$//=12/=1$/=012.$=1$=01$=0012.$/=10.$=10"></span><span data-reactid=".0.0.0.2.1.1:$/=11.0.$//=12/=1$/=012.$=1$=01$=0012.$/=10.1">Read the overview &amp; documentation</span></p>

Allow links in convo description to work when embedded

Right now, links in the convo description try to open in the iframe itself.

To resolve this, we need to be able to set target="_blank" (or something like it) to open links in new window or the parent window.

There seem to be a couple options for fixes:

  1. Use the base element in the iframe [Ref]
  2. Allow users to use HTML directly (which markdown allows, but pol.is setup doesn't.
  3. Allow the kramdown-like feature of being able to set attributes (ie. target) [Ref]

Not a blocker for us, as we just zero'd the description and started showing it in the container page :)

Expose "minority ideologue" personas in API

We should extract from API a list of persons who:

  1. authored a comment that is majority within the group where they are a member, AND
  2. voted AGAINST any given majority opinion within the whole conversation

Make API response object keys consistent

First off, I really appreciate that you guys are adding new API features for the community! Just wanted to put that out there ;)

I'm in the process of documenting the API in swagger format:
http://petstore.swagger.io/?url=https://patcon.github.io/polis-api-spec/swagger.json#/

One (hopefully) small request to simplify documentation and maintain RESTfulness (even though that's a fuzzy term): Could you work toward responses where (when possible) fields don't appear and disappear based on a param flags? In my understanding, it's best to just include these all the time, but we can define them as being "nullable" and in the field description, we can point out that flag so-and-so makes this return a non-null value.

Anyhow, thanks! (This is particularly in response to want_voteCountUnique on GET /conversations, but I know i've seen it crop up elsewhere while I've been sorting through things :) [Context]

Show indication of who user is when hover over profile photo

Most people don't know the current profile photos of all their friends. It seems that pol.is team has taken great effort to show us people we know in the graph. But you can't easily see who's who unless you click through and open a bunch of tabs. I assume this is particularly difficult on mobile.

It would be great to have a tooltip, but the MVP for this would be if it were possible show the link in the bottom of the browser when we hover over the linked avatar image. This is default behaviour for browser links, but perhaps it is not so for iframes.

Relax uniqueness constraint on comment text

I just posted a comment attached to my personal social account. I then realized the implicit "Agree" related to having disabilities didn't apply. So I "rejected" the comment from the admin console, and tried to re-add it as a seed comment.

I was prevented:
screenshot

Perhaps consider only applying the constraint for active and moderated comments, or simply removing it completely?

(While I can imagine it seemed useful to prevent double-postings, I feel that when someone is trying to do this, hitting the exact wording, it's probably almost always on purpose for some edge-case :)

Crowd moderation v0.0.1

Crowd moderation in pol.is will be implemented as additional buttons that replace the primary agree disagree or pass buttons after they are clicked, without replacing the comment text. The tentative proposal for those options are as follows:

  • Agree
    • This is important
    • This is a fact
    • I feel this way
  • Disagree
    • Not my feeling
    • Not fact
    • Abusive
  • Pass
    • Unsure
    • Spam
    • Abusive

With the option to skip. Uncertain at this point whether we allow multiselect. An initial UI sketch:

crowdmod

Crowd moderation will not always appear. Here are some thing that could affect when it is shown.

First, there could be a minimum threshold of comments for crowd moderation to be shown at all. There could also be a switch to turn it on and off in configuration. If, for instance, there are only seed comments, we shouldn't be asking whether they are abusive. It might be useful to ask whether or not they are unclear.

It is also the case that even when crowd moderation is 'on', it will not be shown after every comment. It will be shown more if people interact with it, and less if they choose to skip it before making a selection. Thus people self select / opt into more work.

Additional login providers

Right now, we have sign-in via:

  • admin interface: Facebook or email
  • participation interface: Facebook or Twitter

What other auth providers could or should we consider implementing?

To Do Candidates

  • Add Google auth
    • For admin login
    • For participant login (highest priority)
  • Add Twitter auth for admin login
  • Add extensible login system, e.g. Join.tw (very low priority)
  • Add OpenID Connect

This issue body was replaced on 2020-06-12.

Implement vote progress bar for participants

Participants currently have no way to see how close they are to "done".

As I understand it, this psychologically makes people less likely to continue, as they have no sense of when "success" (ie. completion) might be.

Research Paper: The importance of percent-done progress indicators for computer-human interfaces

If the thought is that numbers might be daunting at first, and discourage people from starting, then perhaps it could only show when people have proven themselves engaged. So if after 10 votes, the conversation starts showing a progress bar, then I think people would be much more likely to carry on until the end.

Thoughts?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.