diff --git a/samples/samplebinary.js b/samples/samplebinary.js
new file mode 100644
index 0000000..9c8c908
--- /dev/null
+++ b/samples/samplebinary.js
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2015 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// To run, use the `javascript_sample.sh` script.
+
+var assert = require('assert');
+var flatbuffers = require('../js/flatbuffers').flatbuffers;
+var MyGame = require('./monster_generated').MyGame;
+
+// Example how to use FlatBuffers to create and read binary buffers.
+function main() {
+  var builder = new flatbuffers.Builder(0);
+
+  // Create some weapons for our Monster ('Sword' and 'Axe').
+  var weaponOne = builder.createString('Sword');
+  var weaponTwo = builder.createString('Axe');
+
+  MyGame.Sample.Weapon.startWeapon(builder);
+  MyGame.Sample.Weapon.addName(builder, weaponOne);
+  MyGame.Sample.Weapon.addDamage(builder, 3);
+  var sword = MyGame.Sample.Weapon.endWeapon(builder);
+
+  MyGame.Sample.Weapon.startWeapon(builder);
+  MyGame.Sample.Weapon.addName(builder, weaponTwo);
+  MyGame.Sample.Weapon.addDamage(builder, 5);
+  var axe = MyGame.Sample.Weapon.endWeapon(builder);
+
+  // Serialize the FlatBuffer data.
+  var name = builder.createString('Orc');
+
+  var treasure = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
+  var inv = MyGame.Sample.Monster.createInventoryVector(builder, treasure);
+
+  var weaps = [sword, axe];
+  var weapons = MyGame.Sample.Monster.createWeaponsVector(builder, weaps);
+
+  var pos = MyGame.Sample.Vec3.createVec3(builder, 1.0, 2.0, 3.0);
+
+  MyGame.Sample.Monster.startMonster(builder);
+  MyGame.Sample.Monster.addPos(builder, pos);
+  MyGame.Sample.Monster.addHp(builder, 300);
+  MyGame.Sample.Monster.addColor(builder, MyGame.Sample.Color.Red)
+  MyGame.Sample.Monster.addName(builder, name);
+  MyGame.Sample.Monster.addInventory(builder, inv);
+  MyGame.Sample.Monster.addWeapons(builder, weapons);
+  MyGame.Sample.Monster.addEquippedType(builder, MyGame.Sample.Equipment.Weapon);
+  MyGame.Sample.Monster.addEquipped(builder, weaps[1]);
+  var orc = MyGame.Sample.Monster.endMonster(builder);
+
+  builder.finish(orc); // You may also call 'MyGame.Example.Monster.finishMonsterBuffer(builder, orc);'.
+
+  // We now have a FlatBuffer that can be stored on disk or sent over a network.
+
+  // ...Code to store to disk or send over a network goes here...
+
+  // Instead, we are going to access it right away, as if we just received it.
+
+  var buf = builder.dataBuffer();
+
+  // Get access to the root:
+  var monster = MyGame.Sample.Monster.getRootAsMonster(buf);
+
+  // Note: We did not set the `mana` field explicitly, so we get back the default value.
+  assert.equal(monster.mana(), 150);
+  assert.equal(monster.hp(), 300);
+  assert.equal(monster.name(), 'Orc');
+  assert.equal(monster.color(), MyGame.Sample.Color.Red);
+  assert.equal(monster.pos().x(), 1.0);
+  assert.equal(monster.pos().y(), 2.0);
+  assert.equal(monster.pos().z(), 3.0);
+
+  // Get and test the `inventory` FlatBuffer `vector`.
+  for (var i = 0; i < monster.inventoryLength(); i++) {
+    assert.equal(monster.inventory(i), i);
+  }
+
+  // Get and test the `weapons` FlatBuffer `vector` of `table`s.
+  var expectedWeaponNames = ['Sword', 'Axe'];
+  var expectedWeaponDamages = [3, 5];
+  for (var i = 0; i < monster.weaponsLength(); i++) {
+    assert.equal(monster.weapons(i).name(), expectedWeaponNames[i]);
+    assert.equal(monster.weapons(i).damage(), expectedWeaponDamages[i]);
+  }
+
+  // Get and test the `equipped` FlatBuffer `union`.
+  assert.equal(monster.equippedType(), MyGame.Sample.Equipment.Weapon);
+  assert.equal(monster.equipped(new MyGame.Sample.Weapon()).name(), 'Axe');
+  assert.equal(monster.equipped(new MyGame.Sample.Weapon()).damage(), 5);
+
+  console.log('The FlatBuffer was successfully created and verified!');
+}
+
+main();
