setSocket()
    {
        this.config.socket = socketIo.listen(this.site.server)

        // Create a socket for the watcher
        const watcherSocket = this.config.socket.of('/watcher')

        watcherSocket.on('connection', (socket) =>
        {
            // Set up
            let project = null

            // Debug
            if(this.config.debug >= 1)
            {
                console.log(`${chalk.green.bold('app > socket')} - ${chalk.cyan('connect')} - ${chalk.cyan(socket.id)}`)
            }

            // Callbacks
            const callbacks = {}

            callbacks.startProject = (data) =>
            {
                data.watcherSocket = socket // Add watcher socket
                project = this.projects.createProject(data)

                this.site.createProjectRoute(project)

                // Debug
                if(this.config.debug >= 1)
                {
                    console.log(`${chalk.green.bold('app > socket')} - ${chalk.cyan('start_project')} - ${chalk.cyan(project.slug)}`)
                }
                if(this.config.debug >= 2)
                {
                    console.log(util.inspect(project.files.describe(), { depth: null, colors: true }))
                }

                socket.emit('started')
            }

            callbacks.updateFile = (data) =>
            {
                project.files.createVersion(data.path, data.content)
                project.zipNeedsUpdate = true

                // Debug
                if(this.config.debug >= 1)
                {
                    console.log(`${chalk.green.bold('app > socket')} - ${chalk.cyan('update_file')} - ${chalk.cyan(data.path)}`)
                }
                if(this.config.debug >= 2)
                {
                    console.log(util.inspect(project.files.describe(), { depth: null, colors: true }))
                }
            }

            callbacks.createFile = (data) =>
            {
                project.files.create(data.path, data.content)
                project.zipNeedsUpdate = true

                // Debug
                if(this.config.debug >= 1)
                {
                    console.log(`${chalk.green.bold('app > socket')} - ${chalk.cyan('create_file')} - ${chalk.cyan(data.path)}`)
                }
                if(this.config.debug >= 2)
                {
                    console.log(util.inspect(project.files.describe(), { depth: null, colors: true }))
                }
            }

            callbacks.deleteFile = (data) =>
            {
                project.files.delete(data.path)
                project.zipNeedsUpdate = true

                // Debug
                if(this.config.debug >= 1)
                {
                    console.log(`${chalk.green.bold('app > socket')} - ${chalk.cyan('delete_file')} - ${chalk.cyan(data.path)}`)
                }
                if(this.config.debug >= 2)
                {
                    console.log(util.inspect(project.files.describe(), { depth: null, colors: true }))
                }
            }

            callbacks.disconnect = () =>
            {
                // Delete project
                this.projects.deleteProject(project.slug)

                // Stop listening
                socket.off('start_project', callbacks.startProject)
                socket.off('update_file', callbacks.updateFile)
                socket.off('create_file', callbacks.createFile)
                socket.off('delete_file', callbacks.disconnect)
                socket.off('disconnect', callbacks.disconnect)

                // Debug
                if(this.config.debug >= 1)
                {
                    console.log(`${chalk.green.bold('app > socket')} - ${chalk.cyan('disconnect')} - ${chalk.cyan(socket.id)}`)
                }
            }

            // Start listening
            socket.on('start_project', callbacks.startProject)
            socket.on('update_file', callbacks.updateFile)
            socket.on('create_file', callbacks.createFile)
            socket.on('delete_file', callbacks.deleteFile)
            socket.on('disconnect', callbacks.disconnect)
        })
    }
Set socket
Instantiate socket with socket io and associate it with the express server
/app socket is used to communicate between watchers and app (because multiple watchers can co-exist)