diff --git a/dev/scripts/ensureTempFolderExists.js b/dev/scripts/ensureTempFolderExists.js
deleted file mode 100644
index 3c16370f6453da1880f417a9947aefb1e8876c06..0000000000000000000000000000000000000000
--- a/dev/scripts/ensureTempFolderExists.js
+++ /dev/null
@@ -1,31 +0,0 @@
-const fs = require('fs')
-const path = require('path')
-
-const { logger } = require('../../src')
-
-const ensureTempFolderExists = () => {
-  logger.info('Ensuring "tmp" folder exists...')
-
-  try {
-    const tempFolderPath = path.join(__dirname, '..', 'tmp')
-
-    fs.stat(tempFolderPath, (err, stats) => {
-      if (err || !stats.isDirectory()) {
-        logger.info(
-          '[ensureTempFolderExists]: "tmp" folder does not exist. Creating...',
-        )
-        fs.mkdirSync(tempFolderPath)
-        logger.info('[ensureTempFolderExists]: "tmp" folder created')
-      } else {
-        logger.info('[ensureTempFolderExists]: "tmp" folder already exists')
-      }
-    })
-
-    process.exit(0)
-  } catch (e) {
-    logger.error(e)
-    process.exit(1)
-  }
-}
-
-ensureTempFolderExists()
diff --git a/dev/scripts/setupDevServer.sh b/dev/scripts/setupDevServer.sh
deleted file mode 100644
index 24c7719de8d047829d959d62f1fcc1af827cf9b5..0000000000000000000000000000000000000000
--- a/dev/scripts/setupDevServer.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-# set -x
-
-# This is run through docker. Its CWD will be the root folder.
-# node ./dev/scripts/ensureTempFolderExists.js
-# node ./dev/scripts/seedAdmin.js
-
-exec "$@"
diff --git a/dev/startServer.js b/dev/startServer.js
deleted file mode 100644
index dc2e031283281b072134785c9a6d9e4ea05bd7fc..0000000000000000000000000000000000000000
--- a/dev/startServer.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const { startServer } = require('../src')
-
-const init = async () => {
-  try {
-    return startServer()
-  } catch (e) {
-    throw new Error(e)
-  }
-}
-
-init()
diff --git a/docker-compose.yml b/docker-compose.yml
index b15cb66872bf69614206011a007febba0dc03c1a..208e4a009aac77be41256aa8fb16e94f88b4a40f 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -9,27 +9,7 @@ services:
       - db
       - filehosting
       - createbucket
-    entrypoint:
-      [
-        'node_modules/.bin/wait-for-it',
-        'db:5432',
-        '--',
-        'sh',
-        'dev/scripts/setupDevServer.sh',
-      ]
-    command:
-      [
-        'node_modules/.bin/nodemon',
-        './dev/startServer.js',
-        '--watch',
-        'src',
-        '--watch',
-        'dev',
-        '--watch',
-        'authorization',
-        '--ext',
-        'js,graphql',
-      ]
+    command: ['yarn', 'coko-server', 'start-dev']
     ports:
       - ${SERVER_PORT:-3000}:${SERVER_PORT:-3000}
     environment:
diff --git a/package.json b/package.json
index ef4d09a94065d2b27eb888c11678b9c4b6602180..4f7573ed2a227af74ffead90a4435092ca0931e4 100644
--- a/package.json
+++ b/package.json
@@ -71,6 +71,7 @@
     "morgan": "^1.10.0",
     "node-cron": "^2.0.3",
     "nodemailer": "^6.4.18",
+    "nodemon": "^3.1.0",
     "objection": "^2.2.15",
     "ora": "^5.4.1",
     "passport": "^0.4.1",
@@ -89,7 +90,6 @@
     "faker": "^5.5.3",
     "jest": "^26.6.3",
     "node-wait-for-it": "^0.2.0",
-    "nodemon": "^3.1.0",
     "standard-version": "^7.1.0",
     "supertest": "^3.1.0",
     "winston": "^2.3.1"
diff --git a/src/cli/coko-server.js b/src/cli/coko-server.js
index 56b39a103a68ff41df87c679ce9cc696d2b3c452..07c7b7e09245c87bc1baa512622d680227d4c7a8 100755
--- a/src/cli/coko-server.js
+++ b/src/cli/coko-server.js
@@ -1,13 +1,16 @@
 #!/usr/bin/env node
 
-const { program } = require('commander')
+const path = require('path')
 
+const { program } = require('commander')
 const madge = require('madge')
 const output = require('madge/lib/output')
 const ora = require('ora')
+const nodemon = require('nodemon')
 
 const pkg = require('../../package.json')
 const logger = require('../logger')
+const { logNodemon } = require('../logger/internals')
 const { migrate, rollback, pending, executed } = require('../dbManager/migrate')
 
 const migrateCommand = program
@@ -121,6 +124,33 @@ program
     })
   })
 
+program
+  .command('start-dev')
+  .description('Start a development server')
+  .showHelpAfterError()
+  .action(() => {
+    const scriptPath = path.join(__dirname, '..', 'init')
+
+    nodemon({
+      script: scriptPath,
+      ignore: './tmp/*',
+    })
+
+    nodemon
+      .on('start', () => {
+        logNodemon('\nStarting dev server...')
+      })
+      .on('quit', () => {
+        logNodemon('\nStopping dev server...\n')
+        process.exit()
+      })
+      .on('restart', files => {
+        logNodemon(`Retarting dev server due to files ${files}...`, {
+          withLines: true,
+        })
+      })
+  })
+
 program
   .name('coko-server')
   .version(pkg.version, '-v, --version')
diff --git a/src/init.js b/src/init.js
new file mode 100644
index 0000000000000000000000000000000000000000..77588a4548b11368ab512f61bdf298b7e29da254
--- /dev/null
+++ b/src/init.js
@@ -0,0 +1,3 @@
+const startServer = require('./startServer')
+
+startServer()
diff --git a/src/logger/internals.js b/src/logger/internals.js
index 6151cf8161f4412d5ebd619eef24449cc77c49c2..cefbb1528d3513918ed8de6ad87462b530b0675b 100644
--- a/src/logger/internals.js
+++ b/src/logger/internals.js
@@ -9,7 +9,7 @@ const CROSS = '\u2718'
 const HORIZONTAL_BOX = '\u2500'
 const PICKAXE = '\u26CF'
 
-const SEPARATOR = `\n${HORIZONTAL_BOX.repeat(65)}\n\n`
+const SEPARATOR = `${HORIZONTAL_BOX.repeat(80)}`
 
 const logErrorTask = str => {
   logger.error(`${chalk.red(CROSS)} ${str}`)
@@ -19,6 +19,18 @@ const logInit = str => {
   logger.info(chalk.yellow(`\n${PICKAXE}   ${str}  ${PICKAXE}`))
 }
 
+const logNodemon = (str, options = { withLines: false }) => {
+  const { withLines } = options
+
+  logger.info(
+    chalk.yellow(
+      `${withLines ? `\n${SEPARATOR}\n\n` : ''}${str}${
+        withLines ? `\n\n${SEPARATOR}` : ''
+      }`,
+    ),
+  )
+}
+
 const logSuccess = str => {
   logger.info(chalk.green(str))
 }
@@ -30,7 +42,7 @@ const logSuccessTask = str => {
 }
 
 const logTask = str => {
-  logger.info(`${SEPARATOR}${chalk.cyan('Task:')} ${str}\n`)
+  logger.info(`\n${SEPARATOR}\n\n${chalk.cyan('Task:')} ${str}\n`)
 }
 
 const logTaskItem = str => {
@@ -40,6 +52,7 @@ const logTaskItem = str => {
 module.exports = {
   logErrorTask,
   logInit,
+  logNodemon,
   logSuccess,
   logSuccessTask,
   logTask,
diff --git a/src/startup/ensureTempFolderExists.js b/src/startup/ensureTempFolderExists.js
index 952013a50bb463160bba230ea282413afc3e0d6d..9f247c190bd055d94f143679eeb3d5ab523974a3 100644
--- a/src/startup/ensureTempFolderExists.js
+++ b/src/startup/ensureTempFolderExists.js
@@ -5,7 +5,6 @@ const tempFolderPath = require('../utils/tempFolderPath')
 
 const ensureTempFolderExists = async () => {
   logTask(`Ensure tmp folder exists`)
-
   await fs.ensureDir(tempFolderPath)
   logTaskItem(`tmp folder now exists`)
 }