diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2e740cfad0ae837823fdf62021aea3a5e726e33f
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,51 @@
+language: rust
+
+matrix:
+  include:
+    - env: TARGET=x86_64-unknown-linux-gnu
+      rust: nightly
+
+    - env: TARGET=thumbv6m-none-eabi
+      rust: nightly
+      addons:
+        apt:
+          sources:
+            - debian-sid
+          packages:
+            - binutils-arm-none-eabi
+
+    - env: TARGET=thumbv7m-none-eabi
+      rust: nightly
+      addons:
+        apt:
+          sources:
+            - debian-sid
+          packages:
+            - binutils-arm-none-eabi
+
+before_install: set -e
+
+install:
+  - bash ci/install.sh
+
+script:
+  - bash ci/script.sh
+
+after_script: set +e
+
+cache: cargo
+before_cache:
+  # Travis can't cache files that are not readable by "others"
+  - chmod -R a+r $HOME/.cargo
+
+branches:
+  only:
+    # release tags
+    - /^v\d+\.\d+\.\d+.*$/
+    - auto
+    - master
+    - try
+
+notifications:
+  email:
+    on_success: never
diff --git a/ci/install.sh b/ci/install.sh
new file mode 100644
index 0000000000000000000000000000000000000000..4d5d56a45bb9563ed35d06665575322b4c392172
--- /dev/null
+++ b/ci/install.sh
@@ -0,0 +1,19 @@
+set -euxo pipefail
+
+main() {
+    case $TARGET in
+        thumb*m-none-eabi)
+            local vers=0.3.8
+
+            cargo install --list | grep "xargo v$vers" || \
+                ( cd .. && cargo install xargo -f --vers $vers )
+
+            rustup component list | grep 'rust-src.*installed' || \
+                rustup component add rust-src
+            ;;
+        *)
+            ;;
+    esac
+}
+
+main
diff --git a/ci/script.sh b/ci/script.sh
new file mode 100644
index 0000000000000000000000000000000000000000..e9ff7e38b9f350574d31a079eeb684e88a3f6d6c
--- /dev/null
+++ b/ci/script.sh
@@ -0,0 +1,12 @@
+set -euxo pipefail
+
+main() {
+    case $TARGET in
+        thumb*m-none-eabi)
+            xargo check --target $TARGET
+            ;;
+        *)
+            cargo check --target $TARGET
+            ;;
+    esac
+}