spacevision

ガジェット好きのアマチュアサイクルフォトグラファー

TOJのチームTTをF1予選風に見たくて、LapClip Timing Visualizerを作った話

明日のTour of Japanは、Astemo 大鹿ステージ。

2026年のTour of Japanで新しく入った大鹿ステージは、11.4kmのチームタイムトライアルです。普段のロードレースとは少し違って、チーム単位でタイムを刻み、順位とトップ差がそのまま観戦の面白さにつながっていくステージです。

こういうレースを見ていると、どうしても思ってしまいます。

F1の予選タイミング画面みたいに見られたら、かなり面白いのではないか。

チーム名が並んでいて、順位があり、トップとの差があり、フィニッシュタイムが一目で見える。更新された瞬間に、どのチームが上がったのか分かる。レースを現地で見ていても、配信で追っていても、タイム差の変化をもう少し直感的に眺められる。

そんなことを考えて、LapClipの表示を補助する小さなツールを作りました。

GitHubはこちらです。

github.com

LapClip Timing VisualizerのF1風UI

ただ、今回書きたいのは「便利なツールを作りました」という話だけではありません。

むしろ、作っている途中で一度立ち止まり、設計を大きく変えることになった話です。

LapClipを、もう少し観戦向きに見たかった

LapClipの公式リザルトは、レースを追ううえでとても重要な情報源です。

ただ、観戦中にスマホやPCで眺めるとき、順位、トップ差、更新タイミング、注目チームを一目で把握するには、もう少し視覚的な補助があると嬉しい。特にチームTTでは、単にタイムが並んでいるだけでなく、チーム単位の動きが見えたほうが面白い。

どのチームがトップに立ったのか。

トップから何秒差なのか。

フィニッシュ済みなのか、まだ途中なのか。

お気に入りのチームが今どのあたりにいるのか。

こういう情報を、F1の予選画面のように縦に並んだタイミングタワーで見られたら、観戦体験としてかなり楽しくなるはずです。

最初の動機は、本当にそれだけでした。

「LapClipのデータを、もう少し見やすくしたい」

そこから、AIと壁打ちしながら仕様を整理していきました。

AIと壁打ちして、まずは形にする

最初に考えた仕様は、わりと素朴なものでした。

  • 総合タイムを表示する
  • トップとの差を表示する
  • 現在順位を表示する
  • 更新タイミングを把握しやすくする
  • チームTTではチーム単位で見られるようにする
  • F1予選風の見た目にする
  • レース中にスマホやPCで見られるようにする

これをAIと壁打ちしながら設計書に落とし込み、Claude Codeに投げて、まずはローカル環境で動く叩き台を作りました。

最近のAI開発ツールは、こういう「頭の中にはあるけれど、まだ形になっていないもの」を動くところまで持っていく速度がかなり速いです。

もちろん、最初から完成品になるわけではありません。表示の揺れもあるし、データの読み取り方も詰めなければならない。けれど、自分のPC上でF1風のタイミングUIが動いたときは、正直かなり手応えがありました。

これは観戦中に使えそうだ。

そう思いました。

スマホから見られるようにした

次に考えたのは、レース中に自分のスマホから見られるようにすることです。

観戦中に使うなら、PCのローカル環境だけで動いても意味がありません。現地や移動中でも、自分のスマホで開ける必要があります。

そこで、まずは自分だけが試せる形で、外からも確認できるようにしました。細かい仕組みはここでは省きますが、いきなり一般公開するのではなく、あくまで自分用の観戦補助ツールとして動作を確かめる段階です。

この段階では、かなり便利でした。

LapClipの情報を読み取り、自分用の画面でF1風に表示する。チーム名、順位、トップ差、フィニッシュタイムが見える。観戦しながら横に置いておく画面としては、思っていた以上に楽しい。

このあたりまでは、かなり素直に「便利なWebアプリを作っている」という感覚でした。

一般公開しようとして、引っかかった

問題に気づいたのは、一般公開を考え始めたタイミングでした。

自分のサーバーでLapClipのデータを取得する。

それを加工する。

別のドメインで表示する。

自分としては「見やすく表示しているだけ」のつもりでも、外から見ると「LapClipのデータを別サイトで提供している」ように見える可能性があります。

これは筋が悪い。

便利かどうか以前に、公式サービスや大会運営、データ提供元に対して敬意のある設計になっているか。そこを考える必要がありました。

ここで、いったん手が止まりました。

AIを使うと、実装そのものは本当に速くなります。思いつきから動くものまでの距離は、以前よりずっと短い。

でも、「公開してよい形かどうか」は、AIが肩代わりしてくれるわけではありません。

むしろ、速く作れるようになったからこそ、作ったものをどこまで出してよいのか、人間側が前より慎重に考えないといけない。

今回、一番大きかったのはここです。

サーバー配信方式をやめた

そこで、設計を根本から見直しました。

最終的に選んだのは、LapClip公式ページをユーザー自身が直接開き、そのページ上でだけ表示を変える方式です。

つまり、自分のサーバーはLapClipのデータを取得しない。

保存しない。

加工して再配信しない。

外部送信もしない。

ユーザーが開いているLapClip公式ページの中で、ブラウザ内だけでDOMを読み取り、同じページ上にF1風のUIを重ねて表示する。あくまで、公式ページの見た目を自分の端末内で補助するだけです。

この方式なら、少なくとも自サーバーで公式データを集めて配る構造とはかなり違います。

公式情報は公式ページで直接見る。

ツールは、そのページの表示を補助する。

GitHubや配布ページは、ツールの説明と配布に限定する。

この方針に変えてから、ようやく「公開するならこの形だな」と思えるようになりました。

Tampermonkeyという選択

そのための中心にしたのが、PC向けのTampermonkeyユーザースクリプト方式です。

Tampermonkeyは、ブラウザ上で特定のページに対して、自分側のJavaScriptを実行できる拡張機能です。今回でいえば、LapClip公式ページを開いたユーザー自身のブラウザ内で、表示補助のスクリプトを動かします。

chromewebstore.google.com

 

サーバー側でデータを取りに行って、別サイトとして表示するのではありません。

公式ページを開いているブラウザの中で、そのページの情報を読み取り、見やすいUIを重ねる。

考え方としては、Webサービスを作るというより、ブラウザを少し拡張する感覚に近いです。

ページ内の情報は、ユーザーの端末内で読み取る。ツールは同じページ上にUIを重ねるだけ。LapClipデータをこちらのサーバーへ送ったり、保存したり、別サービスとして配ったりしない。

ここは、かなり大事にしています。

ブックマークレットとスマホ向け導線

ただ、Tampermonkeyは誰にでも簡単とは言いにくいです。

Chrome拡張を入れて、ユーザースクリプトを入れて、LapClipを開く。慣れている人には普通でも、レース観戦中にちょっと使いたい人には少しハードルがあります。

そこで、ブックマークレット方式も用意しました。

ブックマークレットは、JavaScriptをブックマークとして保存しておき、対象ページを開いた状態でクリックして使う仕組みです。拡張機能なしで動かせる可能性がある一方で、最初の登録方法は少し分かりづらい。

さらに、スマホ向けにはAndroidのWebViewアプリや、iPhone / iPad Safari向けのブックマークレット・ショートカット方式も整理しています。iPhoneでも一応使える導線は用意しています。

ただし、本命はあくまでPC版です。スマホ対応はまだβや暫定版という温度感です。

誰でも簡単に使える完成品、というよりは「こういう方向なら使えるかもしれない」という個人開発の記録に近い。ぶっつけ本番で、うまく動いたら嬉しい、くらいの距離感です。

公式結果の代替ではない

このツールは、LapClip、マトリックス社、Tour of Japan、大会運営とは無関係の非公式個人ツールです。

公式結果は、必ずLapClipおよび大会公式情報を確認してください。

また、このツールは公式ページを開いたユーザー自身のブラウザ内で表示を補助するものであり、LapClipデータの再配信、保存、外部送信、公式結果の代替を目的としたものではありません。

ここは、記事の中でもはっきり書いておきたいところです。

サイクルロードレースの観戦は、公式の計測、運営、チーム、選手、現地スタッフ、多くの人の仕事の上に成り立っています。その上に乗って、観戦者が少し楽しく見るための補助を作る。

その距離感を間違えないようにしたい。

今回のツール作りで、一番考えたのはそこでした。

AIで速く作れるからこそ、立ち止まる

今回、AIとClaude Codeを使ったことで、思いつきから動くものまでの速度はかなり上がりました。

「チームTTをF1予選風に見たい」という観戦中の小さな不満が、短期間で実際に動くUIになった。これは素直に面白い体験でした。

一方で、速く作れることと、そのまま公開してよいことは別です。

特に、公式データを扱う個人ツールでは、便利さだけで突っ走ると危ない。データをどこで読み、どこに保存し、誰に見せるのか。外から見たときに、公式サービスの代替や再配信に見えないか。

そこは、最後に人間が判断しなければいけない部分でした。

AIは実装を速くしてくれます。

でも、責任判断までは肩代わりしてくれません。

むしろ、AIで作れる時代だからこそ、人間が「公開してよい形」を考える必要がある。

LapClip Timing Visualizerは、まだ個人開発の小さなツールです。完成品として大きく広めたいというより、まずは自分の観戦体験を少し拡張するためのものです。

それでも、サイクルロードレース観戦には、まだまだ個人が工夫できる余地があるのだと思います。

明日の大鹿ステージ。

チームTTのタイム差を追いながら、この小さな表示補助ツールがどこまで役に立つか、試してみます。

うまく動いたら嬉しい。

うまく動かなかったら、それもまた次の改善材料です。