docs: function watch () {
    // initialize
    if (!this.root) {
      if(!this.init()) {
        return
      }
    }
  
    // properties
    const root = this.root
    const paths = [].concat(this.paths)
    const settings = this.settings
    const options = {
      usePolling: settings.usePolling,
      ignoreInitial: true
    }
  
    // log
    log('Starting Sketchpad Reload...')
    console.log('\nSettings:\n')
    logBullet('host', settings.host)
    logBullet('root', root)
    logBullet('mode', settings.usePolling ? 'polling' : 'watching')
    console.log('\nFolders:\n')
    paths.forEach(p => logBullet(p.replace(root, '')))
    console.log()
  
    // livereload server, but without watches
    const server = livereload.createServer({start: true})
  
    // callbacks
    const reload = (file, type) => {
      file = file.replace(root, '')
      log(pad('[' + type + ']', 8) + ' > ' + colors.cyan(file))
      server.refresh(type + ':' + file)
    }
  
    const restart = () => {
      this.load()
      if (JSON.stringify(settings) !== JSON.stringify(this.settings)) {
  
        // close chokidars
        wp.close()
        ws.close()
  
        // hack to prevent errors on closing non-watched server
        if (server.watcher) {
          server.close();
        } else {
          server.server._server.close();
          server.server.close();
        }
  
        // restart
        setTimeout(this.watch.bind(this), 500)
      }
    }
  
    // restart when settings changes
    const ws = chokidar
      .watch(settingsFile, options)
      .on('change', restart)
  
    // watch configured paths
    const wp = chokidar
      .watch(paths, options)
      .on('add', file => reload(file, 'add'))
      .on('change', file => reload(file, 'change'))
      .on('unlink', file => reload(file, 'delete'))
  }