diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 00000000..4beed15e
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,38 @@
+name: Create Releases
+on:
+  push:
+    # Eventually run this only on release branches
+    # branches:
+    #  - 'releases/**'
+
+env:
+  CARGO_TERM_COLOR: always
+  CARGO_NET_GIT_FETCH_WITH_CLI: true
+
+jobs:
+  release-linux:
+    name: Release Linux
+    runs-on: ubuntu-22.04
+    steps:
+    - uses: actions/checkout@v3
+
+    - name: Install dependencies
+      run: |
+        sudo apt-get update
+        sudo apt-get install -y libudev-dev libasound2-dev
+
+    - name: Setup Rust toolchain
+      run: rustup show
+
+    - uses: ruby/setup-ruby@v1
+      with:
+        ruby-version: '3.1'
+
+    - name: Build Linux tool and create deb
+      run: ./release/release.sh
+
+    - name: Upload Linux deb
+      uses: actions/upload-artifact@v3
+      with:
+        name: framework-inputmodule-rs-0.0.1.deb
+        path: release/framework-inputmodule-rs-0.0.1.deb
diff --git a/release/framework-inputmodule-rs.service b/release/framework-inputmodule-rs.service
new file mode 100644
index 00000000..14539e31
--- /dev/null
+++ b/release/framework-inputmodule-rs.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=framework-inputmodule-rs runs Framework Laptop 16 input modules and keeps their firmware up to date
+
+[Service]
+ExecStart=/usr/bin/framework-inputmodule-rs led-matrix --clock
+
+[Install]
+WantedBy=multi-user.target
diff --git a/release/postinstall.sh b/release/postinstall.sh
new file mode 100755
index 00000000..4df223d1
--- /dev/null
+++ b/release/postinstall.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+cp -u ./ledmatrix/50-framework.rules /etc/udev/rules.d/
diff --git a/release/release.sh b/release/release.sh
new file mode 100755
index 00000000..9fa7bf84
--- /dev/null
+++ b/release/release.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+set -euxo pipefail
+
+: 'Checking for fpm Ruby gem, installing if not present'
+installed=`gem list -i fpm` || true
+
+if [ $installed = 'false' ]; then
+  gem install fpm
+fi
+
+: 'Running the build'
+cargo build --target x86_64-unknown-linux-gnu -p inputmodule-control
+
+: "Packaging"
+fpm \
+  -s dir -t deb \
+  -p release/framework-inputmodule-rs-0.0.1.deb \
+  --name framework-inputmodule-rs \
+  --version 0.0.1 \
+  --architecture all \
+  --description "framework-inputmodule-rs runs Framework Laptop 16 input modules and keeps their firmware up to date" \
+  --url "https://frame.work" \
+  --maintainer "Framework <support@frame.work>" \
+  --deb-systemd ./release/framework-inputmodule-rs.service \
+  --deb-systemd-enable \
+  --deb-systemd-auto-start \
+  --deb-systemd-restart-after-upgrade \
+  --after-install ./release/postinstall.sh \
+  target/x86_64-unknown-linux-gnu/debug/inputmodule-control=/usr/bin/framework-inputmodule-rs
+
+: 'Packaging successful, install with "sudo dpkg -i <pkg-name>.deb"'