diff --git a/.drone.yml b/.drone.yml
deleted file mode 100644
index 8f6845b..0000000
--- a/.drone.yml
+++ /dev/null
@@ -1,473 +0,0 @@
----
-kind: pipeline
-type: kubernetes
-name: linter
-
-clone:
-  disable: true
-
-steps:
-- name: clone
-  image: git.cryptic.systems/volker.raschek/git:1.4.0
-
-- name: markdown lint
-  commands:
-  - markdownlint *.md
-  image: git.cryptic.systems/volker.raschek/markdownlint:0.44.0
-  resources:
-    limits:
-      cpu: 150
-      memory: 150M
-
-- name: email-notification
-  environment:
-    SMTP_FROM_ADDRESS:
-      from_secret: smtp_from_address
-    SMTP_FROM_NAME:
-      from_secret: smtp_from_name
-    SMTP_HOST:
-      from_secret: smtp_host
-    SMTP_USERNAME:
-      from_secret: smtp_username
-    SMTP_PASSWORD:
-      from_secret: smtp_password
-  image: git.cryptic.systems/volker.raschek/drone-email:0.1.5
-  resources:
-    limits:
-      cpu: 150
-      memory: 150M
-  when:
-    status:
-    - changed
-    - failure
-
-trigger:
-  event:
-    exclude:
-    - tag
-
----
-kind: pipeline
-type: docker
-name: dry-run-amd64
-
-clone:
-  disable: true
-
-depends_on:
-- linter
-
-platform:
-  os: linux
-  arch: amd64
-
-steps:
-- name: clone
-  image: git.cryptic.systems/volker.raschek/git:1.4.0
-
-- name: build
-  image: docker.io/plugins/docker:20.18.6
-  settings:
-    auto_tag: false
-    dockerfile: Dockerfile
-    dry_run: true
-    force_tag: true
-    no_cache: true
-    purge: true
-    mirror:
-      from_secret: docker_io_mirror
-    registry: git.cryptic.systems
-    repo: git.cryptic.systems/volker.raschek/build-image
-    tags: latest-amd64
-    username:
-      from_secret: git_cryptic_systems_container_registry_user
-    password:
-      from_secret: git_cryptic_systems_container_registry_password
-
-- name: email-notification
-  environment:
-    SMTP_FROM_ADDRESS:
-      from_secret: smtp_from_address
-    SMTP_FROM_NAME:
-      from_secret: smtp_from_name
-    SMTP_HOST:
-      from_secret: smtp_host
-    SMTP_USERNAME:
-      from_secret: smtp_username
-    SMTP_PASSWORD:
-      from_secret: smtp_password
-  image: git.cryptic.systems/volker.raschek/drone-email:0.1.5
-  when:
-    status:
-    - changed
-    - failure
-
-trigger:
-  branch:
-    exclude:
-    - master
-  event:
-  - pull_request
-  - push
-  repo:
-  - volker.raschek/build-image
-
----
-kind: pipeline
-type: docker
-name: latest-amd64
-
-clone:
-  disable: true
-
-depends_on:
-- linter
-
-platform:
-  os: linux
-  arch: amd64
-
-steps:
-- name: clone
-  image: git.cryptic.systems/volker.raschek/git:1.4.0
-
-- name: build
-  image: docker.io/plugins/docker:20.18.6
-  settings:
-    auto_tag: false
-    dockerfile: Dockerfile
-    force_tag: true
-    no_cache: true
-    purge: true
-    mirror:
-      from_secret: docker_io_mirror
-    registry: git.cryptic.systems
-    repo: git.cryptic.systems/volker.raschek/build-image
-    tags: latest-amd64
-    username:
-      from_secret: git_cryptic_systems_container_registry_user
-    password:
-      from_secret: git_cryptic_systems_container_registry_password
-
-- name: email-notification
-  environment:
-    SMTP_FROM_ADDRESS:
-      from_secret: smtp_from_address
-    SMTP_FROM_NAME:
-      from_secret: smtp_from_name
-    SMTP_HOST:
-      from_secret: smtp_host
-    SMTP_USERNAME:
-      from_secret: smtp_username
-    SMTP_PASSWORD:
-      from_secret: smtp_password
-  image: git.cryptic.systems/volker.raschek/drone-email:0.1.5
-  when:
-    status:
-    - changed
-    - failure
-
-trigger:
-  branch:
-  - master
-  event:
-  - cron
-  - push
-  repo:
-  - volker.raschek/build-image
-
----
-kind: pipeline
-type: kubernetes
-name: latest-manifest
-
-clone:
-  disable: true
-
-depends_on:
-- latest-amd64
-
-# docker.io/plugins/manifest only for amd64 architectures available
-node_selector:
-  kubernetes.io/os: linux
-  kubernetes.io/arch: amd64
-
-steps:
-- name: clone
-  image: git.cryptic.systems/volker.raschek/git:1.4.0
-
-- name: build-manifest
-  image: docker.io/plugins/manifest:1.4.0
-  settings:
-    auto_tag: false
-    ignore_missing: true
-    spec: manifest.tmpl
-    username:
-      from_secret: git_cryptic_systems_container_registry_user
-    password:
-      from_secret: git_cryptic_systems_container_registry_password
-
-- name: email-notification
-  environment:
-    SMTP_FROM_ADDRESS:
-      from_secret: smtp_from_address
-    SMTP_FROM_NAME:
-      from_secret: smtp_from_name
-    SMTP_HOST:
-      from_secret: smtp_host
-    SMTP_USERNAME:
-      from_secret: smtp_username
-    SMTP_PASSWORD:
-      from_secret: smtp_password
-  image: git.cryptic.systems/volker.raschek/drone-email:0.1.5
-  resources:
-    limits:
-      cpu: 150
-      memory: 150M
-  when:
-    status:
-    - changed
-    - failure
-
-trigger:
-  branch:
-  - master
-  event:
-  - cron
-  - push
-  repo:
-  - volker.raschek/build-image
-
----
-kind: pipeline
-type: kubernetes
-name: latest-sync
-
-clone:
-  disable: true
-
-depends_on:
-- latest-manifest
-
-steps:
-- name: clone
-  image: git.cryptic.systems/volker.raschek/git:1.4.0
-
-- name: latest-sync
-  commands:
-  - skopeo sync --all --src=docker --src-creds=$SRC_CRED_USERNAME:$SRC_CRED_PASSWORD --dest=docker --dest-creds=$DEST_CRED_USERNAME:$DEST_CRED_PASSWORD git.cryptic.systems/volker.raschek/build-image docker.io/volkerraschek
-  environment:
-    SRC_CRED_USERNAME:
-      from_secret: git_cryptic_systems_container_registry_user
-    SRC_CRED_PASSWORD:
-      from_secret: git_cryptic_systems_container_registry_password
-    DEST_CRED_USERNAME:
-      from_secret: container_image_registry_user
-    DEST_CRED_PASSWORD:
-      from_secret: container_image_registry_password
-  image: quay.io/skopeo/stable:v1.18.0
-
-- name: email-notification
-  environment:
-    SMTP_FROM_ADDRESS:
-      from_secret: smtp_from_address
-    SMTP_FROM_NAME:
-      from_secret: smtp_from_name
-    SMTP_HOST:
-      from_secret: smtp_host
-    SMTP_USERNAME:
-      from_secret: smtp_username
-    SMTP_PASSWORD:
-      from_secret: smtp_password
-  image: git.cryptic.systems/volker.raschek/drone-email:0.1.5
-  resources:
-    limits:
-      cpu: 150
-      memory: 150M
-  when:
-    status:
-    - changed
-    - failure
-
-trigger:
-  branch:
-  - master
-  event:
-  - cron
-  - push
-  repo:
-  - volker.raschek/build-image
-
----
-kind: pipeline
-type: docker
-name: tagged-amd64
-
-clone:
-  disable: true
-
-platform:
-  os: linux
-  arch: amd64
-
-steps:
-- name: clone
-  image: git.cryptic.systems/volker.raschek/git:1.4.0
-
-- name: build
-  image: docker.io/plugins/docker:20.18.6
-  settings:
-    auto_tag: true
-    auto_tag_suffix: amd64
-    dockerfile: Dockerfile
-    force_tag: true
-    no_cache: true
-    purge: true
-    mirror:
-      from_secret: docker_io_mirror
-    registry: git.cryptic.systems
-    repo: git.cryptic.systems/volker.raschek/build-image
-    username:
-      from_secret: git_cryptic_systems_container_registry_user
-    password:
-      from_secret: git_cryptic_systems_container_registry_password
-
-- name: email-notification
-  environment:
-    SMTP_FROM_ADDRESS:
-      from_secret: smtp_from_address
-    SMTP_FROM_NAME:
-      from_secret: smtp_from_name
-    SMTP_HOST:
-      from_secret: smtp_host
-    SMTP_USERNAME:
-      from_secret: smtp_username
-    SMTP_PASSWORD:
-      from_secret: smtp_password
-  image: git.cryptic.systems/volker.raschek/drone-email:0.1.5
-  when:
-    status:
-    - changed
-    - failure
-
-trigger:
-  event:
-  - tag
-  repo:
-  - volker.raschek/build-image
-
----
-kind: pipeline
-type: kubernetes
-name: tagged-manifest
-
-clone:
-  disable: true
-
-depends_on:
-- tagged-amd64
-
-# docker.io/plugins/manifest only for amd64 architectures available
-node_selector:
-  kubernetes.io/os: linux
-  kubernetes.io/arch: amd64
-
-steps:
-- name: clone
-  image: git.cryptic.systems/volker.raschek/git:1.4.0
-
-- name: build-manifest
-  image: docker.io/plugins/manifest:1.4.0
-  settings:
-    auto_tag: true
-    ignore_missing: true
-    spec: manifest.tmpl
-    username:
-      from_secret: git_cryptic_systems_container_registry_user
-    password:
-      from_secret: git_cryptic_systems_container_registry_password
-
-- name: email-notification
-  environment:
-    SMTP_FROM_ADDRESS:
-      from_secret: smtp_from_address
-    SMTP_FROM_NAME:
-      from_secret: smtp_from_name
-    SMTP_HOST:
-      from_secret: smtp_host
-    SMTP_USERNAME:
-      from_secret: smtp_username
-    SMTP_PASSWORD:
-      from_secret: smtp_password
-  image: git.cryptic.systems/volker.raschek/drone-email:0.1.5
-  resources:
-    limits:
-      cpu: 150
-      memory: 150M
-  when:
-    status:
-    - changed
-    - failure
-
-trigger:
-  event:
-  - tag
-  repo:
-  - volker.raschek/build-image
-
----
-kind: pipeline
-type: kubernetes
-name: tagged-sync
-
-clone:
-  disable: true
-
-depends_on:
-- tagged-manifest
-
-steps:
-- name: clone
-  image: git.cryptic.systems/volker.raschek/git:1.4.0
-
-- name: tagged-sync
-  commands:
-  - skopeo sync --all --src=docker --src-creds=$SRC_CRED_USERNAME:$SRC_CRED_PASSWORD --dest=docker --dest-creds=$DEST_CRED_USERNAME:$DEST_CRED_PASSWORD git.cryptic.systems/volker.raschek/build-image docker.io/volkerraschek
-  environment:
-    SRC_CRED_USERNAME:
-      from_secret: git_cryptic_systems_container_registry_user
-    SRC_CRED_PASSWORD:
-      from_secret: git_cryptic_systems_container_registry_password
-    DEST_CRED_USERNAME:
-      from_secret: container_image_registry_user
-    DEST_CRED_PASSWORD:
-      from_secret: container_image_registry_password
-  image: quay.io/skopeo/stable:v1.18.0
-
-- name: email-notification
-  environment:
-    SMTP_FROM_ADDRESS:
-      from_secret: smtp_from_address
-    SMTP_FROM_NAME:
-      from_secret: smtp_from_name
-    SMTP_HOST:
-      from_secret: smtp_host
-    SMTP_USERNAME:
-      from_secret: smtp_username
-    SMTP_PASSWORD:
-      from_secret: smtp_password
-  image: git.cryptic.systems/volker.raschek/drone-email:0.1.5
-  resources:
-    limits:
-      cpu: 150
-      memory: 150M
-  when:
-    status:
-    - changed
-    - failure
-
-trigger:
-  event:
-  - tag
-  repo:
-  - volker.raschek/build-image
diff --git a/.gitea/workflows/markdown-linters.yaml b/.gitea/workflows/markdown-linters.yaml
new file mode 100644
index 0000000..ae3f47a
--- /dev/null
+++ b/.gitea/workflows/markdown-linters.yaml
@@ -0,0 +1,22 @@
+name: 'Lint Markdown files'
+
+on:
+  pull_request:
+    types:
+    - opened
+    - reopened
+    - synchronize
+  push:
+    branches:
+    - master
+  workflow_dispatch: {}
+
+jobs:
+  markdown-lint:
+    runs-on:
+    - ubuntu-latest
+    steps:
+    - uses: actions/checkout@v4.2.2
+    - uses: DavidAnson/markdownlint-cli2-action@v19.1.0
+      with:
+        globs: '**/*.md'
diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml
new file mode 100644
index 0000000..74e7859
--- /dev/null
+++ b/.gitea/workflows/release.yaml
@@ -0,0 +1,52 @@
+name: Release
+
+on:
+  push:
+    branches:
+      - master
+
+jobs:
+  push-amd64:
+    runs-on: ubuntu-latest-amd64
+    steps:
+      - uses: actions/checkout@v4.2.2
+      - uses: docker/setup-qemu-action@v3.6.0
+      - uses: docker/setup-buildx-action@v3.10.0
+
+      - uses: docker/login-action@v3.4.0
+        with:
+          registry: git.cryptic.systems
+          username: ${{ github.repository_owner }}
+          password: ${{ secrets.GIT_CRYPTIC_SYSTEMS_PACKAGE_REGISTRY_TOKEN }}
+
+      - name: Build and push image
+        run: |
+          TAG=$(echo ${{ github.ref_name }} | sed 's/v//gm')
+
+          docker buildx build \
+            --file Dockerfile \
+            --platform linux/amd64 \
+            --provenance false \
+            --push \
+            --tag git.cryptic.systems/volker.raschek/build-image:${TAG} \
+            .
+
+  sync-to-hub-docker-io:
+    needs:
+    - push-manifest
+    runs-on: ubuntu-latest
+    steps:
+    - name: Copy images to docker.io
+      run: |
+        TAG=$(echo ${{ github.ref_name }} | sed 's/v//gm')
+
+        apt-get update --yes
+        apt-get install --yes skopeo
+        skopeo copy \
+          --all \
+          --dest-password ${{ secrets.DOCKER_IO_PASSWORD }} \
+          --dest-username ${{ secrets.DOCKER_IO_USERNAME }} \
+          --src-password ${{ secrets.GIT_CRYPTIC_SYSTEMS_PACKAGE_REGISTRY_TOKEN }} \
+          --src-username volker.raschek \
+            docker://git.cryptic.systems/volker.raschek/build-image:${TAG} \
+            docker://docker.io/volkerraschek/build-image:${TAG}
\ No newline at end of file
diff --git a/.gitea/workflows/update-docker-hub-description.yaml b/.gitea/workflows/update-docker-hub-description.yaml
new file mode 100644
index 0000000..95588b8
--- /dev/null
+++ b/.gitea/workflows/update-docker-hub-description.yaml
@@ -0,0 +1,22 @@
+name: Update Docker Hub Description
+
+on:
+  push:
+    branches:
+    - master
+    paths:
+    - README.md
+  workflow_dispatch: {}
+
+jobs:
+  update-description-on-hub-docker-io:
+    runs-on:
+    - ubuntu-latest
+    steps:
+    - uses: actions/checkout@v4.2.2
+    - uses: peter-evans/dockerhub-description@v4.0.2
+      with:
+        username: ${{ secrets.DOCKER_IO_USERNAME }}
+        password: ${{ secrets.DOCKER_IO_PASSWORD }}
+        repository: volkerraschek/build-image
+        readme-filepath: README.md
\ No newline at end of file
diff --git a/manifest.tmpl b/manifest.tmpl
deleted file mode 100644
index 0f67fee..0000000
--- a/manifest.tmpl
+++ /dev/null
@@ -1,14 +0,0 @@
-image: git.cryptic.systems/volker.raschek/build-image:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}}
-{{#if build.tags}}
-tags:
-{{#each build.tags}}
-  - {{this}}
-{{/each}}
-  - "latest"
-{{/if}}
-manifests:
-  -
-    image: git.cryptic.systems/volker.raschek/build-image:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}}-amd64
-    platform:
-      architecture: amd64
-      os: linux
\ No newline at end of file