diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..de153db3b796413119418ec4b9f82dad2e8cb939
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1 @@
+artifacts
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..de153db3b796413119418ec4b9f82dad2e8cb939
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+artifacts
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..31b9ebe7275af2a4d964d2e0687036195a3d5699
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,23 @@
+ARG GOLANG_VERSION=1.21
+ARG BUILDARGS
+ARG ACCESS_TOKEN_USR="nothing"
+ARG ACCESS_TOKEN_PWD="nothing"
+
+FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-bookworm as builder
+WORKDIR /quantumlayer/
+COPY . .
+# based on https://jwenz723.medium.com/fetching-private-go-modules-during-docker-build-5b76aa690280
+RUN printf "machine code.fbi.h-da.de\n\
+    login ${ACCESS_TOKEN_USR}\n\
+    password ${ACCESS_TOKEN_PWD}\n\
+    \n"\
+    >> /root/.netrc
+RUN chmod 600 /root/.netrc
+RUN --mount=type=cache,target=/root/go/pkg/mod \
+    --mount=type=cache,target=/root/.cache/go-build \
+    make build
+
+FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-bookworm
+WORKDIR /app/
+COPY --from=builder /quantumlayer/artifacts/quantumlayer ./quantumlayer
+ENTRYPOINT ["./quantumlayer"]
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..96932cd259b7332d370b66fbb98296f5d401f0ce
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,19 @@
+MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
+MAKEFILE_DIR  := $(dir $(MAKEFILE_PATH))
+GOPATH := $(~/go)
+
+GOCMD=go
+GOBUILD=$(GOCMD) build
+GOCLEAN=$(GOCMD) clean
+BUILD_ARTIFACTS_PATH=artifacts
+
+all: build
+
+pre:
+	mkdir -p $(BUILD_ARTIFACTS_PATH)
+
+build: pre
+	$(GOBUILD) -o $(BUILD_ARTIFACTS_PATH)/quantumlayer ./example/main.go
+
+container: build
+	docker buildx build --rm -t quantumlayer --load -f ./Dockerfile .