GitHubで github.com/kamranahmedse/driver.js を開くと、URLが見慣れない nilbuild/driver.js に書き換わる。スター約2.6万、依存ゼロのプロダクトツアー定番ライブラリを探していた開発者の多くが、ここで一瞬手を止める。「乗っ取られたのか」「なりすましのフォークを踏んだのか」——名前が紛らわしいOSSにまつわる不安が頭をよぎるからだ。
結論から言えば、これは作者本人によるアカウント改名であり、nilbuild/driver.js は紛れもないオリジナルの driver.js そのものである。この記事では、まずその正体をGitHubの一次情報で確定させたうえで、依存ゼロ・約5KBという設計、最小実装からツアー・フックまでの主要API、Shepherd.js / Intro.js との違い、そしてSPA環境で踏みやすい落とし穴までを、公式リポジトリとドキュメントをベースに整理する。
30秒で理解する driver.js
・何をする? ページ上の任意の要素をスポットライトで強調し、ポップオーバーで説明を添えるライブラリ
・主な用途 プロダクトツアー・新機能紹介・フォーム文脈ヘルプ・フォーカス誘導(作者いわく「ツアーは用途のひとつにすぎない」)
・強み 依存パッケージゼロ/gzip後 約5KB/Vanilla TypeScript(フレームワーク非依存)/MITで商用無償
・作者 developer-roadmap(約36万スター)で知られる Kamran Ahmed 氏
・名前の謎 作者がGitHubハンドルを kamranahmedse → nilbuild に改名。本家であって、なりすましではない
・注意点 v1系は小さなコア。分岐シナリオ・多言語・SPAの動的要素は自前設計が前提
UIライブラリの選定基準を体系的に押さえたい場合は、まず デザインシステムとは?仕組み・構成要素・有名事例をエンジニア向けに整理する【2026年版】 を土台にすると、driver.jsのようなUXパーツがどの層を担うのかが俯瞰しやすい。
1. driver.jsとは何か——「ツアーライブラリ」ではなくフォーカス誘導エンジン
driver.jsを一言でいえば、「ページ上の任意の要素を強調表示し、そこに説明を添えるための小さなエンジン」だ。背景を暗く落とし(オーバーレイ)、対象要素だけをくり抜いてスポットライトを当て、その横にタイトルと説明文の入ったツールチップ(ポップオーバー)を出す。これがコア機能のすべてである。
多くの人は「プロダクトツアーのライブラリ」として認識しているが、作者自身はその枠を明確に否定している。READMEの該当箇所を引用する。
いや、これはツアーライブラリ以上のものだ。ツアーは数ある用途のひとつにすぎない。
原文:“No, it’s more than a tour library. Tours are just one of the many use-cases.”(driver.js README)
READMEは具体的な用途として、ユーザーが操作中のコンポーネントを強調して集中を促す、フォーム入力時に背景を暗くして文脈ヘルプを出す、視線を特定要素へ移すフォーカスシフター、動画プレイヤーでよく見る「消灯(Turn off the Lights)」演出、シンプルなモーダル、そしてもちろんプロダクトツアー——を挙げる。要するに 「ページに何らかのオーバーレイを被せたい」場面の汎用部品 だ。
公式のマスコットは、その性格をよく表している。
機能の核を支えているのが、依存ゼロ・軽量という設計思想だ。READMEは自らの軽さを、他ライブラリとのサイズ比較で強調している。
他のライブラリとサイズを比べても、driver.jsは最も軽量だ。gzip後でわずか約5KB、他は12KB超もある。
原文:“...it’s the most light-weight, it is just ~5kb gzipped while others are 12kb+.”(driver.js README)
この「約5KB」と「12KB超」という数字は、あくまでdriver.js公式の主張である点は割り引いて読むべきだが、依存パッケージがゼロでVanilla TypeScript実装という事実は、バンドルサイズとフレームワーク非依存の両面で効いてくる。Reactでも、Vueでも、素のHTMLでも、<script> 1本で同じものが動く。READMEが掲げる特徴を整理すると次のようになる。
driver.jsの設計上の特徴(READMEより)
・Simple:使い方が単純で、外部依存がまったくない
・Light-weight:他ライブラリが12KB超のところ、gzip後 約5KB
・Highly customizable:強力なAPIで挙動を自在に変えられる
・Highlight anything:ページ上の文字どおり「どんな」要素でも強調できる
・Keyboard friendly:すべてキーボードから操作可能
・TypeScript:TypeScriptで記述、全主要ブラウザで一貫動作
・MIT:個人・商用とも無償
2. nilbuild という名前の謎——作者Kamran Ahmedの改名を一次情報で確認する
この記事で最初に潰しておくべきは、「nilbuild/driver.js は本物か」という疑念だ。名前が有名OSSと紛らわしいリポジトリは、悪意あるなりすまし(タイポスクワッティングやアカウント乗っ取り)の温床になりうる。だからこそ、推測ではなくGitHubの一次情報で裏を取る。
調査の結果は明快だった。GitHub APIで repos/kamranahmedse/driver.js を叩くと、レスポンスの full_name は nilbuild/driver.js を返す。これはGitHubがアカウント改名時に旧URLを新URLへリダイレクトする挙動そのものだ。さらに nilbuild アカウントの実体を確認すると、決定的な証拠が並ぶ。
nilbuild = Kamran Ahmed 本人である根拠
・プロフィールの表示名は「Kamran Ahmed」、ブログは kamranahmed.info、所在地はイギリス、フォロワー約4万
・アカウントIDは旧来のまま(2013年作成の同一アカウント)。新規に作られたなりすましアカウントではない
・配下のリポジトリに developer-roadmap(約36万スター)、design-patterns-for-humans(約4.8万)、aws-cost-cli など、Kamran Ahmed氏の代表作がそのまま並ぶ
・READMEのライセンス表記は「MIT © Kamran Ahmed」のままで、リンク先は twitter.com/nilbuild(X/Twitterも同じハンドルへ改名済み)
つまり、Kamran Ahmed氏がGitHubとX/Twitterの両方でハンドルを kamranahmedse から nilbuild へ変えた、というだけの話である。リポジトリの中身(コミット履歴・スター・npmパッケージ名 driver.js)はすべて連続しており、フォークでも別物でもない。
改名OSSを見極める実務チェック
- ・旧URLにアクセスしてリダイレクトされるかを見る。別物のなりすましならリダイレクトされず、独立した新リポジトリになっている。
- ・npmパッケージ名(ここでは
driver.js)とhomepage(driverjs.com)が従来と同じか確認する。 - ・配下にその作者の他の代表作が揃っているか、アカウント作成日が古いままかを見る。
- ・READMEのライセンス表記・著者名が連続しているかを確認する。
なお、npm上のパッケージ名は依然として driver.js(最新 v1.6.0)であり、import { driver } from "driver.js" というコードは改名前後で一切変わらない。インストール時にハンドル名を意識する必要はない。GitHubのURLだけが nilbuild/driver.js に変わった、と理解すればよい。
ちなみにKamran Ahmed氏は、AIエンジニアの学習地図としても定番の developer-roadmap の作者でもある。AIエージェントに一貫したUIを生成させる設計を学びたい読者には、関連文脈として design.mdとは?AIエージェントに一貫UIを生成させるデザイン仕様書の書き方入門 も合わせて読むと、「人間とエージェントの双方が踏み外しにくいUI部品」という観点が補完できる。
3. 30秒で動かす——最小実装とプロダクトツアー
理屈より先に動かす。driver.jsの導入はnpmなら1コマンドだ。
npm install driver.js
# pnpm add driver.js / yarn add driver.js でも可
最小構成は、driver() でインスタンスを作り、highlight() に対象要素とポップオーバーを渡すだけ。CSSの読み込みを忘れないのが唯一のつまずきポイントである。
import { driver } from "driver.js";
import "driver.js/dist/driver.css"; // これを忘れるとオーバーレイが素の見た目になる
const driverObj = driver();
driverObj.highlight({
element: "#save-button",
popover: {
title: "ここで保存",
description: "編集内容はこのボタンで保存されます。Esc でいつでも閉じられます。",
side: "left", // ポップオーバーを要素の左に出す
align: "start", // 上端に揃える
},
});
複数ステップを順に見せるプロダクトツアーにする場合は、driver() のconfigに steps 配列を渡し、drive() で開始する。showProgress: true を付けると「1 of 3」のような進捗が出る。
import { driver } from "driver.js";
import "driver.js/dist/driver.css";
const driverObj = driver({
showProgress: true,
nextBtnText: "次へ",
prevBtnText: "戻る",
doneBtnText: "完了",
steps: [
{ element: "#editor", popover: { title: "エディタ", description: "ここに本文を書きます" } },
{ element: "#preview", popover: { title: "プレビュー", description: "右側にリアルタイム表示されます" } },
{ element: "#publish", popover: { title: "公開", description: "最後にここで公開します", side: "top" } },
],
});
driverObj.drive(); // ツアー開始(drive(2) のようにステップ指定での開始も可能)
これだけで、背景が暗転し、各要素が順にスポットライトされ、Next/Previous/Escでの操作とキーボードナビゲーションが効くツアーが完成する。steps の各要素は DriveStep 型で、element(セレクタ文字列・DOM要素・要素を返す関数のいずれか)と popover を持つ。popover 側で side(top/right/bottom/left)と align(start/center/end)を指定すれば、吹き出しの出る向きを要素ごとに制御できる。
最小実装でハマる3点
- ・CSS未読み込み:
driver.js/dist/driver.cssを読み込まないと、オーバーレイのくり抜きやツールチップの装飾が効かない。 - ・要素がまだDOMにない:
elementのセレクタが描画前だとハイライトが空振りする。後述の関数指定で遅延解決する。 - ・破棄漏れ:SPAでツアーを開いたまま画面遷移すると、オーバーレイが残る。
destroy()を必ず呼ぶ。
4. アーキテクチャと主要API——Config・DriveStep・フックの全体像
driver.jsのコアは src/ 配下の小さなモジュール群で構成される。公開APIである driver() が、設定(config)・状態(state)・イベント(events)を束ね、ハイライト(highlight)→オーバーレイ(overlay)/ポップオーバー(popover)→配置計算(position)へと処理を流す。ソースを読むと、この責務分担がそのままファイル名に現れている。
公開API(driver.ts)"] --> CFG["config.ts
既定値とマージ"] API --> ST["state.ts
現在ステップ・要素を保持"] API --> EV["events.ts
キーボード・リサイズ・クリック"] CFG --> HL["highlight.ts
対象要素の特定"] HL --> OV["overlay.ts
SVGでくり抜くオーバーレイ"] HL --> POP["popover.ts
ツールチップ描画"] POP --> POS["position.ts
吹き出しの配置計算"] EV -.->|"リサイズ・スクロールで再計算"| POS
driver(config) に渡せる主要オプションと既定値を、src/config.ts の configure() から抜き出すと次のとおり。既定で animate: true/allowClose: true/allowKeyboardControl が有効で、何も指定しなくても「アニメーション付き・Escで閉じられる・キーボード操作対応」のツアーになる。
| オプション | 既定値 | 役割 |
|---|---|---|
animate | true | ハイライト移動時のアニメーション有無 |
duration | 400 | アニメーションの時間(ミリ秒) |
overlayColor | "#000" | 背景オーバーレイの色 |
overlayOpacity | 0.7 | 背景オーバーレイの不透明度 |
smoothScroll | false | 対象要素までスムーズスクロールするか |
allowClose | true | 背景クリック・Escで閉じられるか |
overlayClickBehavior | "close" | 背景クリック時の挙動(close / nextStep / 関数) |
stagePadding | 10 | くり抜き枠と要素の余白(px) |
stageRadius | 5 | くり抜き枠の角丸(px) |
showProgress | false | 「1 of N」の進捗表示 |
showButtons | ["next","previous","close"] | 表示するボタン |
disableActiveInteraction | false | ハイライト中の要素操作を無効化するか |
driver.jsの真価は、状態遷移とイベントに差し込めるフック群にある。onHighlightStarted(描画直前)・onHighlighted(描画直後)・onDeselected(ハイライト解除直後)・onDestroyStarted / onDestroyed(破棄前後)といった状態フックと、onNextClick / onPrevClick / onCloseClick / onDoneClick というボタンイベントフックが用意されている。これらに分析イベントの送信や、次ステップへ進む前の非同期処理を挟める。
const driverObj = driver({
animate: true,
overlayOpacity: 0.7,
stagePadding: 10,
allowKeyboardControl: true,
onHighlightStarted: (el, step, { state }) => {
// 要素がハイライトされる直前。計測イベントの送信などに使う
analytics.track("tour_step_shown", { index: state.activeIndex });
},
onNextClick: (el, step, { driver }) => {
// 「次へ」を押したときの独自処理。明示的に進めるのを忘れない
// 例: 非同期でデータ取得してから次へ
driver.moveNext();
},
onDestroyed: () => {
// ツアー終了後の後始末(フラグ保存など)
localStorage.setItem("onboarding_done", "1");
},
});
onNextClick のようなイベントフックを定義した場合、自動でのステップ送りは行われなくなる点に注意したい。フック内で driver.moveNext() を明示的に呼ぶ必要がある。これは「次へ進む前に必ずバリデーションを通す」といった割り込みを可能にするための設計だ。Driver インスタンスは moveNext() / movePrevious() / moveTo(index) / refresh() / getActiveIndex() / isLastStep() / destroy() などのメソッドを公開しており、外部のUIから手動でツアーを制御することもできる。
ツアー1ステップのライフサイクルを図にすると、フックがどのタイミングで発火するかが見える。
描画前フック"] C --> D["onHighlighted
描画後フック"] D --> E{"ユーザー操作"} E -->|"Next または 右キー"| F["moveNext()"] E -->|"Previous または 左キー"| G["movePrevious()"] E -->|"Esc または 背景クリック"| H["destroy()"] F --> I{"最終ステップか"} I -->|"いいえ"| B I -->|"はい"| H H --> J["onDestroyed
後始末フック"]
5. driver.js / Shepherd.js / Intro.js 比較——ライセンスと依存とサイズ
プロダクトツアー/オンボーディング系のOSSは複数あり、driver.jsはその中で「依存ゼロ・軽量・フレームワーク非依存・MIT」という象限に位置する。代表的な選択肢と並べて違いを整理する。選定で最初に効くのはバンドルサイズよりライセンスだ。商用プロダクトに組み込むなら、ここを外すと後で費用や再実装が発生する。
| ライブラリ | ライセンス | 依存 | 対応 | 特徴 |
|---|---|---|---|---|
| driver.js | MIT(商用も無償) | ゼロ | Vanilla(全FW) | 約5KB・キーボード操作・フック充実 |
| Shepherd.js | MIT | Floating UI | Vanilla+FWラッパー | 高機能だがバンドルは大きめ |
| Intro.js | 商用は有償(AGPL/商用デュアル) | ゼロ | Vanilla | 老舗・多機能だが商用ライセンス必須 |
| react-joyride | MIT | あり | React専用 | Reactに深く統合・状態管理しやすい |
| Reactour | MIT | あり | React専用 | Reactでの導入が手軽 |
要点を補足する。Intro.js はツアーUIの老舗で機能は豊富だが、オープンソース版はAGPL系で、商用利用には別途有償ライセンスが必要になる。これが「とりあえず入れたら後でライセンス費用が問題化した」という事故の典型だ。Shepherd.js はMITで自由に使えるが、ポップオーバーの位置決めにFloating UI(旧Popper.js系)を内部依存として持つため、最小構成のバンドルはdriver.jsより大きくなりがちだ。react-joyride / Reactour はReactに特化していて状態管理との相性は良いが、React以外では使えない。
driver.jsを選ぶ判断基準
・商用プロダクトで追加ライセンス費用を払いたくない(MIT)→ driver.js が有利
・React以外(Vue / Svelte / Astro / 素のHTML)でも同じ実装を使い回したい(Vanilla)→ driver.js が有利
・初期表示のバンドルを1KBでも削りたい(依存ゼロ・約5KB)→ driver.js が有利
・逆に:分岐シナリオ・複数ツアーの一元管理・リッチなテーマ機構が標準で欲しいなら、Shepherd.jsや専用SaaS(Userpilot等)も検討対象
フレームワークに縛られないVanilla実装という性質は、設計面でも示唆がある。UIロジックを特定フレームワークから切り離し「替えられる部品」として扱う発想は、フロントエンドのクリーンアーキテクチャ完全解説|依存の方向を制御してReactを「替えられる部品」にする設計論 で論じた依存方向の制御と地続きだ。driver.jsをドメイン層から薄いアダプタ越しに呼ぶ構成にしておけば、将来ツアーライブラリを差し替える余地も残る。
6. 実戦パターン——フォーム補助・フォーカスシフター・AIプロダクトのオンボーディング
driver.jsの応用は「ツアー」に限らない。READMEが挙げる用途を、実装パターンとして具体化する。
まずSPAでの動的要素への対処。React/Vueではルート遷移でDOMが差し替わるため、element にセレクタ文字列ではなく関数を渡し、解決を遅延させるのが定石だ。レイアウトが変わったら refresh() で位置を再計算する。
const driverObj = driver({
steps: [
{
// 関数で返すと、ハイライトする瞬間まで要素解決を遅延できる
element: () => document.querySelector("[data-tour='cart']"),
popover: { title: "カート", description: "追加した商品はここに入ります", side: "bottom" },
},
],
});
// レイアウト変更・ルート遷移後に位置を再計算
window.addEventListener("resize", () => driverObj.refresh());
次にReactでの安全な組み込み。useEffect でツアーを起動し、クリーンアップで必ず destroy() を呼ぶことで、アンマウント時のオーバーレイ残留を防ぐ。これはdriver.js自体がVanillaであっても、Reactのライフサイクルと素直に噛み合う。
import { useEffect } from "react";
import { driver } from "driver.js";
import "driver.js/dist/driver.css";
export function useOnboardingTour(enabled) {
useEffect(() => {
if (!enabled) return;
const obj = driver({
showProgress: true,
steps: [
{ element: "#chat-input", popover: { title: "質問を入力", description: "ここにプロンプトを書きます" } },
{ element: "#model-select", popover: { title: "モデル選択", description: "用途に応じて切り替えます" } },
],
onDestroyed: () => localStorage.setItem("ai_onboarding_done", "1"),
});
obj.drive();
return () => obj.destroy(); // アンマウントで確実に破棄
}, [enabled]);
}
この最後の例は意図的にAIプロダクトのオンボーディングを題材にしている。チャットUI・モデル選択・トークン上限といった「AIアプリ特有の概念」は初見のユーザーには分かりづらく、最初の数十秒で価値を伝えられるかが定着率を左右する。プロンプト入力欄やモデル切替を順に強調するツアーは、その典型的な処方箋だ。
さらに踏み込めば、AIコーディングエージェント自身にツアーを生成させるという使い方も現実味を帯びている。コンポーネントのセレクタとひと言説明さえ与えれば、steps 配列は機械的に組み立てられる。AIにUIを一貫生成させる土台づくりは Claude Code|2026年版・インストールからCLAUDE.md・Hooks・本番運用までの実装手引き でも扱っており、driver.jsの宣言的な steps 構造は、エージェントが出力先として扱いやすい形をしている。デザインスキルをエージェントに教え込む発想は designer-skillsとは|デザイン237スキルをClaude Codeに教えるOSSプラグイン集 も参考になる。
用途別の実装ヒント
- ・フォーム文脈ヘルプ:
disableActiveInteraction: falseのまま、入力欄を1つずつハイライトして説明を添える。 - ・フォーカスシフター:
stepsを使わずhighlight()単発で、特定要素へ一瞬だけ注意を引く。 - ・「消灯」演出:動画要素をハイライトし、
overlayOpacityを高めて周囲を暗く落とす。 - ・初回のみ表示:
localStorageのフラグをonDestroyedで立て、次回以降はdrive()を呼ばない。
7. 導入時の注意点と既知の課題
driver.jsは小さく鋭い道具だが、万能ではない。本番投入で踏みやすい注意点を、設計の前提として押さえておく。
driver.js導入時に注意すべき点
- ・動的・遅延要素:対象がまだDOMにない/遅延ロードされる場合、
elementの関数指定と、表示保証(読み込み完了後にツアー起動)が必要。 - ・z-index / position:fixed:固定ヘッダーや高い z-index を持つUIと干渉すると、くり抜きやポップオーバーがズレる。CSS設計と合わせて検証する。
- ・スクロール追従:スクロールやリサイズでレイアウトが動いたら
refresh()を呼ばないと位置がずれる。 - ・アクセシビリティ:キーボード操作には対応するが、スクリーンリーダー向けのフォーカストラップや aria 属性は用途に応じて自前で補強する前提で考える。
- ・小さなコアであること:v1系は「ハイライト+ポップオーバー」に特化。条件分岐ツアー・多言語管理・複数ツアーの一元管理などは標準機能ではなく、自前で組む。
リポジトリの構成自体は現代的で、メンテナンスも継続している。src/ にコア、playground/ にAstro製のライブ例、tests/ にVitestのテストが置かれ、ビルドはVite、パッケージ管理はpnpm、リリースは release-it という構成だ。デフォルトブランチが main ではなく master である点(READMEやスクリプトのrawファイル取得時に効く)と、npm上に -next.0 のプレリリースタグが多数存在する点は、参照時の細かな注意として覚えておくとよい。
ローカルで挙動を試したい場合、READMEはplaygroundの起動手順を案内している。ライブラリをソースから直接importするため、src/ への変更が即座にホットリロードされる。
pnpm install
pnpm run playground:install
pnpm dev # playground/ のAstroアプリが立ち上がる
各サンプルは playground/src/examples/ 配下の highlight.ts / popover.ts / tour.ts / api.ts にグループ分けされており、ここを読むのが実質的なリファレンスになる。公式ドキュメントの網羅度が気になる場合は、driverjs.com のデモと、この playground のソースを突き合わせるのが最短だ。
関連記事——UI・デザインから掘り下げる
driver.jsは単体のUI部品だが、「ユーザーをどう導くか」というUX設計や、AIにUIを生成させる文脈に置くと位置づけが鮮明になる。次の記事が深掘りに役立つ。
・デザインシステムとは?仕組み・構成要素・有名事例をエンジニア向けに整理する【2026年版】:UIパーツの設計思想を俯瞰する土台。driver.jsのようなUX部品がどの層に属するかが見える
・design.mdとは?AIエージェントに一貫UIを生成させるデザイン仕様書の書き方入門:エージェントに一貫したUIを生成させる仕様の書き方。ツアーのstepsをAIに組ませる発想と地続き
・designer-skillsとは|デザイン237スキルをClaude Codeに教えるOSSプラグイン集:デザイン知識をエージェントに教えるアプローチ。オンボーディングUXの自動生成に応用できる
・Claude Design活用術:Figma・Canva AI・v0と徹底比較+実用プロンプト集:UI生成ツールの比較。driver.jsで仕上げる「動き」の前段にあたるデザイン生成を扱う
・フロントエンドのクリーンアーキテクチャ完全解説|依存の方向を制御してReactを「替えられる部品」にする設計論:Vanillaなdriver.jsを「替えられる部品」として組み込む設計の指針
まとめ——名前に惑わされず、軽さを取る
nilbuild/driver.js を開いて「乗っ取りか」と身構えた人は多い。だが正体は、developer-roadmapで知られる Kamran Ahmed 氏がGitHub/X両方のハンドルを nilbuild に改名した、というだけだった。リポジトリの中身もnpmパッケージ名 driver.js も連続しており、これは紛れもないオリジナルである。名前の紛らわしさは、一次情報を1つ確認すれば解ける。
道具としてのdriver.jsは、依存ゼロ・約5KB・Vanilla・MITという、いま選ぶ理由が明確なライブラリだ。ハイライトとポップオーバーという小さなコアに絞り、フックで挙動を差し込めるよう設計されているため、プロダクトツアーからフォーカス誘導、AIプロダクトのオンボーディングまで、フレームワークを問わず使い回せる。一方で、条件分岐や多言語、SPAの動的要素は自前設計が前提であり、ここを軽く見ると本番でつまずく。
この記事の結論
- ・nilbuild/driver.js は本家。作者Kamran Ahmedの改名であり、なりすましでもフォークでもない。
- ・強みは依存ゼロ・約5KB・Vanilla・MIT。商用無償でフレームワークを選ばない。
- ・使い方は driver().highlight() / drive() の2系統。フックで挙動を差し込める。
- ・選定はサイズよりライセンスを先に見る。Intro.jsは商用有償、Shepherd.jsはFloating UI依存。
- ・SPAでは関数element・refresh()・destroy() の3点で動的要素と破棄漏れに備える。
プロダクトツアーやオンボーディングを「とりあえず軽く、フレームワークに縛られず、商用でも無償で」入れたいなら、driver.jsは2026年でも第一候補に挙げて差し支えない。
参照ソース
・nilbuild/driver.js — GitHubリポジトリ(MIT・スター約2.6万)
・Driver.js 公式ドキュメント・デモ(driverjs.com)
・driver.js — npm パッケージ(v1.6.0)
・Kamran Ahmed(nilbuild)— GitHubプロフィール
・kamranahmed.info — 作者個人サイト
・nilbuild/developer-roadmap — 作者の代表作(参考)