1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub README用のプロフィール統計カードをGUIで作れるWebアプリを作った

1
Posted at

1. 作ったもの

GitHubのプロフィールREADMEに埋め込める、カスタマイズ可能な統計カードを作成できるWebアプリを開発しました。

名前は RSCG - Readme Stats Canvas for GitHub です。
https://rscg.cy-an.net/

image.png

2. 開発した理由

既存のREADME Stats系ツールは、URLパラメータや用意されたテーマを使ってカードを生成するものが多く、デザインの自由度が限られていると感じていました。

そこで、自分らしいGitHubプロフィールカードを自由にデザインできるツールが欲しいと考え、RSCGを開発しました。

3. 主な機能

  • GitHubの統計情報を表示
  • ドラッグ&ドロップによるカード編集
  • バッジ、図形、アバター、進捗バーなどのカスタム要素
  • 日本語、英語、中国語、韓国語に対応
  • テンプレートの利用
  • Undo / Redo
  • カードサイズの自動調整
  • 作成したカードの共有・公開

4. 技術スタック

フロントエンド

  • Next.js 16.2.9

    • App Router
    • standalone 出力
  • React 19.2.4

  • TypeScript 5

    • strict mode
  • Tailwind CSS 4

    • PostCSS
  • Lucide React

    • UIアイコン
  • フォント

    • Geist
    • Geist Mono
    • Noto CJK

バックエンド

  • Next.js Route Handlers

  • SQLite

  • better-sqlite3

  • Zod 3

    • リクエストやカード設定の入力検証
  • 独自SVG生成エンジン

    • GitHub READMEに埋め込むSVGを生成
  • キャッシュ・アクセス制御

    • ETag
    • CDNキャッシュ
    • レート制限

外部サービスとの連携

  • GitHub GraphQL API

    • @octokit/graphql
  • GitHub REST API

    • GraphQL APIを利用できない場合のフォールバック
  • GitHub OAuth

  • Auth.js / NextAuth.js v5 beta

テスト・品質管理

  • Node.js組み込みテストランナー

  • Playwright

    • E2Eテスト
  • ESLint 9

  • Prettier 3

  • TypeScriptによる型チェック

  • GitHub Actions

    • テスト、型チェック、Lint、ビルド、E2Eテストを自動実行

実行・デプロイ

  • Node.js 24 Alpine

  • Docker

    • マルチステージビルド
    • ヘルスチェック
  • Next.js standalone 出力

  • GitHub ActionsからSSHでデプロイ

  • SQLiteデータの永続化

    • ホスト側のデータディレクトリをコンテナにマウント

5. 実装で工夫した点

1. デザインツールのような操作性

専門的な知識がなくても直感的に編集できるよう、Canvaのようなデザインツールを意識したUIにしました。

要素をキャンバス上で移動・選択・リサイズできるほか、複数選択や8px単位のスナップにも対応しています。

2. 多言語対応

日本語だけでなく、英語、中国語、韓国語にも対応しました。

UIの翻訳だけでなく、生成するSVGのラベルやCJKフォントも言語に応じて切り替えています。

3. SVGを動的に生成

作成したカードは画像ファイルとして保存するのではなく、アクセス時にGitHubの最新データを取得してSVGを動的に生成します。

そのため、READMEに一度埋め込めば、カードに表示される統計情報を自動的に更新できます。

6. 苦労した点

1. ビジュアルエディタと最終的なSVGの整合性

特に難しかったのは、エディタ上のプレビューと、実際に公開されるSVGの表示を一致させることです。

主に次のような機能を実装しました。

  • ドラッグ、複数選択、リサイズ、整列、8pxスナップ
  • Undo / Redo と自動保存
  • テキスト幅やCJK文字幅の疑似計測
  • カードサイズの自動計算
  • 16種類の要素を共通の設定モデルで管理
  • エディタ上のプレビューと公開SVGの表示を統一
  • GitHubの実データや言語、フォントの違いによる表示崩れへの対応

ブラウザ上のHTMLとSVGではテキストの描画方法が異なるため、文字幅の計算や要素の位置調整には特に苦労しました。

2. /[username] からのSVG配信

公開カードは、次のようなURLから配信します。

https://rscg.cy-an.net/[username]

このエンドポイントでは、SVGを生成するだけでなく、次の処理も行っています。

  • GitHubユーザー名の厳密な検証
  • GitHub GraphQL APIからの統計取得
  • REST APIへのフォールバック
  • APIタイムアウト処理
  • 同一ユーザーに対する同時リクエストの排除
  • GitHub統計と生成SVGのキャッシュ
  • IP単位のレート制限
  • ETagを利用した304 Not Modifiedの返却
  • Accept-Languageに応じた多言語SVGの生成
  • Acceptヘッダーに応じたHTMLとSVGの出し分け

GitHub APIの負荷を抑えつつ、READMEから安定して表示できるようにする必要があり、キャッシュ設計やエラー時のフォールバックに苦労しました。

7. リポジトリ

ソースコードはGitHubで公開しています。ライセンスは MIT License です。

8. おわりに

RSCGは、GitHubプロフィールをより自由にデザインできるツールを目指して開発しています。

実際に使ってみた感想や、不具合、追加してほしい機能などがあれば、GitHubのIssueから知らせてもらえるとうれしいです。

リポジトリへのStar、開発者アカウントのフォロー、GitHub Sponsorsでの支援も、今後の開発の励みになります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?