diff --git a/travis/3-dry-run.md b/travis/3-dry-run.md
new file mode 100644
index 0000000..f0a3d87
--- /dev/null
+++ b/travis/3-dry-run.md
@@ -0,0 +1,120 @@
+# Perform a dry-run of a TravisCI pipeline
+
+In this lab you will use the `dry-run` command to convert a TravisCI pipeline to its equivalent GitHub Actions workflow.
+
+## Prerequisites
+
+1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment.
+2. Completed the [configure lab](./1-configure.md#configuring-credentials).
+3. Completed the [audit lab](./2-audit.md).
+
+## Perform a dry run
+
+You will be performing a dry-run against a TravisCI project. Answer the following questions before running this command:
+
+1. What pipeline do you want to convert?
+ - __ruby-example__. This is one of the sample projects avaiable in the TravisCI labs-data organization.
+
+2. Where do you want to store the result?
+ - __./tmp/dry-run-lab__. This can be any path within the working directory that Valet commands are executed from.
+
+### Steps
+
+1. Navigate to your codespace terminal.
+2. Run the following command from the root directory:
+
+ ```bash
+ gh valet dry-run travis-ci --travis-ci-repository "ruby-example" --output-dir tmp/travis/dry-run-lab
+ ```
+
+3. The command will list all the files written to disk when the command succeeds.
+
+ 
+
+4. View the converted workflow:
+ - Find `./tmp/travis/dry-run-lab` in the file explorer pane in your codespace.
+ - Click `ruby-example.yml` to open.
+
+## Inspect the output files
+
+The files generated from the `dry-run` command represent the equivalent Actions workflow for the TravisCI project. The TravisCI configuration and converted workflow can be seen below:
+
+
+ TravisCI configuration 👇
+
+```yaml
+ language: ruby
+ sudo: false
+ dist: trusty
+ rvm:
+ - 1.9.3
+ - 2.0.0
+ - 2.1.0
+
+ install:
+ - gem install bundler
+
+ script:
+ - echo "hello!"
+
+ jobs:
+ include:
+ - script: echo "child"
+```
+
+
+
+
+ Converted workflow 👇
+
+```yaml
+ name: valet-travis-labs/ruby-example
+ on:
+ push:
+ branches:
+ - "**/*"
+ pull_request:
+ concurrency:
+ # # This item has no matching transformer
+ # maximum_number_of_builds: 0
+ jobs:
+ test:
+ runs-on: # this agent type is not supported: [[{"dist"=>"trusty"}]]
+ ubuntu-latest
+ steps:
+ - name: checkout
+ uses: actions/checkout@v2
+ - uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: "${{ matrix.rvm }}"
+ # # 'sudo' was not transformed because there is no suitable equivalent in GitHub Actions
+ - run: gem install bundler
+ - run: echo "hello!"
+ strategy:
+ matrix:
+ rvm:
+ - 1.9.3
+ - 2.0.0
+ - 2.1.0
+ test_2:
+ runs-on: # this agent type is not supported: [[{"dist"=>"trusty"}]]
+ ubuntu-latest
+ steps:
+ - name: checkout
+ uses: actions/checkout@v2
+ - uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: 1.9.3
+ # # 'sudo' was not transformed because there is no suitable equivalent in GitHub Actions
+ - run: gem install bundler
+ - run: echo "child"
+
+```
+
+
+
+Despite these two pipelines using different syntax they will function equivalently.
+
+## Next lab
+
+[Use custom transformers to customize Valet's behavior](./4-custom-transformers.md)