diff --git a/Makefile b/Makefile
index 48ce1b8..8534ec7 100644
--- a/Makefile
+++ b/Makefile
@@ -1,9 +1,12 @@
-PWD=$(shell pwd)
-DART_FILES=$(shell find $(PWD)/dart -name *.dart ! -name *.part.dart)
-V23_GOPATH=$(shell echo `v23 run env | grep GOPATH | cut -d\= -f2`)
+SHELL := /bin/bash -euo pipefail
+PWD := $(shell pwd)
+V23_GOPATH := $(shell echo `v23 run env | grep GOPATH | cut -d\= -f2`)
+DART_FILES := $(shell find $(PWD)/dart -name *.dart ! -name *.part.dart)
+GO_FILES := $(shell find go/src -name "*.go")
+V23_GO_FILES := $(shell find $(V23_ROOT) -name "*.go")
 
 ifndef MOJO_DIR
-	$(error MOJO_DIR is not set: ${MOJO_DIR})
+	$(error MOJO_DIR is not set: $(MOJO_DIR))
 endif
 
 ifdef ANDROID
@@ -13,18 +16,18 @@
 	$(error Android is currently not supported.)
 
 	# Configure compiler and linker for Android.
-	GO_BIN=$(MOJO_DIR)/src/third_party/go/tool/android_arm/bin/go
-	GO_FLAGS=-ldflags=-shared
-	MOJO_BUILD_DIR=$(MOJO_DIR)/src/out/android_Debug
-	MOJO_FLAGS=--android
-	MOJO_SHARED_LIB=$(PWD)/gen/lib/android/libsystem_thunk.a
+	GO_BIN := $(MOJO_DIR)/src/third_party/go/tool/android_arm/bin/go
+	GO_FLAGS := -tags=mojo -ldflags=-shared
+	MOJO_BUILD_DIR := $(MOJO_DIR)/src/out/android_Debug
+	MOJO_FLAGS := --android
+	MOJO_SHARED_LIB := $(PWD)/gen/lib/android/libsystem_thunk.a
 else
 	# Configure compiler and linker for Linux.
-	GO_BIN=$(MOJO_DIR)/src/third_party/go/tool/linux_amd64/bin/go
-	GO_FLAGS=-ldflags=-shared -buildmode=c-shared
-	MOJO_FLAGS=
-	MOJO_BUILD_DIR=$(MOJO_DIR)/src/out/Debug
-	MOJO_SHARED_LIB=$(PWD)/gen/lib/linux_amd64/libsystem_thunk.a
+	GO_BIN := $(MOJO_DIR)/src/third_party/go/tool/linux_amd64/bin/go
+	GO_FLAGS := -tags=mojo -ldflags=-shared -buildmode=c-shared
+	MOJO_FLAGS :=
+	MOJO_BUILD_DIR := $(MOJO_DIR)/src/out/Debug
+	MOJO_SHARED_LIB := $(PWD)/gen/lib/linux_amd64/libsystem_thunk.a
 endif
 
 # Compiles a Go program and links against the Mojo C shared library.
@@ -34,8 +37,8 @@
 # MOGO_BIN).
 #
 # MOJO_GOPATH must be exported so it can be picked up by MOGO_BIN.
-export MOJO_GOPATH=$(V23_GOPATH):$(PWD)/gen/go:$(PWD)/go:$(MOJO_BUILD_DIR)/gen/go
-MOGO_BIN=$(MOJO_DIR)/src/mojo/go/go.py
+export MOJO_GOPATH := $(V23_GOPATH):$(PWD)/gen/go:$(PWD)/go:$(MOJO_BUILD_DIR)/gen/go
+MOGO_BIN := $(MOJO_DIR)/src/mojo/go/go.py
 define MOGO_BUILD
 	mkdir -p $(dir $2)
 	$(MOGO_BIN) $(MOJO_FLAGS) -- \
@@ -46,14 +49,14 @@
 		$(PWD)/gen \
 		"-I$(MOJO_DIR)/src" \
 		"-L$(dir $(MOJO_SHARED_LIB)) -lsystem_thunk" \
-		build $(GO_FLAGS) $(PWD)/$1
+		build $(GO_FLAGS) $1
 endef
 
 # Generates go bindings from .mojom file.
 # $1 is input filename.
 # $2 is output directory.
 # $3 is language (go, dart, ...).
-MOJOM_BIN=$(MOJO_DIR)/src/mojo/public/tools/bindings/mojom_bindings_generator.py
+MOJOM_BIN := $(MOJO_DIR)/src/mojo/public/tools/bindings/mojom_bindings_generator.py
 define MOJOM_GEN
 	mkdir -p $2
 	$(MOJOM_BIN) $1 -d . -o $2 -g $3
@@ -90,8 +93,11 @@
 	$(call MOJOM_GEN,$<,gen,go)
 	gofmt -w $@
 
-gen/mojo/echo_server.mojo: go/src/echo_server.go gen-mojom $(MOJO_SHARED_LIB)
-	$(call MOGO_BUILD,$<,$@)
+gen/mojo/echo_server.mojo: $(GO_FILES) gen-mojom $(MOJO_SHARED_LIB)
+	$(call MOGO_BUILD,$(PWD)/go/src/echo_server.go,$@)
+
+gen/mojo/syncbase_server.mojo: $(GO_FILES) $(V23_GO_FILES) gen-mojom $(MOJO_SHARED_LIB)
+	$(call MOGO_BUILD,v.io/syncbase/x/ref/services/syncbase/syncbased,$@)
 
 # Check that the dart-style is being met. Note: Comments are ignored when
 # checking whitespace.
@@ -112,6 +118,10 @@
 run-echo-app: gen/mojo/echo_server.mojo gen-mojom dart/packages
 	$(MOJO_DIR)/src/mojo/devtools/common/mojo_run $(MOJO_FLAGS) -v --enable-multiprocess $(PWD)/dart/bin/echo_client.dart
 
+.PHONY: run-syncbase-app
+run-syncbase-app: gen/mojo/syncbase_server.mojo gen-mojom dart/packages
+	$(MOJO_DIR)/src/mojo/devtools/common/mojo_run $(MOJO_FLAGS) -v --enable-multiprocess $(PWD)/dart/bin/syncbase_client.dart
+
 # TODO(nlacasse): This should run real tests once we have them.
 .PHONY: test
 test: dartanalyzer
diff --git a/dart/bin/echo_client.dart b/dart/bin/echo_client.dart
index 1a040fa..b919391 100644
--- a/dart/bin/echo_client.dart
+++ b/dart/bin/echo_client.dart
@@ -18,12 +18,12 @@
     // either broken or unsupported.  In any case, this will never work on
     // Android, so we should switch to serving these files over http rather
     // than directly from the filesystem.
-    String echoServerUrl = url.replaceFirst('dart/bin/echo_client.dart', 'gen/mojo/echo_server.mojo');
+    String serviceUrl = url.replaceFirst('dart/bin/echo_client.dart', 'gen/mojo/echo_server.mojo');
 
-    print('connecting to $echoServerUrl');
+    print('connecting to $serviceUrl');
 
-    EchoProxy ep = new EchoProxy.unbound();
-    connectToService(echoServerUrl, ep);
+    EchoProxy p = new EchoProxy.unbound();
+    connectToService(serviceUrl, p);
 
     print('connected');
 
diff --git a/dart/bin/syncbase_client.dart b/dart/bin/syncbase_client.dart
new file mode 100644
index 0000000..536c6df
--- /dev/null
+++ b/dart/bin/syncbase_client.dart
@@ -0,0 +1,42 @@
+#!mojo mojo:dart_content_handler
+
+import 'dart:async';
+
+// TODO(nlacasse): Use 'show' or 'as' in non-stdlib import statements, per
+// Vanadium Dart convention.
+import 'package:mojo/application.dart';
+import 'package:mojo/core.dart';
+
+import '../../gen/dart-gen/mojom/lib/mojo/syncbase.mojom.dart' show SyncbaseProxy;
+
+class Client extends Application {
+  Client.fromHandle(MojoHandle handle) : super.fromHandle(handle);
+
+  void initialize(List<String> args, String url) {
+    // TODO(nlacasse): This is pretty gross, but there's no good way to get the
+    // current directory from within a Mojo app.  Dart's Directory.current() is
+    // either broken or unsupported.  In any case, this will never work on
+    // Android, so we should switch to serving these files over http rather
+    // than directly from the filesystem.
+    String serviceUrl = url.replaceFirst('dart/bin/syncbase_client.dart', 'gen/mojo/syncbase_server.mojo');
+
+    print('connecting to $serviceUrl');
+
+    SyncbaseProxy p = new SyncbaseProxy.unbound();
+    connectToService(serviceUrl, p);
+
+    print('connected');
+
+    closeApplication();
+  }
+
+  Future closeApplication() async {
+    await close();
+    assert(MojoHandle.reportLeakedHandles());
+  }
+}
+
+main(List args) {
+  MojoHandle appHandle = new MojoHandle(args[0]);
+  new Client.fromHandle(appHandle);
+}
diff --git a/go/src/echo_server.go b/go/src/echo_server.go
index 892340a..2a8ccd8 100644
--- a/go/src/echo_server.go
+++ b/go/src/echo_server.go
@@ -22,27 +22,28 @@
 //#include "mojo/public/c/system/types.h"
 import "C"
 
-type EchoImpl struct{}
+type echoImpl struct{}
 
-func (echo *EchoImpl) EchoString(inValue *string) (outValue *string, err error) {
-	log.Printf("server: %s\n", *inValue)
-	return inValue, nil
+func (e *echoImpl) EchoString(in *string) (out *string, err error) {
+	log.Printf("server: %s\n", *in)
+	return in, nil
 }
 
-type EchoServerDelegate struct {
+type delegate struct {
 	stubs []*bindings.Stub
 }
 
-func (delegate *EchoServerDelegate) Initialize(context application.Context) {}
+func (d *delegate) Initialize(ctx application.Context) {}
 
-func (delegate *EchoServerDelegate) Create(request echo.Echo_Request) {
-	stub := echo.NewEchoStub(request, &EchoImpl{}, bindings.GetAsyncWaiter())
-	delegate.stubs = append(delegate.stubs, stub)
+func (d *delegate) Create(req echo.Echo_Request) {
+	impl := &echoImpl{}
+	stub := echo.NewEchoStub(req, impl, bindings.GetAsyncWaiter())
+	d.stubs = append(d.stubs, stub)
 	go func() {
 		for {
 			if err := stub.ServeRequest(); err != nil {
-				connectionError, ok := err.(*bindings.ConnectionError)
-				if !ok || !connectionError.Closed() {
+				connErr, ok := err.(*bindings.ConnectionError)
+				if !ok || !connErr.Closed() {
 					log.Println(err)
 				}
 				break
@@ -51,19 +52,19 @@
 	}()
 }
 
-func (delegate *EchoServerDelegate) AcceptConnection(connection *application.Connection) {
-	connection.ProvideServices(&echo.Echo_ServiceFactory{delegate})
+func (d *delegate) AcceptConnection(conn *application.Connection) {
+	conn.ProvideServices(&echo.Echo_ServiceFactory{d})
 }
 
-func (delegate *EchoServerDelegate) Quit() {
-	for _, stub := range delegate.stubs {
+func (d *delegate) Quit() {
+	for _, stub := range d.stubs {
 		stub.Close()
 	}
 }
 
 //export MojoMain
 func MojoMain(handle C.MojoHandle) C.MojoResult {
-	application.Run(&EchoServerDelegate{}, system.MojoHandle(handle))
+	application.Run(&delegate{}, system.MojoHandle(handle))
 	return C.MOJO_RESULT_OK
 }
 
diff --git a/mojom/syncbase.mojom b/mojom/syncbase.mojom
index 6fd799b..84d0387 100644
--- a/mojom/syncbase.mojom
+++ b/mojom/syncbase.mojom
@@ -1,5 +1,7 @@
 // TODO(sadovsky): Copy struct and interface comments from VDL files.
-module mojo.syncbase;
+
+// TODO(sadovsky): This should probably be something else.
+module mojo;
 
 // TODO(sadovsky): Put structs in a separate types.mojom file.
 // TODO(sadovsky): Loose representation of verror. Improve this.
@@ -77,7 +79,7 @@
   AppSetPermissions(string name, Perms perms, string version) => (Error err);
 
   ////////////////////////////////////////
-  // Database
+  // nosql.Database
 
   // TODO(sadovsky): Add SchemaMetadata argument.
   DbCreate(string name, Perms perms) => (Error err);
