diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..504afef
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+node_modules/
+package-lock.json
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..748c9fc
--- /dev/null
+++ b/package.json
@@ -0,0 +1,36 @@
+{
+    "name": "html5-game-template",
+    "version": "1.0.0",
+    "description": "A template for writing jam games in HTML5 + TypeScript",
+    "main": "./src/index.ts",
+    "scripts": {
+        "start": "webpack-dev-server --open --mode development",
+        "build": "webpack --mode production"
+    },
+    "repository": {
+        "type": "git",
+        "url": "git+https://github.com/neverix/html5-game-template.git"
+    },
+    "author": "neverix",
+    "license": "MIT",
+    "bugs": {
+        "url": "https://github.com/neverix/html5-game-template/issues"
+    },
+    "homepage": "https://github.com/neverix/html5-game-template#readme",
+    "devDependencies": {
+        "css-loader": "^2.1.0",
+        "extract-text-webpack-plugin": "^4.0.0-beta.0",
+        "file-loader": "^3.0.1",
+        "html-loader": "^0.5.5",
+        "html-webpack-plugin": "^3.2.0",
+        "node-sass": "^4.11.0",
+        "sass-loader": "^7.1.0",
+        "source-map-loader": "^0.2.4",
+        "style-loader": "^0.23.1",
+        "ts-loader": "^5.3.3",
+        "typescript": "^3.3.3333",
+        "webpack": "^4.29.5",
+        "webpack-cli": "^3.2.3",
+        "webpack-dev-server": "^3.2.0"
+    }
+}
diff --git a/src/index.html b/src/index.html
new file mode 100644
index 0000000..83ae23d
--- /dev/null
+++ b/src/index.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <title>Game</title>
+
+    <link rel='stylesheet' href='style.css'>
+</head>
+
+<body>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/src/index.ts b/src/index.ts
new file mode 100644
index 0000000..50cb788
--- /dev/null
+++ b/src/index.ts
@@ -0,0 +1,2 @@
+import "./ts/main"
+import "./scss/base.scss"
\ No newline at end of file
diff --git a/src/scss/base.scss b/src/scss/base.scss
new file mode 100644
index 0000000..375a34a
--- /dev/null
+++ b/src/scss/base.scss
@@ -0,0 +1,3 @@
+body {
+    padding: 0
+}
\ No newline at end of file
diff --git a/src/ts/main.ts b/src/ts/main.ts
new file mode 100644
index 0000000..8c1ba46
--- /dev/null
+++ b/src/ts/main.ts
@@ -0,0 +1 @@
+console.log("hello world!")
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..2730819
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,28 @@
+{
+    "compilerOptions": {
+        "baseUrl": ".",
+        "paths": {
+            "*": [
+                "types/*"
+            ]
+        },
+        "module": "es6",
+        "target": "es5",
+        "removeComments": true,
+        "sourceMap": true,
+        "lib": [
+            "es2015",
+            "es2017",
+            "dom"
+        ],
+        "noImplicitAny": true,
+        "alwaysStrict": true,
+        "moduleResolution": "Node"
+    },
+    "include": [
+        "src/**/*.ts"
+    ],
+    "exclude": [
+        "node_modules"
+    ]
+}
\ No newline at end of file
diff --git a/webpack.config.js b/webpack.config.js
new file mode 100644
index 0000000..856d7dc
--- /dev/null
+++ b/webpack.config.js
@@ -0,0 +1,65 @@
+const HtmlWebPackPlugin = require("html-webpack-plugin");
+const ExtractTextPlugin = require('extract-text-webpack-plugin');
+module.exports = {
+    devtool: 'inline-source-map',
+    module: {
+        rules: [
+            {
+                test: /\.ts$/,
+                use: 'ts-loader',
+                exclude: /node_modules/
+            },
+            {
+                test: /\.html$/,
+                use: [
+                    {
+                        loader: "html-loader"
+                    }
+                ]
+            },
+            {
+                test: /\.(png|mp3|wav)$/,
+                use: [
+                    {
+                        loader: 'file-loader',
+                        options: {}
+                    }
+                ]
+            },
+            {
+                test: /\.(scss|sass)$/,
+                use: ExtractTextPlugin.extract({
+                    fallback: 'style-loader',
+                    use: ['css-loader', 'sass-loader']
+                })
+            },
+            {
+                test: /\.(eot|svg|ttf|woff|woff2)$/,
+                use: {
+                    loader: 'file-loader?name=./res/fonts/[name].[ext]'
+                }
+            }
+        ]
+    },
+    plugins: [
+        new HtmlWebPackPlugin({
+            template: "./src/index.html",
+            filename: "./index.html"
+        }),
+        new ExtractTextPlugin(
+            {
+                filename: 'style.css',
+                allChunks: true
+            }
+        )
+    ],
+    resolve: {
+        extensions: [
+            ".js",
+            ".ts"
+        ]
+    },
+    entry: [
+        "./src/index.ts"
+    ]
+};