公開した翌日、最初にやったこと
2026年5月30日、VetCalc PROをGitHub Pagesで公開した。
その翌日、最初にやったことはアクセス解析の確認ではなかった。
院内のスタッフに「これ、スマホで使えるか見てみて」と渡した。
看護師さんがiPhoneで開いた。
「閉じられません」
公開翌日に最初の不具合報告が来た。
押せないボタンがあった
薬剤カードの詳細画面を閉じる❌ボタン。自分のPixel 9aでは、ギリギリ押せる。押せることは押せるが、明らかにおかしい。iPhoneでは完全に反応しなかった。
デバッグ用に中古のiPhoneを買うか、本気で迷った。
原因を調べると、Chrome自動アップデートによってアドレスバーの自動非表示の挙動が変わっていた。その結果、Safe Areaが広がり、ボタンが見えているのに触れない領域に入っていた。
env(safe-area-inset-top) という値をpadding-topに加算して、ヘッダーの高さ計算を修正した。
公開した翌日に実機デバッグをしていた。公開とは、そういうことだった。
チュートリアルが毎回出た
Safe Area問題を修正している途中で、別の問題が出た。
Android ChromeのホームスクリーンショートカットからVCPを起動すると、アプリの設定がリセットされていた。チュートリアルが毎回最初から出る。使うたびに同意画面が出る。
原因はlocalStorageだった。ショートカット起動ではlocalStorageがリセットされることがある。これはAndroid Chromeの仕様だった。
直そうとして、沼にはまった。
localStorageを使わない方法を考えるほど、依存箇所が増えていく。修正すると別の挙動が変わる。1時間やって、判断した。
チュートリアルを削除する。
代わりに、管理シート(⚙️)に静的な使い方テキストを置いた。いつでも見られる。消えない。localStorageに依存しない。
「直す」より「なくす」方が正しいことがある。
AIに読んでもらうことを考えた
6月7日。実機デバッグの翌日、別のことを考えていた。
「このアプリ、AIに聞いたときに出てくるだろうか。」
試してみた。Perplexity、Gemini、ChatGPT、Claude。全部に「獣医師向け薬用量計算アプリ」を聞いた。VetCalc PROは、どこにも出てこなかった。
2026年現在、検索の入口がAIに変わりつつある。キーワードで順位を競うより、AIに正しく引用される構造を作る方が先だと判断した。
llms.txt を作った。AIクローラー向けに「このアプリは何者か」を書いたテキストファイルだ。about.html も作った。JSON-LDをindex.htmlに埋め込んだ。
「AIに読まれないようにする」ではなく「AIに正しく読んでもらう」。その方向を選んだ。
ベースラインを測った。全AIでVCPは表示されなかった。これが起点になった。
薬剤DBの設計が間違っていた
6月8日。内服薬の計算がおかしいケースを発見した。
原因は設計だった。注射薬と内服薬を1つのエントリに混在させていた。conc(濃度)のフィールドが1つしかないため、内服タブで注射薬の濃度が使われていた。
「注射・内服の切り替えボタンを正しく実装する」方向で考えると、concを二重に持つ必要が出てくる。スキーマの大改修になる。
判断した。注射と内服を別IDに分割する。
混在していた34件を分割し、新規内服エントリをdrug_275〜drug_303として追加した。薬剤数は303件になった。フラットな構造になった。「1エントリ=1薬剤×1投与経路」というルールが明確になった。
作りながら要件が見えてくる。プロトタイプとはそういうものだと、今は思う。
v6.0を打った
6月10日。GitHub Pages版の正式初リリースとして v6.0 タグを打った。
単一HTML(v5.32)から移植して、SEO・GEO対策・ライセンス整理・薬剤DB改修・PWA化のすべてを含む版として定義した。
OGP画像を作った。実際のアプリ画面を4分割したコラージュ(1200×630px)をSNSシェア用に置いた。<noscript> タグにテキストを追加した。JSを実行しないクローラー向けの保険だ。
READMEに書いた。
このアプリは「巨人の肩の上に立つ」という考え方で作られています。
CRI計算のワークシートを最初に作ったのはDr. Tim Hackettで、それを日本語に翻訳した松葉洋宗先生がいて、小宮山典寛先生の解説があって、私はそれを使わせてもらいながら今の仕事をしてきた。
巨人の肩の上に立って作ったものを、次の誰かが使える形で残す。それだけのことだった。
コードを書かない時間も開発だった
6月19日、コードは触っていなかった。
公開後のアクセス状況を確認し、Qiita記事を書き、開発ログを整理していた。
公開前は「コードを書くこと」が開発だと思っていた。公開後は違った。ドキュメントを書くことも、告知することも、振り返ることも、全部プロジェクトの一部だった。
カードをドラッグで並び替えられるようにした
6月23日。計算タブの薬剤カードに↑↓ボタンがあった。
使いにくかった。カードが増えると特に。
ドラッグ&ドロップに変えた。マウスでも、タッチ長押し300msでも動く。
実装で一つ詰まった。タッチD&Dで「ゴースト」が出た。ドラッグ中の要素の残像がAndroidに残り続ける問題だ。
原因はtouchClone方式だった。DOM上に複製を作ってドラッグ像として使う方法で、Androidでは描画タイミングのズレで残像になる。
DOM直接移動方式に切り替えた。クローンを作らず、要素そのものを動かす。ゴーストが消えた。
↑↓ボタンを削除した。コードが減った。動作が速くなった。
公開してからが本番だった
5月30日に公開した。
翌日、❌ボタンが押せなかった。チュートリアルが毎回出た。AIにどこにも表示されなかった。薬剤DBの設計が間違っていた。ドラッグするとゴーストが出た。
3週間で、アプリは別物になった。
変わったのはアプリだけではなかった。
公開前は「完成」させることを考えていた。公開後は「動き続けること」を考えるようになった。
その過程で、mainブランチに直接pushする怖さも覚えた。ブランチを切るようになった。pull requestを使うようになった。Service Workerのキャッシュ更新で何度も沼った。
完成はなかった。公開した瞬間から、運用が始まっていた。
- 前回:技術を選んだ記憶がない。ただ、動くまでやった。
- フィードバック:https://forms.gle/F77zxqSErFUafBAB8
- GitHub:https://github.com/VetCalcPRO/vetcalc-pro