anchor.diff:    }
   }
   
  -
  +/**
  + * A servlet that can serve files from any of the [Project]s in the [Workspace]
  + */
  +class WorkspacePicoServlet extends PicoServlet {
  +
  +  bool canServe(HttpRequest request) {
  +    if (request.uri.pathSegments.length <= 1) return false;
  +    var projectNamesList = _workspace.getProjects().map((project) => project.name).toList();
  +    return projectNamesList.contains(request.uri.pathSegments[0]);
  +  }
  +
  +  Future<HttpResponse> serve(HttpRequest request) {
  +    HttpResponse response = new HttpResponse.ok();
  +    String path = request.uri.path;
  +    if (path.startsWith('/')) {
  +      path = path.substring(1);
  +    }
  +    Resource resource = _workspace.getChildPath(path);
  +
  +    return (resource as File).getContents().then((String string) {
  +      response.setContent(string);
  +      response.setContentTypeFrom(resource.name);
  +      return new Future.value(response);
  +    });
  +  }
  +}
  +
  +/**
  + * Serves up resources like favicon.ico
  + */
  +class StaticResourcesServlet extends PicoServlet {
  +  bool canServe(HttpRequest request) {
  +    return request.uri.path == '/favicon.ico';
  +  }
  +
  +  Future<HttpResponse> serve(HttpRequest request) {
  +    HttpResponse response = new HttpResponse.ok();
  +    return _getContentsBinary('images/favicon.ico').then((List<int> bytes) {
  +      response.setContentStream(
  +          new Stream.fromIterable(bytes));
  +      response.setContentTypeFrom('favicon.ico');
  +      return new Future.value(response);
  +    });
  +  }
  +}
  +
  +/**
  + * Server that redirects to the landing page for the project that is run.
  + */
  +class ProjectRedirectServlet extends PicoServlet {
  +
  +  String HTML_REDIRECT =
  +      '<meta http-equiv="refresh" content="0; url=http://127.0.0.1:$SERVER_PORT/';
  +
  +  bool canServe(HttpRequest request) {
  +    return request.uri.path == '/';
  +  }
  +
  +  Future<HttpResponse> serve(HttpRequest request) {
  +    HttpResponse response = new HttpResponse.ok();
  +    // TODO: for now landing page is hardcoded to project/web/index.html
  +    String string ='$HTML_REDIRECT${_currentProject.name}/web/index.html">';
  +    response.setContent(string);
  +    response.setContentTypeFrom('redirect.html');
  +    return new Future.value(response);
  +  }
  +}
  +
  +
  +/**
  + * Return the contents of the file at the given path. The path is relative to
  + * the Chrome app's directory.
  + */
  +Future<List<int>> _getContentsBinary(String path) {
  +  String url = chrome.runtime.getURL(path);
  +
  +  return html.HttpRequest.request(url, responseType: 'arraybuffer').then((request) {
  +    typed_data.ByteBuffer buffer = request.response;
  +    return new typed_data.Uint8List.view(buffer);
  +  });
  +}
  +
  
positive.code:   }
  
    void run(Resource resource) {
      //TODO: implement this
      print('TODO: run project ${resource.project}');
    }
  
  }
  
  /**
  
negative.code:     _delegates.firstWhere((delegate) => delegate.canRun(resource)).run(resource);
    }
  
    void dispose() {
      _server.dispose();
    }
  
  }
  
  /**
  