diff --git a/.devcontainer.json b/.devcontainer.json
new file mode 100644
index 0000000000000000000000000000000000000000..8f68abe9b01411b8df713108e0f31df115fd7722
--- /dev/null
+++ b/.devcontainer.json
@@ -0,0 +1,28 @@
+{
+	"name": "ogs-gcc-dev",
+	"image": "registry.opengeosys.org/ogs/ogs/vscode:latest",
+	"containerEnv": {
+		"CPM_SOURCE_CACHE": "/opt/cpm"
+	},
+	"postStartCommand": "nohup bash -c 'cd web; yarn; yarn build; hugo server &'",
+	"forwardPorts": [
+		1313
+	],
+	"mounts": [
+		"source=devcontainer-cpm-cache,target=/opt/cpm,type=volume",
+		"source=devcontainer-ccache-cache,target=/opt/ccache,type=volume",
+		"source=${localWorkspaceFolder}/../build,target=${containerWorkspaceFolder}/../build,type=bind"
+	],
+	"customizations": {
+		"vscode": {
+			"extensions": [
+				"ms-vscode.cmake-tools",
+				"ms-vscode.cpptools"
+			]
+		}
+	},
+	"remoteUser": "vscode",
+	"features": {
+		"common": {}
+	}
+}
diff --git a/.gitignore b/.gitignore
index c88708be60b7c806f72cd91a16b057e4739f1d60..417f635afe798df5103d062fca402e2de0a1cfe1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,7 @@ CMakeUserPresets.json
 # clangd and other language servers' caches
 .cache
 .ccls-cache
+
+# VS Code devcontainer
+/.cpm
+nohup.out