diff --git a/README.md b/README.md
index 35a3df8e60b6618c9b686cba7f9b949e388a24a2..53e804d715309f39b86fc66e5d8311ff51d2419c 100644
--- a/README.md
+++ b/README.md
@@ -12,3 +12,15 @@ Lithuanian | Up-to-date | Wait What
 Czech | Up-to-date | Fatalerrorcoded
 Russian | Work in progress. | Wait What
 Hungarian | Pending. | Organic Coke
+
+## Coverage
+
+By running `process.js` all language files will be compared to `en.json` and a coverage table will be generated below.
+
+ File | Coverage | Missing keys | Extraneous keys
+------|-----|--------------|-----------------
+cz.json | `92.31%` | `general.image_by` | 
+en.json | `100.00%` |  | 
+hu.json | `0.00%` | `general.about`<br>`general.tos`<br>`general.privacy`<br>`general.image_by`<br>`login.title`<br>`login.email`<br>`login.password`<br>`login.enter.email`<br>`login.enter.password`<br>`login.forgot`<br>`login.new`<br>`login.create`<br>`app.main.channel.message` | 
+lt.json | `100.00%` |  | 
+pl.json | `100.00%` |  | 
\ No newline at end of file
diff --git a/cz.json.d.ts b/cz.json.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..62f39ceb7fbf72266bc372f548d459edfeae0316
--- /dev/null
+++ b/cz.json.d.ts
@@ -0,0 +1 @@
+export default any;
diff --git a/process.js b/process.js
new file mode 100644
index 0000000000000000000000000000000000000000..323d177c3419fb012d9a1ae6be114a7d9d4eb895
--- /dev/null
+++ b/process.js
@@ -0,0 +1,44 @@
+const { readdirSync, readFileSync, existsSync, writeFileSync } = require('fs');
+
+function recurseKeys(object, path = []) {
+    let collected = [];
+    let keys = Object.keys(object);
+
+    for (let key of keys) {
+        let item = object[key];
+        let current = [ ...path, key ];
+
+        if (typeof item === 'object') {
+            collected = [ ...collected, ...recurseKeys(item, current) ];
+        } else {
+            collected.push(current.join('.'));
+        }
+    }
+
+    return collected;
+}
+
+let en = JSON.parse(readFileSync('en.json'));
+let keys = recurseKeys(en);
+
+let output = [];
+let language_files = readdirSync('.');
+for (let file of language_files) {
+    if (file.endsWith('.json')) {
+        if (!existsSync(file + '.d.ts')) {
+            writeFileSync(file + '.d.ts', 'export default any;\n');
+        }
+
+        let lang = JSON.parse(readFileSync(file));
+        let lkey = recurseKeys(lang);
+
+        let missing = keys.filter(x => !lkey.includes(x));
+        let extraneous = lkey.filter(x => !keys.includes(x));
+
+        output.push(`${file} | \`${((1 - missing.length / keys.length) * 100).toFixed(2)}%\` | ${missing.map(x => '`' + x + '`').join('<br>')} | ${extraneous.map(x => '`' + x + '`').join('<br>')}`);
+    }
+}
+
+let s = `------|-----|--------------|-----------------`;
+let inp = readFileSync('README.md').toString().split(s)[0];
+writeFileSync('README.md', inp + s + '\n' + output.join('\n'));