add a --force parameter to build.js to force a specific commit build/queue.
diff --git a/README.md b/README.md
index 555c436..c5286b8 100644
--- a/README.md
+++ b/README.md
@@ -30,6 +30,13 @@
   - when it detects a new commit, it will run through and wrap up the Cordova test suite, [mobile-spec](http://github.com/apache/cordova-mobile-spec), in each platform implementation currently supported
   - this version of [mobile-spec](http://github.com/apache/cordova-mobile-spec) will save results to couchdb
 
+## Usage
+
+### build.js
+
+- Run `node build.js` without parameters to listen to new commits coming into the Apache Cordova project and build tests for these new commits. Will also scan your machine for all connected and supported mobile devices and compare with the couch datastore, and queue any builds for any device+library commit combination that is missing from the datastore.
+- Run `node build.js --force=<platform>@<sha>`, where `<platform>` equals one of `android` or `ios`, and `<sha>` is a valid commit SHA, tag or branch for that platform's git repository.
+
 ## Supported Platforms
 
 - Android
diff --git a/build.js b/build.js
index 41499cc..537c59b 100644
--- a/build.js
+++ b/build.js
@@ -6,6 +6,7 @@
     libraries     = require('./libraries'),
     n             = require('ncallbacks'),
     bootstrap     = require('./bootstrap'),
+    argv          = require('optimist').argv,
     queue         = require('./src/build/queue');
 
 // Clean out temp directory, where we keep our generated apps
@@ -13,6 +14,30 @@
 shell.rm('-rf', temp);
 shell.mkdir(temp);
 
+// Sanitize/check parameters if we are forcing a build.
+if (argv.force) {
+    if (argv.force.indexOf('@') == -1) {
+        console.error(['--force takes a parameter of the form <platform>@<sha>, where:',
+                       '  <platform> - one of android, blackberry or ios',
+                       '  <sha> - a string representing a particular commit SHA for the specified platform'].join('\n'));
+        process.exit(1);
+    } else {
+        var params = argv.force.split('@');
+        var platform = params[0];
+        var sha = params[1];
+        if (!(('cordova-' + platform) in libraries.paths)) {
+            console.error('--force parameter platform "' + platform + '" not recognized.');
+            process.exit(1);
+        } else {
+            var res = shell.exec('cd ' + libraries.paths['cordova-' + platform] + ' && git branch --contains ' + sha, {silent:true});
+            if (res.code > 0) {
+                console.error('--force parameter SHA "' + sha + '" not found in cordova-' + platform);
+                process.exit(1);
+            }
+        }
+    }
+}
+
 bootstrap.go(function() {
     // on new commits, queue builds for relevant projects.
     var apache_url = "http://urd.zones.apache.org:2069/json";
@@ -21,78 +46,88 @@
     gitpubsub.pipe(apache_parser);
     console.log('[MEDIC] Now listening to Apache git commits from ' + apache_url);
 
-    // Look at results for specific devices of recent commits. Compare to connected devices. See which are missing from server. Queue those builds.
-    // TODO: figure out ios device scanning. issue: determine what model and version connected ios devices are running. until then, we can't queue ios builds on devices that we are missing results for, so we look at ios commits with no results and queue those up.
-    var ms = 'cordova-mobile-spec';
-    for (var lib in libraries.paths) if (libraries.paths.hasOwnProperty(lib) && lib != ms) (function(repo) {
-        var platform = repo.substr(repo.indexOf('-')+1);
-        couch.cordova_commits.get(repo, function(err, commits_doc) {
-            var commits = commits_doc.shas;
-            if (repo == 'cordova-ios') {
-                // look at latest commits and see which ones have no results
-                commits.forEach(function(commit) {
-                    couch.mobilespec_results.query_view('results', 'ios?key="' + commit + '"', function(error, result) {
-                        if (error) {
-                            console.error('[COUCH] Failed to retrieve iOS results for sha ' + commit.substr(0,7) + ', continuing.');
-                        } else {
-                            if (result.rows.length === 0) {
-                                // no results, queue the job!
-                                var job = {
-                                    'cordova-ios':{
-                                        'sha':commit
-                                    }
-                                };
-                                queue.push(job);
+    if (argv.force && platform && sha) {
+        console.log('[QUEUE] Forcing build of cordova-' + platform + '@' + sha);
+        var job = {};
+        job['cordova-' + platform] = {
+            'sha':sha
+        };
+        queue.push(job);
+    } else {
+        console.log('[MEDIC] Querying local devices and queueing builds (if applicable)...');
+        // Look at results for specific devices of recent commits. Compare to connected devices. See which are missing from server. Queue those builds.
+        // TODO: figure out ios device scanning. issue: determine what model and version connected ios devices are running. until then, we can't queue ios builds on devices that we are missing results for, so we look at ios commits with no results and queue those up.
+        var ms = 'cordova-mobile-spec';
+        for (var lib in libraries.paths) if (libraries.paths.hasOwnProperty(lib) && lib != ms) (function(repo) {
+            var platform = repo.substr(repo.indexOf('-')+1);
+            couch.cordova_commits.get(repo, function(err, commits_doc) {
+                var commits = commits_doc.shas;
+                if (repo == 'cordova-ios') {
+                    // look at latest commits and see which ones have no results
+                    commits.forEach(function(commit) {
+                        couch.mobilespec_results.query_view('results', 'ios?key="' + commit + '"', function(error, result) {
+                            if (error) {
+                                console.error('[COUCH] Failed to retrieve iOS results for sha ' + commit.substr(0,7) + ', continuing.');
+                            } else {
+                                if (result.rows.length === 0) {
+                                    // no results, queue the job!
+                                    var job = {
+                                        'cordova-ios':{
+                                            'sha':commit
+                                        }
+                                    };
+                                    queue.push(job);
+                                }
+                            }
+                        });
+                    });
+                } else {
+                    // scan for devices for said platform
+                    var platform_scanner = require('./src/build/makers/' + platform + '/devices');
+                    var platform_builder = require('./src/build/makers/' + platform);
+                    platform_scanner(function(err, devices) {
+                        if (err) console.log('[BUILD] Error scanning for ' + platform + ' devices: ' + devices);
+                        else {
+                            var numDs = 0;
+                            for (var d in devices) if (devices.hasOwnProperty(d)) numDs++;
+                            if (numDs > 0) {
+                                commits.forEach(function(commit) {
+                                    var job = {};
+                                    var targets = 0;
+                                    job[repo] = {
+                                        sha:commit,
+                                        numDevices:0,
+                                        devices:{}
+                                    };
+                                    var end = n(numDs, function() {
+                                        if (targets > 0) {
+                                            job[repo].numDevices = targets;
+                                            queue.push(job);
+                                        }
+                                    });
+                                    for (var d in devices) if (devices.hasOwnProperty(d)) (function(id) {
+                                        var device = devices[id];
+                                        var version = device.version;
+                                        var model = device.model;
+                                        var couch_id = platform + '__' + commit + '__' + version + '__' + model;
+                                        couch.mobilespec_results.get(couch_id, function(err, res_doc) {
+                                            if (err && res_doc == 404) {
+                                                // Don't have results for this device!
+                                                targets++;
+                                                job[repo].devices[id] = {
+                                                    version:version,
+                                                    model:model
+                                                }; 
+                                            }
+                                            end();
+                                        });
+                                    }(d));
+                                });
                             }
                         }
                     });
-                });
-            } else {
-                // scan for devices for said platform
-                var platform_scanner = require('./src/build/makers/' + platform + '/devices');
-                var platform_builder = require('./src/build/makers/' + platform);
-                platform_scanner(function(err, devices) {
-                    if (err) console.log('[BUILD] Error scanning for ' + platform + ' devices: ' + devices);
-                    else {
-                        var numDs = 0;
-                        for (var d in devices) if (devices.hasOwnProperty(d)) numDs++;
-                        if (numDs > 0) {
-                            commits.forEach(function(commit) {
-                                var job = {};
-                                var targets = 0;
-                                job[repo] = {
-                                    sha:commit,
-                                    numDevices:0,
-                                    devices:{}
-                                };
-                                var end = n(numDs, function() {
-                                    if (targets > 0) {
-                                        job[repo].numDevices = targets;
-                                        queue.push(job);
-                                    }
-                                });
-                                for (var d in devices) if (devices.hasOwnProperty(d)) (function(id) {
-                                    var device = devices[id];
-                                    var version = device.version;
-                                    var model = device.model;
-                                    var couch_id = platform + '__' + commit + '__' + version + '__' + model;
-                                    couch.mobilespec_results.get(couch_id, function(err, res_doc) {
-                                        if (err && res_doc == 404) {
-                                            // Don't have results for this device!
-                                            targets++;
-                                            job[repo].devices[id] = {
-                                                version:version,
-                                                model:model
-                                            }; 
-                                        }
-                                        end();
-                                    });
-                                }(d));
-                            });
-                        }
-                    }
-                });
-            }
-        });
-    })(lib);
+                }
+            });
+        })(lib);
+    }
 });
diff --git a/package.json b/package.json
index 42b825b..c6fff47 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "medic",
-  "version": "0.1.11",
+  "version": "0.1.12",
   "description": "continuous integration setup for Apache Cordova",
   "author": "Fil Maj <maj.fil@gmail.com> (http://filmaj.ca)",
   "main": "dashboard.js",
@@ -12,7 +12,8 @@
     "request": "2.12.0",
     "follow": "0.8.0",
     "ncallbacks": "1.0.0",
-    "mime": "1.2.9"
+    "mime": "1.2.9",
+    "optimist":"0.3.5"
   },
   "devDependencies": {
     "elementtree": "0.1.4",
diff --git a/src/dashboard/templates/css/medic.css b/src/dashboard/templates/css/medic.css
index 85a2d7a..a4be918 100644
--- a/src/dashboard/templates/css/medic.css
+++ b/src/dashboard/templates/css/medic.css
@@ -26,8 +26,8 @@
     background: url('/img/platforms.svg') 0 0 no-repeat;
 }
 td.pie_chart {
-    height:275px;
-    width:420px;
+    height:300px;
+    width:430px;
 }
 td.percentage img {
     margin-top:5px;