Code Monkey home page Code Monkey logo

self-host-planning-poker's Introduction

Self-host Planning Poker

A hassle-free Planning Poker application to deploy on your NAS.

Docker Hub Docker Hub GitHub release

GitHub last commit License Tests Docker build Crowdin

What is it?

This application is intended as a simplified and self-hostable alternative to Planning Poker Online.

It features:

  • Multiple deck types: Fibonacci, modified Fibonacci, T-Shirt sizes, powers of 2 and trust vote (0 to 5)
  • Spectator mode
  • Responsive layout
  • Vote summary
  • Translations (English, French, German, Italian and Polish. Contributions welcome!)

It does not have fancy features like issues management, Jira integration or timers.

Screenshots

Application screenshot with cards face down Application screenshot with cards revealed

Deployment

Deploying the application is easy as it's self-contained in a single container. All you need is to create a volume to persist the games settings (ID, name and deck).

Docker

docker run \
  -v planning-poker-data:/data \
  -p 8000:8000 \
  axeleroy/self-host-planning-poker:latest

docker-compose

version: "3"
services:
  planning-poker:
    image: axeleroy/self-host-planning-poker:latest
    ports:
      - 8000:8000
    volumes:
      - planning-poker-data:/data
volumes:
  planning-poker-data: {}

Environment variables

Variable Meaning Example
APP_ROOT (optional) Allows you to deploy to another path than /.
See Configuration examples for deploying on sub‐paths for more details.
APP_ROOT=/poker/

Running behind a reverse-proxy

Refer to Socket.IO's documentation for setting up your reverse-proxy to work correctly with Socket.IO.

Customization

See Customizing the application's style and icon.

Getting involved

I'm a developer and I want to help

You are welcome to open Pull Requests resolving issues in the Project or tagged pr-welcome. Don't forget to mention the issue you want to close 😉

I'm a user and I need help / I encountered a bug / I have a feature request

Open an issue and I'll take a look at it.

I'm a user and want to contribute translations

There is a Crowdin project that lets you add translations for your language. If your language is not available, feel free to contact me over Crowdin.

Development

The app consists of two parts:

Back-end development

You must first initialise a virtual environment and install the dependencies

# Run the following commands in the flask/ folder
python3 -m venv env
source env/bin/activate
pip3 install -r requirements.txt

Then launching the development server is as easy as that:

FLASK_DEBUG=1 python app.py

Run unit tests

After initializing the virtual environment, run this command in the flask/ directory:

python -m unittest

Front-end development

Note: You might want to test the front-end against a back-end. You can either follow the instructions in the previous section to install and run it locally or use the following command to run it in a Docker container:
docker run --rm -it \
  -v $(pwd)/flask:/app \
  -p 5000:5000 \
  python:3.11-slim \
  bash -c "cd /app; pip install -r requirements.txt; FLASK_DEBUG=1 gunicorn --worker-class eventlet -w 1 app:app --bind 0.0.0.0:5000"

First make sure that Node.js (preferably LTS) is installed. Then, install dependencies and launch the development server

# Run the following commands in the angular/ folder
npm install
npm start

Building Docker image

# After checking out the project
docker build . -t axeleroy/self-host-planning-poker:custom
# Alternatively, if you don't want to checkout the project
docker build https://github.com/axeleroy/self-host-planning-poker -t axeleroy/self-host-planning-poker:custom

self-host-planning-poker's People

Contributors

axeleroy avatar crowdin-bot avatar dependabot[bot] avatar moshekaplan 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

Watchers

 avatar  avatar  avatar  avatar

self-host-planning-poker's Issues

Present join URL as a QR code

Hi!
Great project! Is it possible to add an option to present a QR code with link to join?
It will be great to be able to present it to others to join on mobile phones.

Cheers!

Duplicate users in a game

Issue description:
When users join a game, when they press button to save their name, they are able to submit the form multiple times which results in having ghost participants when the game loads up.

Expected behaviour:
User should not be able to submit their name multiple times

Steps to reproduce:
When you create a new game, open the game URL in incognito window or other browser. When you input name, press multiple times on Join button.

Potential solution:
Maybe adding debounce for couple of seconds on Join form to prevent multiple submissions from frontend. Alternatively, add validation on backend side to prevent duplicate users for a single session.

Selected card isn't reset after deck change

Reproduction steps

  1. Select a card
  2. Select a new deck
    → No card is selected
  3. Select the previous deck
    → The card selected at step 1 is selected

Expected behavior
After step 4, no card should be selected

End turn summary

Add the ability to display a summary of the turn, with how many players picked which card and an average.

Image

Administration page to list all games

The owner of the instance should be able to list all games saved to the SQLite database. Could be useful to know the usage and to help someone who forgot or lost a game's URL.

This page should only be accessible with a password set in Docker environment variable. Documentation should be updated accordingly.

Customizations for UI and Game Decks

Hey,

it would be nice to have some options to customize the UI.
For example:

  • accent color
  • logo
    You could solve this via environmental variables in the docker compose.

Also a possibility to add custom game decks.

Thank you! We use your Scrum Poker every week! The only good one (with selfhosting) that isnt overloaded with crap!

Translation does not follow browser's language

Even though Transloco is configured for both English and French and the browser is set to locales fr or fr-FR, the application will always display English, which is set as the default and fallback language.

Project is in maintenance mode

Hello,

As stated in 1.2.0's release notes, I now work at a company that does not use the Scrum methodology and, by extension, this application.

As such, I don't expect to spend as much time as I did in the past on new features, issues and pull-requests.

Thanks for your understanding,
Axel

Allow deployments on other paths than `/`

Since all my self-hosted services are deployed on their own (sub-)domains, I omitted use-cases where users might want to deploy multiple services on the same domain but on different paths.

It causes issues because the front-end will always try to connect to the back-end at /create and /socket.io/.

The front-end needs to be modified so that if it is deployed on https://foo.ddns.tld/poker it will call https://foo.ddns.tld/poker/create and https://foo.ddns.tld/poker/socket.io/ instead of https://foo.ddns.tld/create and https://foo.ddns.tld/socket.io/. Ideally this should be done with Docker Environment Variables rather than needing to re-build the image.

Issue using with nginx reverse proxy

I'm using an nginx reverse proxy (swag) and I can't seem to get this application to work when accessed through the reverse proxy.

There are transport errors displayed in the application and I see the following in the console log.

Firefox can’t establish a connection to the server at wss://poker.example.com/socket.io/?EIO=4&transport=websocket&sid=CVguRykPVYUwoQT0AC4s. main.js:1:10539

I've setup a domain (poker.example.com). I've tried two different nginx configs.

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name poker.*;

    include /config/nginx/ssl.conf;

    client_max_body_size 0;

   if ($lan-ip = yes) { set $geo-whitelist yes; }
   if ($geo-whitelist = no) { return 404; }


    location / {
        include /config/nginx/proxy.conf;
        include /config/nginx/resolver.conf;
        set $upstream_app 192.168.1.2;
        set $upstream_port 8000;
        set $upstream_proto http;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass $upstream_proto://$upstream_app:$upstream_port;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

I've also tried redirection with socket.io in the path.

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name poker.*;

    include /config/nginx/ssl.conf;

    client_max_body_size 0;

    location / {
        include /config/nginx/proxy.conf;
        include /config/nginx/resolver.conf;
        set $upstream_app 192.168.1.2;
        set $upstream_port 8000;
        set $upstream_proto http;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass $upstream_proto://$upstream_app:$upstream_port;

        proxy_hide_header X-Frame-Options;
        proxy_redirect off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_hide_header X-Frame-Options;
    }

    location /socket.io/ {
        include /config/nginx/proxy.conf;
        include /config/nginx/resolver.conf;
        set $upstream_app 192.168.1.2;
        set $upstream_port 8000;
        set $upstream_proto http;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass $upstream_proto://$upstream_app:$upstream_port;

        proxy_hide_header X-Frame-Options;
        proxy_redirect off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

    }
}

I used https://socket.io/docs/v3/reverse-proxy/ as an example but it doesn't seem to work as documented.

Documentation

Ready the README for other developers to pick up the project and users to deploy the application.

  • Docker deployment
  • Link to Docker Hub
  • Screenshots
  • Development
    • Back-end
    • Front-end
    • How to run backend tests
    • Publication of a new version
  • License
  • Copy README to DockerHub with link to GitHub project

Language bug

Hi, I updated my docker container to the latest version. Now the language is bugged out. Is there any bugfix?

image

Enable and disable card selection and buttons on end turn / new turn events

On end_turn event

  • The deck should not allow card selection (or be hidden by the turn summary in #3)
  • The "Reveal cards" button should be disabled
  • The "New turn button" should be enabled

On new_turn event

  • The deck should be visible and allow card selection
  • The "Reveal cards" should be enabled
  • The "New turn button" should be disabled

Cannot unselect card

When unselecting a card, the action is not taken into account and the following error is shown The card you have picked is not an acceptable value of the current deck.

May have been caused by a647e1f

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.