diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..cb75afc
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+config.json
+node_modules/
diff --git a/config.sample.json b/config.sample.json
new file mode 100644
index 0000000..239e555
--- /dev/null
+++ b/config.sample.json
@@ -0,0 +1,25 @@
+{
+	"ym_account": {
+		"userid": "changeme",
+		"password": "changeme"
+	},
+	"interval_in_seconds": 180,
+	"partners": [
+		{
+			"name": "CHANGEME",
+			"ym_ids": [
+				"ym0",
+				"ym1",
+				"ym2"
+			],
+			"command": "s.1234",
+			"regex_pattern": "Rp\\.(\\d+)\\.",
+			"regex_match_index": 1
+		}
+	],
+	"redis": {
+		"host": "127.0.0.1",
+		"port": "6379"
+	},
+	"test": 1
+}
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..81160a0
--- /dev/null
+++ b/index.js
@@ -0,0 +1,114 @@
+var config = require("./config.json");
+var ym = require("yahoomessenger");
+var redis = require('redis');
+
+var redisClient;
+
+function sendPM(destination, message) {
+    console.log("SEND " + destination + ": " + message);
+    if (!config.test) {
+        ym.sendPM(destination, message);
+    }
+
+}
+
+function parseBalance(partner, message) {
+    try {
+        var re = new RegExp(partner.regex_pattern);
+        var match = message.match(re);
+        return match[partner.regex_match_index];
+    }
+    catch(err) {
+        console.log("Exception on parseBalance: " + err);
+        return;
+    }
+}
+
+function onPM(data) {
+    console.log("RECEIVE " + data.sender + ': ' + data.message);
+
+    var partner = getPartnerFromMessage(data.sender);
+    if (!partner) {
+        console.log('Invalid sender');
+        return;
+    }
+
+    console.log("Message is from known sender: " + data.sender + "(" + partner.name + ")");
+    var balance = parseBalance(partner, data.message);
+    if (balance) {
+        console.log("Balance di " + partner.name + ": " + balance);
+        saveBalanceToRedis(partner, balance);
+    }
+}
+
+function saveBalanceToRedis(partner, balance) {
+    var key = 'balance.gw:' + partner.name;
+    redisClient.set(key, Number(balance));
+    redisClient.expire(key, 3600*24*7);
+}
+
+function getPartnerFromMessage(sender) {
+    var partner_count = config.partners.length;
+
+    for (var i = 0; i < partner_count; i++) {
+        var partner = config.partners[i];
+        var ym_ids = partner.ym_ids;
+        var ym_count = ym_ids.length;
+
+        for (var j = 0; j < ym_count; j++) {
+            if (sender == ym_ids[j]) {
+                return partner;
+            }
+        }
+
+    }
+
+    return;
+
+}
+
+function checkAllBalance() {
+    var count = config.partners.length;
+    for (var i = 0; i < count; i++) {
+        var partner = config.partners[i];
+
+        console.log("Checking balance for " + partner.name);
+
+        var ym_idx = Math.round(Math.random() * (partner.ym_ids.length - 1));
+        sendPM(partner.ym_ids[ym_idx], partner.command);
+    }
+}
+
+
+try {
+    redisClient = redis.createClient(config.redis.port, config.redis.host);
+} catch(err) {
+    logger.info("Error creating redis client");
+}
+
+
+ym.newInstance();
+
+ym.on("ready", function() {
+    ym.login(config.ym_account.userid, config.ym_account.password);
+});
+
+ym.on('loginSuccessful', function(data) {
+    console.log("Login successful as: " + data.firstname + " " + data.lastname + " (" +  data.user_id + ")");
+
+
+    checkAllBalance();
+
+    var sleepTime = config.interval_in_seconds * 1000;
+    if (config.test) {
+        sleepTime = 1000;
+    }
+    setInterval(checkAllBalance, sleepTime);
+});
+
+ym.on('buddyAddRequest', function(data) {
+    ym.acceptAddBuddy(data.username);
+    console.log("Add budy: " + data.username);
+});
+
+ym.on('pm', onPM);
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..0a301fd
--- /dev/null
+++ b/package.json
@@ -0,0 +1,28 @@
+{
+  "name": "sate24-ym-balance",
+  "version": "1.0.0",
+  "description": "Tools tuk check balance via YM",
+  "main": "index.js",
+  "scripts": {
+    "test": "mocha"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git@gitlab.kodesumber.com:reload97/sate24-ym-balance.git"
+  },
+  "keywords": [
+    "st24",
+    "ppob",
+    "reload97",
+    "r97",
+    "ym",
+    "yahoo",
+    "yahoomessenger"
+  ],
+  "author": "Adhidarma Hadiwinoto <me@adhisimon.org>",
+  "license": "ISC",
+  "dependencies": {
+    "redis": "^2.6.0-2",
+    "yahoomessenger": "^0.1.3-Beta"
+  }
+}