website: removes JS related content

The JavaScript libraries and infrastructure is not under active
development and is not in an ideal state for consumption. This CL
removes tutorial content and any wording that will lead someone to
believe that the JS SDK is anything but experimental.

Closes vanadium/issues#1123

Change-Id: If20acbf82263ac5cfd4187736f719cd93cf0d336
diff --git a/Makefile b/Makefile
index 33e6b77..333843d 100644
--- a/Makefile
+++ b/Makefile
@@ -109,8 +109,6 @@
 tutSuffixPart1 = tutorials/naming/suffix-part1
 tutSuffixPart2 = tutorials/naming/suffix-part2
 tutGlobber     = tutorials/naming/globber
-tutJSHello     = tutorials/javascript/hellopeer
-tutJSFortune   = tutorials/javascript/fortune
 tutJavaAndroid = tutorials/java/android
 tutJavaFortune = tutorials/java/fortune
 
@@ -126,9 +124,7 @@
 	$(completer)-custom-authorizer.sh \
 	$(completer)-suffix-part1.sh \
 	$(completer)-suffix-part2.sh \
-	$(completer)-globber.sh \
-	$(completer)-js-hellopeer.sh \
-	$(completer)-js-fortune.sh
+	$(completer)-globber.sh
 
 # Opaquely named copies of particular completer scripts, used to set up
 # conditions for later tutorials. See individual targets for more explanation.
@@ -139,18 +135,14 @@
 	$(scenario)-b-setup.sh \
 	$(scenario)-c-setup.sh \
 	$(scenario)-d-setup.sh \
-	$(scenario)-e-setup.sh \
-	$(scenario)-f-setup.sh
+	$(scenario)-e-setup.sh
 
 depsCommon = \
 	content/$(tutSetup).md \
 	content/$(tutCheckup).md \
 	content/$(tutWipeSlate).md
 
-# This target builds the hosted web assets for the JavaScript tutorials.
-jsTutorialResults := public/tutorials/javascript/results
-
-scripts := $(completerScripts) $(setupScripts) $(jsTutorialResults)
+scripts := $(completerScripts) $(setupScripts)
 
 #############################################################################
 # Target definitions
@@ -290,7 +282,7 @@
 $(completer)-multiservice-dispatcher.sh: $(depsMultiDisp) | $(MDRIP)
 	mkdir -p $(@D)
 	$(MDRIP) --preambled 0 completer $^ > $@
-$(scenario)-f-setup.sh: $(completer)-multiservice-dispatcher.sh
+$(scenario)-e-setup.sh: $(completer)-multiservice-dispatcher.sh
 	cp $^ $@
 
 depsCaveats1st = $(depsPermsAuth) content/$(tutCaveats1st).md
@@ -350,24 +342,6 @@
 	mkdir -p $(@D)
 	$(MDRIP) --preambled 0 completer $^ > $@
 
-depsJsHello = $(depsBasics) content/$(tutJSHello).md
-.PHONY: test-js-hello
-test-js-hellopeer: $(depsJsHello) | $(MDRIP)
-	$(MDRIP) --subshell test $^
-$(completer)-js-hellopeer.sh: $(depsJsHello) | $(MDRIP)
-	mkdir -p $(@D)
-	$(MDRIP) --preambled 0 completer $^ > $@
-$(scenario)-e-setup.sh: $(completer)-js-hellopeer.sh
-	cp $^ $@
-
-depsJsFortune = $(depsBasics) content/$(tutJSFortune).md
-.PHONY: test-js-fortune
-test-js-fortune: $(depsJsFortune) | $(MDRIP)
-	$(MDRIP) --subshell test $^
-$(completer)-js-fortune.sh: $(depsJsFortune) | $(MDRIP)
-	mkdir -p $(@D)
-	$(MDRIP) --preambled 0 completer $^ > $@
-
 # An ordering that lets us test all the tutorials faster than running the
 # individual tests in sequence. This exploits the knowledge that, for example,
 # tutCaveats3rd can be tested right after tutCaveats1st without reseting to a
@@ -395,16 +369,6 @@
 	content/$(tutSuffixPart1).md \
 	content/$(tutSuffixPart2).md
 
-# An ordering that lets us test all the JS tutorials faster than running the
-# individual tests in sequence.
-depsOneBigJsTutorialTest = \
-	content/$(tutSetup).md \
-	content/$(tutCheckup).md \
-	content/$(tutWipeSlate).md \
-	content/$(tutBasics).md \
-	content/$(tutJSHello).md \
-	content/$(tutJSFortune).md
-
 # An ordering that lets us test all the Java tutorials faster than running the
 # individual tests in sequence.
 depsOneBigJavaTutorialTest = \
@@ -412,7 +376,7 @@
 	content/$(tutJavaAndroid).md
 
 .PHONY: test
-test: test-site test-tutorials-core test-tutorials-js-node test-tutorials-java
+test: test-site test-tutorials-core test-tutorials-java
 
 .PHONY: test-site
 test-site: build node_modules
@@ -438,49 +402,6 @@
 test-tutorials-java: build
 	$(MDRIP) --blockTimeOut 5m --subshell test $(depsOneBigJavaTutorialTest)
 
-# Test JS tutorials against an existing development install.
-#
-# This is the target to run to see if the tutorials work against Vanadium
-# changes that have not been checked in.
-#
-# Note: Unlike test-tutorials-js-web, this test is intended to skip the UI
-# portion of the test in order to achieve some amount of test coverage without
-# having to introduce additional dependencies.
-#
-# Called from v.io/x/devtools/jiri-test/internal/test/website.go.
-# This test fails if JIRI_ROOT isn't defined.
-# This test defines V_TUT (a tutorial variable) appropriately in terms of
-# JIRI_ROOT.
-.PHONY: test-tutorials-js-node
-test-tutorials-js-node: build
-	jiri go install v.io/v23/... v.io/x/ref/...
-	$(MDRIP) --blockTimeOut 2m --subshell test content/testing.md $(depsOneBigJsTutorialTest)
-
-# Test JS tutorials (web version) against an existing development install.
-#
-# This is the target to run to see if the tutorials work against Vanadium
-# changes that have not been checked in.
-#
-# However, it uses the live version of the Vanadium extension.
-#
-# Used to be called from v.io/x/devtools/jiri-test/internal/test/website.go.
-# This test fails if JIRI_ROOT isn't defined.
-#
-# This test also takes additional env vars (typically temporary):
-# - GOOGLE_BOT_USERNAME and GOOGLE_BOT_PASSWORD (to sign into Google/Chrome)
-# - CHROME_WEBDRIVER (the path to the Chrome WebDriver)
-# - WORKSPACE (optional, defaults to $JIRI_ROOT/website)
-#
-# In addition, this test requires Maven and Xvfb and xvfb-run to be installed.
-# An HTML report is written to $JIRI_ROOT/website/htmlReports.
-#
-# NOTE(sadovsky): This test does not currently work, is omitted from continuous
-# integration testing, and will likely be decommissioned soon.
-.PHONY: test-tutorials-js-web
-test-tutorials-js-web: build
-	jiri go install v.io/v23/... v.io/x/ref/...
-	$(MDRIP) --subshell --blockTimeOut 3m testui content/testing.md $(depsOneBigJsTutorialTest)
-
 # Test tutorials against fresh external install.
 #
 # This runs an install from v.io, then runs the tutorials against that install,
@@ -500,23 +421,3 @@
 .PHONY: test-tutorials-no-install
 test-tutorials-no-install: build
 	$(MDRIP) --subshell test $(depsOneBigCoreTutorialTest)
-
-# The files needed to build JS tutorial output.
-depsJSTutorialResults = \
-	content/testing.md \
-	content/$(tutSetup).md \
-	content/$(tutBasics).md \
-	content/$(tutJSHello).md \
-	content/$(tutJSFortune).md
-
-# There are two steps to this build target:
-# 1. Build any dependencies like the VDL tool.
-# 2. Run mdrip to create artifacts from running $(jsDeps) code blocks.
-#
-# NOTE: Jenkins nodes may use the $JIRI_ROOT installation rather than "go get".
-# The "jiri go install" line below ensures all required tools (e.g. vdl) are
-# installed.
-$(jsTutorialResults): $(depsJSTutorialResults) | $(MDRIP)
-	jiri go install v.io/v23/... v.io/x/ref/...
-	V_TUT=$(abspath $@) $(MDRIP) --subshell --blockTimeOut 1m buildjs $^
-	rm -rf $(abspath $@)/node_modules
diff --git a/content/api-reference.md b/content/api-reference.md
index bef8811..e749ab7 100644
--- a/content/api-reference.md
+++ b/content/api-reference.md
@@ -9,19 +9,8 @@
 * [ref]: Reference implementation of the public API
 * [lib]: Vanadium-independent libraries
 
-# Vanadium core JavaScript module
-
-The JavaScript module provides APIs for Node.js and Google Chrome. These APIs
-can be used to develop Vanadium-capable JavaScript applications, enabling
-communication with other Vanadium services.
-
-* [Documentation][jsdoc]
-* [Source][js-source]
-* [NPM module][npm]
-
 [v23]: https://godoc.org/v.io/v23
 [ref]: https://godoc.org/v.io/x/ref
 [lib]: https://godoc.org/v.io/x/lib
-[jsdoc]: https://jsdoc.v.io/
 [js-source]: https://github.com/vanadium/js
 [npm]: https://www.npmjs.com/package/vanadium
diff --git a/content/community/coding-guidelines.md b/content/community/coding-guidelines.md
index 6676ce7..4d7b4cb 100644
--- a/content/community/coding-guidelines.md
+++ b/content/community/coding-guidelines.md
@@ -84,7 +84,7 @@
 # VDL
 
 The `devtools/bin/vdl` tool uses VDL files to generate files
-containing [RPC] stub code for various languages - Go, JavaScript,
+containing [RPC] stub code for various languages - Go, Java, JavaScript,
 etc.
 
 [VDL] is not Go, but is modeled after Go, so VDL code should follow
diff --git a/content/concepts/device-management.md b/content/concepts/device-management.md
index 462c45f..f548198 100644
--- a/content/concepts/device-management.md
+++ b/content/concepts/device-management.md
@@ -10,7 +10,7 @@
 
 A __device__ abstracts a system running Vanadium software, although the device need not be exclusively for Vanadium apps - for example, the system could be running natively installed applications alongside Vanadium applications. Typically, a device is a physical computing device, but a device could also be a virtual machine or a browser environment.
 
-An __application__ is a piece of software built using Vanadium. We use "app" as shorthand for "application", without adopting any of the specific meanings the term "app" may have elsewhere (e.g. in the context of mobile device app stores). Vanadium applications instantiate the Vanadium runtime. Usually, a running instance of a binary corresponds to an application, though applications can be multi-processed, or can be scripts (such as JavaScript applications), or can be [Docker][docker] images.
+An __application__ is a piece of software built using Vanadium. We use "app" as shorthand for "application", without adopting any of the specific meanings the term "app" may have elsewhere (e.g. in the context of mobile device app stores). Vanadium applications instantiate the Vanadium runtime. Usually, a running instance of a binary corresponds to an application, though applications can be multi-processed, or can be scripts (such as Node.js applications), or can be [Docker][docker] images.
 
 Applications are described by an __application envelope__. The envelope
 contains information needed by the device to install and run the application,
diff --git a/content/concepts/rpc.md b/content/concepts/rpc.md
index 3fd0f40..40b2bda 100644
--- a/content/concepts/rpc.md
+++ b/content/concepts/rpc.md
@@ -52,10 +52,9 @@
 
 # VDL
 
-The Vanadium Definition Language (VDL) enables interoperability between
-software components executing in different computing environments. For
-example, a frontend written in JavaScript running on a mobile phone may wish
-to communicate with a backend written in Go running in the cloud.
+The Vanadium Definition Language (VDL) enables interoperability between software
+components executing in different computing environments. For example, an Android application written in Java running on a mobile phone may wish to
+communicate with a backend written in Go running in the cloud.
 
 VDL has a well-defined type system and semantics that specify the baseline
 behavior for all RPCs.  Each native computing environment or programming
diff --git a/content/designdocs/vdl-spec.md b/content/designdocs/vdl-spec.md
index fc3ac0f..e9ba197 100644
--- a/content/designdocs/vdl-spec.md
+++ b/content/designdocs/vdl-spec.md
@@ -5,7 +5,7 @@
 
 This is a reference manual for VDL, the Vanadium Definition Language.  The intended audience is both end-users writing VDL files, as well as core developers implementing VDL.
 
-VDL is an interface definition language for describing Vanadium components.  It is designed to enable interoperability between implementations executing in heterogeneous environments.  E.g. it enables a frontend written in JavaScript running on a phone to communicate with a backend written in Go running on a server.  VDL is compiled into an intermediate representation that is used to generate code in each target environment.
+VDL is an interface definition language for describing Vanadium components.  It is designed to enable interoperability between implementations executing in heterogeneous environments.  E.g. it enables an Android application running on a phone to communicate with a backend written in Go running on a server.  VDL is compiled into an intermediate representation that is used to generate code in each target environment.
 
 Communication in Vanadium is based on remote procedure calls.  The main concepts in VDL map closely to concepts in general-purpose languages used to specify interfaces and communication protocols.
 
@@ -18,12 +18,12 @@
 VDL defines its own type and value system, with well-defined semantics.  The VOM (Vanadium Object Marshalling) protocol defines mappings from values of every VDL type to a wire format.  The combination of VDL and VOM enables a simple yet powerful mechanism to specify wire protocols.
 
 ## Specify the API
-Once a common wire format has been established between components, we need an API to access the functionality in our desired programming environment.  E.g. a JavaScript frontend that needs to invoke methods on a Go backend needs a standard way to access that functionality.
+Once a common wire format has been established between components, we need an API to access the functionality in our desired programming environment.  E.g. an Android Java frontend that needs to invoke methods on a Go backend needs a standard way to access that functionality.
 
 APIs are specified by compiling VDL to your target environment.  The VDL compiler converts VDL concepts into idiomatic native constructs in your target environment.
 
 ## Usage is optional
-The last goal is to ensure the usage of VDL is optional.  Users have a choice to forgo VDL if it doesn't adequately benefit their usage scenario.  E.g. two JavaScript components may choose to communicate directly as full-fledged Vanadium components, without using VDL at all.
+The last goal is to ensure the usage of VDL is optional.  Users have a choice to forgo VDL if it doesn't adequately benefit their usage scenario.  E.g. two Android Java components may choose to communicate directly as full-fledged Vanadium components, without using VDL at all.
 
 # Syntax
 The VDL syntax is based on the Go language, which has a compact and regular grammar.
diff --git a/content/faq.md b/content/faq.md
index fff6d68..6801069 100644
--- a/content/faq.md
+++ b/content/faq.md
@@ -80,14 +80,5 @@
 virtual CPUs, each implemented as a single hyperthread on a 2.3 GHz Intel Xeon
 E5 v3 (Haswell).
 
-# Are JavaScript promises supported?
-
-Yes, the Vanadium JS library is both callback and promise compatible. For
-simplicity, the tutorials use callbacks exclusively.
-
-Any function that accepts a callback argument also returns a promise. Thus, to
-use promises, omit the `cb` argument. Accordingly, use `Promise.resolve` and
-`Promise.reject` to indicate the end of the function.
-
 [benchmarks]: https://github.com/vanadium/go.ref/tree/master/profiles/internal/rpc/benchmark
 [gce]: https://cloud.google.com/compute/docs/machine-types
diff --git a/content/glossary.md b/content/glossary.md
index a1762ac..b621fe8 100644
--- a/content/glossary.md
+++ b/content/glossary.md
@@ -396,7 +396,7 @@
 
 VOM is the data serialization format used in Vanadium.  It enables the
 encoding and decoding of typed values across different programming languages,
-e.g. Go, Java, and JavaScript.
+e.g. Go and Java.
 
 See also: [VOM specification][vom-spec].
 
diff --git a/content/index.md b/content/index.md
index 6204d3d..15a2799 100644
--- a/content/index.md
+++ b/content/index.md
@@ -16,7 +16,7 @@
   well as for smaller-scale enterprise and consumer applications, including
   those needing to cross NAT boundaries.
 + a performant, self-describing encoding format, usable from many programming
-  languages and platforms (including Go, Java/Android, and JavaScript, with more
+  languages and platforms (including Go and Java/Android, with more
   on the way).
 + a global naming service that offers the convenience of urls but allows for
   federation and multi-level resolution. The 'programming model' consists of
diff --git a/content/installation/javascript.md b/content/installation/javascript.md
deleted file mode 100644
index 0ed17a6..0000000
--- a/content/installation/javascript.md
+++ /dev/null
@@ -1,22 +0,0 @@
-= yaml =
-title: JavaScript Prerequisites
-toc: true
-sort: 3
-= yaml =
-
-JavaScript development requires the `nacl` and `nodejs` profiles. As an
-additional prerequisite, OS X users must have a full and up-to-date installation
-of Xcode.
-
-Install `nacl` and `nodejs` profiles:
-
-    jiri v23-profile install nacl nodejs
-
-Build and test the JavaScript code:
-
-    cd $JIRI_ROOT/release/javascript/core
-    make test
-
-Remove all JavaScript build artifacts:
-
-    make clean
diff --git a/content/tools/vanadium-chrome-extension.md b/content/tools/vanadium-chrome-extension.md
index 0ec765a..e917b8c 100644
--- a/content/tools/vanadium-chrome-extension.md
+++ b/content/tools/vanadium-chrome-extension.md
@@ -3,28 +3,28 @@
 toc: true
 = yaml =
 
-The [Vanadium Chrome extension][] is a bridge between JavaScript web apps and
+The [Vanadium Chrome extension] is a bridge between JavaScript web apps and
 the Vanadium runtime, libraries, and services.
 
 Support for web applications is a work-in-progress.  Currently, Vanadium web
 apps can run only in the Chrome desktop browser with the [Vanadium Chrome
-extension][] installed.  Mobile browsers and non-Chrome browsers will be
+extension] installed.  Mobile browsers and non-Chrome browsers will be
 supported in the future.
 
 # Overview
 
-The Vanadium codebase is written mostly in [Go][].  In order to make the Go
+The Vanadium codebase is written mostly in [Go].  In order to make the Go
 libraries accessible to a JavaScript web app, the Vanadium Go code is compiled
-into a [Native Client][] (NaCl) plugin and embedded in a Chrome extension.
+into a [Native Client] (NaCl) plugin and embedded in a Chrome extension.
 
-[Native Client][] is a sandbox for running compiled binary code in
+[Native Client] is a sandbox for running compiled binary code in
 the browser efficiently and securely, independent of the user's operating
-system type.  These plugins can make use of the [Pepper API][].
+system type.  These plugins can make use of the [Pepper API].
 
 Traditionally, NaCl has supported only C and C++ compilation, but the Vanadium
 team has extended the Go compiler to target NaCl and the Pepper API.
 
-The [Vanadium JavaScript library][] provides a set of JavaScript APIs for
+The [Vanadium JavaScript library] provides a set of JavaScript APIs for
 interacting with the Vanadium Go code running inside the NaCl plugin in the
 extension.
 
@@ -42,8 +42,8 @@
 # Vanadium Chrome extension details
 
 The Vanadium extension has two main components:
-  * a [content script][] that runs on each tab, and
-  * a [background page][] that runs once per browser and contains JavaScript code and a NaCl plugin.
+  * a [content script] that runs on each tab, and
+  * a [background page] that runs once per browser and contains JavaScript code and a NaCl plugin.
 
 The following diagram depicts these components and the flow of messages between them.
 
diff --git a/content/tutorials/faq.md b/content/tutorials/faq.md
index d785fef..c460e45 100644
--- a/content/tutorials/faq.md
+++ b/content/tutorials/faq.md
@@ -84,11 +84,6 @@
 break the tutorials must be accompanied by tutorial content changes
 that keep things up to date.
 
-# Do I need to know JavaScript to do the JavaScript tutorials?
-
-The JavaScript tutorials describe Vanadium concepts from a JavaScript
-perspective. Familiarity with the language is helpful but is not required.
-
 # Where are the API docs?
 
 Please refer to our in-depth [API references].
@@ -98,39 +93,6 @@
 Please refer to the
 [Vanadium Chrome extension] page.
 
-# How can the JavaScript tutorials be run in Node.js?
-
-The JavaScript tutorials are designed for the browser and interact with web
-pages. They can be adapted to a pure `node` environment by removing the
-web-specific components.
-
-Vanadium Node.js programs currently require a go-language proxy `wsprd`
-(Websocket Proxy Daemon) to be running. `wsprd` performs the same role as the
-[Vanadium Chrome extension]. It is our intention to remove these requirements
-so that running `npm install` is the only step needed to use Vanadium.
-
-To start `wsprd`, run:
-
-```
-$V_BIN/wsprd \
-  -v23.namespace.root /\(dev.v.io/role/vprod/service/mounttabled\)@ns.dev.v.io:8101 \
-  -v23.proxy proxy \
-  -identd identity/dev.v.io/u/google
-```
-
-The above flags give the `node` program the same blessings and namespace root as
-the tutorial examples running in the browser.
-
-The Vanadium program will also need to know where `wsprd` is running. By default,
-this is at `http://127.0.0.1:8124`. (It can be customized with the
-`v23.tcp.address` flag.) Add the `wspr` field to your Vanadium configuration:
-
-```
-var config = {
-  wspr: http://127.0.0.1:8124,
-};
-```
-
 [VDL]: /glossary.html#vanadium-definition-language-vdl-
 [golang.org]: http://golang.org/
 [bash scripts]: #why-bash-
diff --git a/content/tutorials/hello-world.md b/content/tutorials/hello-world.md
index 788ce06..b88605d 100644
--- a/content/tutorials/hello-world.md
+++ b/content/tutorials/hello-world.md
@@ -9,7 +9,7 @@
 
 # Introduction
 
-Practically speaking, Vanadium is a set of Go and JavaScript language
+Practically speaking, Vanadium is a set of Go and Java language
 libraries (more languages coming), plus a few dozen services and
 command line tools built on top of them.
 
diff --git a/content/tutorials/index.md b/content/tutorials/index.md
index 296da97..b5adbdb 100644
--- a/content/tutorials/index.md
+++ b/content/tutorials/index.md
@@ -16,7 +16,3 @@
   {{# content.tutorials.java }}
   * [{{ title }}]({{ url }})
   {{/ content.tutorials.java }}
-* [JavaScript](/tutorials/javascript/)
-  {{# content.tutorials.javascript }}
-  * [{{ title }}]({{ url }})
-  {{/ content.tutorials.javascript }}
diff --git a/content/tutorials/javascript/fortune.md b/content/tutorials/javascript/fortune.md
deleted file mode 100644
index e7ea78a..0000000
--- a/content/tutorials/javascript/fortune.md
+++ /dev/null
@@ -1,671 +0,0 @@
-= yaml =
-title: "Fortune in JS"
-fullTitle: "Fortune in JavaScript"
-layout: tutorial
-wherein: you build a fortune teller service and a client to talk to it.
-sort: 4
-toc: true
-prerequisites: {completer: js-fortune, scenario: e, also: {jsSpecial: true, chrome: true}}
-= yaml =
-
-## Introduction
-
-This tutorial creates a fortune teller example in order to go more deeply into
-some Vanadium concepts than [Hello Peer][hello-peer]. In addition, this
-tutorial demonstrates how to connect
-the application with a compatible Go-language fortune application.
-
-JavaScript Vanadium applications are based around the same fundamental structure
-as Go Vanadium applications. Because of the similarities, this tutorial
-focuses on the differences between building Vanadium applications
-in Go and JavaScript.
-
-## Defining the Fortune service
-
-In the [Hello Peer][hello-peer] tutorial, [VDL] (Vanadium Definition Language)
-was not used.
-It is possible to communicate without VDL for simple applications, but
-it is strongly recommended to use VDL for cross-platform, cross-language,
-or more complex applications. VDL provides a clear, strongly-typed definition
-of the protocols that your clients and servers will use to communicate with each other.
-
-When not using VDL, different programming languages may have different
-representations of values that may not be coerced to compatible types.
-In particular, a special representation is used for JavaScript values
-when VDL is not being used that may be incompatible with Go values.
-
-### Fortune VDL
-
-We will reuse the same interface definition from the
-[Client/Server Basics tutorial][client-server].
-`$V_TUT/src/fortune/ifc/fortune.vdl` defines a fortune teller service, which
-allows clients to `Get` and `Add` fortunes. The relevant code is reproduced below:
-
-{{# helpers.code }}
-package fortune
-
-type Fortune interface {
-  // Returns a random fortune.
-  Get() (wisdom string | error)
-  // Adds a fortune to the set used by Get().
-  Add(wisdom string) error
-}
-{{/ helpers.code }}
-
-The `vdl` tool generates a JavaScript file from this protocol definition.
-
-<!-- @generateFortuneVDLJS @buildjs @test @testui @completer -->
-```
-mkdir -p $V_TUT/src/fortune
-VDLROOT=$V23_RELEASE/src/v.io/v23/vdlroot \
-    VDLPATH=$V_TUT/src \
-    $V_BIN/vdl generate -lang=javascript -js-out-dir=$V_TUT/src \
-    $V_TUT/src/fortune/ifc
-```
-
-When generating JavaScript, the flag `-js-out-dir` is used to specify where
-generated files should appear.
-After running this command, `$V_TUT/src/fortune/ifc/index.js`
-should have been created.
-
-### Implementation
-
-The code below implements the Fortune service.
-It defines the `Get` and `Add` methods and attaches the VDL-generated interface
-description to the service's prototype chain.
-
-Create `$V_TUT/src/fortune/service/index.js`.
-
-<!-- @fortuneImplementation @buildjs @test @testui @completer -->
-```
-mkdir -p $V_TUT/src/fortune/service
-cat - <<EOF >$V_TUT/src/fortune/service/index.js
-var vdlFortune = require('../ifc');
-
-module.exports = FortuneService;
-
-// Define the fortune service.
-function FortuneService() {
-  this.fortunes = [
-    'You will reach the heights of success.',
-    'Conquer your fears or they will conquer you.',
-    'Today is your lucky day!',
-  ];
-  this.numFortunesServed = 0;
-}
-
-// Add VDL service metadata and type information.
-FortuneService.prototype = new vdlFortune.Fortune();
-
-// Define the FortuneServiceMethod bodies.
-FortuneService.prototype.add = function(ctx, serverCall, wisdom) {
-  this.fortunes.push(wisdom);
-}
-FortuneService.prototype.get = function(ctx, serverCall) {
-  this.numFortunesServed++;
-  var fortuneIndex = Math.floor(Math.random() *
-    this.fortunes.length);
-  return this.fortunes[fortuneIndex];
-};
-EOF
-```
-
-This service implementation is analogous to Go's. It also exposes two fields,
-`fortunes` and `numFortunesServed`, which will be used to make the fortune teller
-more interactive.
-
-## Fortune server
-
-Two files are used to serve the Fortune service: the JavaScript file that
-serves the service and an HTML page to display the server status.
-
-### Server code
-
-Use a Vanadium server to serve the Fortune service.
-
-<!-- @fortuneServerJS @buildjs @test @testui @completer -->
-```
-mkdir -p $V_TUT/src/fortune/server
-cat - <<EOF >$V_TUT/src/fortune/server/index.js
-var vanadium = require('vanadium');
-var FortuneService = require('../service');
-
-// Define the Vanadium configuration for this app.
-var config = {
-  logLevel: vanadium.vlog.levels.INFO,
-  appName: 'Fortune Server'
-};
-
-// Setup Vanadium and serve the Fortune service.
-vanadium.init(config, function(err, runtime) {
-  if (err) {
-    return displayError(err);
-  }
-  runtime.on('crash', displayError);
-
-  // Create and serve the Fortune service.
-  var service = new FortuneService();
-  var serviceName = getDefaultServiceName(runtime.accountName);
-  runtime.newServer(serviceName, service, function(err) {
-    if (err) {
-      displayError(err);
-    }
-  });
-
-  // Initialize the UI (see fortune-server.html).
-  uiInit(service, serviceName);
-});
-function getDefaultServiceName(accountName) {
-  var homeDir = accountName.replace(/^dev.v.io:u:/, 'users/').replace(vanadium.security.ChainSeparator.val, '/');
-  return homeDir + '/tutorial/fortune';
-}
-EOF
-```
-
-The Fortune server works similarly to the one in the [Client/Server Basics tutorial][client-server].
-The service implementation:
-- Uses a VDL protocol to define the Fortune interface
-- Creates and runs the Fortune service
-- Uses the default authorizer
-- Uses the default dispatcher
-
-The following sections describe some **key differences** between the JavaScript
-and Go APIs.
-
-### Configuration
-
-A configuration can optionally be specified when initializing Vanadium,
-for example:
-
-{{# helpers.code }}
-var config = {
-  logLevel: vanadium.vlog.levels.INFO,
-  appName: 'Fortune Server'
-};
-{{/ helpers.code }}
-
-This sets the output level for Vanadium log messages to `INFO` (`WARN` is the default)
-and sets the name of the application, which is primarily used to identify the
-application in error messages.
-
-Similar parameters are typically specified through command line flags with Go.
-
-### Serving at a name
-
-The Fortune service was served using a Vanadium [name]. To learn more about names and name resolution, read
-the [Naming Concepts][naming-concepts] page or go through the [Naming tutorial][naming-tutorial].
-
-{{# helpers.code }}
-// Serve the service at a Vanadium name.
-server.serve(name, service, callback);
-{{/ helpers.code }}
-
-In the [Client/Server Basics tutorial][client-server], the Fortune client connected to the server directly using
-a name rooted at its [endpoint address][endpoint].
-In contrast, the server in this tutorial uses a name that does not include
-an endpoint address and is resolved against a mount table.
-
-### Server HTML
-
-Create the HTML page. This page displays:
-- The service name
-- The number of fortunes sent by the service
-- The service's list of fortunes
-
-The service will manipulate the page as its data is updated.
-
-<!-- @fortuneServerHTML @buildjs @test @testui @completer -->
-```
-cat - <<EOF >$V_TUT/fortune-server.html
-<!DOCTYPE html>
-<html>
-<head>
-  <title>Fortune Teller - Server</title>
-  <script>
-    // Helpers to display status information on the page.
-    function displayError(err) {
-      displayNumFortunesServed('Error: ' + err.toString());
-    }
-    function displayNumFortunesServed(count) {
-      document.getElementById('fortune-count').innerHTML = count;
-    }
-    function displayFortunes(fortunes) {
-      var fortuneList = document.getElementById('fortune-list');
-      // Assume that only new fortunes can be added to the end list.
-      for (var i = fortuneList.childNodes.length; i < fortunes.length; i++) {
-        var bullet = document.createElement('li');
-        bullet.textContent = fortunes[i];
-        fortuneList.appendChild(bullet);
-      }
-    }
-    function setServiceName(serviceName) {
-      return document.getElementById('service-name').textContent = serviceName;
-    }
-    function uiInit(service, serviceName) {
-      setServiceName(serviceName);
-      setInterval(function() {
-        displayNumFortunesServed(service.numFortunesServed);
-        displayFortunes(service.fortunes);
-      }, 250);
-    }
-  </script>
-</head>
-<body>
-  <h1>Server</h1>
-  <p>
-    <span>Name of service to provide to clients: </span>
-    <span id="service-name"></span>
-  </p>
-  <p>
-    List of fortunes:
-    <br><ol id="fortune-list"></ol></br>
-  </p>
-  <p>
-    Total Fortunes Sent: <span id="fortune-count">0</span>
-  </p>
-  <script src="browser/fortune-server.js"></script>
-</body>
-</html>
-EOF
-```
-
-## Fortune client
-
-As with the server, the client consists of two files: a JavaScript file that
-contains the application logic and an HTML page for the user interface.
-
-### Client code
-
-The client code starts Vanadium and waits for the user to act.
-- Upon pressing the `Add` button, the client makes an `Add` RPC request.
-- Upon pressing the `Get` button, the client makes a `Get` RPC request.
-
-Create `$V_TUT/src/fortune/client/index.js`.
-
-<!-- @fortuneClientJS @buildjs @test @testui @completer -->
-```
-mkdir -p $V_TUT/src/fortune/client
-cat - <<EOF >$V_TUT/src/fortune/client/index.js
-var vanadium = require('vanadium');
-
-// Define the Vanadium configuration for this app.
-var config = {
-  logLevel: vanadium.vlog.levels.INFO,
-  appName: 'Fortune Client'
-};
-
-vanadium.init(config, function(err, runtime) {
-  if (err) {
-    displayError(err);
-    return;
-  }
-
-  // Get runtime context and client.
-  var context = runtime.getContext();
-  var client = runtime.getClient();
-
-  // Set default service name.
-  var defaultName = getDefaultServiceName(runtime.accountName);
-  setServiceName(defaultName);
-
-  // Listen for button presses.
-  document.getElementById('get-button').addEventListener('click', getFortune);
-  document.getElementById('add-button').addEventListener('click', addFortune);
-
-  // Adds a fortune to the fortune teller.
-  function addFortune() {
-    updateStatus('Adding ' + getEnteredFortune() + '...');
-    client.bindTo(context, getServiceName(), function(err, s) {
-      if (err) {
-        displayError(err);
-        return;
-      }
-
-      s.add(context, getEnteredFortune(), function(err) {
-        if (err) {
-          displayError(err);
-          return;
-        }
-        updateStatus('Done!');
-      });
-    });
-  }
-
-  // Gets a random fortune from the fortune teller.
-  function getFortune() {
-    updateStatus('Getting random fortune...');
-    client.bindTo(context, getServiceName(), function(err, s) {
-      if (err) {
-        displayError(err);
-        return;
-      }
-
-      s.get(context, function(err, randomFortune) {
-        if (err) {
-          displayError(err);
-          return;
-        }
-
-        displayFortune(randomFortune);
-        updateStatus('Done!');
-      });
-    });
-  }
-});
-function getDefaultServiceName(accountName) {
-  var homeDir = accountName.replace(/^dev.v.io:u:/, 'users/').replace(vanadium.security.ChainSeparator.val, '/');
-  return homeDir + '/tutorial/fortune';
-}
-EOF
-```
-
-### Client HTML
-
-Create the client's HTML page. This page contains:
-- An input for selecting the server endpoint
-- An input for adding new fortunes
-- A button to get new fortunes
-- A running list of fortunes received
-- JavaScript code to manipulate these elements
-
-<!-- @fortuneClientHTML @buildjs @test @testui @completer -->
-```
-cat - <<EOF >$V_TUT/fortune-client.html
-<!DOCTYPE html>
-<html>
-<head>
-  <title>Fortune Teller - Client</title>
-  <script>
-    // Helpers to update and introspect the HTML page.
-    function getServiceName() {
-      return document.getElementById('service-name').value;
-    }
-    function setServiceName(serviceName) {
-      return document.getElementById('service-name').value = serviceName;
-    }
-    function getEnteredFortune() {
-      return document.getElementById('add-text').value;
-    }
-    function displayFortune(fortune) {
-      var fortuneNode = document.createElement('li');
-      fortuneNode.textContent = fortune;
-      document.getElementById('fortune-list').appendChild(fortuneNode);
-    }
-    function displayError(err) {
-      updateStatus(err.toString());
-    }
-    function updateStatus(status) {
-      document.getElementById('status').innerHTML = status;
-    }
-  </script>
-</head>
-<body>
-  <h1>Client</h1>
-  <p>Service to connect to: <input id="service-name" type="text" placeholder="Enter a service name" size="60" /></p>
-  <p>
-  Fortune to add: <input type="text" id="add-text" placeholder="write a custom fortune" size="60"/> <button id="add-button">Add Fortune</button>
-  </p>
-  <p><button id="get-button">Get Fortune</button></p>
-  <h2>Status: <span id="status">Ready</span></h2>
-  <p>Received fortunes: <ol id="fortune-list"></ol></p>
-  <script src="browser/fortune-client.js"></script>
-</body>
-</html>
-EOF
-```
-
-### About bindTo
-
-The example above uses `bindTo` to retrieve a service stub. This step does not
-exist when using Go.
-
-{{# helpers.code }}
-client.bindTo(context, name, callback);
-{{/ helpers.code }}
-
-`bindTo` retrieves the service definition from the remote server. This allows
-the client to generate a service stub without needing a local VDL definition.
-In contrast, Go clients typically get the service definition from the generated
-VDL code because types must be known at compile-time.
-
-If the JavaScript client already has access to the service signature, it can skip
-the retrieval step by creating the stub directly using `bindWithSignature`:
-
-{{# helpers.code }}
-client.bindWithSignature(name, signature);
-{{/ helpers.code }}
-
-
-### About contexts
-
-The `context` or `ctx` variable has appeared in a few places in this tutorial.
-
-{{# helpers.code }}
-// Client connecting to a service.
-client.bindTo(context, serviceName, callback);
-
-// Fortune service method definition.
-FortuneService.prototype.get = function(ctx, serverCall) {
-  ...
-};
-{{/ helpers.code }}
-
-Contexts are used to:
-- Configure deadlines and timeouts for RPCs
-- Provide request traces when debugging
-- Carry security configuration information during a request
-
-When a service method is invoked, the context it receives should generally be
-used for any ensuing outgoing RPCs so that the full sequence of calls can
-be traced.
-
-## Running Fortune
-
-### Browserify
-
-Use `browserify` to build the browser-targeted JavaScript files, which
-integrate the Vanadium libraries with the server and client code.
-
-<!-- @browserifyFortune @buildjs @test @testui @completer -->
-```
-NODE_PATH=$V_TUT $V_TUT/node_modules/.bin/browserify \
-  $V_TUT/src/fortune/client/index.js -o $V_TUT/browser/fortune-client.js
-NODE_PATH=$V_TUT $V_TUT/node_modules/.bin/browserify \
-  $V_TUT/src/fortune/server/index.js -o $V_TUT/browser/fortune-server.js
-```
-
-### Combined HTML page
-
-For demonstration purposes, the Fortune client and server are shown on the same page.
-
-<!-- @fortuneIndexHTML @buildjs @test @testui @completer -->
-```
-cat - <<EOF >$V_TUT/fortune.html
-<!DOCTYPE html>
-<html>
-<head>
-  <title>Fortune Teller</title>
-</head>
-<body style="background: #000000;">
-  <div style="position:fixed;top:0px;left:0px;bottom:0;width:48%; background: #ffffff;">
-    <iframe id="client" src="fortune-client.html" style="width:100%; height:100%;" frameBorder="0"></iframe>
-  </div>
-  <div style="position:fixed;top:0px;right:0px;bottom:0;width:48%; background: #ffffff;">
-    <iframe id="server" src="fortune-server.html" style="width:100%; height:100%;" frameBorder="0"></iframe>
-  </div>
-</body>
-</html>
-EOF
-```
-
-### Try it out
-
-You are ready to serve the web pages on a local server. Run the web server on port 8989.
-
-Using node-static, the command is:
-
-<!-- @nodeStaticBackground @test @testui @sleep -->
-```
-$V_TUT/node_modules/.bin/static $V_TUT -p 8989 > /dev/null &
-TUT_PID_HTTPD=$!
-```
-
-This static server runs in the background and is stopped in the [Cleanup section].
-
-Go to http://127.0.0.1:8989/fortune.html to view the examples.
-
-{{# helpers.hidden }}
-Check that curling the fortune page doesn't fail. Since the user presumably
-visits the link above, this ensures that the URL functions properly.
-
-<!-- @curlFortune @test @testui -->
-```
-curl -f http://127.0.0.1:8989/fortune.html &> /dev/null
-```
-
-Set the workspace, if necessary. Check other required environment variables.
-
-<!-- @mavenEnv @testui -->
-```
-# Set WORKSPACE, if not chosen.
-[ -z "$WORKSPACE" ] && export WORKSPACE=${JIRI_ROOT}/www
-
-# Check that the environment variables exist.
-echo ${CHROME_WEBDRIVER?} > /dev/null
-echo ${GOOGLE_BOT_USERNAME?} > /dev/null
-echo ${GOOGLE_BOT_PASSWORD?} > /dev/null
-```
-
-Then, run the WebDriver test with maven.
-
-<!-- @mavenTest @testui -->
-```
-# Run the maven test.
-TMPDIR=/tmp xvfb-run -s '-ac -screen 0 1024x768x24' \
-  mvn test \
-  -f=$JIRI_ROOT/website/test/ui/pom.xml \
-  -Dtest=FortuneUITest \
-  -DchromeDriverBin=$CHROME_WEBDRIVER \
-  -DhtmlReportsRelativePath=htmlReports \
-  -DgoogleBotUsername=$GOOGLE_BOT_USERNAME \
-  -DgoogleBotPassword=$GOOGLE_BOT_PASSWORD \
-  -DprincipalBin=$V_BIN/principal \
-  -DtutDir=$V_TUT
-```
-{{/ helpers.hidden }}
-
-## Interoperating with Go
-
-The client and server defined here can communicate with the client and server that was defined in Go.
-
-### Creating an OAuth-authenticated principal for Go
-
-For simplicity, this example uses the default authorizer. To pass
-the authorization check, it is possible to create a principal with
-the proper blessings for communication with the browser. To read more, go to
-the [Security Concepts] page or run through the [Principals and blessings] tutorial.
-
-Use the `principal` tool, as follows:
-
-```
-$V_BIN/principal --v23.credentials $V_TUT/cred/basics \
-  seekblessings
-```
-
-A new tab will appear in the browser. Click the `Bless` button. The Go code
-will now have access to an OAuth-authenticated blessing that matches the
-browser's.
-
-In general, it is not necessary to generate an identical set of blessings; other
-authorizers can be used to grant access with different rules than the default
-authorizer.
-
-### Go client + JS server
-
-In order for the Go client to contact the JavaScript server, it needs the
-Vanadium name for the server.
-
-`$JS_FORTUNE_NAME` will hold the name of the JavaScript server. The following
-command parses the principal and computes the name of the fortune server.
-It should match the service name listed on the Fortune page.
-
-```
-export JS_FORTUNE_NAME=$(
-  $V23_RELEASE/bin/principal get \
-    --v23.credentials $V_TUT/cred/basics default \
-    | $V_BIN/principal dumpblessings - \
-    | awk -F/ '/Blessings/ {print "users/" $3 "/chrome/tutorial/fortune"}'
-  )
-```
-
-Use the Go fortune client to request a fortune from the JS server.
-```
-$V_TUT/bin/client --v23.credentials $V_TUT/cred/basics \
-  --server $JS_FORTUNE_NAME
-```
-
-It is also possible to add a fortune:
-
-```
-$V_TUT/bin/client --v23.credentials $V_TUT/cred/basics \
-  --server $JS_FORTUNE_NAME -add 'Fortune favors the bold.'
-```
-
-### Go server + JS client
-
-To use a Go fortune server with a JS client, first run the server.
-
-<!-- @runFortuneGoServer @test @testui @sleep -->
-```
-kill_tut_process TUT_PID_SERVER
-$V_TUT/bin/server --v23.credentials $V_TUT/cred/basics \
-  --endpoint-file-name=$V_TUT/server.txt &
-TUT_PID_SERVER=$!
-```
-
-The server's endpoint will be used to identify the fortune service. To get
-the endpoint, run the following command.
-
-<!-- @runFortuneGoServer -->
-```
-cat $V_TUT/server.txt # The go server's endpoint address
-```
-
-The Go server's endpoint should be printed out to the console.
-**Copy this endpoint and paste it into the client page's Server field.**
-
-The JS client will now be able to call `Get` and `Add` on the Go server.
-
-## Cleanup
-
-Once finished, stop the HTTP server and the Go fortune server.
-
-<!-- @runFortuneGoServer @test @testui -->
-```
-kill $TUT_PID_HTTPD
-kill $TUT_PID_SERVER
-```
-
-## Summary
-
-Congratulations! You have successfully run the Go-JS fortune example.
-
-You have:
-- Built a fortune client and server in JavaScript. A hosted copy of the tutorial
-result can be accessed [here][built-example].
-- Established communication between the JavaScript and Go clients and servers.
-- Learned about using Vanadium in JavaScript as compared to Go.
-
-[vdl]: /glossary.html#vanadium-definition-language-vdl-
-[client-server-terminology]: /tutorials/basics.html#terminology
-[client-server]: /tutorials/basics.html
-[built-example]: /tutorials/javascript/results/fortune.html
-[hello-peer]: /tutorials/javascript/hellopeer.html
-[default-auth]: /tutorials/security/principals-and-blessings.html#default-authorization-policy
-[endpoint]: /glossary.html#endpoint
-[name]: /glossary.html#object-name
-[naming-concepts]: /concepts/naming.html
-[naming-tutorial]: /tutorials/naming/
-[Security Concepts]: /concepts/security.html
-[Principals and blessings]: /tutorials/security/principals-and-blessings.html
-[Cleanup section]: #cleanup
diff --git a/content/tutorials/javascript/hellopeer.md b/content/tutorials/javascript/hellopeer.md
deleted file mode 100644
index 74355bf..0000000
--- a/content/tutorials/javascript/hellopeer.md
+++ /dev/null
@@ -1,440 +0,0 @@
-= yaml =
-title: Hello Peer
-layout: tutorial
-wherein: Vanadium says hello in a peer-to-peer manner.
-prerequisites: {completer: js-hellopeer}
-sort: 2
-toc: true
-= yaml =
-
-## Introduction
-
-This tutorial demonstrates how to use JavaScript to create a peer-to-peer
-Vanadium app and run it in your browser.
-
-## Setup
-
-Vanadium has two core dependencies when building browser apps:
-
-* [Node.js][node] for running a JavaScript-based build system.
-Download and install node from [https://nodejs.org/download][node] and add it to your `PATH`.
-* [Go][golang] for core Vanadium tools. This is technically optional for this tutorial, but
-will be used in later tutorials. Download and install it from https://golang.org/dl/ or
-through your package manager and make sure it is in your `PATH`.
-
-Apart from these two global dependencies, the remainder of the setup
-involves only local changes to the project directory.
-
-### Project directory
-
-First, create a directory for the tutorial. The environment variable
-`$V_TUT` will be used throughout the tutorials to represent this directory.
-
-<!-- @createProjectDir @buildjs @test @testui @completer -->
-```
-export V_TUT=${V_TUT-$HOME/v23_tutorial}
-mkdir -p $V_TUT
-```
-
-### Install Node modules with NPM
-
-The Node Package Manager `npm` (which was installed with Node.js)
-is used to install the modules
-needed for the tutorial to `$V_TUT/node_modules`:
-
-```
-cd $V_TUT
-echo "{}" > $V_TUT/package.json
-npm install vanadium browserify node-static
-```
-
-{{# helpers.hidden }}
-The following block should be removed once vanadium is available on npm.
-{{/ helpers.hidden }}
-{{# helpers.warning }}
-**Pre-release only: Run this command block instead.**
-
-<!-- @removeThisBlockBeforeRelease @buildjs @test @testui @completer -->
-```
-cd $V_TUT
-echo "{}" > $V_TUT/package.json
-npm install git+https://vanadium.googlesource.com/release.js.core
-npm install browserify node-static
-```
-{{/ helpers.warning }}
-
-After running this command, the following modules will be installed:
-
-* `vanadium` - The core vanadium library.
-* `browserify` - A build tool used to create a browser-compatible
-JavaScript file from a project structured for node. Vanadium uses node to handle
-JavaScript dependency management.
-* `node-static` - A simple static web server that enables the tutorials
-to be viewed in a browser.
-
-
-### Vanadium Chrome extension
-
-Vanadium currently requires an extension to run JavaScript in the browser.
-This extension is used to securely store credentials and
-additionally contains Vanadium's go-language core.
-The Vanadium team is working to remove the Chrome-extension dependency
-in the future.
-
-The extension can be installed from its page on the Chrome web store:
-https://chrome.google.com/webstore/detail/jcaelnibllfoobpedofhlaobfcoknpap
-
-For more information, see: [Vanadium Chrome extension Overview](/tools/vanadium-chrome-extension.html)
-
-**You have finished setting up your project. Now, onto the code!**
-
-## Creating a Vanadium application
-
-Each **peer** in the application will consist of a **server** and a **client**.
-After receiving a request, the server outputs the message sent by the client.
-
-The following sections break down the application code into bite-sized snippets.
-**The full file will be shown afterwards.**
-
-### Service definition
-
-Define a service that has a single method `hello()` with a single
-parameter `greeting`, in addition to the required `context` and `serverCall` parameters.
-
-{{# helpers.code }}
-function HelloService() {}
-
-HelloService.prototype.hello = function(ctx, serverCall, greeting) {
-  displayHello(greeting);
-};
-{{/ helpers.code }}
-
-It is also possible to define service interfaces in [VDL] (Vanadium Definition
-Language) in order to declare the
-protocol with explicit type information.
-This is demonstrated in the next tutorial.
-
-### Creating the service
-
-The service is created and served by calling `runtime.newServer` and passing in
-the name used to mount the service, along with the service itself.
-
-{{# helpers.code }}
-runtime.newServer(serviceName, new HelloService(), function callback() {
-  // HelloService is now ready.
-});
-{{/ helpers.code }}
-
-### Calling the service from a client
-
-To call a service, first bind on the name. This results in a stub object
-that represents the service.
-When the client program calls a method on the stub,
-the corresponding method is remotely invoked on the service.
-
-
-{{# helpers.code }}
-var client = runtime.getClient();
-var ctx = runtime.getContext();
-
-client.bindTo(ctx, serviceName, function(err, helloService) {
-  if (err) {
-    // handle err
-  }
-
-  var greeting = 'Hello Vanadium';
-  helloService.hello(ctx, greeting, function callback(err) {
-    if (err) {
-      // handle err
-    }
-    // The call is complete!
-  });
-});
-{{/ helpers.code }}
-
-### Putting it all together
-
-This example combines the service, server, and client into a single file.
-Typically, the client is a separate program from the server and service.
-
-The following command creates the peer implementation `$V_TUT/src/hello/peer.js`.
-
-<!-- @helloPeerJS @buildjs @test @testui @completer -->
-```
-mkdir -p $V_TUT/src/hello
-cat - <<EOF >$V_TUT/src/hello/peer.js
-var vanadium = require('vanadium');
-
-// Define HelloService and the hello() method.
-function HelloService() {}
-
-HelloService.prototype.hello = function(ctx, serverCall, greeting) {
-  displayHello(greeting);
-};
-
-// Initialize Vanadium runtime.
-vanadium.init(function(err, runtime) {
-  if (err) {
-    showStatus('Initialization error: ' + err);
-    return;
-  }
-  showStatus('Initialized');
-  runtime.on('crash', function(err) {
-    showStatus('The runtime has crashed unexpectedly and the page must be reloaded.');
-  });
-
-  setupServer(runtime);
-  setupClient(runtime);
-});
-
-// Setup the server.
-function setupServer(runtime) {
-  // Create a server and serve the HelloService.
-  var serviceName = getLocalPeerName(runtime.accountName);
-  runtime.newServer(serviceName, new HelloService(), function(err) {
-    if (err) {
-      showServerStatus('Failed to serve ' + serviceName + ': ' + err);
-      return;
-    }
-    showServerStatus('Serving');
-    // HelloService is now served.
-  });
-}
-
-// Setup the client.
-function setupClient(runtime) {
-  // Create a client and bind to the service.
-  var client = runtime.getClient();
-  var ctx = runtime.getContext();
-
-  var serviceName = getRemotePeerName(runtime.accountName);
-  showClientStatus('Binding');
-  client.bindTo(ctx, serviceName, function(err, helloService) {
-    if (err) {
-      showClientStatus('Failed to bind to ' + serviceName + ': ' + err);
-      return;
-    }
-    showClientStatus('Ready');
-
-    registerButtonHandler(function(greeting) {
-      showClientStatus('Calling');
-      // Call hello() on the service.
-      helloService.hello(ctx, greeting, function(err) {
-        if (err) {
-          showClientStatus('Error invoking hello(): ' + err);
-          return;
-        }
-        showClientStatus('Ready');
-      });
-    });
-  });
-}
-
-// Get the local and remote names.
-function getLocalPeerName(accountName) {
-  var homeDir = accountName.replace(/^dev.v.io:u:/, 'users/').replace(vanadium.security.ChainSeparator.val, '/');
-  var hash = window.location.hash;
-  return homeDir + '/tutorial/hello' + hash;
-}
-function getRemotePeerName(accountName) {
-  var localPeer = getLocalPeerName(accountName);
-  var splitPeer = localPeer.split('#');
-  if (splitPeer[1] == 'A') {
-    splitPeer[1] = 'B';
-  } else {
-    splitPeer[1] = 'A';
-  }
-  return splitPeer.join('#');
-}
-
-// Manipulate the html page.
-function displayHello(greeting) {
-  var li = document.createElement('li');
-  li.textContent = greeting;
-  document.getElementById('receivedhellos').appendChild(li);
-}
-function registerButtonHandler(fn) {
-  document.getElementById('hellobutton').addEventListener('click', function() {
-    var greeting = document.getElementById('hellotext').value;
-    fn(greeting);
-  });
-}
-function showClientStatus(text) {
-  document.getElementById('clientstatus').textContent = text;
-}
-function showServerStatus(text) {
-  document.getElementById('serverstatus').textContent = text;
-}
-function showStatus(text) {
-  showClientStatus(text);
-  showServerStatus(text);
-}
-EOF
-```
-
-### Building for the browser
-
-Use `browserify` to build the browser-targeted JavaScript file, which
-combines `peer.js` above with its dependencies, such as the Vanadium library:
-
-<!-- @browserifyServer @buildjs @test @testui @completer -->
-```
-mkdir -p $V_TUT/browser
-NODE_PATH=$V_TUT $V_TUT/node_modules/.bin/browserify \
-  $V_TUT/src/hello/peer.js -o $V_TUT/browser/hello-peer.js
-```
-
-This command generates `$V_TUT/browser/hello-peer.js`.
-
-### Adding the script to an HTML page
-
-Finally, a web page is needed to host `peer.js`.
-
-Create another HTML file in `$V_TUT/browser/peer.html` that includes the server
-JavaScript code and links to the client.
-
-<!-- @helloPeerHTML @buildjs @test @testui @completer -->
-```
-cat - <<EOF >$V_TUT/browser/peer.html
- <!DOCTYPE html>
- <html>
- <head>
-   <title>Hello Peer</title>
- </head>
- <body>
-   <div>
-     <div style="float:left;"><input id="hellotext" value="Hello World"></input><button id="hellobutton">Send</button></div>
-     <div style="float:right; white-space:nowrap">
-     <div>Client Status: <span id="clientstatus">Initializing</span></div>
-     <div>Server Status: <span id="serverstatus">Initializing</span></div>
-     </div>
-   </div>
-   <div style="clear:both;">
-     Received Greetings:
-     <ol id="receivedhellos"></ol>
-   </div>
-   <script src="hello-peer.js"></script>
- </body>
- </html>
-EOF
-```
-
-Create an HTML file in `$V_TUT/hello.html` that contains two copies of `peer.js`
-in iframes for simplified viewing.
-
-<!-- @helloMainHTML @buildjs @test @testui @completer -->
-```
-cat - <<EOF >$V_TUT/hello.html
- <!DOCTYPE html>
- <html>
- <head>
-   <title>Hello Peers</title>
- </head>
- <body style="background: #000000;">
-   <div style="position:fixed;top:0px;left:0px;bottom:0px;width:48%; background: #ffffff;">
-     <iframe id="frameA" src="browser/peer.html#A" style="width:100%; height:100%;" frameBorder="0"></iframe>
-   </div>
-   <div style="position:fixed;top:0px;right:0px;bottom:0px;width:48%; background: #ffffff;">
-     <iframe id="frameB" src="browser/peer.html#B" style="width:100%; height:100%;" frameBorder="0"></iframe>
-   </div>
- </body>
- </html>
-
-EOF
-```
-
-**You are now ready to view the peers in a browser!**
-
-## Viewing in a browser
-
-### Starting a local server
-
-You are ready to serve the web pages on a local server. Run the web server on port 8989.
-
-Using node-static, the command is:
-
-```
-$V_TUT/node_modules/.bin/static $V_TUT -p 8989 > /dev/null
-```
-
-{{# helpers.hidden }}
-For the test, we want to run the node-static server without blocking. It's not
-worth adding a cleanup step to the tutorial, so it's done in this hidden block.
-
-<!-- @serveHello @test @testui @sleep -->
-```
-$V_TUT/node_modules/.bin/static $V_TUT -p 8989 > /dev/null &
-TUT_PID_HTTPD=$!
-```
-
-Curl the page to confirm its existence.
-<!-- @curlHello @test @testui -->
-```
-curl -f http://127.0.0.1:8989/hello.html > /dev/null
-```
-
-Set the workspace, if necessary. Check other required environment variables.
-
-<!-- @mavenEnv @testui -->
-```
-# Set WORKSPACE, if not chosen.
-[ -z "$WORKSPACE" ] && export WORKSPACE=${JIRI_ROOT}/www
-
-# Check that the environment variables exist.
-echo ${CHROME_WEBDRIVER?} > /dev/null
-echo ${GOOGLE_BOT_USERNAME?} > /dev/null
-echo ${GOOGLE_BOT_PASSWORD?} > /dev/null
-```
-
-Then, run the WebDriver test with maven.
-
-<!-- @mavenTest @testui -->
-```
-# Run the maven test.
-TMPDIR=/tmp xvfb-run -s '-ac -screen 0 1024x768x24' \
-  mvn test \
-  -f=$JIRI_ROOT/website/test/ui/pom.xml \
-  -Dtest=HelloPeerUITest \
-  -DchromeDriverBin=$CHROME_WEBDRIVER \
-  -DhtmlReportsRelativePath=htmlReports \
-  -DgoogleBotUsername=$GOOGLE_BOT_USERNAME \
-  -DgoogleBotPassword=$GOOGLE_BOT_PASSWORD
-```
-
-And clean up the static server.
-
-<!-- @cleanupHTTPD @test @testui -->
-```
-kill $TUT_PID_HTTPD
-```
-
-{{/ helpers.hidden }}
-
-### Viewing the pages
-
-The page shows two peers. Enter a greeting (or use the default 'Hello World') and
-press Send for one peer. The other peer will receive the greeting.
-
-{{# helpers.warning }}
-On your first visit to a Vanadium web app, the Chrome Vanadium extension
-prompts you to `Allow` blessings.
-This grants the web app permission to use your identity when running servers and clients.
-
-For the purposes of the tutorials, please click the `Allow` button when prompted
-(this might be in another browser tab).
-{{/ helpers.warning }}
-
-Open http://127.0.0.1:8989/hello.html and allow the blessing.
-
-## Summary
-
-This tutorial demonstrated how to:
-* Set up the Vanadium environment for JavaScript.
-* Create and build a Hello Peer client and server.
-* Run the example in a web browser. A hosted copy of the tutorial
-result can be accessed [here][built-example].
-
-[vdl]: /glossary.html#vanadium-definition-language-vdl-
-[built-example]: /tutorials/javascript/results/hello.html
-[node]: https://nodejs.org/download
-[golang]: http://golang.org
diff --git a/content/tutorials/javascript/index.md b/content/tutorials/javascript/index.md
deleted file mode 100644
index cd8985f..0000000
--- a/content/tutorials/javascript/index.md
+++ /dev/null
@@ -1,37 +0,0 @@
-= yaml =
-title: Overview
-layout: tutorial
-sort: 1
-toc: false
-= yaml =
-
-Vanadium can be used to build secure, distributed applications for the web.
-Servers and clients can be written in JavaScript to run under
-a [browser] or [Node.js] and communicate via RPC.
-
-By using the [Vanadium Definition Language][vdl] (VDL),
-Vanadium apps written in JavaScript can also communicate
-with Vanadium servers and clients written in other languages.
-
-Chrome (desktop) is currently required for browser applications,
-but this will change in the future.
-
-The following tutorials build on the [Client/Server Basics tutorial] and demonstrate
-Vanadium's JavaScript API. While the tutorials are targeted toward
-running in the browser, the code can be adapted to run in a [Node.js] environment.
-
-* [Hello Peer][hellopeer]
-
-  _Wherein_ Vanadium says hello in a peer-to-peer manner.
-
-* [Fortune in JS][fortune]
-
-  _Wherein_ you build a fortune teller service and a client to talk to it.
-
-
-[vdl]: /glossary.html#vanadium-definition-language-vdl-
-[Node.js]: https://nodejs.org/
-[browser]: https://www.google.com/chrome/
-[hellopeer]: /tutorials/javascript/hellopeer.html
-[fortune]: /tutorials/javascript/fortune.html
-[Client/Server Basics tutorial]: /tutorials/basics.html
diff --git a/content/tutorials/javascript/security.md b/content/tutorials/javascript/security.md
deleted file mode 100644
index d9ec979..0000000
--- a/content/tutorials/javascript/security.md
+++ /dev/null
@@ -1,951 +0,0 @@
-= yaml =
-title: "Security in JS"
-fullTitle: "Security in JavaScript"
-layout: tutorial
-wherein: you learn how to bless and authorize users in JavaScript
-sort: 5
-toc: true
-prerequisites: {scenario: e, also: {jsSpecial: true, chrome: true}}
-= yaml =
-
-## Introduction
-In the Fortune tutorial, you saw how to create a client and a server and how to
-fetch fortunes from the server. However, the server and the client had
-the same identity, which simplified authorization.
-
-This tutorial demonstrates how to restrict calls to methods with a more
-sophisticated authorization scheme. This tutorial does not explain the core
-security concepts in much depth, so it is highly recommended that the
-[Security Tutorials] are completed before starting.
-
-### The return of Alice, Bob, Carol and Diane
-The scenario and roles from the [Security Tutorials] will be replicated here:
-
-* Alice hosts a fortune service and has blessings `alice`
-* Bob is a friend of Alice (friends can get fortunes, but not add them) and
-has blessings `alice:friends:bob`.
-* Carol is a family member of Alice (family can both add and get fortunes) and
-has blessings `alice:family:sister`.
-* Diane is given blessings by Carol with an expiry caveat so until the
-expiration takes effect Diane can act as a family member of Carol through
-the blessings `alice:family:sister:guest:diane`.
-
-However, there are a few modifications for the JavaScript tutorials. In
-addition to the blessings above, each person with have an additional blessing
-from OAuth. This will often be used as a trusted root for confirming the
-identity of the other person.
-
-### Sending blessings
-The [Security Tutorials] passed the blessings and Alice's public key out of
-band. In this tutorial, they will be sent between peers using the OAuth-blessing
-as a trusted root to verify the identity of the corresponding peer.
-
-Two main techniques will be explored for sending blessings:
-* Running a service that returns the appropriate blessing given a request.
-This is used to give Bob and Carol their blessings.
-* Using a granter in a call to a service. Granters make it possible to specify
-blessings on client calls. They are similar to passing in an argument, but
-get access to the remote end's blessings which make it possible to create
-a blessing for the remote public key. This is used when Carol provides a
-blessing to Alice.
-
-## Interfaces
-
-First, define the VDL interfaces. In this tutorial, Alice hosts both a Fortune
-service and a Blessing Provider service. The corresponding interfaces are shown
-below.
-
-### Fortune VDL
-
-The Fortune VDL definition is nearly the same as in other tutorials, but includes
-access tags. Fortune's `Get` method requires Read access, while `Add` requires
-Write access.
-
-This command creates `src/security/ifc/fortune.vdl`
-```
-mkdir -p $V_TUT/src/security/ifc
-cat - <<EOF >$V_TUT/src/security/ifc/fortune.vdl
-package security
-
-import "v.io/v23/security/access"
-
-type Fortune interface {
-  // Returns a random fortune.
-  Get() (wisdom string | error) {access.Read}
-  // Adds a fortune to the set used by Get().
-  Add(wisdom string) error {access.Write}
-}
-EOF
-```
-
-These security tags are used by the Permissions Authorizer, defined in the
-[Permissions Authorizer tutorial].
-
-### ProvideBlessings VDL
-
-Alice also runs a ProvideBlessings service, which allows any client to make the
-`GetBlessings` RPC. On each request, the method prompts Alice to decide whether to
-return a blessing or an error. This service will be used to provide blessings to
-Bob and Carol.
-
-The following goes in `src/security/ifc/provide-blessings.vdl`
-```
-cat - <<EOF >$V_TUT/src/security/ifc/provide-blessings.vdl
-package security
-
-import "v.io/v23/security"
-
-type ProvideBlessings interface {
-  GetBlessings() (security.WireBlessings | error)
-}
-EOF
-```
-
-### Building VDL
-
-Use the VDL tool to build these interfaces. The command will generate
-`src/security/ifc/index.js`.
-
-```
-VDLROOT=$V23_RELEASE/src/v.io/v23/vdlroot \
-    VDLPATH=$V23_RELEASE/src:$V_TUT/src \
-    $V_BIN/vdl generate -lang=javascript -js-out-dir=$V_TUT/src \
-    $V_TUT/src/security/ifc/...
-```
-
-## Vanadium security in JavaScript
-
-### Alice
-
-Alice runs two services in this example, a Fortune-teller service and a service
-that provides blessings to callers.
-
-#### Fortune service
-
-**What follows is a copy of the Fortune implementation from the [Fortune tutorial].**
-
-The access rules defined in VDL apply to this service despite no change to the
-service body because the Fortune Service adds the VDL interface definition to its
-prototype chain.
-
-This command creates `src/security/service/fortune.js`
-```
-mkdir -p $V_TUT/src/security/service
-cat - <<EOF >$V_TUT/src/security/service/fortune.js
-var vdlFortune = require('../ifc');
-
-module.exports = FortuneService;
-
-// Define the fortune service.
-function FortuneService() {
-  this.fortunes = [
-    'You will reach the heights of success.',
-    'Conquer your fears or they will conquer you.',
-    'Today is your lucky day!',
-  ];
-  this.numFortunesServed = 0;
-}
-
-// Add VDL service metadata and type information.
-FortuneService.prototype = new vdlFortune.Fortune();
-
-// Define the FortuneServiceMethod bodies.
-FortuneService.prototype.add = function(ctx, serverCall, Fortune) {
-  this.fortunes.push(Fortune);
-}
-FortuneService.prototype.get = function(ctx, serverCall) {
-  this.numFortunesServed++;
-  var fortuneIndex = Math.floor(Math.random() *
-    this.fortunes.length);
-  return this.fortunes[fortuneIndex];
-};
-EOF
-```
-
-#### Blessings service
-
-This command creates `src/security/service/provide-blessings.js`
-```
-mkdir -p $V_TUT/src/security/service
-cat - <<EOF >$V_TUT/src/security/service/provide-blessings.js
-var vanadium = require('vanadium');
-var vdlProvideBlessings = require('../ifc');
-
-module.exports = ProvideBlessingsService;
-
-// Define the provide blessings service, which allows clients to request blessings.
-function ProvideBlessingsService(principal, getBlessingsCallback) {
-  this._principal = principal;
-  this._getBlessingsCallback = getBlessingsCallback;
-}
-
-// Add VDL service metadata and type information.
-ProvideBlessingsService.prototype = new vdlProvideBlessings.ProvideBlessings();
-
-// getBlessings handles requests for blessings and prompts the user for a
-// blessing string to bless the client with. The user can deny the request.
-ProvideBlessingsService.prototype.getBlessings = function(ctx, serverCall) {
-  var desiredSuffix =
-    this._getBlessingsCallback(serverCall.securityCall.remoteBlessingStrings);
-  if (desiredSuffix === null) {
-    return Promise.reject(new Error('No blessing provided - not authorized'));
-  }
-  var forPeerArgs = [ctx].concat(serverCall.securityCall.remoteBlessingStrings);
-
-  var self = this;
-  return this._principal.blessingStore.forPeer.apply(
-    this._principal.blessingStore, forPeerArgs)
-  .then(function(peerBlessings) {
-    var expiryTime = new Date();
-    expiryTime.setDate(new Date().getDate() + 1); // Expires in 1 day.
-    var expiryCaveat = vanadium.security.createExpiryCaveat(expiryTime);
-    return self._principal.bless(ctx, serverCall.securityCall.remoteBlessings.publicKey, peerBlessings, desiredSuffix, expiryCaveat);
-  });
-};
-EOF
-```
-
-This service takes a principal and a callback function. When a client calls
-getBlessings, Alice will use this callback to determine whether or not the
-client truly ought to be blessed. Alice can also decide what name to use when
-blessing the client.
-
-#### Blessing store
-
-It is helpful to inspect the blessing store of Alice, Bob, Carol, and Diane. The
-following code block creates `src/security/lib/show-blessing-store.js`, which
-(assuming some DOM elements) exposes the list of blessings that each user owns.
-
-```
-mkdir -p $V_TUT/src/security/lib
-cat - <<EOF >$V_TUT/src/security/lib/show-blessing-store.js
-module.exports = showBlessingStore;
-
-function showBlessingStore(runtime) {
-  var ctx = runtime.getContext();
-
-  runtime.principal.blessingStore.getDefault(ctx)
-  .then(function(defaultBlessings) {
-    document.getElementById('default-blessings').textContent = defaultBlessings.toString();
-  }).catch(function(err) {
-    throw new Error('Error displaying default blessings: ' + err);
-  });
-
-  runtime.principal.blessingStore.getPeerBlessings(ctx)
-  .then(function(peerBlessings) {
-    var ul = document.getElementById('peer-blessings');
-
-    // Remove all children in the list.
-    while (ul.lastChild) {
-      ul.removeChild(ul.lastChild);
-    }
-
-    // Add all the peerBlessings to the list.
-    peerBlessings.forEach(function(blessings, pattern) {
-      var item = document.createElement('li');
-      item.textContent = pattern + ' -> ' + blessings.toString();
-      ul.appendChild(item);
-    });
-  }).catch(function(err) {
-    throw new Error('Error displaying peer blessings: ' + err);
-  });
-}
-EOF
-```
-
-#### Alice code
-
-The following goes in `src/security/alice.js`
-```
-mkdir -p $V_TUT/src/security
-cat - <<EOF >$V_TUT/src/security/alice.js
-var vanadium = require('vanadium');
-var FortuneService = require('./service/fortune');
-var ProvideBlessingsService = require('./service/provide-blessings');
-var showBlessingStore = require('./lib/show-blessing-store');
-
-var config = {
-  logLevel: vanadium.vlog.levels.INFO,
-};
-
-vanadium.init(config, function(err, runtime) {
-  if (err) {
-    setStatus('Initialization error: ' + err);
-    return;
-  }
-  runtime.on('crash', function(err) {
-    setStatus('The runtime has crashed unexpectedly and the page must be reloaded.');
-  });
-
-  var aliceName = runtime.accountName.replace(/^dev.v.io:u:/, 'users/').replace(vanadium.security.ChainSeparator.val, '/') + // is this needed
-    '/tutorial/alice';
-  var aliceReqName = runtime.accountName.replace(/^dev.v.io:u:/, 'users/').replace(vanadium.security.ChainSeparator.val, '/') + // is this needed
-    '/tutorial/alicerequest';
-
-  var ctx = runtime.getContext();
-
-  setStatus('Configuring blessings');
-  var aliceBlessings;
-  runtime.principal.blessSelf(ctx, 'alice', vanadium.security.unconstrainedUse)
-  .then(function(blessings) {
-    aliceBlessings = blessings;
-    return runtime.principal.addToRoots(ctx, aliceBlessings);
-  }).then(function() {
-    return runtime.principal.blessingStore.set(ctx, aliceBlessings, '...');
-  }).then(function(oldBlessings) {
-    return runtime.principal.blessingStore.set(ctx, oldBlessings,
-      'dev.v.io/role/vprod');
-  }).then(function() {
-    return runtime.principal.blessingStore.getDefault(ctx);
-  }).then(function(oldDefault) {
-    return runtime.principal.blessingStore.setDefault(ctx, vanadium.security.unionOfBlessings(ctx, oldDefault, aliceBlessings));
-  }).then(function() {
-    showBlessingStore(runtime);
-    setStatus('Preparing to serve...');
-    var fortuneServeConfig = {
-      authorizer: createFortuneAuthorizer()
-    };
-    var fortuneService = new FortuneService();
-    setInterval(function() {
-      displayNumFortunesServed(fortuneService.numFortunesServed);
-      displayFortunes(fortuneService.fortunes);
-    }, 250);
-    return runtime.newServer(aliceName, fortuneService,
-      fortuneServeConfig);
-  }).then(function() {
-    var provideBlessingsConfig = {
-      authorizer: function() {}
-    };
-    return runtime.newServer(
-      aliceReqName,
-      new ProvideBlessingsService(runtime.principal, askUserForBlessings),
-      provideBlessingsConfig
-    );
-  }).then(function() {
-    setStatus('Ready');
-  }).catch(function(err) {
-    setStatus('Error: ' + error);
-  });
-});
-
-function createFortuneAuthorizer() {
-  // ACLs
-  var acl = new Map();
-  var access = vanadium.security.access;
-  acl.set(access.Read, {
-    in: ['alice:family', 'alice:friends']
-  });
-  acl.set(access.Write, {
-    in: ['alice:family']
-  });
-  return new access.permissionsAuthorizer(acl, access.Tag);
-}
-
-function setStatus(status) {
-  document.getElementById('status').textContent = status;
-}
-function askUserForBlessings(blessings) {
-  // Tutorial-only: If the blessings comes from Bob (19102) or Carol (19103),
-  // helpfully suggest the correct suffix to bless them with.
-  var suggestion = '';
-  if (blessings[0].indexOf('19102') !== -1) {
-    suggestion = 'friends:bob';
-  } else if (blessings[0].indexOf('19103') !== -1) {
-    suggestion = 'family:sister';
-  }
-  return window.prompt(
-    'Received blessing request from peer with remote blessings: ' +
-    blessings + '\nWhat blessing suffix should peer be given?',
-    suggestion);
-}
-function displayFortunes(fortunes) {
-  var fortuneList = document.getElementById('fortune-list');
-  fortuneList.innerHTML = '';
-  for (var i = 0; i < fortunes.length; i++) {
-    var bullet = document.createElement('li');
-    bullet.textContent = fortunes[i];
-    fortuneList.appendChild(bullet);
-  }
-}
-function displayNumFortunesServed(count) {
-  document.getElementById('fortune-count').innerHTML = count;
-}
-EOF
-```
-
-#### Alice HTML
-
-Alice's JavaScript is hosted in a corresponding HTML file:
-```
-cat - <<EOF >$V_TUT/browser/alice.html
-<!DOCTYPE html>
-<html>
-<head>
-  <title>Security - Alice</title>
-</head>
-<body>
-  <br><h2>Alice</h2></br>
-  <br>Default Blessings: <span id="default-blessings">----</span></br>
-  <br><b>Peer Blessings:</b></br>
-  <br><ul id="peer-blessings"></ul></br>
-  <br>Status: <span id="status">Initializing...</span></br>
-  <br></br>
-  <div>
-    <br>Current Fortunes:</br>
-    <br><ul id="fortune-list"></ul></br>
-  </div>
-  <br>Fortunes Served: <span id="fortune-count">0</span></br>
-  <script src="security-alice.js"></script>
-</body>
-</html>
-EOF
-```
-
-### Bob
-Bob is a friend of Alice and will be given a `alice:friends:bob` blessing that
-enables read-only access to fortunes. In order to get this blessing, he needs
-to contact Alice's blessing granter service.
-
-#### Fortune client
-
-This is the generic Fortune client that Bob, Carol, and Diane will use upon
-connecting to Alice's Fortune server. The following command creates
-`src/security/lib/fortune-client.js`.
-
-```
-mkdir -p $V_TUT/src/security/lib
-cat - <<EOF >$V_TUT/src/security/lib/fortune-client.js
-module.exports = {
-  prepareClient: prepareClient,
-  setStatus: setStatus,
-  showFortune: showFortune
-};
-
-function prepareClient(ctx, alice) {
-  onGetFortune(function() {
-    setStatus('Getting a fortune...');
-    alice.get(ctx)
-    .then(function(f) {
-      showFortune(f);
-      setStatus('Ready');
-    })
-    .catch(function(err) {
-      setStatus('Error in get(): ' + err);
-    });
-  });
-  onAddFortune(function(fortuneToAdd) {
-    setStatus('Adding a fortune...');
-    alice.add(ctx, fortuneToAdd)
-    .then(function() {
-      setStatus('Ready');
-    })
-    .catch(function(err) {
-      setStatus('Error in add(): ' + err);
-    });
-  });
-}
-
-function setStatus(status) {
-  document.getElementById('status').textContent = status;
-}
-function showFortune(fortune) {
-  document.getElementById('last-fortune').textContent = fortune;
-}
-function onGetFortune(cb) {
-  document.getElementById('get-fortune').addEventListener('click', cb);
-}
-function onAddFortune(cb) {
-  document.getElementById('add-fortune').addEventListener('click', function() {
-    var fortuneToAdd = document.getElementById('fortune-to-add').value;
-    cb(fortuneToAdd);
-  });
-}
-EOF
-```
-
-#### Bob code
-
-Bob should exist in `src/security/bob.js`:
-```
-cat - <<EOF >$V_TUT/src/security/bob.js
-var vanadium = require('vanadium');
-var showBlessingStore = require('./lib/show-blessing-store');
-var clientLib = require('./lib/fortune-client');
-
-var config = {
-  logLevel: vanadium.vlog.levels.INFO
-};
-
-// Initialize Vanadium runtime
-vanadium.init(config, function(err, runtime) {
-  if (err) {
-    throw new Error('Initialization error: ' + err);
-  }
-  runtime.on('crash', function(err) {
-      throw new Error('The runtime has crashed unexpectedly and the page must be reloaded.');
-  });
-
-  showBlessingStore(runtime);
-
-  clientLib.setStatus('Waiting for Alice\'s blessings...');
-  var aliceReqName = runtime.accountName.replace(/^dev.v.io:u:/, 'users/').replace(vanadium.security.ChainSeparator.val, '/') + // is this needed
-    '/tutorial/alicerequest';
-  var aliceName = runtime.accountName.replace(/^dev.v.io:u:/, 'users/').replace(vanadium.security.ChainSeparator.val, '/') + // is this needed
-    '/tutorial/alice';
-  var ctx = runtime.getContext();
-  var client = runtime.getClient();
-  client.bindTo(ctx, aliceReqName)
-  .then(function(req) {
-    var callOpts = client.callOption({
-      allowedServersPolicy: [runtime.accountName + '/http%3A%2F%2F127.0.0.1%3A19101']
-    });
-    return req.getBlessings(ctx, callOpts);
-  }).then(function(blessings) {
-    return runtime.principal.addToRoots(ctx, blessings)
-    .then(function() {
-      return runtime.principal.blessingStore.set(ctx, blessings, 'alice');
-    });
-  }).then(function() {
-    showBlessingStore(runtime);
-    clientLib.setStatus('Connecting to Alice...');
-    return client.bindTo(ctx, aliceName);
-  }).then(function(alice) {
-    clientLib.prepareClient(ctx, alice);
-    clientLib.setStatus('Ready');
-  }).catch(function(err) {
-    clientLib.setStatus('Error: ' + err);
-  });
-});
-EOF
-```
-
-#### Bob HTML
-
-Bob needs a corresponding HTML file:
-```
-cat - <<EOF >$V_TUT/browser/bob.html
-<!DOCTYPE html>
-<html>
-<head>
-  <title>Security - Bob</title>
-</head>
-<body>
-  <br><h2>Bob</h2></br>
-  <br>Default Blessings: <span id="default-blessings">----</span></br>
-  <br><b>Peer Blessings:</b></br>
-  <br><ul id="peer-blessings"></ul></br>
-  <br>Status: <span id="status">Initializing...</span></br>
-  <br></br>
-  <br><input id="fortune-to-add" value="Fortune to Add"></input><button id="add-fortune">Add Fortune</button></br>
-  <br><button id="get-fortune">Get Fortune</button></br>
-  <br>Last Fortune: <span id="last-fortune">----</span></br>
-  <script src="security-bob.js"></script>
-</body>
-</html>
-EOF
-```
-
-### Carol
-Carol operates nearly identically to Bob, except that she uses `alice:family:sister`
-blessing that allows read / write access. In addition, Carol has functionality
-to grant Diane a blessing with caveats.
-
-#### Carol code
-
-`src/security/carol.js` should contain:
-```
-cat - <<EOF >$V_TUT/src/security/carol.js
-var vanadium = require('vanadium');
-var showBlessingStore = require('./lib/show-blessing-store');
-var clientLib = require('./lib/fortune-client');
-
-var config = {
-  logLevel: vanadium.vlog.levels.INFO
-};
-
-// Initialize Vanadium runtime
-vanadium.init(config, function(err, runtime) {
-  if (err) {
-    throw new Error('Initialization error: ' + err);
-  }
-  runtime.on('crash', function(err) {
-      throw new Error('The runtime has crashed unexpectedly and the page must be reloaded.');
-  });
-
-  showBlessingStore(runtime);
-  initGranteeField(runtime);
-
-  clientLib.setStatus('Waiting for Alice\'s blessings...');
-  var aliceReqName = runtime.accountName.replace(/^dev.v.io:u:/, 'users/').replace(vanadium.security.ChainSeparator.val, '/') + // is this needed
-    '/tutorial/alicerequest';
-  var aliceName = runtime.accountName.replace(/^dev.v.io:u:/, 'users/').replace(vanadium.security.ChainSeparator.val, '/') + // is this needed
-    '/tutorial/alice';
-  var ctx = runtime.getContext();
-  var client = runtime.getClient();
-  var carolBlessings;
-  client.bindTo(ctx, aliceReqName)
-  .then(function(req) {
-    var callOpts = client.callOption({
-      allowedServersPolicy: [runtime.accountName + '/http%3A%2F%2F127.0.0.1%3A19101']
-    });
-    return req.getBlessings(ctx, callOpts);
-  }).then(function(blessings) {
-    carolBlessings = blessings;
-    return runtime.principal.addToRoots(ctx, blessings);
-  }).then(function() {
-    return runtime.principal.blessingStore.set(ctx, carolBlessings, 'alice');
-  }).then(function() {
-    showBlessingStore(runtime);
-    clientLib.setStatus('Connecting to Alice...');
-    return client.bindTo(ctx, aliceName);
-  }).then(function(alice) {
-    clientLib.prepareClient(ctx, alice);
-    onSendBlessings(runtime, carolBlessings, sendBlessingsToDiane);
-    clientLib.setStatus('Ready');
-  }).catch(function(err) {
-    clientLib.setStatus('Error: ' + err);
-  });
-});
-
-
-function sendBlessingsToDiane(runtime, carolBlessings, grantee, expiration, suffix) {
-  var client = runtime.getClient();
-  clientLib.setStatus('Connecting to Diane...');
-  console.log('Connecting to grantee at: ' + grantee);
-  client.bindTo(runtime.getContext(), grantee)
-  .then(function(diane) {
-    var expirationMs = expiration * 1000;
-    var expirationTime = new Date(Date.now() + expirationMs);
-    var granterCalled = false;
-    var granterOption = client.callOption({
-      granter: function(ctx, securityCall, cb) {
-        console.log('In granter. Signing with key: ', securityCall.remoteBlessings.publicKey);
-        granterCalled = true;
-        runtime.principal.bless(ctx,
-          securityCall.remoteBlessings.publicKey,
-          carolBlessings,
-          suffix,
-          vanadium.security.createExpiryCaveat(expirationTime),
-          function(err, blessing) {
-            expectedBlessing = blessing;
-            cb(err, blessing);
-          });
-      }
-    });
-    clientLib.setStatus('Granting a blessing to Diane...');
-    return diane.grantBlessing(runtime.getContext(), granterOption);
-  }).then(function() {
-    clientLib.setStatus('Ready');
-  }).catch(function(err) {
-    clientLib.setStatus('Error sending blessings: ' + err);
-  });
-}
-
-function onSendBlessings(runtime, carolBlessings, cb) {
-  document.getElementById('send-grant').addEventListener('click', function() {
-    var grantee = document.getElementById('grantee').value;
-    var suffix = document.getElementById('grant-suffix').value;
-    var expiration = parseInt(document.getElementById('grant-expiration').value);
-    cb(runtime, carolBlessings, grantee, expiration, suffix);
-  });
-}
-function initGranteeField(runtime) {
-  var dianeName = runtime.accountName.replace(/^dev.v.io:u:/, 'users/').replace(vanadium.security.ChainSeparator.val, '/') + // is this needed
-    '/tutorial/diane';
-  document.getElementById('grantee').value = dianeName;
-}
-EOF
-```
-
-#### Carol HTML
-
-Carol needs a corresponding HTML file:
-```
-cat - <<EOF >$V_TUT/browser/carol.html
-<!DOCTYPE html>
-<html>
-<head>
-  <title>Security - Carol</title>
-</head>
-<body>
-  <br><h2>Carol</h2></br>
-  <br>Default Blessings: <span id="default-blessings">----</span></br>
-  <br><b>Peer Blessings:</b></br>
-  <br><ul id="peer-blessings"></ul></br>
-  <br>Status: <span id="status">Initializing...</span></br>
-  <br><button id="send-grant">Send Grant</button> to <input id="grantee" value="---"></input> with suffix <input id="grant-suffix" value="guest:diane"></input> expiration time (seconds): <input id="grant-expiration" value="10"></input></br>
-  <br></br>
-  <br><input id="fortune-to-add" value="Fortune to Add"></input><button id="add-fortune">Add Fortune</button></br>
-  <br><button id="get-fortune">Get Fortune</button></br>
-  <br>Last Fortune: <span id="last-fortune">----</span></br>
-  <script src="security-carol.js"></script>
-</body>
-</html>
-
-EOF
-```
-
-### Diane
-Diane gets the blessing `family:sister:guest:diane` from Carol with an expiry
-caveat.
-
-#### Diane code
-
-Put the following in `src/security/diane.js`:
-```
-cat - <<EOF >$V_TUT/src/security/diane.js
-var vanadium = require('vanadium');
-var showBlessingStore = require('./lib/show-blessing-store');
-var clientLib = require('./lib/fortune-client');
-
-var config = {
-  logLevel: vanadium.vlog.levels.INFO
-};
-
-var dianeService = {
-  grantBlessing: function(ctx, serverCall) {
-    console.log('In grantBlessing() localKey: ', serverCall.securityCall.localBlessings.publicKey);
-    console.log('Grant blessing called');
-    var grantedBlessings = serverCall.grantedBlessings;
-    console.log('Granted blessings key: ', grantedBlessings.publicKey);
-    var runtime = vanadium.runtimeForContext(ctx);
-    var aliceName = runtime.accountName.replace(/^dev.v.io:u:/, 'users/').replace(vanadium.security.ChainSeparator.val, '/') + // is this needed
-      '/tutorial/alice';
-    console.log('alice name: ' + aliceName);
-
-    clientLib.setStatus('Blessings received!');
-    var client = runtime.getClient();
-    runtime.principal.addToRoots(ctx, grantedBlessings)
-    .then(function() {
-      return runtime.principal.blessingStore.set(ctx, grantedBlessings, 'alice');
-    }).then(function() {
-      showBlessingStore(runtime);
-      clientLib.setStatus('Connecting to Alice...');
-      return client.bindTo(ctx, aliceName);
-    }).then(function(alice) {
-      clientLib.prepareClient(ctx, alice);
-      clientLib.setStatus('Ready');
-    }).catch(function(err) {
-      clientLib.setStatus('Error: ' + err);
-    });
-  }
-};
-
-// Initialize Vanadium runtime
-vanadium.init(config, function(err, runtime) {
-  if (err) {
-    throw new Error('Initialization error: ' + err);
-  }
-  runtime.on('crash', function(err) {
-      throw new Error('The runtime has crashed unexpectedly and the page must be reloaded.');
-  });
-
-  showBlessingStore(runtime);
-
-  clientLib.setStatus('Waiting for blessings...');
-
-  // Create a server and serve the Diane's Service.
-  var dianeName = runtime.accountName.replace(/^dev.v.io:u:/, 'users/').replace(vanadium.security.ChainSeparator.val, '/') + // is this needed
-    '/tutorial/diane';
-  console.log('dianeName: ' + dianeName);
-  var dianeServiceConfig = {
-    authorizer: function(ctx, secCall) {
-      return undefined;
-    }
-  };
-  runtime.newServer(dianeName, dianeService, dianeServiceConfig, function(err) {
-    if (err) {
-      throw new Error('Failed to serve ' + serviceName + ': ' + err);
-    }
-    console.log('Diane served');
-  });
-});
-EOF
-```
-
-#### Diane HTML
-
-Diane needs a corresponding HTML file:
-```
-cat - <<EOF >$V_TUT/browser/diane.html
-<!DOCTYPE html>
-<html>
-<head>
-  <title>Security - Diane</title>
-</head>
-<body>
-  <br><h2>Diane</h2></br>
-  <br>Default Blessings: <span id="default-blessings">----</span></br>
-  <br><b>Peer Blessings:</b></br>
-  <br><ul id="peer-blessings"></ul></br>
-  <br>Status: <span id="status">Initializing...</span></br>
-  <br></br>
-  <br><input id="fortune-to-add" value="Fortune to Add"></input><button id="add-fortune">Add Fortune</button></br>
-  <br><button id="get-fortune">Get Fortune</button></br>
-  <br>Last Fortune: <span id="last-fortune">----</span></br>
-  <script src="security-diane.js"></script>
-</body>
-</html>
-EOF
-```
-
-## Running the code
-
-### Combined HTML
-
-`security.html` is an HTML page containing all of the above pages in iframes to
-make it easier to observe changes.
-
-There are four iframes, one each for Alice, Bob, Carol, and Diane. Alice will
-always appear in the left frame. The iframes for Bob, Carol, and Diane can be
-toggled using the "Show" buttons in the center of the page.
-
-```
-cat - <<EOF >$V_TUT/security.html
-<!DOCTYPE html>
-<html>
-<head>
-  <title>JavaScript Security Tutorial</title>
-  <style>
-    .hidden {
-      display: none;
-    }
-  </style>
-</head>
-<body style="background: #000000;">
-  <div style="position:fixed;top:0vh;left:0vh;bottom:0vh;width:47vw; background: #ffffff;">
-    <iframe id="Alice" src="http://127.0.0.1:19101/browser/alice.html" style="width:100%; height:100%;" frameBorder="0"></iframe>
-  </div>
-  <button style="position:fixed;top:0vh;left:47vw;bottom:0vh;width:6vw;height:5vh;" id='Bob-button'>Show Bob</button>
-  <button style="position:fixed;top:5vh;left:47vw;bottom:0vh;width:6vw;height:5vh;" id='Carol-button'>Show Carol</button>
-  <button style="position:fixed;top:10vh;left:47vw;bottom:0vh;width:6vw;height:5vh;" id='Diane-button'>Show Diane</button>
-  <div id="Bob-div" style="position:fixed;top:0vh;right:0vw;bottom:0vh;width:47vw; background: #ffffff;">
-    <iframe id="Bob" src="http://127.0.0.1:19102/browser/bob.html" style="width:100%; height:100%;" frameBorder="0"></iframe>
-  </div>
-  <div id="Carol-div" style="position:fixed;top:0vh;right:0vw;bottom:0vh;width:47vw; background: #ffffff;" class="hidden">
-    <iframe id="Carol" src="http://127.0.0.1:19103/browser/carol.html" style="width:100%; height:100%;" frameBorder="0"></iframe>
-  </div>
-  <div id="Diane-div" style="position:fixed;top:0vh;right:0vw;bottom:0vh;width:47vw; background: #ffffff;" class="hidden">
-    <iframe id="Diane" src="http://127.0.0.1:19104/browser/diane.html" style="width:100%; height:100%;" frameBorder="0"></iframe>
-  </div>
-  <script type="text/javascript">
-    var people = [
-      'Bob',
-      'Carol',
-      'Diane'
-    ];
-    function showDiv(name) {
-      people.forEach(function(p) {
-        document.getElementById(p + '-div').classList.toggle('hidden', name !== p);
-      });
-    }
-
-    people.forEach(function(p) {
-      document.getElementById(p + '-button').addEventListener('click', showDiv.bind(null, p));
-    });
-  </script>
-</body>
-</html>
-EOF
-```
-
-### Helper script
-
-To help run it, the following `run-security.sh` script will be used:
-```
-cat - <<EOF >$V_TUT/run-security.sh
-echo "Browserifying..."
-
-NODE_PATH=$V_TUT
-$V_TUT/node_modules/.bin/browserify --debug $V_TUT/src/security/alice.js -o $V_TUT/browser/security-alice.js
-$V_TUT/node_modules/.bin/browserify --debug $V_TUT/src/security/bob.js -o $V_TUT/browser/security-bob.js
-$V_TUT/node_modules/.bin/browserify --debug $V_TUT/src/security/carol.js -o $V_TUT/browser/security-carol.js
-$V_TUT/node_modules/.bin/browserify --debug $V_TUT/src/security/diane.js -o $V_TUT/browser/security-diane.js
-
-echo "Serving..."
-$V_TUT/node_modules/.bin/static $V_TUT -p 19101 > /dev/null &
-PID_SERV1=$!
-$V_TUT/node_modules/.bin/static $V_TUT -p 19102 > /dev/null &
-PID_SERV2=$!
-$V_TUT/node_modules/.bin/static $V_TUT -p 19103 > /dev/null &
-PID_SERV3=$!
-$V_TUT/node_modules/.bin/static $V_TUT -p 19104 > /dev/null &
-PID_SERV4=$!
-$V_TUT/node_modules/.bin/static $V_TUT -p 8989 > /dev/null &
-PID_SERV5=$!
-
-function killservers() {
-  kill $PID_SERV1
-  kill $PID_SERV2
-  kill $PID_SERV3
-  kill $PID_SERV4
-  kill $PID_SERV5
-}
-trap killservers EXIT
-
-sleep infinity
-EOF
-```
-
-Make the script runnable. Then, run the script.
-
-```
-bash $V_TUT/run-security.sh
-```
-
-The console will show "Browserifying..." and then "Serving...".
-
-### Loading the page
-{{# helpers.warning }}
-
-**On the first run, you will be asked to allow each domain to be blessed.**
-
-Recall that we are running this example across 4 origins. Since the extension
-will bless each iframe based on origin, up to 4 blessing tabs will appear.
-
-Click "Bless" on each of the tabs.
-
-**On each load, you will also be prompted to Bless Bob and Carol.**
-
-The page will prompt you with a dialog entitled "The page at 127.0.0.1:19101 says".
-
-This occurs because Bob and Carol are asking for blessings. The prompt prefills
-the input section with "friends:bob" (for :19102) and "family:sister" (for :19103).
-
-In practice, Alice would use this opportunity to verify that she is indeed
-allowing Bob and Carol to receive a blessing from her.
-
-The tutorial expects Alice to send the blessing strings that are pre-filled in
-the prompt box, but feel free to experiment with different ones.
-{{/ helpers.warning }}
-
-Now, go to http://127.0.0.1:8989/security.html .
-You should see four iframes, one each for Alice, Bob, Carol, and Diane.
-
-### Using the example
-After Bob and Carol are blessed, the blessings they received from Alice should
-be visible in their respective windows.
-
-Try requesting a fortune as Bob and Carol. Each should be given access, and a
-fortune should be retrieved.
-
-Now, try adding a fortune as Bob and Carol. Bob should get an error
-indicating failure because he is only a friend. In contrast, Carol's request
-should succeed because she is family. The fortune should appear on Alice's display.
-
-Now let's give Diane a blessing. Go to Carol's iframe and Press the "Grant"
-button. This sends a blessing to Diane (alice:family:sister:guest:diane).
-
-Until the designated expiration time (default 10s),
-Diane should be able to both add and get a fortune, as if she were family.
-
-Once the blessing expires, Diane is no longer able to access Alice's fortunes
-until Carol grants her another blessing.
-
-## Summary
-
-We need a summary.
-
-[Fortune tutorial]: /tutorials/javascript/fortune.html
-[Permissions Authorizer tutorial]: /tutorials/security/permissions-authorizer.html
-[Security Tutorials]: /tutorials/security
diff --git a/content/tutorials/naming/globber.md b/content/tutorials/naming/globber.md
index 3273dee..cfff850 100644
--- a/content/tutorials/naming/globber.md
+++ b/content/tutorials/naming/globber.md
@@ -2,7 +2,7 @@
 title: Globber
 layout: tutorial
 wherein: you use the Globber interface to create your own server namespace. This is an advanced tutorial.
-prerequisites: {completer: globber, scenario: f}
+prerequisites: {completer: globber, scenario: e}
 sort: 35
 toc: true
 = yaml =
diff --git a/content/tutorials/naming/suffix-part2.md b/content/tutorials/naming/suffix-part2.md
index 90ac736..c3cc209 100644
--- a/content/tutorials/naming/suffix-part2.md
+++ b/content/tutorials/naming/suffix-part2.md
@@ -2,7 +2,7 @@
 title: The Suffix - Part II
 layout: tutorial
 wherein: you add fine-grained security to control access to your multiple services. This is an advanced tutorial.
-prerequisites: {completer: suffix-part2, scenario: f}
+prerequisites: {completer: suffix-part2, scenario: e}
 sort: 34
 toc: true
 = yaml =
diff --git a/content/tutorials/security/index.md b/content/tutorials/security/index.md
index ada5d77..8903b63 100644
--- a/content/tutorials/security/index.md
+++ b/content/tutorials/security/index.md
@@ -51,6 +51,5 @@
 [Caveats]: /tutorials/security/first-party-caveats.html
 [Third-party Caveats]: /tutorials/security/third-party-caveats.html
 [client-server]: /tutorials/basics.html
-[JavaScript tutorial]: /tutorials/javascript/hellopeer.html
 [Security Concepts document]: /concepts/security.html
 [Mount table tutorial]: /tutorials/naming/mount-table.html
diff --git a/templates/partials/sidebar.mustache b/templates/partials/sidebar.mustache
index 8ad3a43..29598e0 100644
--- a/templates/partials/sidebar.mustache
+++ b/templates/partials/sidebar.mustache
@@ -37,14 +37,6 @@
       {{/ content.tutorials.java }}
     </nav>
 
-    <a href="#" class="nav">JavaScript</a>
-    <nav>
-      <a href="/tutorials/javascript/">Overview</a>
-      {{# content.tutorials.javascript }}
-      <a href="{{ url }}">{{ title }}</a>
-      {{/ content.tutorials.javascript }}
-    </nav>
-
     <a href="/tutorials/faq.html">Tutorial FAQ</a>
   </nav>
 
diff --git a/templates/partials/tut_prereqs.mustache b/templates/partials/tut_prereqs.mustache
index 171b463..e113386 100644
--- a/templates/partials/tut_prereqs.mustache
+++ b/templates/partials/tut_prereqs.mustache
@@ -13,16 +13,6 @@
   This command wipes tutorial files and defines shell environment variables. If you start a new terminal, and just want to re-establish the environment, see instructions <a href="/tutorials/setup.html">here</a>.
   {{/ scenario }}
 
-  {{# also }}Also:<ul>
-    {{# jsSpecial }}<li>
-      Please see the <a href="/tutorials/basics.html">Client/Server Basics tutorial</a> and the <a href="/tutorials/javascript/hellopeer.html">Hello Peer tutorial</a> for background concepts.
-    </li>{{/ jsSpecial }}{{# chrome }}<li>
-      Please install the <a href="https://chrome.google.com/webstore/detail/vanadium-extension/jcaelnibllfoobpedofhlaobfcoknpap">Vanadium Chrome extension from the Chrome web store</a>.
-    </li>{{/ chrome }}{{# account }}<li>
-      This tutorial requires a <a href="https://accounts.google.com">Google account</a>.
-    </li>{{/ account }}
-  </ul>{{/ also }}
-
   {{# completer }}
   If you would like to generate files from this tutorial without the copy/paste steps, download and source <a href="/sh/tut-completer-{{ completer }}.sh" download="tut-completer-{{ completer }}.sh">this script</a>. Files will be created in the `$V_TUT` <a href="/tutorials/setup.html">directory</a>.
   {{/ completer }}