diff --git a/build.gradle.kts b/build.gradle.kts
index b3f355f4455ab33abf357a4e669de6d98c03d3c9..e508afb51accfe41712f944cf0451627d86bab51 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,4 +1,11 @@
-import org.gradle.internal.os.OperatingSystem
+import com.google.protobuf.gradle.id
+
+plugins {
+    kotlin("jvm") version "1.8.0"
+    application
+	id("com.google.protobuf") version "0.9.2"
+}
+
 
 val lwjglVersion = "3.3.1"
 
@@ -15,14 +22,45 @@ val lwjglNatives = Pair(
 	}
 }
 
-plugins {
-    kotlin("jvm") version "1.8.0"
-    application
-}
-
 group = "com.radarsystem.viewer"
 version = "1.0.0"
 
+
+sourceSets {
+    main {
+        proto {
+            srcDir("src/main/resources/protos")
+        }
+    }
+}
+
+
+protobuf {
+    protoc {
+        artifact = "com.google.protobuf:protoc:3.22.0"
+    }
+    plugins {
+        id("grpc") {
+            artifact = "io.grpc:protoc-gen-grpc-java:1.53.0"
+        }
+        id("grpckt") {
+            artifact = "io.grpc:protoc-gen-grpc-kotlin:1.3.0:jdk8@jar"
+        }
+    }
+    generateProtoTasks {
+        all().forEach {
+            it.plugins {
+                id("grpc")
+                id("grpckt")
+            }
+            it.builtins {
+                id("kotlin")
+            }
+        }
+    }
+}
+
+
 repositories {
     mavenCentral()
 }
@@ -44,6 +82,12 @@ dependencies {
 	runtimeOnly("org.lwjgl", "lwjgl-openal", classifier = lwjglNatives)
 	runtimeOnly("org.lwjgl", "lwjgl-opengl", classifier = lwjglNatives)
 	runtimeOnly("org.lwjgl", "lwjgl-stb", classifier = lwjglNatives)
+
+	implementation("io.grpc:grpc-kotlin-stub:1.3.0")
+    implementation("io.grpc:grpc-protobuf:1.53.0")
+    implementation("com.google.protobuf:protobuf-kotlin:3.22.0")
+
+    runtimeOnly("io.grpc:grpc-netty-shaded:1.53.0")
 }
 
 tasks.test {
@@ -56,4 +100,25 @@ kotlin {
 
 application {
     mainClass.set("MainKt")
-}
\ No newline at end of file
+}
+
+
+tasks {
+    val buildJar = register<Jar>("build-jar") {
+        dependsOn.addAll(listOf("compileJava", "compileKotlin", "processResources"))
+        archiveClassifier.set("radar-server")
+        duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+        manifest {
+            attributes(mapOf("Main-Class" to application.mainClass))
+        }
+        val sourcesMain = sourceSets.main.get()
+        val contents = configurations.runtimeClasspath.get()
+            .map { if (it.isDirectory) it else zipTree(it) } +
+                sourcesMain.output
+        from(contents)
+    }
+
+    build {
+        dependsOn(buildJar)
+    }
+}