diff --git a/index.js b/index.js
index 9768d87813bc3e67105e1d97768f468ab13ddcb7..270557dc30b0c7ec566508d53a8cef7e1f334e3d 100644
--- a/index.js
+++ b/index.js
@@ -17,6 +17,8 @@ const { warn, error } = require('./utils/notifications');
 // Routes
 const authRouter = require('./routes/auth');
 const charactersRouter = require('./routes/characters');
+// Crons
+require('./utils/crons');
 
 // Configuration
 const app = express();
diff --git a/utils/crons.js b/utils/crons.js
new file mode 100644
index 0000000000000000000000000000000000000000..2beec70e1bfba6033467329223a0983f7b92cabd
--- /dev/null
+++ b/utils/crons.js
@@ -0,0 +1,29 @@
+const cron = require('node-cron');
+const fs = require('fs');
+const Character = require('../models/character');
+const { maxActionPoints } = require('js-yaml').safeLoad(fs.readFileSync('./config.yml', 'utf8'));
+
+if (!fs.existsSync('./data/lastActionPointsUpdate')) {
+  fs.writeFileSync('./data/lastActionPointsUpdate', new Date().toString());
+  console.log("Missing data file, generating...");
+}
+
+cron.schedule('*/3 * * * *', () => {
+  // Read last time
+  let lastUpdate = new Date(fs.readFileSync('./data/lastActionPointsUpdate').toString());
+  // Loop until now
+  while (lastUpdate.getTime() < new Date().getTime() - 3*1000) {
+    // Give a point
+    Character.where('actionPoints').lt(maxActionPoints)
+      .exec((err, characters) => {
+        characters.forEach(character => {
+          character.actionPoints ++;
+          character.save();
+        });
+      });
+    // Write lastime
+    lastUpdate = new Date(fs.readFileSync('./data/lastActionPointsUpdate').toString());
+    lastUpdate = new Date(lastUpdate.getTime() + 3*1000);
+    fs.writeFileSync('./data/lastActionPointsUpdate', lastUpdate.toString());
+  }
+});