diff --git a/index.js b/index.js
index 9453fdc86d23c5bb67a835f712bddb97d655336c..83d99f47065c057fc52337474cc799d10361de02 100755
--- a/index.js
+++ b/index.js
@@ -2,33 +2,32 @@
 const { spawnSync, spawn } = require('child_process')
 const config = require('./sitegin/config')
 
-function onBabelExit(code) {
-  setTimeout(() => {
-    runBabel({ watch: true })
-  }, 500)
-}
-
-function runBabel({ watch = false }) {
+function runBabel({ onExit, opts = [] }) {
   const babel = spawn(
     './node_modules/.bin/babel',
-    [
-      'theme-source',
-      '-d',
-      'theme',
-      '--delete-dir-on-start',
-      watch ? '--watch' : null,
-    ].filter(a => a),
+    ['theme-source', '-d', 'theme', ...opts].filter(a => a),
     { stdio: 'inherit', cwd: __dirname },
   )
-  if (watch) babel.on('exit', onBabelExit)
+  if (onExit) babel.on('exit', onExit)
+}
+
+function runBabelWatch() {
+  runBabel({
+    onExit: () => {
+      setTimeout(() => runBabelWatch(), 500)
+    },
+    opts: ['--skip-initial-build', '--watch'],
+  })
 }
 
 ;(async () => {
   const opts = await config()
-  runBabel({ watch: !opts.nowatch })
-  if (opts.config.options.nowatch) {
-    require('./sitegin/index.js')
-  } else {
+  await new Promise(res =>
+    runBabel({ onExit: res, opts: ['--delete-dir-on-start'] }),
+  )
+  const watch = !opts.config.options.nowatch
+  if (watch) {
+    runBabelWatch()
     spawnSync(
       process.argv[0],
       [
@@ -40,5 +39,7 @@ function runBabel({ watch = false }) {
       ],
       { stdio: ['inherit', 'inherit', 'inherit'] },
     )
+  } else {
+    require('./sitegin/index.js')
   }
 })()