PoinZ (/pɔɪnts/) is a simple web app for distributed teams in an agile setup. It allows to easily estimate items of interest (e.g. "stories").
The goal was to provide a ready-to-use tool without the hassle of registration/login, setup and a lot of configuration.
Checkout the App at https://poinz.herokuapp.com/
Similar tools are : https://www.pointingpoker.com/ or https://www.planningpoker.com/
Confused? Or you want to learn about hidden features? Read the User Manual.
You can contribute in multiple ways...
- Maybe you have a feature request? Found a bug? General feedback? Please open a new issue
- You want to extend Poinz? Or fix one of the issues? Check out the Development section.
- Install
nodeJS
at v10+ andnpm
at v6+. - Install git
- Install
docker
if you want to build PoinZ
Fork & checkout the repository then install all npm dependencies.
$ npm install
(This will also install client and server npm dependencies)
Start the backend
$ cd server/ && npm run start:dev
Serve the client in dev mode via webpack-dev-server
$ cd client/ && npm start
Then you can open the app at http://localhost:9000/
Run $ npm t
in the root directory to lint all files and run tests.
Our build produces a docker image that contains nodejs and our poinz server.
Make sure you have docker installed on your machine and your user is in the "docker" usergroup. ($ sudo groupadd docker
and $ sudo usermod -aG docker $USER
)
In project root, run
$ npm run build
This will copy all backend and client files to deploy/
.
And then start the docker build.
See Deployment for more information.
To start the newly built image locally, in detached mode with port forwarding:
$ docker run -p 3000:3000 -d xeronimus/poinz
The PoinZ Client is built with ReactJS and redux. Webpack serves as bundling tool.
The PoinZ Backend is a nodeJS express server.
Client and server communicate over websockets (socket.io).
Our backend handles commands sent by the client over a websocket connection. Every command produces one or multiple events that modify the respective room (aka "aggregate"). Then the events are sent back to the client.
(Somewhat inspired by CQRS.)
See the generated command and event docu;