diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..73833e5
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,24 @@
+language: dart
+
+dart:
+  - dev
+  - stable
+
+dart_task:
+  - test
+
+matrix:
+  include:
+    # Only validate formatting using the dev release
+    - dart: dev
+      dart_task: dartfmt
+    - dart: dev
+      dart_task: analyzer
+
+# Only building master means that we don't run two builds for each pull request.
+branches:
+  only: [master]
+
+cache:
+ directories:
+   - $HOME/.pub-cache
diff --git a/lib/shelf_web_socket.dart b/lib/shelf_web_socket.dart
index 3d376aa..9c9239d 100644
--- a/lib/shelf_web_socket.dart
+++ b/lib/shelf_web_socket.dart
@@ -38,12 +38,12 @@
 /// See also the WebSocket spec's discussion of [origin considerations][].
 ///
 /// [origin considerations]: https://tools.ietf.org/html/rfc6455#section-10.2
-Handler webSocketHandler(Function onConnection, {Iterable<String> protocols,
-      Iterable<String> allowedOrigins}) {
+Handler webSocketHandler(Function onConnection,
+    {Iterable<String> protocols, Iterable<String> allowedOrigins}) {
   if (protocols != null) protocols = protocols.toSet();
   if (allowedOrigins != null) {
-    allowedOrigins = allowedOrigins
-        .map((origin) => origin.toLowerCase()).toSet();
+    allowedOrigins =
+        allowedOrigins.map((origin) => origin.toLowerCase()).toSet();
   }
 
   if (onConnection is! _BinaryFunction) {
diff --git a/lib/src/web_socket_handler.dart b/lib/src/web_socket_handler.dart
index b8f94a2..05b7bb4 100644
--- a/lib/src/web_socket_handler.dart
+++ b/lib/src/web_socket_handler.dart
@@ -26,8 +26,8 @@
 
     var connection = request.headers['Connection'];
     if (connection == null) return _notFound();
-    var tokens = connection.toLowerCase().split(',')
-        .map((token) => token.trim());
+    var tokens =
+        connection.toLowerCase().split(',').map((token) => token.trim());
     if (!tokens.contains('upgrade')) return _notFound();
 
     var upgrade = request.headers['Upgrade'];
@@ -58,7 +58,8 @@
     // unexpected origins, we ensure that malicious JavaScript is unable to fake
     // a WebSocket handshake.
     var origin = request.headers['Origin'];
-    if (origin != null && _allowedOrigins != null &&
+    if (origin != null &&
+        _allowedOrigins != null &&
         !_allowedOrigins.contains(origin.toLowerCase())) {
       return _forbidden('invalid origin "$origin".');
     }
@@ -66,8 +67,7 @@
     var protocol = _chooseProtocol(request);
     request.hijack((channel) {
       var sink = UTF8.encoder.startChunkedConversion(channel.sink);
-      sink.add(
-          "HTTP/1.1 101 Switching Protocols\r\n"
+      sink.add("HTTP/1.1 101 Switching Protocols\r\n"
           "Upgrade: websocket\r\n"
           "Connection: Upgrade\r\n"
           "Sec-WebSocket-Accept: ${WebSocketChannel.signKey(key)}\r\n");
@@ -97,20 +97,20 @@
   }
 
   /// Returns a 404 Not Found response.
-  Response _notFound() => _htmlResponse(404, "404 Not Found",
-      "Only WebSocket connections are supported.");
+  Response _notFound() => _htmlResponse(
+      404, "404 Not Found", "Only WebSocket connections are supported.");
 
   /// Returns a 400 Bad Request response.
   ///
   /// [message] will be HTML-escaped before being included in the response body.
-  Response _badRequest(String message) => _htmlResponse(400, "400 Bad Request",
-      "Invalid WebSocket upgrade request: $message");
+  Response _badRequest(String message) => _htmlResponse(
+      400, "400 Bad Request", "Invalid WebSocket upgrade request: $message");
 
   /// Returns a 403 Forbidden response.
   ///
   /// [message] will be HTML-escaped before being included in the response body.
-  Response _forbidden(String message) => _htmlResponse(403, "403 Forbidden",
-      "WebSocket upgrade refused: $message");
+  Response _forbidden(String message) => _htmlResponse(
+      403, "403 Forbidden", "WebSocket upgrade refused: $message");
 
   /// Creates an HTTP response with the given [statusCode] and an HTML body with
   /// [title] and [message].
diff --git a/test/web_socket_test.dart b/test/web_socket_test.dart
index b061c04..6b83d94 100644
--- a/test/web_socket_test.dart
+++ b/test/web_socket_test.dart
@@ -10,11 +10,11 @@
 import 'package:test/test.dart';
 
 Map<String, String> get _handshakeHeaders => {
-  "Upgrade": "websocket",
-  "Connection": "Upgrade",
-  "Sec-WebSocket-Key": "x3JJHMbDL1EzLkh9GBhXDw==",
-  "Sec-WebSocket-Version": "13"
-};
+      "Upgrade": "websocket",
+      "Connection": "Upgrade",
+      "Sec-WebSocket-Key": "x3JJHMbDL1EzLkh9GBhXDw==",
+      "Sec-WebSocket-Version": "13"
+    };
 
 void main() {
   test("can communicate with a dart:io WebSocket client", () async {
@@ -49,14 +49,16 @@
   });
 
   test("negotiates the sub-protocol", () async {
-    var server = await shelf_io.serve(webSocketHandler((webSocket, protocol) {
-      expect(protocol, equals("two"));
-      webSocket.sink.close();
-    }, protocols: ["three", "two", "x"]), "localhost", 0);
+    var server = await shelf_io.serve(
+        webSocketHandler((webSocket, protocol) {
+          expect(protocol, equals("two"));
+          webSocket.sink.close();
+        }, protocols: ["three", "two", "x"]),
+        "localhost",
+        0);
 
     try {
-      var webSocket = await WebSocket.connect(
-          'ws://localhost:${server.port}',
+      var webSocket = await WebSocket.connect('ws://localhost:${server.port}',
           protocols: ["one", "two", "three"]);
       expect(webSocket.protocol, equals("two"));
       return webSocket.close();
@@ -69,9 +71,12 @@
     var server;
     var url;
     setUp(() async {
-      server = await shelf_io.serve(webSocketHandler((webSocket) {
-        webSocket.sink.close();
-      }, allowedOrigins: ["pub.dartlang.org", "GoOgLe.CoM"]), "localhost", 0);
+      server = await shelf_io.serve(
+          webSocketHandler((webSocket) {
+            webSocket.sink.close();
+          }, allowedOrigins: ["pub.dartlang.org", "GoOgLe.CoM"]),
+          "localhost",
+          0);
       url = 'http://localhost:${server.port}/';
     });
 
@@ -173,7 +178,7 @@
 }
 
 Matcher hasStatus(int status) => completion(predicate((response) {
-  expect(response, new isInstanceOf<http.Response>());
-  expect(response.statusCode, equals(status));
-  return true;
-}));
+      expect(response, new isInstanceOf<http.Response>());
+      expect(response.statusCode, equals(status));
+      return true;
+    }));
