Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.

For the best experience please use the latest Chrome, Safari or Firefox browser.

Distributed Bug Tracking in the 21st Century

A Presentation By Dave MacFarlane

(Apologies for getting carried away with the CSS3.)

What is Distributed Bug Tracking?

Why Distributed Bug Tracking (BE)

Bugs and code that live on branches are tracked together—when a branch is merged, both the code changes and bug changes that the branch contains are merged alongside each other. We no longer have to be confused about whether a fix that is applied to the development branch but not yet present in the production branch means that our bug is "fixed".

Users can fully modify bug state while offline, unlike with many centralized bugtrackers.

When a user checks out your source code, she gets the current bug state for free.

-- Bugs Everywhere website

Why Distributed Bug Tracking (Dave)

By combining source control and issues on the same branch, bug lists become context sensitive, offline capable, and very fast.

It's much easier to drop things off and pick them up knowing all you need to do is run "bug list" to see what's unresolved on a branch.

Centralized bug trackers are good for tracking user problems with released products, but ill-suited to tracking the state of unreleased feature branches.

By being offline and commandline based, the tools are more flexible and scriptable.

Let's have a demo!

But first.. why didn't distributed bug tracking take off?

How is Dave's Distributed Bug Tracker ("bug") different?

/* Integrating With A Go App */

import (

func main() {
    b := bugs.New("I am a bug report")
    fmt.Fprintf(b, "I am detail, here me roar!\n");
    fmt.Fprintf(b, "More details!\n");

/* Recovering In An HTTP Handler Function*/

func handlerFunc(w ResponseWriter, r *http.Request) {
    defer func() {
        if r := recover(); r != nil {
            b := bugs.New(fmt.Sprintf(
                "Crash on %s from %s",
            fmt.Fprintf(b, "There was a 500 error")
            fmt.Fprintf(b, "on %s\n", r.URL.Path)
            fmt.Fprintf(b, "The request was: %s", r)
    /* Normal handler code goes here */

Thanks for your time!

(Sorry again about the gratuitous animations.)