SLING-12505
diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml
new file mode 100644
index 0000000..2635155
--- /dev/null
+++ b/.github/workflows/main-build.yml
@@ -0,0 +1,85 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+name: Main Build
+
+on:
+  workflow_call:
+    inputs:
+      maven-version:
+        description: The Maven version to use
+        required: false
+        default: '3.9.9'
+        type: string
+
+# allow single build per branch or PR
+concurrency:
+  group: ${{ github.workflow }}-${{ github.ref }}
+  cancel-in-progress: true
+
+# clare all permissions for GITHUB_TOKEN
+permissions: {}
+
+jobs:
+
+  prepare:
+    name: Preparation steps
+    runs-on: ubuntu-latest
+    # transfer from steps output to job output
+    outputs:
+      jdks: ${{ steps.read-module-descriptor.outputs.jdks }}
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          persist-credentials: false
+      # this reads the module descriptor 
+      - name: Read .sling-module.json
+        id: read-module-descriptor
+        run: |
+          {
+            echo 'SLING_MODULE<<EOF'
+            cat ./sling-module.json
+            echo EOF
+          } >> "$GITHUB_ENV"
+      # ...and stores relevant pieces in the step outputs
+      - name: Populate env with parsed data
+        run: |
+          # evaluate json https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/evaluate-expressions-in-workflows-and-actions#fromjson 
+          echo jdks=${{fromJson(steps.read-module-descriptor.outputs.SLING_MODULE).jenkins.jdks}} >> $GITHUB_ENV
+      
+  # prepare matrix data for verify step
+  build:
+    runs-on: ubuntu-latest
+    needs: prepare
+    
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          persist-credentials: false
+      - name: Set up JDK
+        uses: actions/setup-java@v4
+        with:
+          java-version: ${{needs.prepare.outputs.jdks}}
+          distribution: 'temurin'
+          cache: 'maven'
+      - name: Set up Maven
+        # https://maven.apache.org/wrapper/#using-a-different-version-of-maven
+        run: mvn --errors --batch-mode --show-version org.apache.maven.plugins:maven-wrapper-plugin:3.3.2:wrapper "-Dmaven=${{ inputs.maven-version}}"
+
+      - name: Build with Maven
+        run: ./mvnw --errors --batch-mode --show-version clean verify
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e98980b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,61 @@
+# Apache Sling Shared GitHub Actions
+
+## Usage
+
+Create GitHub workflow in project file:
+
+```
+.github/workflows/main-build.yml
+```
+
+ with content:
+
+```yaml
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+name: Verify
+
+on:
+  push:
+  pull_request:
+
+jobs:
+  build:
+    name: Verify
+    uses: apache/sling-github-tooling/.github/workflows/main-build@v1
+
+```
+
+## Configuration
+
+The [Sling module descriptor](https://cwiki.apache.org/confluence/display/SLING/Sling+module+descriptor) with name `.sling-module.json` is evaluated and used for parameterizing the build.
+
+## Versioning
+
+The workflows maintained here follow semantic versioning, however this requires some thought when releasing (<https://devopsjournal.io/blog/2022/10/19/How-GitHub-Actions-versioning-works>) as this requires tags not being immutable and multiple tags potentially pointing to the same version.
+The notation `uses: <apache/sling-tooling-github/>.github/workflows/main-build.yml@<ref>` allows the following values for refs:
+
+1. SHA1 commit ids
+1. Tag Names
+1. Branch Names (same tag name takes precedence)
+
+# References
+
+1. [Workflow Syntax](https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions)
+1. [Reusing Workflows](https://docs.github.com/en/actions/sharing-automations/reusing-workflows)
+1. [Maven Shared GitHub Actions](https://github.com/apache/maven-gh-actions-shared)