Ichigo Notes について:自作 Web 開発フレームワークと個人開発アプリ

このブログ「Ichigo Notes」を書いている ichigo です。エンジニアとして働きながら、個人でも Web アプリを開発・運用しています。個人開発では、Go の Web フレームワークや TypeScript の UI ライブラリを自作し、その上でアプリを作っています。この記事では、筆者がどんな開発をしているのかを紹介します。
- Web フレームワーク (gooze)、UI ライブラリ (uix)、CMS (skein) など、アプリの土台を勉強も兼ねて自分で作っています
- 土台となるフレームワークは、外部ライブラリに頼らず標準ライブラリ中心で書いています
- その土台の上で、Meooow・minotake・棋譜蔵・LUDORA の 4 つのアプリを公開しています
- 開発には AI を活用しつつ、自分の知識を育てることを大切にして、学んだことをこのブログで発信していきます
エンジニアとしての私
技術スタック
| 領域 | 個人開発 | 実務経験あり |
|---|---|---|
| バックエンド | Go | PHP、C++, Java、Python, Ruby |
| フロントエンド | TypeScript、Web Components | React, jQuery |
| DB | PostgreSQL、SQLite | MySQL |
| インフラ | Google Cloud、Terraform、Firebase Hosting | AWS, Azure |
| ツール | vim, Docker, Git | EC-CUBE, WordPress |
| そのほか | Rust | C#、Kotlin、Swift, Flutter |
いちばん得意なのは Go で、自作のライブラリも Go の標準ライブラリの流儀に合わせることを方針にしています。仕事では、個人開発で使っていない言語やクラウドにも携わってきました。このブログでも、個人開発に限らず、実務で役立った知見を少しずつ書いていければと思っています。
土台を「外部依存なし」で作る理由
自作ライブラリのコアにはポリシーがあります。可能な限り、サードパーティのライブラリに依存しないことです。Go なら標準ライブラリと golang.org/x、TypeScript なら標準の Web API、Rust なら std だけで書きます。どうしても外部ライブラリが要る機能 (DB ドライバなど) は、拡張側に切り出しています。
理由は 2 つあります。
- 長く保守するため 依存が少ないほど、外部ライブラリの破壊的変更や開発停止に振り回されません。個人で複数のアプリを運用し続けるうえで、安定した基盤を自分で整えることを重視しています。
- 仕組みを理解するため ルータ、ORM、JWT、WebAuthn などを自分で実装すると、普段使っている技術の中身がよくわかります。
車輪の再発明には手間がかかりますし、実績のある既存のライブラリに及ばないところもたくさんあります。それでも、自分で作ってみて初めてわかることが多いと感じています。
開発の進め方
- AI と一緒に作る 開発には Claude Code を活用しています。コーディングだけでなく、設計やレビューなどにも AI を利用して効率的に開発を進めています。
- 自作アプリで開発を管理する 各プロジェクトのチケットや仕様メモは、自作のタスク管理アプリ Meooow に置いています。
- 素材はローカルで生成する LUDORA のゲームの画像や音楽はローカル PC の ComfyUI で作り、使ったモデルやプロンプトを台帳に記録しています。
自作フレームワーク・ライブラリ
リポジトリは現時点で公開していません。公開するかどうかは個別に検討中です。設計の話は、このブログで順に書いていく予定です。
gooze — Go の Web フレームワーク
すべての土台になるフレームワークで、2024 年 6 月から作り続けています。ルータ、ミドルウェア、セッション、JWT、WebAuthn (パスキー)、ORM、マイグレーション、i18n、WebSocket などを、標準ライブラリと golang.org/x だけで実装しています。
設計の方針は「フレームワークは出しゃばらない」ことです。アーキテクチャはアプリ側が決め、フレームワークは最低限の決まりしか持ちません。必要な機能だけを選んで使え、あとから差し替えやすい作りにしています。
このように、gooze は謙虚なツールキットとして開発しています。
実は gooze を作り始める前は、Rust でフルスタックフレームワークを開発していました。ただ、標準ライブラリを小さく保つという Rust の考え方と、サードパーティのパッケージに頼らないという私の方針がうまく噛み合わず、Go に切り替えました。
goozex と gosling — 拡張と「配管」
goozex は gooze の拡張です。外部ライブラリが要る機能を引き受けます。SQLite / PostgreSQL / MySQL の DB 方言、OAuth2 プロバイダの設定、OpenAPI 定義や TypeScript の API クライアントの生成、CRUD の雛形生成などです。
gosling は gooze の上に載る薄い層です。ルーティングの規約、トランザクション境界、エラーから HTTP レスポンスへの変換など、アプリごとに毎回書く「配管」をそろえます。機能ごとに縦に切るアーキテクチャ (垂直スライス) を前提にしていて、依存は gooze だけです。
uix — Web Components の UI ライブラリ
TypeScript で書いた、外部依存のない UI ライブラリです。標準の Custom Elements と Shadow DOM の上に、リアクティブな SPA を作る仕組みと 100 個以上の組み込みコンポーネントを載せています。ルータ、HTTP クライアント、i18n、テーマ (ライト/ダーク) もそろっています。テンプレートの式は eval を使わない自前のパーサで評価します。
skein — Markdown で書く小さな CMS
このブログを動かしている CMS です。gooze・goozex・gosling と uix を組み合わせて作っていて、自作の土台を実際の製品で使い込む場にもなっています。
記事は Markdown の原文のまま保存します。HTML への変換は uix の部品が受け持ち、サーバには変換済みの HTML をキャッシュとして持たせるだけです。変換の処理を 1 か所にまとめることで、編集画面と公開ページで表示がずれないようにしています。Ichigo Notes は、skein で書いた記事を静的サイトとして書き出して Firebase Hosting で配信しています。
そのほか
- gaggle gooze の上で 2D ゲームサーバを作るためのライブラリです。WebSocket でのリアルタイム通信を前提に、ゲームループ、状態の差分配信、マッチメイキングなどの部品をそろえています。
- gander Go の機械学習ライブラリです。線形回帰、決定木、ランダムフォレスト、SVM、ニューラルネットなどを標準ライブラリだけで実装しています。
- alula Rust の
stdだけで書いた 2D ゲームエンジンです。OpenGL / Vulkan / DirectX 11 / Metal の描画を自前で持っています。
公開中のアプリ
上のライブラリを使って作り、公開しているアプリです。どれも個人開発の無料サービスです。
| アプリ | ひとことで | URL |
|---|---|---|
| Meooow | チケットで管理するタスク管理アプリ | meooow.space |
| minotake | 家族で使える家計簿アプリ | minotake.life |
| 棋譜蔵 | 将棋の独学を支える棋譜・定跡管理アプリ | kifugura.com |
| LUDORA | ブラウザで遊べる無料のオンライン対戦ゲーム | ludora-games.com |
4 つとも、バックエンドは gooze 系、フロントエンドは uix で書いています。記事ページは skein です。
Meooow — チケットで管理するタスク管理アプリ
チームの作業を、ワークスペース・プロジェクト・チケットなどの機能で見える化するアプリです。Wiki、Git 連携、作業量の分析までをひとつにまとめています。AI エージェントから操作できる MCP サーバも用意しています。
いちばん長く開発しているアプリで、私も Meooow 自身やそれ以外のプロジェクトの管理などに活用しています。
minotake — 家族で使える家計簿アプリ
家族で日々の収支を記録・共有する家計簿アプリです。予算と月末の着地予測、資産と負債の推移などを見られます。記録を続けると家族のマスコットが育つ仕掛けや、Claude による AI アドバイスも入れています。
棋譜蔵 — 将棋の独学を支えるアプリ
頭の中に散らばりがちな定跡や局面を、一か所に集めて整理するためのアプリです。分岐つきの棋譜管理、定跡の出題練習、苦手な局面の復習、エンジンとの練習対局ができます。
将棋エンジンのやねうら王を WebAssembly にしてブラウザ内で動かし、対局の解析や「どこで形勢を損ねたか」の検出もできます。将棋の勉強で自分が欲しかった道具として作っています。
LUDORA — ブラウザで遊べる対戦ゲーム集
インストール不要で、ブラウザだけで遊べるオンラインゲームプラットフォームです。将棋、囲碁、チェス、麻雀といった定番から、エアホッケーや 3D のカートレースのようなオリジナルまで、多数のゲームを気軽に遊べます。フレンドとボイスチャットを繋いで盛り上がったり、見知らぬプレイヤーとのオンラインマッチで白熱した対戦が楽しめます。
ゲームサーバには gaggle を使っています。描画は Canvas 2D が中心で、3D のゲームには WebGL2 の描画処理を自前で書いています。
AI を使いながら、自分の知識を育てる
開発では AI を積極的に使っています。設計の相談からコーディング、レビューまで、今では欠かせない相棒です。
一方で、AI が書いたコードを理解しないまま積み上げていくと、問題が起きたときに自分で判断できなくなります。AI に頼る場面が増えるほど、その土台になる自分の知識を大切にしたいと考えています。フレームワークを自作しているのも、仕組みを自分の手で確かめておきたいからです。
このブログで書くこと
Ichigo Notes は、手を動かして確かめたことを自分の言葉で整理し直す場所です。次のようなことを書いていきます。
- 自作フレームワークの設計と、作ってわかったこと
- Go・TypeScript・Web Components の実装メモ
- Cloud Run・Terraform・Firebase の運用とトラブル対応
- 実務で役立った設計や開発の知見
- Claude Code を使った個人開発の進め方
まだまだ学ぶことの多い身ですが、確かめたことを再現できる形で残していきます。同じところでつまずいた人の役に立てばうれしいです。