diff --git a/src/api/endpoints/aggregation/posts/reaction.ts b/src/api/endpoints/aggregation/posts/reaction.ts
index e4ca680c33..eb99b9d088 100644
--- a/src/api/endpoints/aggregation/posts/reaction.ts
+++ b/src/api/endpoints/aggregation/posts/reaction.ts
@@ -52,7 +52,7 @@ module.exports = (params) => new Promise(async (res, rej) => {
 	const graph = [];
 
 	for (let i = 0; i < 30; i++) {
-		let day = new Date(new Date().setDate(new Date().getDate() - i));
+		const day = new Date(new Date().setDate(new Date().getDate() - i));
 
 		const data = datas.filter(d =>
 			d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate()
diff --git a/src/api/endpoints/aggregation/posts/reply.ts b/src/api/endpoints/aggregation/posts/reply.ts
index c7ba413311..02a60c8969 100644
--- a/src/api/endpoints/aggregation/posts/reply.ts
+++ b/src/api/endpoints/aggregation/posts/reply.ts
@@ -51,7 +51,7 @@ module.exports = (params) => new Promise(async (res, rej) => {
 	const graph = [];
 
 	for (let i = 0; i < 30; i++) {
-		let day = new Date(new Date().setDate(new Date().getDate() - i));
+		const day = new Date(new Date().setDate(new Date().getDate() - i));
 
 		const data = datas.filter(d =>
 			d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate()
diff --git a/src/api/endpoints/aggregation/posts/repost.ts b/src/api/endpoints/aggregation/posts/repost.ts
index 88d21243f8..217159caa7 100644
--- a/src/api/endpoints/aggregation/posts/repost.ts
+++ b/src/api/endpoints/aggregation/posts/repost.ts
@@ -51,7 +51,7 @@ module.exports = (params) => new Promise(async (res, rej) => {
 	const graph = [];
 
 	for (let i = 0; i < 30; i++) {
-		let day = new Date(new Date().setDate(new Date().getDate() - i));
+		const day = new Date(new Date().setDate(new Date().getDate() - i));
 
 		const data = datas.filter(d =>
 			d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate()
diff --git a/src/api/endpoints/aggregation/users/activity.ts b/src/api/endpoints/aggregation/users/activity.ts
index 6c5efff4b3..5d2ce995f7 100644
--- a/src/api/endpoints/aggregation/users/activity.ts
+++ b/src/api/endpoints/aggregation/users/activity.ts
@@ -86,7 +86,7 @@ module.exports = (params) => new Promise(async (res, rej) => {
 	const graph = [];
 
 	for (let i = 0; i < 365; i++) {
-		let day = new Date(new Date().setDate(new Date().getDate() - i));
+		const day = new Date(new Date().setDate(new Date().getDate() - i));
 
 		const data = datas.filter(d =>
 			d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate()
diff --git a/src/api/endpoints/aggregation/users/post.ts b/src/api/endpoints/aggregation/users/post.ts
index cb6bae4970..c964815a0c 100644
--- a/src/api/endpoints/aggregation/users/post.ts
+++ b/src/api/endpoints/aggregation/users/post.ts
@@ -84,7 +84,7 @@ module.exports = (params) => new Promise(async (res, rej) => {
 	const graph = [];
 
 	for (let i = 0; i < 30; i++) {
-		let day = new Date(new Date().setDate(new Date().getDate() - i));
+		const day = new Date(new Date().setDate(new Date().getDate() - i));
 
 		const data = datas.filter(d =>
 			d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate()
diff --git a/src/api/endpoints/aggregation/users/reaction.ts b/src/api/endpoints/aggregation/users/reaction.ts
index 8f1919fa69..0a082ed1b7 100644
--- a/src/api/endpoints/aggregation/users/reaction.ts
+++ b/src/api/endpoints/aggregation/users/reaction.ts
@@ -56,7 +56,7 @@ module.exports = (params) => new Promise(async (res, rej) => {
 	const graph = [];
 
 	for (let i = 0; i < 30; i++) {
-		let day = new Date(new Date().setDate(new Date().getDate() - i));
+		const day = new Date(new Date().setDate(new Date().getDate() - i));
 
 		const data = datas.filter(d =>
 			d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate()
diff --git a/src/api/endpoints/i/appdata/set.ts b/src/api/endpoints/i/appdata/set.ts
index 07178d6507..24f192de6b 100644
--- a/src/api/endpoints/i/appdata/set.ts
+++ b/src/api/endpoints/i/appdata/set.ts
@@ -34,7 +34,7 @@ module.exports = (params, user, app, isSecure) => new Promise(async (res, rej) =
 	const [value, valueError] = $(params.value).optional.string().$;
 	if (valueError) return rej('invalid value param');
 
-	let set = {};
+	const set = {};
 	if (data) {
 		Object.entries(data).forEach(([k, v]) => {
 			set[`data.${k}`] = v;
diff --git a/src/api/endpoints/posts/create.ts b/src/api/endpoints/posts/create.ts
index 26faee4713..535f850a6e 100644
--- a/src/api/endpoints/posts/create.ts
+++ b/src/api/endpoints/posts/create.ts
@@ -36,9 +36,7 @@ module.exports = (params, user, app) => new Promise(async (res, rej) => {
 		// Fetch files
 		// forEach だと途中でエラーなどがあっても return できないので
 		// 敢えて for を使っています。
-		for (let i = 0; i < mediaIds.length; i++) {
-			const mediaId = mediaIds[i];
-
+		for (const mediaId of mediaIds) {
 			// Fetch file
 			// SELECT _id
 			const entity = await DriveFile.findOne({
@@ -188,7 +186,7 @@ module.exports = (params, user, app) => new Promise(async (res, rej) => {
 		}
 	});
 
-	let mentions = [];
+	const mentions = [];
 
 	function addMention(mentionee, type) {
 		// Reject if already added
diff --git a/src/api/event.ts b/src/api/event.ts
index 39dc809bdc..9613a9f7cc 100644
--- a/src/api/event.ts
+++ b/src/api/event.ts
@@ -13,14 +13,6 @@ class MisskeyEvent {
 			config.redis.port, config.redis.host);
 	}
 
-	private publish(channel: string, type: string, value?: any): void {
-		const message = value == null ?
-			{ type: type } :
-			{ type: type, body: value };
-
-		this.redisClient.publish(`misskey:${channel}`, JSON.stringify(message));
-	}
-
 	public publishUserStream(userId: ID, type: string, value?: any): void {
 		this.publish(`user-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
 	}
@@ -32,6 +24,14 @@ class MisskeyEvent {
 	public publishMessagingStream(userId: ID, otherpartyId: ID, type: string, value?: any): void {
 		this.publish(`messaging-stream:${userId}-${otherpartyId}`, type, typeof value === 'undefined' ? null : value);
 	}
+
+	private publish(channel: string, type: string, value?: any): void {
+		const message = value == null ?
+			{ type: type } :
+			{ type: type, body: value };
+
+		this.redisClient.publish(`misskey:${channel}`, JSON.stringify(message));
+	}
 }
 
 const ev = new MisskeyEvent();
diff --git a/src/config.ts b/src/config.ts
index f7b0095ee7..ca940420e8 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -22,7 +22,7 @@ export const path = process.env.NODE_ENV == 'test'
 /**
  * ユーザーが設定する必要のある情報
  */
-interface Source {
+type Source = {
 	maintainer: string;
 	url: string;
 	secondary_url: string;
@@ -68,12 +68,12 @@ interface Source {
 		hook_secret: string;
 		username: string;
 	};
-}
+};
 
 /**
  * Misskeyが自動的に(ユーザーが設定した情報から推論して)設定する情報
  */
-interface Mixin {
+type Mixin = {
 	host: string;
 	scheme: string;
 	secondary_host: string;
@@ -83,7 +83,7 @@ interface Mixin {
 	about_url: string;
 	dev_url: string;
 	drive_url: string;
-}
+};
 
 export type Config = Source & Mixin;
 
diff --git a/src/index.ts b/src/index.ts
index b8d9b35f41..b8ff525ba7 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -87,7 +87,7 @@ async function init(): Promise<Config> {
 	MachineInfo.show();
 	new DependencyInfo().showAll();
 
-	let configLogger = new Logger('Config');
+	const configLogger = new Logger('Config');
 	if (!fs.existsSync(configPath)) {
 		throw 'Configuration not found - Please run "npm run config" command.';
 	}
@@ -109,7 +109,7 @@ async function init(): Promise<Config> {
 	*/
 
 	// Try to connect to MongoDB
-	let mongoDBLogger = new Logger('MongoDB');
+	const mongoDBLogger = new Logger('MongoDB');
 	const db = require('./db/mongodb').default;
 	mongoDBLogger.info('Successfully connected');
 	db.close();
diff --git a/src/utils/dependencyInfo.ts b/src/utils/dependencyInfo.ts
index 8c3014d302..818fa3136c 100644
--- a/src/utils/dependencyInfo.ts
+++ b/src/utils/dependencyInfo.ts
@@ -2,19 +2,19 @@ import Logger from './logger';
 import { execSync } from 'child_process';
 
 export default class {
-	logger: Logger;
+	private logger: Logger;
 
 	constructor() {
 		this.logger = new Logger('Deps');
 	}
 
-	showAll(): void {
+	public showAll(): void {
 		this.show('MongoDB', 'mongo --version', x => x.match(/^MongoDB shell version:? (.*)\r?\n/));
 		this.show('Redis', 'redis-server --version', x => x.match(/v=([0-9\.]*)/));
 		this.show('GraphicsMagick', 'gm -version', x => x.match(/^GraphicsMagick ([0-9\.]*) .*/));
 	}
 
-	show(serviceName: string, command: string, transform: (x: string) => RegExpMatchArray): void {
+	public show(serviceName: string, command: string, transform: (x: string) => RegExpMatchArray): void {
 		try {
 			// ステータス0以外のときにexecSyncはstderrをコンソール上に出力してしまうので
 			// プロセスからのstderrをすべて無視するように stdio オプションをセット
diff --git a/src/utils/environmentInfo.ts b/src/utils/environmentInfo.ts
index f8508d1d8b..e6084cde0e 100644
--- a/src/utils/environmentInfo.ts
+++ b/src/utils/environmentInfo.ts
@@ -1,10 +1,11 @@
 import Logger from './logger';
 
 export default class {
-	static show(): void {
+	public static show(): void {
 		const env = process.env.NODE_ENV;
-		let logger = new Logger('Env');
+		const logger = new Logger('Env');
 		logger.info(typeof env == 'undefined' ? 'NODE_ENV is not set' : `NODE_ENV: ${env}`);
+
 		if (env !== 'production') {
 			logger.warn('The environment is not in production mode');
 			logger.warn('Do not use for production purpose');
diff --git a/src/utils/logger.ts b/src/utils/logger.ts
index ebfa3c34fe..ecfacbc952 100644
--- a/src/utils/logger.ts
+++ b/src/utils/logger.ts
@@ -11,43 +11,43 @@ function toLevelColor(level: LogLevel): chalk.ChalkStyle {
 }
 
 export default class Logger {
-	domain: string;
-
-	static log(level: LogLevel, message: string): void {
-		let color = toLevelColor(level);
-		let time = (new Date()).toLocaleTimeString('ja-JP');
-		console.log(`[${time} ${color.bold(level.toUpperCase())}]: ${message}`);
-	}
-
-	static error(message: string): void {
-		Logger.log('Error', message);
-	}
-
-	static warn(message: string): void {
-		Logger.log('Warn', message);
-	}
-
-	static info(message: string): void {
-		Logger.log('Info', message);
-	}
+	private domain: string;
 
 	constructor(domain: string) {
 		this.domain = domain;
 	}
 
-	log(level: LogLevel, message: string): void {
+	public static log(level: LogLevel, message: string): void {
+		const color = toLevelColor(level);
+		const time = (new Date()).toLocaleTimeString('ja-JP');
+		console.log(`[${time} ${color.bold(level.toUpperCase())}]: ${message}`);
+	}
+
+	public static error(message: string): void {
+		Logger.log('Error', message);
+	}
+
+	public static warn(message: string): void {
+		Logger.log('Warn', message);
+	}
+
+	public static info(message: string): void {
+		Logger.log('Info', message);
+	}
+
+	public log(level: LogLevel, message: string): void {
 		Logger.log(level, `[${this.domain}] ${message}`);
 	}
 
-	error(message: string): void {
+	public error(message: string): void {
 		this.log('Error', message);
 	}
 
-	warn(message: string): void {
+	public warn(message: string): void {
 		this.log('Warn', message);
 	}
 
-	info(message: string): void {
+	public info(message: string): void {
 		this.log('Info', message);
 	}
 }
diff --git a/src/utils/machineInfo.ts b/src/utils/machineInfo.ts
index acae773743..0c189cc7ca 100644
--- a/src/utils/machineInfo.ts
+++ b/src/utils/machineInfo.ts
@@ -2,10 +2,10 @@ import * as os from 'os';
 import Logger from './logger';
 
 export default class {
-	static show(): void {
+	public static show(): void {
 		const totalmem = (os.totalmem() / 1024 / 1024 / 1024).toFixed(1);
 		const freemem = (os.freemem() / 1024 / 1024 / 1024).toFixed(1);
-		let logger = new Logger('Machine');
+		const logger = new Logger('Machine');
 		logger.info(`Hostname: ${os.hostname()}`);
 		logger.info(`Platform: ${process.platform}`);
 		logger.info(`Architecture: ${process.arch}`);
diff --git a/tslint.json b/tslint.json
index 6f21b4b7ea..dfd8309675 100644
--- a/tslint.json
+++ b/tslint.json
@@ -1,153 +1,32 @@
 {
-  "rules": {
-    // TypeScript Specific
-    "ban-types": [
-      true,
-      [
-        "Object"
-      ]
-    ],
-    "member-access": false,
-    "member-ordering": [
-      true,
-      "static-before-instance",
-      "variables-before-functions"
-    ],
-    "no-any": false,
-    "no-import-side-effect": true,
-    "no-inferrable-types": false,
-    "no-internal-module": false,
-    "no-namespace": false,
-    "no-non-null-assertion": true,
-    "no-reference": true,
-    "no-var-requires": false,
-    "only-arrow-functions": false,
-    "typedef": [
-      true,
-      "property-declaration"
-    ],
-    "typedef-whitespace": [
-      true,
-      {
-        "call-signature": "nospace",
-        "index-signature": "nospace",
-        "parameter": "nospace",
-        "property-declaration": "nospace",
-        "variable-declaration": "nospace"
-      }
-    ],
-    // Functionality
-    "ban": false,
-    "curly": false,
-    "forin": true,
-    "label-position": true,
-    "no-arg": true,
-    "no-bitwise": true,
-    "no-conditional-assignment": true,
-    "no-console": [
-      true,
-      "debug",
-      "info",
-      "time",
-      "timeEnd",
-      "trace"
-    ],
-    "no-construct": true,
-    "no-debugger": true,
-    "no-duplicate-super": true,
-    "no-duplicate-variable": true,
-    "no-empty": true,
-    "no-eval": false,
-    "no-for-in-array": false,
-    "no-invalid-this": [
-      true,
-      "check-function-in-method"
-    ],
-    "no-misused-new": true,
-    "no-null-keyword": false,
-    "no-shadowed-variable": false,
-    "no-string-literal": false,
-    "no-switch-case-fall-through": true,
-    "no-unsafe-finally": true,
-    "no-unused-expression": true,
-    "no-use-before-declare": false,
-    "no-var-keyword": true,
-    "radix": true,
-    "restrict-plus-operands": false,
-    "switch-default": false,
-    "triple-equals": [
-      false,
-      "allow-null-check",
-      "allow-undefined-check"
-    ],
-    "use-isnan": true,
-    // Maintainability
-    "eofline": true,
-    "indent": [
-      true,
-      "tabs"
-    ],
-    "linebreak-style": false,
-    "max-file-line-count": false,
-    "max-line-length": false,
-    "no-default-export": false,
-    "no-mergeable-namespace": true,
-    "no-require-imports": false,
-    "no-reference-import": true,
-    "no-trailing-whitespace": true,
-    "no-unnecessary-callback-wrapper": true,
-    "no-unnecessary-initializer": true,
-    "object-literal-sort-keys": false,
-    "trailing-comma": true,
-    // Style
-    "align": [
-      true,
-      "parameters",
-      "statements"
-    ],
-    "arrow-parens": false,
-    "arrow-return-shorthand": true,
-    "class-name": true,
-    "comment-format": [
-      true,
-      "check-space"
-    ],
-    "interface-name": false,
-    "jsdoc-format": true,
-    "match-default-export-name": false,
-    "newline-before-return": false,
-    "new-parens": true,
-    "no-angle-bracket-type-assertion": true,
-    "no-consecutive-blank-lines": true,
-    "object-literal-key-quotes": false,
-    "one-line": [
-      true,
-      "check-catch",
-      "check-finally",
-      "check-else",
-      "check-open-brace",
-      "check-whitespace"
-    ],
-    "one-variable-per-declaration": true,
-    "ordered-imports": false,
-    "prefer-function-over-method": true,
-    "prefer-method-signature": true,
-    "prefer-template": true,
-    "quotemark": [
-      true,
-      "single",
-      "avoid-escape"
-    ],
-    "semicolon": true,
-    "variable-name": false,
-    "whitespace": [
-      true,
-      "check-branch",
-      "check-decl",
-      "check-operator",
-      "check-separator",
-      "check-type",
-      "check-preblock"
-    ]
-  }
+	"defaultSeverity": "error",
+	"extends": [
+		"tslint:recommended"
+	],
+	"jsRules": {},
+	"rules": {
+		"indent": ["tab"],
+		"quotemark": ["single"],
+		"no-var-requires": false,
+		"no-string-throw": false,
+		"trailing-comma": [false],
+		"object-literal-sort-keys": false,
+		"curly": false,
+		"no-console": [false],
+		"ordered-imports": [false],
+		"arrow-parens": false,
+		"object-literal-shorthand": false,
+		"triple-equals": [false],
+		"no-shadowed-variable": false,
+		"no-string-literal": false,
+		"variable-name": [false],
+		"comment-format": [false],
+		"interface-over-type-literal": false,
+		"max-line-length": [false],
+		"member-ordering": [false],
+		"ban-types": [
+			"Object"
+		]
+	},
+	"rulesDirectory": []
 }