Technical Books Search は、Recursionのカリキュラムに関連するキーワードをもとに、Google Books API を使った技術書検索と「積読(tsundoku)」管理をひとつのアプリケーションで提供するフルスタックプロジェクトです。バックエンドは Go、フロントエンドは React + Vite で構成されており、検索→積読追加→読書進捗の管理までをブラウザで完結できます。
- 自由キーワード+ジャンルタグで 技術書 を検索
- 同じ書籍は積読中・読書中は重複追加できず、読了後に再度積み直しが可能
- 積読アイテムの状態遷移(
stacked/reading/done)と読了済みからの再積み直し - 最も古い積読を自動で取り出す「pickup」と、特定の本を選んで読書を開始する機能
- 月単位にグルーピングされた積読/読書中/読了済みダッシュボード
- 不要になった積読アイテムを削除してリストを整理
demo.mp4
- バックエンド: Go 1.25, chi (ルーティング),
- フロントエンド: React 19, TypeScript 5, Vite 7
- CI: GitHub Actions(PR 作成時に
go fmtを強制) - 外部サービス: Google Books API(API Key 必須)
.
├── backend/ Go 製 API・ドメイン・インフラ
│ ├── cmd/
│ ├── data/
│ └── internal/
│ ├── handler/
│ ├── infra/
│ ├── server/
│ └── service/
└── frontend/ React + Vite 製 SPA
├── src/
│ ├── components/
│ ├── hooks/
│ ├── pages/
│ └── assets/
├── public/
└── dist/
- Go 1.25 以上
- Node.js 20(18 以上でも動作する想定、Vite はアクティブ LTS を推奨)
- npm 9 以上
- Google Books API Key(Google Cloud Console で取得)
- 環境変数ファイルをコピー
cp backend/.env.template backend/.env
backend/.envを編集し、BOOKS_API_KEYに取得したキーを設定します。必要に応じてBOOKS_BASE_URLやSTORAGE_BACKEND、TSUNDOKU_STORE_PATHを変更できます。- API を起動
HTTP サーバーは
cd backend go run cmd/api/main.gohttp://localhost:8080で待機します。
- 依存関係をインストール
cd frontend npm install - 開発サーバーを起動
Vite が
npm run dev
http://localhost:5173でアプリを提供し、/apiへのリクエストはhttp://localhost:8080にプロキシされます。
| 変数名 | 説明 | 既定値 |
|---|---|---|
BOOKS_API_KEY |
Google Books API の認証キー(本番利用では必須) | "" |
BOOKS_BASE_URL |
Google Books API のエンドポイント | https://www.googleapis.com/books/v1/volumes |
STORAGE_BACKEND |
積読ストレージの種別。現在は file のみ対応。 |
file |
TSUNDOKU_STORE_PATH |
ファイルストレージ利用時の JSON 保存パス | data/tsundoku.json |
file バックエンドを使用すると、API 起動時にディレクトリと JSON ファイルが自動生成されます。
GET /health→{"status":"ok"}
GET /api/technical-books- クエリパラメータ
q(必須): Google Books に渡す検索クエリpage(任意, デフォルト1): フロント側のページ番号startIndex(任意): Google Books の抽出開始位置(0 始まり)。指定がなければpageから自動算出。orderBy(任意):relevanceornewestlang(任意): ISO 言語コード。allまたは未指定でフィルタなし。
- レスポンスは
TotalItemsと 10 件単位のItemsを含む JSON です。
- クエリパラメータ
例:
curl "http://localhost:8080/api/technical-books?q=golang&page=1"GET /api/tsundoku?status=stacked|reading|done— 状態でフィルタ可能な積読一覧POST /api/tsundoku—Bookと任意のNote/Priorityを含む JSON を送信して積読へ追加POST /api/tsundoku/pickup— 最も古い積読をreadingに変更POST /api/tsundoku/{id}/pickup— 指定 ID の積読をreadingに変更POST /api/tsundoku/{id}/status— 任意の状態へ更新POST /api/tsundoku/{id}/restack— 読了済みアイテムを再び積読へ戻す(タイムスタンプ更新)DELETE /api/tsundoku/{id}— 積読アイテムを完全に削除
- このプロジェクトではローカルで動作するアプリケーションを開発するため、積読データはバックエンド実行ディレクトリ配下の JSON に保存するようにしております。初期化したい場合は手動で削除してください。