Skip to content
MeetEasier is a web application that visualizes meeting room availability. It works using Exchange Web Services (EWS) with Exchange room lists in Office 365.
JavaScript CSS HTML
Branch: master
Clone or download
Pull request Compare This branch is 1 commit ahead of danxfisher:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


Because why pay money for something you can do yourself?


MeetEasier is a web application that visualizes meeting room availability. It works using Exchange Web Services (EWS) with Exchange room lists in Office 365.

Mockup 1


MeetEasier is licensed under the open source GNU General Public License (GPL 3.0).

In the event of wanting to commercially distribute a closed source modification of this code, please contact me.


  • v0.3.4
    • #34 - bug fix for 'Next up:' displaying incorrectly
  • v0.3.3
    • #18 - use localized sort for rooms
  • v0.3.2
    • Added additional error handling for incorrect credentials. The error will now be shown on the front end.
    • Updated the socket component to stop most ERR_CONNECTION_REFSUED errors from happening.
  • v0.3.1
    • Removed skipped rooms/room blacklist filtering from front end and added to back end.
  • v0.3
    • Cleaned up unnecessarily nested component folder structure
    • #8 - add script-shortcuts to package.json in root
    • #9 - support environment-variables for authentication and port configuration
    • #10 - create shrinkwraps for npm-dependencies
    • #11 - add .editorconfig
    • #12 - pass error (while fetching appointments), to frontend
    • #13 - set engine-requirements
    • #14 - add heartbeat-endpoint, to check if server is alive (for monitoring)
    • #15 - add '.nvmrc'
  • v0.2
    • Changed domain to accept more than just ".com" extension
    • Changed ui-react/config/flightboard.config.js to handle all text so that the application can be multilingual
    • Added ui-react/config/singleRoom.config.js to do the same for the single-room component
    • Added console.log to server.js to know when the server is running correctly
    • Updated styles slightly
  • v0.1
    • Initial release


This application assumes you have:

  • Exchange Online (Office 365)
  • Conference room mailboxes organized in room lists
  • Exchange Web Services (EWS) enabled
  • A service account with access to all conference room mailboxes and EWS
  • A web server with Node.js installed to run the application

Please Note: This application uses Basic Authentication which, by its very nature, is insecure. I would strongly suggest using SSL where ever you decide to run this.


  1. Optional: Install IISNode
    • I've also included a web.config file for an IIS install
  2. In root directory, open a terminal or cmd:
    $ npm install
  3. In the root directory, open a terminal or cmd:
    $ npm run build
  4. In the root directory, open a terminal or cmd:
    $ npm start
  5. If you want to start the react development server, in the root directory run:
    $ npm start-ui-dev

Root Folder Structure Explained

  • app/ : Routes for EWS APIs
  • app/ews/ : All EWS functionality
  • confg/ : All server side configuration settings
  • scss/ : All styles
  • static/ : All global static files
  • ui-react/ : Front end React routes and components

React /src Folder Structure Explained

There are three main directories in the ui-react/src/ folder:

  • components/ : Components separated in folders by function
  • config/ : Customizable config file (see defails below in Customization section)
  • layouts/ : Layout components for the two different layouts used.


  • flightboard/ : All components related to the flightboard or "all meeting" layout
  • global : Components that will be used by both layouts
  • single-room : All components related to the Single Room layout


  • Board : Actual flightboard component itself
  • Clock : Clock component for the upper right hand of the display
  • Navbar : Top navigation/title bar piece
  • RoomFilter : Room list filter in the navbar


  • NotFound : A "not found" page if an error or "404" occurs
  • Socket : A service component to run the web socket connection for updating the flightboard and single room display


  • Clock : Clock component for the upper right hand of the display
  • Display : All other features of the single room display


  • flightboard.config.js : Simple customization config explained in the Customization section


  • flightboard/ : Layout for flightboard display
  • single-room/ : Layout for single room display



  • In /config/auth.js, enter your credentials and domain:

    module.exports = {
      // this user MUST have full access to all the room accounts
      'exchange' : {
        'username'  : 'SVCACCT_EMAIL@DOMAIN.COM',
        'password'  : 'PASSWORD',
        'uri'       : ''
      'domain' : 'DOMAIN'
  • Alternatively, username, password and domain can be set as environment variable

    export PASSWORD=password
  • In /config/room-blacklist.js, add any room by email to exclude it from the list of rooms:

      module.exports = {
        'roomEmails' : [
  • In /ui-react/src/config/flightboard.config.js, manage your customizations:

    module.exports = {
      'board' : {
        'nextUp' : 'Next Up',
        'statusAvailable' : 'Open',
        'statusBusy' : 'Busy',
        'statusError' : 'Error'
      'navbar' : {
        'title' : 'Conference Room Availability',
      'roomFilter' : {
        'filterTitle' : 'Locations',
        'filterAllTitle' : 'All Conference Rooms',
  • Upload your logo to /static/img/logo.png


  • All EWS functionality is located in app/ews.
  • To change the interval in which the web socket emits, edit the interval time in app/socket-controller.js. By default, it is set to 1 minute.
  • To update styles, make sure you install grunt first with npm install -g grunt-cli. Then run grunt in the root directory to watch for SCSS changes. Use the .scss files located in the /scss folder.
    • All React components can be locally styled by adding a new .css file and importing it into the component itself if you'd prefer to do it that way.
  • In app/ews/rooms.js, there is a block of code that may not be necessary but were added as a convenience. Feel free to use it, comment it out, or remove it completely. It was designed for a use case where the email addresses (ex: do not match the corporate domain (ex: jsmith-enterprise).
    // if the email domain != your corporate domain,
    // replace email domain with domain from auth config
    var email = roomItem.Address;
    email = email.substring(0, email.indexOf('@'));
    email = email + '@' + auth.domain + '.com';

Flightboard Layout Mockup

Mockup 3

Single Room Layout Mockup

Mockup 2

Resources & Attributions

You can’t perform that action at this time.