🚧 Work in Progress
このプロジェクトは活発に開発中です。破壊的変更・バグ・未完成の機能があり得ます。問題や提案があれば Issue でお知らせください。
TypedCode は、すべてのキーストロークを SHA-256 ハッシュチェーンと Proof of Sequential Work (PoSW) に記録する、改ざん耐性を備えた VSCode 風のコードエディタです。記録された編集列は改ざん耐性があり(署名チェックポイントがある場合は時刻アンカリングも付く)、エクスポート後の改変を検出できます。すべてブラウザ内で動作し、C / C++ / Python は WebAssembly (Wasmer)、JavaScript / TypeScript はブラウザ内で実行します。
主たる用途は、AI 生成や自動コピーを防ぎたいプログラミング試験、および学習プロセスを検証したい教育現場です。
無料・無制限・サインアップ不要。データはブラウザ外に出ません。
- 改ざん耐性のある証明: SHA-256 ハッシュチェーン + Proof of Sequential Work (PoSW)
- 時刻アンカリング: サーバ署名済みチェックポイント (ECDSA-P256) による、後付け改ざんに強い時刻バインディング。さらにセッション開始トークン (ADR-0017) でチェーン根の開始時刻もサーバアンカーし、オフライン捏造を封じる
- 人間認証: Cloudflare Turnstile と HMAC 署名済みアテステーション
- 網羅的なイベント追跡: コンテンツ変更・キーストローク・マウス・フォーカス・可視性・ペースト/ドロップ検出・テンプレート注入・セッション復旧などを記録 (一覧は
events.ts) - マルチタブ: 複数ファイルを同時に編集し、タブ切替も追跡
- スクリーンショット: 定期撮影とフォーカス喪失時の撮影、ハッシュ検証付き
- ブラウザ内実行: Wasmer SDK (WebAssembly) で C / C++ / Python / JavaScript / TypeScript を実行
- エクスポート形式: 証明 JSON・ソースコード・スクリーンショット・検証手順を含む ZIP アーカイブ
- 日英バイリンガル UI
| パッケージ | 説明 |
|---|---|
| @typedcode/editor | Monaco ベースのエディタ。キーストローク追跡とコード実行を担当 |
| @typedcode/verify | Web ベースの証明検証アプリ |
| @typedcode/verify-cli | CLI 検証ツール (Node.js ≥24) |
| @typedcode/shared | コアライブラリ: TypingProof / Fingerprint / 検証 / 型定義 |
| @typedcode/workers | Cloudflare Workers API (Turnstile 連携・チェックポイント署名) |
| @typedcode/e2e | Playwright E2E テスト (実エディタで証明を生成し verify-cli で round-trip 検証) |
- エディタ: https://typedcode.dev
- 検証アプリ: https://typedcode.dev/verify
npm install詳細手順とチェックリストは docs/setup.md を参照。動作確認は doctor で:
npm run doctor # ローカル設定をチェック
npm run doctor -- --cf # Cloudflare 側 (KV / wrangler 認証) も検証未設定のものは「何を、どこに、どう書くか」が出力されるので、それに沿って 1 つずつ潰していきます。
# 全パッケージを同時起動 (editor + verify + workers)
npm run dev
# 個別起動
npm run dev:editor # http://localhost:5173
npm run dev:verify # http://localhost:5174
npm run dev:workers # http://localhost:8787# 全パッケージ
npm run build
# 個別ビルド
npm run build:editor
npm run build:verify
npm run build:verify-cliテストは shared / workers / editor パッケージにあります(verify / verify-cli は未整備)。CI が回すのは shared / workers です。
npm run test -w @typedcode/shared
npm run test:coverage -w @typedcode/shared- イベント記録: ユーザー操作 (キーストローク・カーソル移動・ペーストなど) を型付きイベントとして捕捉
- ハッシュチェーン: 各イベントを SHA-256 でハッシュ化し、前イベントのハッシュへ連結
- PoSW 計算: Web Worker で各イベントごとに反復ハッシュ計算 (UI ブロックなし、反復数は
POSW_ITERATIONS固定) - 時刻アンカリング: チェックポイントを Workers で署名 (ECDSA-P256) し、サーバ時刻を結びつける
- 人間認証: ファイル作成時とエクスポート前に Turnstile で人間確認
- エクスポート: 全イベント履歴・ハッシュチェーン・フィンガープリント・スクリーンショットを含む証明ファイルを出力
- 検証: チェーン整合性・タイムスタンプ・PoSW・署名済みチェックポイントを独立に検証
カテゴリ分けされた union 型として定義されています。一覧と分類は packages/shared/src/types/events.ts、許可/禁止の方針は docs/adr/0005-input-type-policy.md を参照してください。
単一タブは {filename}_TC{timestamp}.zip、全タブ一括は ALL_TC{timestamp}.zip として出力され、以下を含みます:
{filename}.{ext}— ソースコード{filename}_proof.json— 証明 JSON (下記構造)screenshots/— 撮影された画面 (JPEG)screenshots/manifest.json— スクリーンショットのハッシュとメタデータREADME.md— 検証手順 (英語)README.ja.md— 検証手順 (日本語)
証明 JSON の構造:
{
"version": "1.2.0",
"typingProofHash": "sha256...",
"typingProofData": { "finalContentHash": "...", "metadata": {...} },
"proof": { "events": [...], "finalHash": "..." },
"fingerprint": { "deviceId": "...", "components": {...} },
"checkpoints": [...],
"sessionStartToken": { "payload": {...}, "signature": "...", "keyId": "..." },
"rootAnchored": true
}
sessionStartToken/rootAnchoredは ADR-0017 (casual/class の root サーバアンカー) で加わった任意フィールド。session/start が成功したときのみ付き、無くても (旧 proof / オフライン) 検証は通る (後方互換、MIN_SUPPORTED_VERSION1.0.0 据え置き)。
| レイヤー | 技術 |
|---|---|
| エディタ | Monaco Editor, xterm.js |
| 実行環境 | Wasmer SDK (WebAssembly) |
| 検証 UI | Chart.js, Highlight.js |
| ビルド | Vite 8, TypeScript 5/6 |
| Workers | Cloudflare Workers, Wrangler |
| テスト | Vitest |
- docs/system-spec.md — システム仕様書 (詳細)
- CLAUDE.md — プロジェクト概要 (Claude Code 用)
MIT License