尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
這是一個旅行記帳網站。你可以用它記低每一筆旅行開支,例如食飯、交通、酒店、門票和購物。 1. 你去旅行。 2. 你花了錢。 3. 你把收據、金額或文字放入這個 app。 4. App 幫你整理成清楚的記錄。 5. 你可以在不同旅程之間切換,不會把資料混在一起。 請記住一件事:每個人要用自己的登入 email。這樣你的旅行開支就不會和其他人的開支混在一起。 • Compact app(主要公開 app): https://travel-expense-compact.vercel.app • React app: https://travel-expense-react.vercel.app • Admin Console: https://travel-expense-admin-kanban.vercel.app • GitHub Pages React app: https://jd92-beep.github.io/travel-expense/react/ • GitHub Pages root(安全轉址到 Compact): https://jd92-beep.github.io/travel-expense/檢視完整 README ↗
English · 繁體中文(廣東話)
Track travel expenses, organize receipts and itineraries, and calculate shared costs. Each trip has its own records. Compact is the main public app; the parallel React client uses compatible data contracts.
The GitHub Pages root redirects to Compact. Check the version shown in Settings when reporting an issue. Source versions and deployed versions can differ; this README is not a deployment receipt.
User 1.Use a separate account for each person. Expense-splitting companions are calculation participants; adding one does not grant another app user access to the trip.
| Screen / Chinese label | What to do |
|---|---|
| Home / 首頁 | Select the active trip; check your budget, today's spending and itinerary. |
| Scan / 記帳 | Take a receipt photo, choose an image, paste email text, enter an expense manually or use voice input. |
| Records / 紀錄 | Search and filter expenses; open a record to review or edit it. |
| Itinerary / 行程 | View the trip's daily places, times and related expenses. |
| Weather / 天氣 | Choose a day and location; inspect hourly forecasts, source and freshness. |
| Stats / 統計 | Review totals, spending categories and shared costs. |
| Settings / 設定 | Manage trips, exchange rates, AI models, sync, themes and backups. |
Always select the correct trip before adding or syncing records. Before saving a receipt, check its merchant, date, time, currency, amount, payment method, payer and sharing mode. AI output is a draft and may need correction.
Rates are displayed as 1 HKD = N units of the trip currency.
Paste itinerary, hotel, restaurant, transport or booking text into Trip Update AI. Review the proposed dates, places and missing details before applying changes.
Weather uses the selected trip date and location. Its hourly rail opens at the corresponding local clock hour where available, and you can select another hour. Forecasts distinguish observations, daily bulletins and hourly models, including their sources and freshness. Official services are preferred where supported; missing fields can use labelled fallback providers. Unavailable dates or fields are shown explicitly. Device location requires your action and browser permission.
In 設定 → AI 模型選擇, expand a task category, then a provider, to choose a model. The category header shows the current model without expanding it.
429, quota and daily-limit errors stop automatic retries to other models.All credentialed AI calls go through the server-side Credential Broker. Never paste a provider API key into public frontend code or a backup. Manual expense entry remains available when AI is unavailable.
Use 外觀主題 (Appearance) in Settings. 自動(依旅程) follows the active trip's recommendation; a manual choice stays selected across trips. The current catalog includes regional and style themes, with light and dark options. Selection saves immediately. Compact's theme UI is independent of the parallel React client.
Supabase is the shared primary store. Notion is an optional mirror.
See HANDOVER.md for outstanding integration checks. A local test does not establish that a production sync completed.
In 設定 → 資料管理 → 下載旅程資料 (Settings → Data management → Download trip data):
summary.html for an offline, printable report. Open the CSV files in Excel or Numbers.The archive contains the current trip's expense, item, allocation, companion, itinerary and photo tables, plus a portable JSON backup. Missing images, failed downloads and thumbnail substitutes are labelled; the text data is still available. Standalone CSV and JSON downloads are also available.
JSON restore previews the imported data and removes credentials, cloud IDs and stale or foreign trip links. It restores text data, not the ZIP's receipt images. Downloads can contain private records: keep them in a private location. See the export format.
Use Node.js 22.x, as declared by Compact's package. Start from your clone:
git clone https://github.com/jd92-beep/travel-expense.git
cd travel-expense/app-compact
npm ci
npm run dev
Open local Compact. Live sign-in and provider features require their configured backend services; local startup alone does not provision them. Keep private credentials in the approved server-side broker/vault.
Required checks for Compact changes:
npm run typecheck
npm run build
npm run security:scan
npm run smoke:scan
npm run smoke:settings
npm run smoke:weather
npm run smoke:dashboard
npm run smoke:ai-routing
npm run smoke:mobile-layout
The browser smoke wrapper starts an isolated local server with safe environment loading. Playwright blocks unmocked external hosts. Install its Chromium browser with npx playwright install chromium if it is missing. Run the smoke suites relevant to your change; see Compact's scripts and notes and architecture.
For the parallel client, run npm ci and npm run dev from app-react/, then open local React. Compact and React version independently. Changes to shared storage or trip/receipt contracts need cross-client checks.
| Path | Purpose |
|---|---|
app-compact/ | Active public React/Vite client |
app-react/ | Parallel public client |
app-admin-kanban/ | Admin frontend and same-origin BFF |
workers/credential-broker/ | Credentialed provider access |
supabase/ | Database migrations and Edge Functions |
index.html | Stateless redirect to Compact |
docs/ | Contracts, runbooks and technical notes |
AGENTS.md | Repository working rules |
HANDOVER.md / CHANGELOG.md | Continuation notes and change history |
GitHub Pages builds from main: Compact under /compact/, React under /react/, and a redirect at the root. Vercel has separate app targets. Admin production uses a protected, explicitly dispatched workflow. Legacy Netlify configuration remains in the repository; it is not the recommended public entry point.
A push to main can trigger deployment. Obtain the repository owner's explicit authorization before pushing, merging or deploying, and verify the intended source SHA and live app afterwards. Bump the touched app's visible APP_VERSION, package version and lockfile version together. Database migrations, Admin writes and credential changes require separate authorization for their target.
Read AGENTS.md, the relevant app architecture and HANDOVER.md before maintenance. Never commit secrets, .env files, personal exports, generated deployment output or local graph indexes.