diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3fe893406e52d7a8afdd92c2850c1b481ce1cf7a
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,47 @@
+name: Rust CI
+
+on:
+  push:
+    branches:
+      - main
+  pull_request:
+  workflow_dispatch:
+
+jobs:
+  fmt:
+    runs-on: ubuntu-latest
+    if: "!contains(github.event.head_commit.message, 'draft:') && !contains(github.event.head_commit.message, 'no-ci:')"
+    steps:
+      - uses: actions/checkout@v3
+      - name: Set up Rust
+        uses: actions-rs/toolchain@v1
+        with:
+          toolchain: stable
+      - name: Run fmt check
+        run: make fmt-check
+
+  test:
+    runs-on: ubuntu-latest
+    env:
+      NUSHELL_ARCH: 'x86_64-unknown-linux-musl'
+      NUSHELL_VERSION: '0.95.0'
+    needs: fmt
+    if: "!contains(github.event.head_commit.message, 'draft:') && !contains(github.event.head_commit.message, 'no-ci:')"
+    steps:
+      - uses: actions/checkout@v3
+      - name: Install dependencies
+        run: |
+          sudo apt update --yes
+          sudo apt upgrade --yes
+          sudo apt install protobuf-compiler --yes
+      - name: Install Nushell
+        run: |
+          curl -fLo /tmp/nu.tar.gz "https://github.com/nushell/nushell/releases/download/$NUSHELL_VERSION/nu-$NUSHELL_VERSION-$NUSHELL_ARCH.tar.gz"
+          tar xvf /tmp/nu.tar.gz --directory /tmp
+          cp "/tmp/nu-$NUSHELL_VERSION-$NUSHELL_ARCH/nu" /tmp/nu
+          echo "PATH=/tmp/:$PATH" >> $GITHUB_ENV
+      - name: Show configuration
+        run: make show
+      - name: Run tests
+        run: |
+          make check clippy test example