{"id":34819403,"url":"https://github.com/haotool/app","last_synced_at":"2026-04-30T07:02:08.267Z","repository":{"id":318756981,"uuid":"1074936979","full_name":"haotool/app","owner":"haotool","description":"🛠️ HaoTool Apps - Modern React 19 Monorepo | 匯率換算 (RateWise) · 日本名字產生器 (NihonName) · 專案平台 (HaoTool)","archived":false,"fork":false,"pushed_at":"2026-01-16T11:23:09.000Z","size":19078,"stargazers_count":2,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-16T11:25:26.758Z","etag":null,"topics":["currency-converter","monorepo","pnpm","pwa","react","react19","tailwindcss","typescript","vite"],"latest_commit_sha":null,"homepage":"https://app.haotool.org","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/haotool.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":null},"created_at":"2025-10-12T18:54:24.000Z","updated_at":"2026-01-14T18:04:45.000Z","dependencies_parsed_at":"2025-10-29T19:29:41.500Z","dependency_job_id":"08d912c5-4dbf-4d11-a59d-fdb607c00222","html_url":"https://github.com/haotool/app","commit_stats":null,"previous_names":["haotool/app"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/haotool/app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haotool%2Fapp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haotool%2Fapp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haotool%2Fapp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haotool%2Fapp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/haotool","download_url":"https://codeload.github.com/haotool/app/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haotool%2Fapp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28482482,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["currency-converter","monorepo","pnpm","pwa","react","react19","tailwindcss","typescript","vite"],"created_at":"2025-12-25T14:07:56.883Z","updated_at":"2026-04-30T07:02:08.260Z","avatar_url":"https://github.com/haotool.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# haotool Apps\n\n**Modern React Applications Monorepo**\n\n[![CI](https://github.com/haotool/app/actions/workflows/ci.yml/badge.svg)](https://github.com/haotool/app/actions/workflows/ci.yml)\n[![License: GPL-3.0](https://img.shields.io/badge/License-GPL%203.0-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue?logo=typescript)](https://www.typescriptlang.org/)\n[![React](https://img.shields.io/badge/React-19.2-61dafb?logo=react)](https://react.dev/)\n[![Vite](https://img.shields.io/badge/Vite-8.0-646cff?logo=vite)](https://vitejs.dev/)\n[![pnpm](https://img.shields.io/badge/pnpm-9.10.0-yellow?logo=pnpm)](https://pnpm.io/)\n\n[English](#english) · [繁體中文](#繁體中文)\n\n\u003c/div\u003e\n\n---\n\n## 繁體中文\n\n### 專案概述\n\nhaotool Apps 是一個專業的 pnpm Monorepo，包含多個高品質的 React 19 應用程式。所有應用程式共享統一的工程標準、CI/CD 管線和開發工具鏈。\n\n「HAO」取自中文「好」的拼音，我們的核心理念是打造真正的「好工具」。\n\n### 應用程式\n\n| 應用                                     | 描述                                           | 狀態 | 連結                                                                  |\n| ---------------------------------------- | ---------------------------------------------- | ---- | --------------------------------------------------------------------- |\n| **[RateWise](./apps/ratewise/)**         | 台銀即時匯率換算 PWA，支援 18 種貨幣           | Live | [app.haotool.org/ratewise](https://app.haotool.org/ratewise/)         |\n| **[NihonName](./apps/nihonname/)**       | 日本名字產生器，探索皇民化歷史                 | Live | [app.haotool.org/nihonname](https://app.haotool.org/nihonname/)       |\n| **[Quake-School](./apps/quake-school/)** | 互動式地震科學教育平台                         | Live | [app.haotool.org/quake-school](https://app.haotool.org/quake-school/) |\n| **[Park Keeper](./apps/park-keeper/)**   | 停車場導航工具，GPS 指引 + 多語言（i18n）      | Live | [app.haotool.org/park-keeper](https://app.haotool.org/park-keeper/)   |\n| **[Split Meow](./apps/split-meow/)**     | 貓咪主題旅遊帳單分攤計算機，支援費用分類與分享 | Live | [app.haotool.org/split-meow](https://app.haotool.org/split-meow/)     |\n| **[haotool](./apps/haotool/)**           | 專案展示平台，3D 互動首頁                      | Live | [app.haotool.org](https://app.haotool.org/)                           |\n\n### 應用特色\n\n#### RateWise - 匯率好工具\n\n基於臺灣銀行牌告匯率的即時匯率 PWA 應用，顯示實際買賣價（非中間價）\n\n- 台銀實際賣出價：顯示真正換匯成本，非市場中間價\n- 18 種貨幣、4 種匯率類型（現金/即期買入賣出）\n- 即時匯率：每 5 分鐘同步臺灣銀行牌告匯率\n- 趨勢圖表：30 天歷史匯率走勢視覺化\n- PWA 支援：可安裝至手機，支援離線使用\n- 收藏管理：自訂常用貨幣快速存取\n- 程序化 SEO：249 個可索引 SEO path（幣對頁 + 金額頁）\n\n#### NihonName - 皇民化改姓生成器\n\n探索 1940 年代台灣皇民化運動的歷史改姓對照\n\n- 姓名變換所：查詢歷史上的日式改姓對照\n- 歷史專區：皇民化運動、馬關條約、舊金山和約\n- 諧音梗名字：500+ 趣味諧音日本名\n- 和紙質感 UI：日式傳統美學設計\n\n#### Quake-School - 地震知識小學堂\n\n互動式地震科學教育網站\n\n- 地震模擬器：互動式調整規模與深度，即時視覺化影響\n- 分級課程：幼兒園到進階程度的地震知識\n- 知識測驗：互動問答測驗，驗證學習成效\n- 震度視覺化：台灣震度分級圖表\n- 地震波動畫：P 波、S 波視覺化展示\n\n#### Park Keeper - 停車場導航\n\nGPS 輔助的停車場路徑指引工具\n\n- GPS 即時定位：指引回到停車位的方向與步數\n- 羅盤導航：設備方向感測器驅動的視覺化方向指示\n- 多語言支援：繁體中文、英文、日文（i18n）\n- Leaflet 地圖整合：停車紀錄與地圖標記\n\n#### Split Meow - 分帳計算機\n\n貓咪主題的旅遊帳單分攤工具\n\n- 費用分類標籤：Emoji 分類（餐飲、交通、住宿等）\n- 行程摘要分享：Web Share API + 剪貼簿備援\n- 貓咪互動夥伴：爪印粒子效果 + 慶祝動畫\n- 結清標記：追蹤已結算費用\n\n#### haotool - 專案平台\n\n3D 互動展示平台，介紹所有專案\n\n- Three.js 3D 效果：沉浸式視覺體驗\n- 響應式設計：完美適配各種裝置\n- 極致效能：Lighthouse 95+ 全類別\n\n---\n\n### 技術棧\n\n| 類別         | 技術                         |\n| ------------ | ---------------------------- |\n| **框架**     | React 19.2 + TypeScript 5.9  |\n| **建置工具** | Vite 8.0 + vite-react-ssg    |\n| **樣式**     | Tailwind CSS 3.4             |\n| **測試**     | Vitest 4.1 + Playwright 1.57 |\n| **套件管理** | pnpm 9.10.0 (Monorepo)       |\n| **CI/CD**    | GitHub Actions (9 workflows) |\n| **部署**     | Docker + Zeabur / Vercel     |\n| **安全**     | Gitleaks CLI + Trivy + SARIF |\n\n### 品質指標\n\n| 指標           | 數值          |\n| -------------- | ------------- |\n| **測試數量**   | 1700+         |\n| **測試覆蓋率** | 92%+          |\n| **TypeScript** | Strict Mode   |\n| **ESLint**     | 0 警告        |\n| **Lighthouse** | 95+ 全類別    |\n| **CI 管線**    | 9 個 workflow |\n\n### 快速開始\n\n#### 環境需求\n\n- **Node.js**: \u003e= 24.0.0\n- **pnpm**: \u003e= 9.10.0\n\n#### 安裝與開發\n\n```bash\n# 複製儲存庫\ngit clone https://github.com/haotool/app.git\ncd app\n\n# 安裝依賴\npnpm install\n\n# 啟動所有應用開發模式\npnpm dev\n\n# 或啟動特定應用\npnpm --filter @app/ratewise dev      # RateWise (http://localhost:4173)\npnpm --filter @app/nihonname dev     # NihonName (http://localhost:3002)\npnpm --filter @app/quake-school dev  # Quake-School (http://localhost:3003)\npnpm --filter @app/park-keeper dev   # Park Keeper (http://localhost:3004)\npnpm --filter @app/split-meow dev    # Split Meow (http://localhost:3005)\npnpm --filter @app/haotool dev       # haotool (http://localhost:3000)\n```\n\n#### 建置與測試\n\n```bash\n# 建置所有應用\npnpm build\n\n# 執行測試\npnpm test\n\n# TypeScript 檢查\npnpm typecheck\n\n# ESLint 檢查\npnpm lint\n```\n\n#### 版本與發版\n\n```bash\n# 每個 PR 都要建立 changeset，描述使用者可見影響\npnpm changeset\n\n# release PR 由 GitHub Actions 自動建立\npnpm changeset:status\n```\n\nRelease workflow 以 `pnpm changeset:version` 作為版本 SSOT，並由\n`scripts/get-release-metadata.mjs --changed` 產生 release tag 與 GitHub\nrelease 清單。禁止手動修改版本號、手動編輯 CHANGELOG，或在 CI 內直接呼叫\n`pnpm changeset tag` 建 tag；CI 內部 tag push 會以 `HUSKY=0` 單次推送，避免重複觸發\npre-push hook。\n\n正式站部署由 Zeabur production deployment 接 GitHub main。合併一般 PR 後若會再合併\nchangesets release PR，需先確認較早的 production deployment 已完成，避免舊 SHA 在 release\nSHA 之後才變成 active，造成正式站版本回退。Release 後以\n`app-version`、GitHub deployment status 與 live precache 驗證作為完成證據。\n\n### 專案結構\n\n```\nhaotool-app/\n├── apps/\n│   ├── ratewise/         # 匯率換算工具\n│   ├── nihonname/        # 日本名字產生器\n│   ├── quake-school/     # 地震知識小學堂\n│   ├── park-keeper/      # 停車場導航工具\n│   ├── split-meow/       # 貓咪分帳計算機\n│   ├── haotool/          # 專案展示平台\n│   └── shared/           # 共用模組\n├── docs/                 # 文檔\n├── scripts/              # 自動化腳本\n├── .github/\n│   └── workflows/        # CI/CD 管線\n│       ├── ci.yml                      # 主要 CI 流程\n│       ├── release.yml                 # 版本發布\n│       ├── seo-audit.yml               # SEO 審查\n│       ├── seo-production.yml          # 生產環境 SEO\n│       ├── update-committed-seo-files.yml # SEO 產出物同步\n│       ├── update-historical-rates.yml # 歷史匯率更新\n│       ├── update-latest-rates.yml     # 最新匯率更新\n│       ├── update-moneybox-rates.yml   # MoneyBox 匯率更新\n│       └── update-seo-rate-examples.yml # SEO 範例匯率更新\n├── package.json          # Monorepo 根配置\n├── pnpm-workspace.yaml   # pnpm workspace 配置\n└── tsconfig.base.json    # 共用 TypeScript 配置\n```\n\n### 文檔\n\n| 文檔                                           | 描述                 |\n| ---------------------------------------------- | -------------------- |\n| [AGENTS.md](./AGENTS.md)                       | Agent 工具與工作流程 |\n| [LINUS_GUIDE.md](./LINUS_GUIDE.md)             | Linus 風格開發指南   |\n| [CONTRIBUTING.md](./CONTRIBUTING.md)           | 貢獻指南             |\n| [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md)     | 行為準則             |\n| [SECURITY.md](./SECURITY.md)                   | 安全政策             |\n| [COMMIT_CONVENTION.md](./COMMIT_CONVENTION.md) | 提交規範             |\n\n### 貢獻\n\n歡迎提交 Issue 和 Pull Request！請先閱讀 [貢獻指南](./CONTRIBUTING.md)。\n\n### 授權\n\n本專案採用 [GPL-3.0](./LICENSE) 授權。\n\n### 團隊\n\n- **作者**: [haotool](https://haotool.org)\n- **Threads**: [@azlife_1224](https://www.threads.net/@azlife_1224)\n- **Email**: haotool.org@gmail.com\n\n---\n\n## English\n\n### Overview\n\nhaotool Apps is a professional pnpm Monorepo containing multiple high-quality React 19 applications. All applications share unified engineering standards, CI/CD pipelines, and development toolchains.\n\n\"HAO\" comes from the Chinese word \"好\" (good). Our core philosophy is to build truly **good tools**.\n\n### Applications\n\n| App                                      | Description                                         | Status | Link                                                                  |\n| ---------------------------------------- | --------------------------------------------------- | ------ | --------------------------------------------------------------------- |\n| **[RateWise](./apps/ratewise/)**         | Taiwan Bank exchange rate PWA, 18 currencies        | Live   | [app.haotool.org/ratewise](https://app.haotool.org/ratewise/)         |\n| **[NihonName](./apps/nihonname/)**       | Japanese name generator, historical exploration     | Live   | [app.haotool.org/nihonname](https://app.haotool.org/nihonname/)       |\n| **[Quake-School](./apps/quake-school/)** | Interactive earthquake science education            | Live   | [app.haotool.org/quake-school](https://app.haotool.org/quake-school/) |\n| **[Park Keeper](./apps/park-keeper/)**   | Parking lot navigator with GPS compass + i18n       | Live   | [app.haotool.org/park-keeper](https://app.haotool.org/park-keeper/)   |\n| **[Split Meow](./apps/split-meow/)**     | Cat-themed trip expense splitter with share + emoji | Live   | [app.haotool.org/split-meow](https://app.haotool.org/split-meow/)     |\n| **[haotool](./apps/haotool/)**           | Project showcase with 3D interactive homepage       | Live   | [app.haotool.org](https://app.haotool.org/)                           |\n\n### Tech Stack\n\n- **Framework**: React 19.2 + TypeScript 5.9\n- **Build**: Vite 8.0 + vite-react-ssg\n- **Styling**: Tailwind CSS 3.4\n- **Testing**: Vitest 4.1 + Playwright 1.57\n- **Package Manager**: pnpm 9.10.0 (Monorepo)\n- **CI/CD**: GitHub Actions (9 workflows)\n- **Deployment**: Docker + Zeabur / Vercel\n- **Security**: Gitleaks CLI + Trivy + SARIF\n\n### Quick Start\n\n```bash\n# Clone repository\ngit clone https://github.com/haotool/app.git\ncd app\n\n# Install dependencies\npnpm install\n\n# Start development\npnpm dev\n```\n\n### Release\n\nEvery PR must include a changeset. GitHub Actions creates the release PR with\n`pnpm changeset:version`; release tags and GitHub releases are generated from\n`scripts/get-release-metadata.mjs --changed`.\n\nProduction is deployed by Zeabur from GitHub main. Before merging a release PR\nright after another main PR, confirm the earlier production deployment has\nfinished so an older SHA cannot become active after the release SHA.\n\n### License\n\nThis project is licensed under [GPL-3.0](./LICENSE).\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**Built with ❤️ by [haotool](https://app.haotool.org/)**\n\n[Website](https://haotool.org) · [GitHub](https://github.com/haotool/app) · [Threads](https://www.threads.net/@azlife_1224)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhaotool%2Fapp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhaotool%2Fapp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhaotool%2Fapp/lists"}