diff --git a/.github/workflows/release-feature.yml b/.github/workflows/release-feature.yml
new file mode 100644
index 0000000..558cd4f
--- /dev/null
+++ b/.github/workflows/release-feature.yml
@@ -0,0 +1,45 @@
+name: "Release dev-container feature"
+on: workflow_dispatch
+
+jobs:
+  update-docs:
+    runs-on: ubuntu-latest
+    permissions:
+      contents: write
+    steps:
+      -
+        name: "Checkout"
+        uses: actions/checkout@v3
+      -
+        name: "Generate docs"
+        uses: devcontainers/action@v1
+        with:
+          base-path-to-features: "./features"
+          generate-docs: true
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      -
+        name: "Commit docs if changed"
+        uses: stefanzweifel/git-auto-commit-action@v4
+        with:
+          commit_message: "Update docs"
+          file_pattern: "features/**/README.md"
+
+  release:
+    runs-on: ubuntu-latest
+    needs: update-docs
+    permissions:
+      contents: write
+      packages: write
+    steps:
+      -
+        name: "Checkout"
+        uses: actions/checkout@v3
+      -
+        name: "Build and release"
+        uses: devcontainers/action@v1
+        with:
+          base-path-to-features: "./features"
+          publish-features: true
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/validate-feature.yml b/.github/workflows/validate-feature.yml
new file mode 100644
index 0000000..3d7124e
--- /dev/null
+++ b/.github/workflows/validate-feature.yml
@@ -0,0 +1,19 @@
+name: "Validate dev-container feature"
+on:
+  push:
+    paths:
+      - 'features/**'
+
+jobs:
+  validate:
+    runs-on: ubuntu-latest
+    steps:
+      -
+        name: "Checkout"
+        uses: actions/checkout@v3
+      -
+        name: "Build"
+        uses: devcontainers/action@v1
+        with:
+          base-path-to-features: "./features"
+          validate-only: true