diff --git a/README.md b/README.md
index cddcc6a..2018270 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,13 @@ Follow the instructions after setup runs.
 
 ### Run the server
 ```bash
-npm start
+npm run start
+```
+You can also run this to skip checking the database version on startup.
+```bash
+npm run start -- --skip-migrate
+# don't forget to migrate manually when you update
+npm run migrate
 ```
 
 ## Contributing
diff --git a/package.json b/package.json
index f77afd1..840082b 100644
--- a/package.json
+++ b/package.json
@@ -7,7 +7,8 @@
 	"scripts": {
 		"start": "ts-node src/index.ts",
 		"user": "ts-node src/cli.ts",
-		"setup": "sh install/setup.sh"
+		"setup": "sh install/setup.sh",
+		"migrate": "ts-node src/migrate.ts"
 	},
 	"repository": {
 		"type": "git",
diff --git a/src/cleanup.ts b/src/cleanup.ts
index 00e55ae..56c9dc9 100644
--- a/src/cleanup.ts
+++ b/src/cleanup.ts
@@ -1,10 +1,42 @@
 import * as db from "./database";
+import {readdirSync} from "fs";
 
-async function init() {
+async function init(m?: boolean) {
+	if(!m){
+		console.log('Checking database version.');
+		var tmp: string[] = await db.query('show tables like \"db_meta\"');
+		if(tmp.length === 0){
+			console.log('No database version info, running initial migration.');
+			await require('./db/0').run();
+			await bringUpToDate();
+		}
+		else {
+			await bringUpToDate();
+		}
+	}
+	else {
+		console.log('Skipping database version check.');
+	}
     //If satyr is restarted in the middle of a stream
     //it causes problems
     //Live flags in the database stay live
     await db.query('update user_meta set live=false');
 }
 
+async function bringUpToDate(): Promise<void>{
+	var versions: Object[] =  await db.query('select * from db_meta');
+	var scripts: Buffer[] | string[] = readdirSync('./src/db/', {withFileTypes: false});
+	var diff: number = scripts.length - versions.length
+	if(diff === 0){
+		console.log('No migration needed.');
+	} else {
+		console.log('Versions differ, migrating now.');
+		for(let i=0;i<diff;i++){
+			console.log('Migration to version '+Math.floor(scripts.length-(diff-i)));
+			await require('./db/'+scripts[Math.floor(scripts.length-(diff-i))]).run();
+		}
+		console.log('Done migrating database.');
+	}
+}
+
 export { init };
diff --git a/src/config.ts b/src/config.ts
index 91db07f..3f74000 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -2,6 +2,7 @@ import {parseAsYaml as parse} from "parse-yaml";
 import {readFileSync as read} from "fs";
 try {
 	var localconfig: Object = parse(read('config/config.yml'));
+	console.log('Config file found.');
 } catch (e) {
 	console.log('No config file found. Exiting.');
 	process.exit();
diff --git a/src/database.ts b/src/database.ts
index 1d9a9c7..2cbc440 100644
--- a/src/database.ts
+++ b/src/database.ts
@@ -9,6 +9,7 @@ var cryptoconfig: Object;
 function init (){
 	raw = mysql.createPool(config['database']);
 	cryptoconfig = config['crypto'];
+	console.log('Connected to database.');
 }
 
 async function addUser(name: string, password: string){
diff --git a/src/db/0.ts b/src/db/0.ts
new file mode 100644
index 0000000..d9de386
--- /dev/null
+++ b/src/db/0.ts
@@ -0,0 +1,8 @@
+import * as db from "../database";
+
+async function run () {
+	await db.query('CREATE TABLE IF NOT EXISTS db_meta(version SMALLINT)');
+	await db.query('INSERT INTO db_meta (version) VALUES (0)');
+}
+
+export { run }
\ No newline at end of file
diff --git a/src/index.ts b/src/index.ts
index 2573948..889c20f 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -7,7 +7,7 @@ import { config } from "./config";
 
 async function run() {
 	await initDB();
-	await clean();
+	await clean(process.argv.indexOf('--skip-migrate') !== -1);
 	await initHTTP();
 	await initRTMP();
 	await initChat();
diff --git a/src/migrate.ts b/src/migrate.ts
new file mode 100644
index 0000000..06284c4
--- /dev/null
+++ b/src/migrate.ts
@@ -0,0 +1,9 @@
+import {init as initDB} from "./database";
+import {init as clean} from "./cleanup";
+import { config } from "./config";
+
+async function run() {
+	await initDB();
+	await clean(false);
+}
+run().then(() => {process.exit()});
\ No newline at end of file