尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證GDG Hackathon VT
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗The rent you see isn't the rent you pay. True Cost uses Gemma 4 to read apartment listings, find every fee, and show what each place really costs per person per month, side by side, before you sign.
Live app: true-cost-xi.vercel.app. Demo video: watch on Loom. Built at GDG Build with AI x Hacktoberfest 2026, Virginia Tech (Oct 24–25, 2026).
True Cost helps students at VT who are looking for off-campus housing see the actual price of housing after all the fees and be able to compare apartments side by side. Our database of over 200 apartments around VT gives VT students plenty of options, and they can sort the database to their liking. Our Chrome extension allows them to, instead, choose an apartment that they like and scan the listing page to find all the fees included and compare it to other apartments in our database.
Blacksburg students pick apartments months ahead, and they compare them by the headline per-bed price. That price leaves a lot out. Admin fees, utility service fees, parking, amenity fees and reconditioning fees sit on separate tabs, in fine print, or in the lease itself. Real examples from Blacksburg listings:
Virginia now requires advertised prices to include mandatory fees (Va. Code § 59.1-608) and leases to itemize charges on the first page (Va. Code § 55.1-1204.1). Few students know that, and nobody adds the numbers up for them. Splitting a unit with roommates makes the math harder still, because some fees are charged per person and some per unit.
You tell it who's splitting, pick or capture up to three apartments, check the fees it found, and get one number per apartment: the true monthly cost per person, with every fee counted.
flowchart TD
subgraph Add["1. Add apartments"]
CAT["Catalog of 143 Blacksburg places<br/>already scanned"]
EXT["Chrome extension<br/>captures any listing page"]
UP["Upload screenshots<br/>or paste text"]
end
EXT -- "stitched screenshots + page text" --> API
UP --> API
API["POST /api/extract<br/>Vercel function"] -- "images + text" --> GEMMA["Gemma 4<br/>gemma-4-26b-a4b-it<br/>fallback gemma-4-31b-it"]
GEMMA -- "record_fees function call:<br/>each fee with its exact quote" --> CHECK["Zod schema + quote and amount checks<br/>unverified fees marked Check this"]
CHECK --> REVIEW
CAT -- "checked by hand" --> COMPARE
CAT -- "auto-scanned, not checked" --> REVIEW
SETUP["2. Setup<br/>people sharing, lease months,<br/>budget, parking / pet / furnished"] --> ENGINE
REVIEW["3. Review fees<br/>edit, delete or add fees,<br/>then Looks right"] --> ENGINE
REVIEW -. "opt-in, anonymous" .-> INDEX[("Blacksburg fee index<br/>Neon Postgres")]
ENGINE["Cost engine + utility estimates<br/>+ Virginia fee rules<br/>plain TypeScript, no AI"] --> COMPARE
COMPARE["4. Compare<br/>true cost per person, advertised vs real,<br/>hidden per year, lease total"]
INDEX -. "fees other students reported" .-> COMPARE
COMPARE --> EMAIL["Leasing-office email<br/>drafted by Gemma 4"]
Everything you enter stays in your browser (localStorage). There are no accounts and screenshots are never stored.
Choose how many people share the unit (1 to 6), how long the lease is, an optional monthly budget per person, and which extras you need (parking, a pet, a furnished unit). Optional fees for the extras you need are counted automatically; the rest are left out.
The Apartments step opens on 143 Blacksburg places whose fees were read ahead of time, so you can compare without adding anything:
Search the list and click a card to add it. Hand-checked places go straight to Compare. Auto-scanned ones open Review first, because nobody has checked their fees yet. Every card shows its source and the date it was read, and links to the original listing.
For a listing that isn't in the catalog, the True Cost extension reads it in one click:
If something fails, the panel says what went wrong and offers Try again. The extension holds no API key and only sends data to the True Cost app. It works in Chrome and other Chromium browsers such as Brave and Edge. Install steps are in extension/README.md.
You can also drop, click or paste up to 5 screenshots, or paste listing text. Images are resized in the browser before they're sent.
POST /api/extract sends the images and text to Gemma 4, which returns structured fees through function calling: name, amount, how often it's charged, whether it's per person or per unit, whether it's required or refundable, and the exact quote it came from. Each quote and amount is checked against the listing. Anything that can't be verified is marked "Check this".
Every fee shows its source quote. Low-confidence fees sort to the top with a "Check this" badge. You can edit any field, delete a fee, add one by hand, or correct the advertised price. Utilities the listing doesn't include get Blacksburg estimates, labelled "Estimate". Numbers only show up after you click Looks right.
One column per apartment, with:
A sentence above the columns gives the answer ("X is $N a month cheaper per person than Y, with every fee counted"), and the cheapest place is highlighted. "See every fee" opens the itemized breakdown, where you can switch fees in or out.
Rules in code (lib/flags.ts) check confirmed fees against Virginia law: advertised prices that leave out mandatory fees (§ 59.1-608), security deposits above two months' rent (§ 55.1-1226), and first-page fee itemization (§ 55.1-1204.1). Each one cites its statute and links to Virginia Law Help. This is information, not legal advice.
One click drafts a polite email to the leasing office that asks for the full fee sheet and turns any Virginia flags into questions rather than accusations. Gemma 4 writes it. If Gemma fails, or the draft mentions an amount it wasn't given, a plain template is used instead. The To line is filled in only when the listing shows the office's email. Copy it, or open it in Gmail, Outlook or your mail app.
If you tick the box on Review (it's off by default), the fees you confirmed are shared anonymously: only the complex name and the fee amounts. Compare then shows fees other students reported at the same complex that aren't on your list, such as "Utility service fee, $62/month, reported 3 times". It stores only fees a person has checked, never raw model output, images, quotes or anything about you. Rate limiting uses a hash that changes daily, so submissions can't be linked across days.
gemma-4-26b-a4b-it (fallback gemma-4-31b-it) through the Gemini API, using the @google/genai SDK.record_fees function with the exact quote for each, and drafts the leasing-office email.lib/cost.ts and lib/flags.ts does both.prefers-reduced-motion.npm run eval scores extraction on 8 hand-labelled Blacksburg listings in eval/cases/ and writes eval/results.json. Latest run: 100% precision and 100% recall (33 of 33 fees, no extras), advertised price right on 8 of 8.
npm install
cp .env.example .env.local # then paste your key from https://aistudio.google.com
npm run dev # http://localhost:3000
npm test # unit tests
npm run eval # extraction eval
GEMINI_API_KEY is required. DATABASE_URL (Neon Postgres) is only needed for the fee index; without it the app still works and the index section stays hidden.
Next.js 15 (App Router), TypeScript, Tailwind CSS v4, shadcn/ui, Zustand, Zod, Gemma 4 through @google/genai, Neon Postgres, deployed on Vercel. The extension is a Manifest V3 Chrome extension with a side panel.
Sam (@sam044) and Andy (@andyshah17).