diff --git a/.editorconfig b/.editorconfig
index bfeb6df95a4c157ce202c356dcf685a076691f9b..e62e4cc5fb808a28307c11f1c67a62473715a226 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -2,18 +2,15 @@
 root = true
 
 [*]
-indent_style = space
-indent_size = 4
-end_of_line = lf
 charset = utf-8
-trim_trailing_whitespace = true
 insert_final_newline = true
+end_of_line = lf
+indent_style = space
+max_line_length = 120
+trim_trailing_whitespace = true
 
 [*.md]
 trim_trailing_whitespace = false
 
-[*.{css,html,js,scss,j2}]
-indent_size = 2
-
-[*.yml]
-indent_size = 2
+[*.py]
+indent_size = 4
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000000000000000000000000000000000000..af3ad128122dfe2a143df207c66884380fd888d4
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,4 @@
+/.yarn/**            linguist-vendored
+/.yarn/releases/*    binary
+/.yarn/plugins/**/*  binary
+/.pnp.*              binary linguist-generated
diff --git a/.gitignore b/.gitignore
index 47f6a8a3309b0076e5f70443596df19b9e59ecbf..f0b4232c377dfc773a4277f5cad09359ceb1c34b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -108,3 +108,13 @@ dmypy.json
 
 # Cython debug symbols
 cython_debug/
+
+# yarn
+.pnp.*
+.yarn/*
+!.yarn/patches
+!.yarn/plugins
+!.yarn/releases
+# SDKS are excluded as we do not want them in the repository
+# !.yarn/sdks
+!.yarn/versions
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000000000000000000000000000000000000..a62db468f4fccb86db90f75de2ffeab330377e6c
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,11 @@
+**/*.html
+**/*.j2
+
+static.dist/
+**/vendor/**/*
+**/list_script.js
+
+src/core/fixtures/local/**/*
+
+src/plainui/static/hub.*
+src/plainui/static/plainui/js/player.js
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1 @@
+{}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..4c0532e0b08817822f3630f3f6ff32cab05c86fd
--- /dev/null
+++ b/package.json
@@ -0,0 +1,7 @@
+{
+  "name": "hub",
+  "packageManager": "yarn@4.5.0",
+  "devDependencies": {
+    "prettier": "^3.3.3"
+  }
+}
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000000000000000000000000000000000000..068de79e35a8fac870b57949b1e93fb833006772
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,23 @@
+# This file is generated by running "yarn install" inside your project.
+# Manual changes might be lost - proceed with caution!
+
+__metadata:
+  version: 8
+  cacheKey: 10c0
+
+"hub@workspace:.":
+  version: 0.0.0-use.local
+  resolution: "hub@workspace:."
+  dependencies:
+    prettier: "npm:^3.3.3"
+  languageName: unknown
+  linkType: soft
+
+"prettier@npm:^3.3.3":
+  version: 3.3.3
+  resolution: "prettier@npm:3.3.3"
+  bin:
+    prettier: bin/prettier.cjs
+  checksum: 10c0/b85828b08e7505716324e4245549b9205c0cacb25342a030ba8885aba2039a115dbcf75a0b7ca3b37bc9d101ee61fab8113fc69ca3359f2a226f1ecc07ad2e26
+  languageName: node
+  linkType: hard