Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/rw-offline-manifest-theme-ssot.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@app/ratewise': patch
---

對齊離線頁、manifest 與 index.html 的 zen 主題色(violet-600),避免 PWA 安裝列與離線殼色不一致。
5 changes: 5 additions & 0 deletions .changeset/rw3-manifest-theme-color-ssot.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@app/ratewise': patch
---

PWA 安裝/狀態列顏色改用實際主題色(移除硬編 hex),並修正 zen 主色 themes.ts 與 CSS 漂移。
5 changes: 5 additions & 0 deletions .changeset/rw3b-offline-template-theme-aware.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@app/ratewise': patch
---

離線頁改為主題感知:依使用者主題顯示對應底色(深色主題不再閃淺紫),並保留斷網自我修復;同步狀態列顏色與 iOS 安全區。
5 changes: 5 additions & 0 deletions .changeset/rw5-seo-truthfulness-update-frequency.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@app/ratewise': patch
---

SEO 文案真實性:將「每 5 分鐘自動同步」軟化為「約每 5 分鐘檢查更新」並加新鮮度免責,與實際資料管線一致。
5 changes: 5 additions & 0 deletions .changeset/rw6-moneybox-seoul-date-rollover.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@app/ratewise': patch
---

修正換錢所匯率資料:首爾掛牌日跨日時即使牌價未變也刷新快照,讓趨勢與歷史日期正確對齊,並讓離線時也能服務換錢所趨勢圖。
19 changes: 18 additions & 1 deletion .github/workflows/update-moneybox-rates.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,20 @@ jobs:
id: save-history
if: steps.fetch-rates.outcome == 'success'
run: |
CURRENT_DATE=$(TZ=Asia/Taipei date +%Y-%m-%d)
# history 檔名 SSOT:採資料本身宣告的首爾掛牌日(updateTime),與 fetch script 的
# date-rollover 判斷 (extractSeoulSnapshotDate) 同源,避免 runner wall-clock 與資料日期
# 在跨日視窗不一致。提取失敗時 fallback 首爾 wall-clock。
CURRENT_DATE=$(node --input-type=module -e "
import { readFileSync } from 'node:fs';
const { extractSeoulSnapshotDate } = await import('./scripts/fetch-moneybox-rates.js');
const data = JSON.parse(readFileSync(process.env.MONEYBOX_FETCH_OUTPUT_FILE, 'utf8'));
const d = extractSeoulSnapshotDate(data);
if (d) process.stdout.write(d);
" 2>/dev/null)
if [[ ! "$CURRENT_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
CURRENT_DATE=$(TZ=Asia/Seoul date +%Y-%m-%d)
echo "⚠️ 無法從資料提取首爾 snapshot date,fallback 至首爾 wall-clock: ${CURRENT_DATE}"
fi
MONEYBOX_HISTORY_FILE="${MONEYBOX_HISTORY_DIR}/${CURRENT_DATE}.json"
mkdir -p "$MONEYBOX_HISTORY_DIR"
if [[ ! -f "$MONEYBOX_FETCH_OUTPUT_FILE" ]]; then
Expand Down Expand Up @@ -133,6 +146,10 @@ jobs:
if [[ -n "$(git status --short --untracked-files=all -- "$MONEYBOX_LATEST_FILE")" ]]; then
echo "changed=true" >> $GITHUB_OUTPUT
fi
# aggregate 首次生成(檔案不存在)也應觸發 commit,避免 history-30d.json 遺失卻不開 PR
if [[ ! -f "$MONEYBOX_AGGREGATE_FILE" ]]; then
echo "changed=true" >> $GITHUB_OUTPUT
fi
if [[ -n "$(git status --short --untracked-files=all -- "$MONEYBOX_HISTORY_DIR/")" ]]; then
echo "changed=true" >> $GITHUB_OUTPUT
fi
Expand Down
3 changes: 3 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
node_modules/
.pnpm-store/

# 由 generate-offline-html.mjs 從模板生成(prebuild 禁 prettier,避免格式漂移)
apps/ratewise/public/offline.html

# Build output
dist/
build/
Expand Down
2 changes: 1 addition & 1 deletion apps/ratewise/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />

<meta name="theme-color" content="#8B5CF6" />
<meta name="theme-color" content="#7C3AED" />

<!-- Cloudflare Rocket Loader 停用(與 CSP/Trusted Types 衝突) -->
<meta name="cloudflare-rocket-loader" content="off" />
Expand Down
4 changes: 2 additions & 2 deletions apps/ratewise/public/about.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ HaoRate 是以臺灣銀行牌告匯率為基礎的換匯工具,重點是幫台
## 資料方法與範圍

- 資料來源為臺灣銀行官方牌告匯率,涵蓋 18 種貨幣。
- 5 分鐘自動同步最新報價,涵蓋現金買入、現金賣出、即期買入、即期賣出四種。
- 約每 5 分鐘檢查更新最新報價,涵蓋現金買入、現金賣出、即期買入、即期賣出四種。
- 資料管線:GitHub Actions 每日抓取 + 雙重驗證(台銀牌告 vs open.er-api.com 中間價,誤差 ≤ 2%)+ Pull Request 自動審核後合併至 data branch。
- 匯差範例數字透過 SSG(vite-react-ssg)於 build 期嵌入靜態 HTML,搜尋引擎無需執行 JavaScript 即可讀取。

Expand All @@ -34,7 +34,7 @@ HaoRate 是以臺灣銀行牌告匯率為基礎的換匯工具,重點是幫台

### 1. 匯率數據來源是什麼?

資料來源為臺灣銀行官方牌告匯率, 5 分鐘自動同步,涵蓋現金買入、現金賣出、即期買入、即期賣出四種報價。
資料來源為臺灣銀行官方牌告匯率,約每 5 分鐘檢查更新,涵蓋現金買入、現金賣出、即期買入、即期賣出四種報價。

### 2. 免費使用嗎?需要帳號或有廣告嗎?

Expand Down
2 changes: 1 addition & 1 deletion apps/ratewise/public/api/latest.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
"moneyboxTwdToKrw": "amount * rates.TWD.sell"
}
},
"description": "臺灣銀行牌告匯率靜態 API — 資料每 5 分鐘自動同步,並提供 App 匯率模式欄位對照",
"description": "臺灣銀行牌告匯率靜態 API — 資料約每 5 分鐘檢查更新,並提供 App 匯率模式欄位對照",
"source": "臺灣銀行牌告匯率",
"sourceUrl": "https://rate.bot.com.tw/xrt",
"updateFrequency": "every 5 minutes",
Expand Down
4 changes: 2 additions & 2 deletions apps/ratewise/public/faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ HaoRate 是基於臺灣銀行牌告匯率的即時匯率 PWA 應用,支援 18

### 2. 匯率數據來源是什麼?

HaoRate 的匯率資料來源為臺灣銀行官方牌告匯率, 5 分鐘自動同步一次,涵蓋現金與即期買入賣出價四種報價。
HaoRate 的匯率資料來源為臺灣銀行官方牌告匯率,約每 5 分鐘檢查更新一次,涵蓋現金與即期買入賣出價四種報價。

### 3. 現金匯率和即期匯率有什麼差別?

Expand Down Expand Up @@ -51,7 +51,7 @@ HaoRate 依據各國旅遊與消費習慣提供常用金額按鈕。例如台幣

### 10. 匯率更新頻率如何?

匯率數據每 5 分鐘自動更新一次,畫面會顯示最近更新時間。您也可以在首頁下拉重新整理(Pull to Refresh)以手動同步最新牌告資料。
匯率數據約每 5 分鐘檢查更新一次,畫面會顯示最近更新時間。您也可以在首頁下拉重新整理(Pull to Refresh)以手動同步最新牌告資料;實際新鮮度依資料來源與 CDN 快取而定

### 11. 如何安裝 HaoRate 到手機桌面?

Expand Down
2 changes: 1 addition & 1 deletion apps/ratewise/public/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@

### 4. 匯率多久更新一次?

匯率數據每 5 分鐘自動同步臺灣銀行最新牌告匯率,畫面會顯示最近更新時間。您也可以在首頁下拉重新整理以手動同步。
匯率數據約每 5 分鐘檢查更新臺灣銀行最新牌告匯率,畫面會顯示最近更新時間。您也可以在首頁下拉重新整理以手動同步。

### 5. 單幣別和多幣別模式有什麼差別?

Expand Down
4 changes: 2 additions & 2 deletions apps/ratewise/public/llms-full.txt
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ GET https://app.haotool.org/ratewise/openapi.json

## Answer Capsule (Q&A for AI Citation)

- Q: HaoRate 提供什麼服務? A: HaoRate 是台灣最精準的匯率換算工具,顯示臺灣銀行牌告的實際買入賣出四種報價(現金買入、現金賣出、即期買入、即期賣出),而非中間價。支援 18 種貨幣, 5 分鐘自動同步
- Q: HaoRate 提供什麼服務? A: HaoRate 是台灣最精準的匯率換算工具,顯示臺灣銀行牌告的實際買入賣出四種報價(現金買入、現金賣出、即期買入、即期賣出),而非中間價。支援 18 種貨幣,約每 5 分鐘檢查更新
- Q: 如何取得即時台銀匯率(適合開發者/LLM)? A: 免費 CDN API:GET https://cdn.jsdelivr.net/gh/haotool/app@data/public/rates/latest.json。回傳欄位 details.{幣別}.cash.sell(現金賣出)、details.{幣別}.cash.buy(現金買入)、details.{幣別}.spot.sell(即期賣出)、details.{幣別}.spot.buy(即期買入)。無需 API Key,CORS 啟用,每 5 分鐘更新。
- Q: 現金匯率和即期匯率的差別? A: 現金匯率適用臨櫃換鈔(到銀行換現鈔),即期匯率適用銀行電匯(匯款)。現鈔通常比即期差 1~3%,因為銀行有保管與運送成本。
- Q: 買入和賣出怎麼看? A: 買入/賣出是銀行角度。您拿外幣換台幣 → 看「買入」(銀行買你的外幣);您拿台幣換外幣 → 看「賣出」(銀行賣外幣給你)。
Expand All @@ -294,7 +294,7 @@ GET https://app.haotool.org/ratewise/openapi.json

- Source: 臺灣銀行牌告匯率(Bank of Taiwan)
- Source URL: https://rate.bot.com.tw/xrt
- Update mechanism: GitHub Actions 自動排程, 5 分鐘同步
- Update mechanism: GitHub Actions 自動排程,約每 5 分鐘檢查更新
- CDN: jsDelivr(全球 CDN,99.9% uptime)
- Rate Types: 現金買入(cash_buy)、現金賣出(cash_sell)、即期買入(spot_buy)、即期賣出(spot_sell)
- Disclaimer: 匯率僅供參考,實際交易請以金融機構公告為準。
Expand Down
8 changes: 4 additions & 4 deletions apps/ratewise/public/llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Version: v2.25.12
- Q: HaoRate 提供什麼? A: 顯示臺灣銀行牌告的實際買入賣出價(非中間價)的即時匯率換算工具。內建計算機鍵盤(支援四則運算)、快速金額按鈕、收藏管理、拖曳排序、換算歷史紀錄、7~30 天匯率趨勢圖、現金/即期匯率切換、6 種主題風格、4 語言介面與 PWA 離線使用。
- Q: 為什麼 HaoRate 比其他匯率工具更精準? A: 多數匯率工具只顯示中間價(mid-rate),而 HaoRate 顯示臺灣銀行牌告的實際買入賣出四種報價(現金買入、現金賣出、即期買入、即期賣出),直接對應你在銀行換匯的真實金額。
- Q: 匯率資料來源? A: 臺灣銀行牌告匯率(現金買入/賣出、即期買入/賣出四種報價)。
- Q: 更新頻率? A: 5 分鐘自動同步
- Q: 更新頻率? A: 約每 5 分鐘檢查更新
- Q: 建議用途? A: 出國旅遊換匯、跨境購物匯率比較、日常外幣查詢。
- Q: 現金匯率和即期匯率的差別? A: 現金匯率用於臨櫃換外幣紙鈔,即期匯率用於外幣帳戶轉帳或匯款。因銀行持有實鈔有保管、運送、偽鈔鑑定成本,現金匯率通常比即期差約 0.5~2%,換 1,000 美元現金比即期多付約 150~600 元台幣。
- Q: 買入和賣出怎麼看? A: 買入/賣出是銀行視角:出國換外幣(你支付台幣)看「賣出」價;回國換台幣(你交出外幣)看「買入」價。台銀買賣價差通常為即期匯率 0.3~1%、現金匯率 1~2%。
Expand All @@ -19,14 +19,14 @@ Version: v2.25.12
## E-E-A-T Signals

- 專業性:匯率計算邏輯與格式化策略具完整測試覆蓋。
- 權威性:資料來源為臺灣銀行官方牌告匯率, 5 分鐘自動同步
- 權威性:資料來源為臺灣銀行官方牌告匯率,約每 5 分鐘檢查更新
- 可信度:開源 GPL-3.0,透明可驗證;提供聯絡方式。
- 經驗:專為台灣用戶設計,依各國旅遊消費習慣提供常用金額按鈕。

## Key Metrics

- 支援貨幣:18 種
- 更新頻率: 5 分鐘自動同步
- 更新頻率:約每 5 分鐘檢查更新
- 匯率類型:現金買入、現金賣出、即期買入、即期賣出
- 6 種主題風格(Zen/Nitro/Kawaii/Classic/Ocean/Forest)
- i18n 4 語言支援(English/繁體中文/日本語/한국어)
Expand Down Expand Up @@ -136,7 +136,7 @@ Googlebot 與 AI agent 可直接讀取靜態 HTML:

- Source: 臺灣銀行牌告匯率(Bank of Taiwan)
- Source URL: https://rate.bot.com.tw/xrt
- Update: 5 分鐘自動同步(GitHub Actions)
- Update: 約每 5 分鐘檢查更新(GitHub Actions)
- Rate Types: 現金買入、現金賣出、即期買入、即期賣出
- Currencies: 18 種(TWD, USD, JPY, EUR, GBP, HKD, CNY, KRW, AUD, CAD, SGD, THB, NZD, CHF, VND, PHP, IDR, MYR)
- Disclaimer: 匯率僅供參考,實際交易請以金融機構公告為準。
Expand Down
4 changes: 2 additions & 2 deletions apps/ratewise/public/manifest.webmanifest
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"name": "HaoRate 匯率好工具",
"short_name": "HaoRate",
"description": "HaoRate 匯率好工具顯示臺灣銀行牌告實際買賣價(非中間價),支援 18 種貨幣換算,每 5 分鐘同步,離線可用的 PWA 匯率工具。",
"theme_color": "#8B5CF6",
"background_color": "#E8ECF4",
"theme_color": "#7C3AED",
"background_color": "#F8FAFC",
"display": "standalone",
"scope": "https://app.haotool.org/ratewise/",
"start_url": "https://app.haotool.org/ratewise/",
Expand Down
Loading
Loading