This is a Retrospective Idea board, powering retrospected.com.
This project is both an actual product, and also a technology demo using the latest and greatest JavaScript/TypeScript libraries of the month.
It features the following technologies:
- React 17
- React Hooks
- React Router 4
- TypeScript 4
- Recoil.js, as the global state management library
- Socket IO
- Webpack 4 (See older versions for Webpack 1, 2 and 3)
- MUI 5 for our components (previously known as Material-UI)
- Material UI design
- Emotion
- Multilingual / Internationalization
- Postgres
- Node 16
- Passport for seamless OAuth authentication with:
- GitHub
- Slack
- Microsoft
- Okta
- Giphy because adding a bit of fun to your retro can't hurt!
- React Beautiful DND to allow re-ordering and grouping by drag-and-drop
- Jest for Unit Testing
- React Testing Library, for Integration Tests
- Yarn, replacing NPM
- Docker, for easy deployment
- Kubernetes, to scale Retrospected for its 10M+ users (not)
- GitHub Actions, for Continuous Integration and Deployment (CI/CD)
- Multi-Architecture, for automatic compatibility with ARM-based servers
- Stripe, for our payment solution
- Docusaurus, for our documentation
Previous versions, up to v1.0.1 featured the following libraries:
ReduxCSS Modulesredux-sagareselectESLint for JS and JSX
You can browse the documentation here.
You have two ways of running Retrospected:
- Using the public version, at www.retrospected.com
- Host Retrospected on your premises
You can start an instance of Retrospected in 5 minutes by following the quick-start guide.
This will run a demo version, which you can turn into a fully licenced version by purchasing a Self Hosted licence.
- Remove Yarn Workspaces to limit dependency sharing
- Upgrade most dependencies for security reasons
- Upgrade Nginx image to fix security issues
- Force secure cookies
- Add better GDPR compliance, with the right to be forgotten: allows a user to delete all of their data
- Add the ability for users to signal if they are done with their posts, to help the moderator
- โซ Upgrading dependencies
- Brand new documentation website.
- Migrate all docker images from
antoinejaussoin/retro-board-*
toretrospected/*
. - Allowing Self-Hosted instances to use SendGrid for email recovery
- ๐ The Unlimited subscription domain check was not accepting valid domains such as
.ventures
or.agency
.
- Upgrade to MUI 5.0 (ex Material UI)
- Migration from Styled Components to Emotion (for compatibility reasons with MUI)
- Add hard-coded self-hosting licence mechanism for companies with restricted internet access
- โซ Upgrading dependencies
- Replacing Google OAuth passport library, to try and reduce Google OAuth errors on production
- Added a script to make bumping versions easier
- โซ Upgrading dependencies
- ๐ Fixed a bug highlighted by Sentry, where anonymous account without a password would trigger an exception.
- Account Federation: all accounts with the same email address are now a unique account (sharing sessions, etc.). If you owned multiple accounts with the same email address (for instance one via Google OAuth and another via GitHub), they will be merged into a single account.
- CSRF protection
- Significant performance improvements on retrieving past sessions (10x to 100x)
- Add the ability for anonymous users to delete the boards they created under certain conditions (#229).
- โซ Upgrading dependencies
- Fixing a typo. ๐ Thanks Chad S.! (#296)
- Support OKTA for authentication
- Speeding up the migration on production (using transpiled JavaScript instead of TypeScript via ts-node)
- Making email checks for Pro Team subscriptions case-insensitive. ๐ Thanks Nico! (#287)
- Adding the ability to self-host Retrospected in a very easy way.
- Change the default order for new posts. New posts are now (by default) appearing at the top of the column. ๐ Thanks @konrad44 for the idea. (#272)
- Upgrade containers from Node 15 to Node 16
- Spelling fixes on home page cards
- โซ Upgrading dependencies
- ๐ Fixed a bug where the export button on the summary page was hidden by the participants bar. ๐ Thanks @hieuwu for pointing this out. (#262)
- Added the ability to collapse groups (hidding their content). ๐ Thanks to Sultan S. for the suggestion. (#263)
- Added the possibility for deployements where the backend has a single instance (no replicas) to not use Redis with Socket.IO.
- Fixed a bug that would trigger the rate limiting when adding posts to groups, triggering a disconnection
- โซ Upgrading dependencies
- Add the ability to restrict the number of posts per user on a given session (as an option).
- Rename some folders in the repository to more sensible names
- Prevent the UI from sending more than 100 Sentry errors, to avoid spamming Sentry.
- Add a better check for self-hosted licences.
- โซ Upgrading dependencies
- Search now also works with the author's name, if the author is displayed. ๐ Thanks @ayxos for pointing this out. (#202)
- Replacing the reducer logic with Recoil for global state management.
- Adding the possibility of creating a post by clicking on the 'return' icon (โฎ) instead of hitting "Enter". ๐ Thanks to @do606 for pointing out that Enter doesn't always seem to work (#246).
- Re-adding the ability of creating a post by hitting Enter on a numeric pad. ๐ Thanks again to @do606 for that.
- โซ Upgrading dependencies
- Add a page explaining how local encryption works
- Re-introducing rate limiting, both for the REST API and the Websocket connections, in Node and Nginx
- Reduce the quantity of data sent over Websockets (for instance, only sending post ID instead of whole post when voting)
- Reduce the number of SQL queries on the backend, simplifying the backend logic
- Return an error message to the UI if a Websocket message doesn't succeed
- Improve websocket reconnection logic
- Upgrading to Socket.IO 4.0
- โซ Upgrading dependencies
- ๐ The participants footer was sometimes hidden by the blur overlay of a post. ๐ Thanks @Pajinell for pointing this out. (#240)
- ๐ Thanks to @cindyccook for pointing out reliability issues (#232).
- ๐ Language loading issues
- ๐ New users were wrongly added with a quota of 0
- ๐ Fixed a bug with local storage
- ๐ Fixed a bug where Slack OAuth was disabled
- Adding a 30-day trial
- Adding Microsoft OAuth 2.0
- Code splitting: all pages have their own bundle now, for a faster first-load experience
- Removing all
import React from 'react';
imports, as they are now redundant. - Introducing Recoil.js (as an experiment)
- Limiting the number of posts to 50 for free accounts
- ๐ Fixed a bug whereby adding multiple cards on a single group wouldn't work correctly (only the first card would be persisted in that group). ๐ Thanks to Daniel N. for reporting this by email.
- ๐ Fixed a bug where adding an action was changing ownership of the post to the person adding the action. ๐ Thanks @botactic! (#209)
- Use TypeORM transactions for every database interactions, fixing some random races conditions.
- Improving multi-arch support
- Improving API calls and Sentry
- ๐ Fixed a bug where groups couldn't be deleted if you didn't create them in the first place.
- ๐จ Emergency fix, for a serious bug that made it seem like a lot of people were participant to your session. This was never the case, it was displaying every non-logged in people as spectators to your session erroneously.
- Added the list of participants to the bottom of the screen ๐งโ๐ป
- Added a notification on connection or disconnection of participants ๐ข ๐ด
- Update OAuth photo on every login
- Replaced GitHub OAuth library by a more recent version, to avoid deprecated GitHub API.
- ๐ Fixed a bug where the author of a new session wasn't registered as a participant
- ๐ Fixed a bug where online participants were not showing
- [โญ๏ธ Pro Feature] Encrypted Sessions: full client-side encryption of your data
- [โญ๏ธ Pro Feature] Private Sessions: ensure only your colleagues can access your session
- Full support for password-based accounts
- Slack Authentication (OAuth) ๐
- Replacing Travis by GitHub Actions for CI and Deployment ๐
- New Freemium model
- Adding dynamic HTML title for better browser experience. ๐ Thanks @sam-pires! (#167)
- Adding a search functionality to find the needle in your haystack. ๐ Thanks @ayxos for the suggestion! (#171)
- Improving the Post component to hide up/down votes when they are disabled. Also got rid of the "flippable" panel, all actions are now visible directly. ๐ Thanks @Xyaren for pointing this out. (#150)
- Automatic Backend code linting, and CI linting
- โซ Upgrade to TypeScript 4
- โซ Upgrade to React 17
- โซ Upgrade to Create-React-App 4
- โซ Upgrade to Socket.IO 3.0
- ๐ A big thanks to @wooddar for beta-testing and his great feedback!
- Fixed a bug with GitHub authentication, where the display name was not set (#165). ๐ Thanks @hieuwu!
- ๐ Fixed a bug where any user editing the name of the session would become owner of the session.
- ๐ Fixed a serious bug under Firefox, where users could not see the content of the post (#154, #148). ๐ Thanks to all people who reported this (@Xyaren, @dallasgutauckis, @courtney-thwaites).
- ๐ฎ๐น Improved Italian translation (๐ Thanks @mventuri)
- Ability to delete sessions, if you are authenticated and you are the author of the session (#116)
- Allow changing the default language for new users via environement variables (#135)
- Allow a moderator to blur cards written by others, to keep everything hidden until the end of the retrospective (#100)
- Complete redesign of the Custom Session settings modal
- Ability to modify session settings once the game has started. This is only available to the session moderator (author) (#92).
- Ability to display past sessions for Anonymous users. This is limited to viewing past sessions on the same browser, any login to a different browser will create a different anonymous account, for safety reasons (#112).
- โซ Dependencies update
- ๐ณ๐ฑ Improved Dutch translation (๐ Thanks @jghaanstra)
- โซ Dependencies update
- Multi-architecture support! Hello Rasperry Pi ๐ ๐! And Apple Silicon ๐
- Docker images are automatically compatible with ARM (arm64, v6, v7, v8)
- Adding privacy policy, terms and conditions, GDPR support
- ๐ Fix various bugs reported by Sentry
- Improvements on the landing page experience
- SEO
- Brand new landing page, and much improved look and feel ๐
- Authentication using your favourite social media account:
- GitHub
- ...more coming!
- Ability to re-order posts by drag-and-drop ๐
- Ability to group posts together
- Save your custom session settings as a default template
- Giphy support ๐
- Improved homepage dashboard ๐
- ๐ท๐บ Russian Translation improvements (๐ Thanks @regmagik)
- Fixing logout button translation
- Adding fetch polyfill for IE
- โซ Upgrading dependencies
- ๐ฎ๐น Italian Translation (๐ Thanks @mventuri)
- Re-enabling source maps for Sentry
- โซ Upgrading dependencies
- Allowing a user to disable voting (by setting the max number of votes to 0) (๐ Thanks @imranismail)
- Fixing an issue with Docker and Yarn's installation
- โซ Upgrading dependencies
- Adding Sentry support for the backend
- Making Google Analytics and Sentry configurable at run-time (as in Docker run-time)
- Adding Copy to clipboard compatibility for more browsers
- Preventing the app from crashing when cookies are disabled on Firefox
- Handling disconnections better by not reconnecting automatically and displaying a message instead.
- Kubernetes configs. Deploy Retrospected to the cloud! โ๏ธ ๐ โธ๏ธ
- Making the backend scalable by making SocketIO use Redis to communicate between instances. This is disabled by default and is only useful for Kubernetes deployments.
- The backend hostname is now configurable on the nginx config on the frontend.
- Replaced all occurences of
withRouter
byuseHistory
anduseParams
- Added CI/CD support with Travis
- Auto-deployment of Docker images to Docker Hub
- Changing the UX related to Summary Mode
- Added the ability to copy the content of the session in the clipboard, both in Markdown format and Rich Text
- Added Error Boundaries to improve the user experience if the app crashes
- Added support for Sentry.io (error logging)
- Fixed an issue where multiline content was not displayed properly for anyone except the author
- Fixed an issue where a post couldn't be deleted if it had votes attached to it
- Issue 56 - Fixed an issue where new users who were not persisted yet couldn't vote (๐ Thanks @dkistner)
- ๐ฉ๐ช German Translation (๐ Thanks @PaulBrandt)
- ๐ Bugfix: First post was sometimes not saved on regular sessions
- IE fix: the previous polyfill didn't quite work with IE9 to IE11.
- Older browser support (IE11, somewhat works with IE10 and IE9).
- Adding an "outdated browser" warning
- Adding a remaining votes counter when using a maximum number of votes rule.
- Changing how Editable Labels work: they now only fire onChange on blur or Enter, minimizing the amount of traffic over the socket
- Removing the REACT_APP_DEBUG environment variable (using NODE_ENV instead).
- Adding a loading spinner while loading the game now that we can't predict which number of columns are going to appear on screen.
- Making sure index.html is not cached by Nginx on production
- Removing .map files on production
- MS Windows support/fixes (๐ Thanks @srraf).
- PR-48 - Fixed a word-wrapping issue when we have only one (long) post (๐ Thanks @manicmaniac).
- Fixes a possible race-condition issue with "vote" syncing.
- Adding full customisation of columns and rules:
- You can now create a board with 1 to 5 columns
- You can allow a user to vote for his own posts
- You can allow multiple votes on the same post
- You can limit the number of up and down votes
- You can choose to display the name of the author, and the name of the persons who vote
- Your language selection is now remembered between sessions
- Various UI fixes:
- Login modal improvements
- Editable label improvements
- Various Docker improvements
- โซ Upgraded dependencies
- ๐ Special thanks to @jesusabp, @zalexki and @jfritz for their inputs and ideas!
- โซ Upgraded dependencies
- Allows multi-line posts and comments (use the shift key to add a new line) (๐ Thanks @andyk314)
- Re-adding Hot Reload, which now works great with TypeScript and Create-React-App.
- โซ Upgraded dependencies
- Fixed an issue with Docker eating too much space with its unlimited log size. Log is now limited to 50mb.
- Added an "Action" field on each Post: this allows the user to define a list of actions that need doing in the next sprint, and allows displaying this list in the Summary Mode.
- ๐ Bugfix: In certain conditions, some race-condition would store a post with a null session ID (so the post was lost forever).
- ๐ Bugfix: Disabled the Web Worker, as it's not working properly when loading a game directly (and not loading the homepage).
- Adding support for Postgres migrations
- Adding created/updated fields on Post and Session
- ๐ Bugfix: Summary mode wasn't ordered by votes anymore. (๐ Thanks @cindyccook)
- Complete rewrite
- TypeScript
- React Hooks
- @testing-library/react
- New component library (MaterialUI)
- Docker-friendly
- ๐ฏ๐ต Japanese Translation (๐ Thanks @sat0yu)
- Simplified the ESLint configuration
- Introducing Prettier (
yarn format
) - โซ Upgrading to Babel 7
- React 16
- Webpack 4 (for previous versions of webpack, see below)
- Using @bionikspoon/react-toolbox instead of the original
react-toolbox
, as the project is no longer maintained and doesn't work with React 16. - โซ Upgraded all the other dependencies, everything should be up-to-date
- Improved the home screen
- Webpack 3 (for Webpack 2, look at version 0.9.0)
- Converting entire project to 2-space indentation
- โซ Upgrade other dependencies
- ๐ต๐ฑ Polish Translation (๐ Thanks @olaf-cichocki)
- ๐ฆ๐ช Arabic Translation (๐ Thanks @Meshredded)
- Improved the loading screen
- Webpack 2 (for Webpack 1, look at version 0.8.1 and older)
- React 15.5 (which needs the new
prop-types
module, among other things) - React Router 4 (completely different way of doing the routing)
- Move the structure of the project to a modular structure
- โซ Upgraded all the other dependencies to the latest versions, except
react-toolbox
- Hotfix (ESLint errors on production build)
- Using redux-saga-testing to test sagas
- ๐น๐ผ๐จ๐ณ Chinese (Traditional and Simplified) Translation (๐ Thanks @aqutw)
- Using Yarn
- โซ Updating dependencies
- Fixing some Spanish translation mistakes (๐ Thanks @MrPolymath)
- ๐ Fixed a bug where the Vote buttons would allow a user to vote multiple times (on the UI only)
- Good test coverage, using Jest
- ๐ท๐บ Russian Translation (๐ Thanks @vectart)
- ๐ช๐ธ Spanish Translation (๐ Thanks @andresin87)
- Replacing PNG flags by SVG/CSS versions
- Using
react-hot-loader
3.0.0 (beta2) for Hot reloading - Fixing a few mobile/responsive issues
- React-toolbox 1.0.0
- Debugging instructions
- Added the ability to edit existing posts inline (posts you wrote)
- Adding a new Invite button to simplify and explain how to invite other people
- Removing the snackbar
- Removing ES7 decorators, as they are not standard yet
- Removing hash on CSS and JS on production (not necessary since we have the version number)
- ๐ Fixed a bug on the anti-spam when if using a proxy (nginx for instance), the wrong ip was used
- ๐ Fixed a bug where the linting would fail if the default configuration was used (๐ Thanks @veselignome)
- Full support of ESLint, based on AirBnB rules
- Adding an anti-spam for SocketIO, because someone is having fun crashing my server (thanks!)
- Adding the possibility to join a previously joined session quickly (๐ Thanks @Sonaryr)
- Performance improvement on title edit (Also thanks to @Sonaryr ๐)
- New Logo!
- Added Favicons
- Updated the screenshot on the readme
- package.json version updated properly this time
- Improved the "Create Session" page, allows a user to create a session with a custom name
- Ability to edit that session name in real-time (by anyone)
- Added a "Summary Mode": this gives a summary of a current session, allowing a user to copy-paste the entire content easily
- New shorter session IDs
- New look-and-feel (new colours)
- Using reselect to create memoized selectors
- Improving performance by using
shouldComponentUpdate
via a custom base Component - Updated to the brand new React 15
- Improving Windows support by allowing Windows users to use the same commands as *nix users
- ๐ณ๐ฑ Internationalisation: added Dutch to the list of supported languages (๐ Thanks @Sonaryr)
- Adding support for more robust databases (NeDB, by default, in process, and MongoDB)
- Change to the Like / Unlike logic: a user can now only vote once, and not for his own posts
- Change to the Like / Unlike logic: like and unlikes counts are separated
- Adding ES7 decorators, more readable than the previous curry-ed functions
- Better support for Windows
- ๐ง๐ท Internationalisation: added Brazilian Portuguese to the list of supported languages (๐ Thanks @renancouto)
- Using
redux-saga
instead ofredux-thunk
- Persistence: Simple persistence to disk (no database needed)
- Support for Google Analytics (with precise events monitoring)
- Ability to logout, and to leave a session
- Improve the reliability of the clients list (currently connected users)
- Fix issues when the web fonts can't load (firewall blocking for example)
- ๐ฌ๐ง ๐ซ๐ท ๐ญ๐บ Internationalisation: support for English, French and Hungarian (๐ Thanks @iaretiga)
- Minor visual tweaks
- Better console logs, server side
- Big clean up of un-used files and old libs
- First production version
- Basic functionalities are there and working
- Login
- Creating a session
- Joining a session
- Adding new posts
- Like / Unlike posts
- Ability to delete our own posts
- List of connected users
- No persistence (yet)
You can actually change the session ID in the URL with anything you like: for example www.retrospected.com/game/hello_world
Try not to take a too common name though, to avoid anyone else finding your session by chance.
Many thanks to the following contributors who helped translating the app:
- Hungarian: @iaretiga
- Portuguese (Brazilian): @renancouto
- Dutch: @Sonaryr, @jghaanstra
- Russian: @vectart, @regmagik
- Spanish: @andresin87
- Chinese: @aqutw
- Polish: @olaf-cichocki
- Arabic: @Meshredded
- Japanese: @sat0yu
- German: @PaulBrandt
- Italian: @mventuri
If you are a native speaker of another language, please don't hesitate to make a pull request to add a translation.
Special thanks to @andresin87 for pointing the flag-icon-css
package to me, it replaces the PNG flags in a neater way.
Another special thanks to Browserstack, as they allow me to test this project in other browsers.
Please make your PRs from the develop branch, not master.