Open Net Worth
Open Net Worth is an open-source personal AI wealth assistant you run yourself: one ledger for your whole financial life, worked by an AI agent you control.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Finds GST input tax credit (ITC) a business is losing by matching its purchase bills against GSTR-2B, the government's record of what suppliers reported.
A buyer can only claim credit for invoices that appear in GSTR-2B. When a supplier files late, files the wrong amount, or doesn't file at all, the credit silently disappears. This tool finds each of those bills, puts a rupee value on it, and writes the message to send the supplier.
GST CREDIT CHECK GSTR-2B 09-2026, 10-2026
====================================================
Credit at risk: ₹39,741.00
Credit confirmed: ₹69,444.50
Matched 21
Missing in GSTR-2B 4 (₹29,001.50 at risk)
Amount mismatch 1 (₹250.00 at risk)
IGST vs CGST/SGST mismatch 1 (₹8,037.00 at risk)
Credit not available 1 (₹1,672.50 at risk)
Invalid GSTIN on bill 1 (₹780.00 at risk)
Probable match (check) 1
Duplicate bill 1
In GSTR-2B, no bill 2
URGENT: 1 item(s) within 60 days of the claim deadline
Sharma Traders: ST-0982 (₹7,650.00) deadline 30-11-2026, 38 days left
(Example output from the test data. All businesses and GSTINs in it are fictional.)
cd C:\GSTCreditFinder
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements-dev.txt
python run_web.py
Open http://localhost:8080:
Each check is saved to the business. The next month's check shows the credit recovered: bills that were at risk before and are now in GSTR-2B. If a business has a GSTIN, uploads of GSTR-2B for a different GSTIN are refused, so a CA can't file one client's data under another.
What is stored: uploaded files are processed in memory and never written to disk. Check results and Excel reports are saved in a SQLite database (data/gst_credit_finder.db, git-ignored). Passwords are stored as scrypt hashes. Users can delete a check, a business, or their whole account from the site.
| Setting | Default | |
|---|---|---|
HOST | 127.0.0.1 | 0.0.0.0 to open it from other devices |
PORT | 8080 | |
GST_DB | data/gst_credit_finder.db | Database file |
COOKIE_SECURE | 0 | Set to 1 when served over HTTPS |
RELOAD | 1 | Set to 0 in production |
APP_URL | Public address, used as the link in reminder messages | |
DAILY_JOBS | 1 | Daily backup + monthly reminders inside the website; 0 if cron runs them |
BACKUP_DIR | data/backups | |
BACKUP_KEEP | 14 | Number of daily backups kept |
A login that's an email gets email, and a mobile number gets SMS. With no provider set up, messages are printed in the server window, so you can try password reset locally: the 6-digit code appears in the terminal.
| Email (SMTP) | SMS (MSG91) |
|---|---|
SMTP_HOST, SMTP_PORT (587), SMTP_USER, SMTP_PASSWORD, MAIL_FROM | MSG91_AUTH_KEY, MSG91_OTP_TEMPLATE, MSG91_NUDGE_TEMPLATE |
Indian SMS needs DLT-registered templates. Register an OTP template with the variable otp, and a reminder template with month, count and link, then put their MSG91 template IDs in the settings above. Check the request format against MSG91's current Flow API docs before going live.
Monthly reminders: GSTR-2B for a month is ready on the 14th of the next month. From then on, anyone with a business not yet checked for that month gets one message. Users can switch this off in Account settings. To send by hand: python -m gst_credit_finder.nudges.
The website copies the database to BACKUP_DIR once a day and keeps the newest BACKUP_KEEP copies. To back up by hand: python -m gst_credit_finder.backup. A backup on the same disk won't survive that disk failing, so also copy BACKUP_DIR off the server regularly (for example to cloud storage).
On the results page, enter the ITC claimed in GSTR-3B Table 4A(5). The app compares it per tax head with the credit available in GSTR-2B for that month. Reverse-charge records and records marked "ITC not available" are excluded, and credit notes, imports and ISD aren't counted yet.
/privacy and /terms are templates. Replace every [bracketed] item with your business details and have a lawyer review them before launch.
On Vercel the disk doesn't persist, so the app stores everything in Postgres whenever DATABASE_URL is set. Locally it keeps using the SQLite file.
Push the code to GitHub.
Create the project: on vercel.com/new, import the repository. No build settings are needed: Vercel detects FastAPI and sends every request to app.py.
Add a database: in the Vercel project, open Storage → Create Database → Neon (Postgres) and connect it to the project. This sets DATABASE_URL for you. The tables are created on the first request.
Set environment variables (Project → Settings → Environment Variables):
| Variable | Value |
|---|---|
CRON_SECRET | A long random string. Vercel Cron sends it to /api/cron/daily, which runs the monthly GSTR-2B reminders every day at 09:00 IST |
APP_URL | Your site's address, e.g. https://gst-credit-finder.vercel.app (used in reminder messages) |
SMTP_* / MSG91_* | Optional: email/SMS for reset codes and reminders (see below). Without them, codes only appear in Vercel's function logs |
Redeploy so the variables take effect.
What changes on Vercel (set automatically from the VERCEL variable):
MAX_UPLOAD_MB.backup.py.To test against Postgres locally:
docker run -d --rm --name gcf-test-pg -e POSTGRES_PASSWORD=test -p 5433:5432 postgres:16-alpine
$env:TEST_DATABASE_URL = "postgresql://postgres:test@localhost:5433/postgres"
python -m pytest -q
python -m gst_credit_finder `
--register purchase_register.xlsx `
--gstr2b gstr2b_092026.json gstr2b_102026.json `
--buyer-name "Shree Ganesh Kirana Stores" `
--out report.xlsx
Open report.xlsx. It has four sheets: Summary, Action needed, Supplier reminders (ready-to-send messages) and All invoices.
Fictional files for trying it out: python tests\fixtures\generate_sample.py my_test_files writes a purchase register and two GSTR-2B files (every business and GSTIN in them is made up) into my_test_files\. Upload them on the website or pass them to the command above.
Run the tests (they generate the same files automatically):
python -m pytest -q
One row per purchase bill.
| Column | Required | Example |
|---|---|---|
supplier_gstin | yes | 27AFSPS7316K1ZN |
invoice_number | yes | ST-1201 |
invoice_date | yes | 02-09-2026 (also DD/MM/YYYY, YYYY-MM-DD) |
taxable_value | yes | 36700 |
igst, cgst, sgst, cess | no | 0, 917.50, 917.50, 0 |
supplier_name | no | Sharma Traders |
invoice_value | no | 38535.00; used to catch misread totals |
GST portal → Returns → GSTR-2B → download JSON. Pass the bill month and later months, so invoices that suppliers filed late are found instead of being reported missing.
B2B invoices and amendments (b2b, b2ba) are matched. Credit notes and other sections are counted and reported as "not checked yet".
Matching is plain code with no AI and no guessing: the same inputs always give the same result, and every bill and every GSTR-2B record ends up in exactly one result.
PD/26-27/0458 = 458)| Result | Meaning | Credit at risk |
|---|---|---|
| Matched | On the government record | none |
| Missing in GSTR-2B | Supplier hasn't reported it | full tax |
| Amount mismatch | Supplier reported different amounts | the shortfall |
| IGST vs CGST/SGST mismatch | Wrong tax type reported | full tax |
| Credit not available | GSTR-2B marks ITC unavailable | full tax |
| Invalid GSTIN on bill | GSTIN misread/mistyped | full tax |
| Probable match (check) | Same bill, different number | confirm |
| Duplicate bill | Bill entered twice | claim once |
| In GSTR-2B, no bill | Supplier reported a sale with no bill | find the bill |
gst_credit_finder/
├── accounts.py # Users, businesses, saved checks, password reset (SQLite)
├── bills.py # Purchase bills typed into the app
├── notify.py # Email / SMS sending
├── nudges.py # Monthly "GSTR-2B is ready" reminders
├── backup.py # Daily database backup
├── gstin.py # GSTIN format + check-digit validation
├── invoice_numbers.py # Invoice number normalisation
├── register.py # Purchase register CSV loader
├── gstr2b.py # GSTR-2B JSON loader
├── matcher.py # Three-pass matching and result statuses
├── deadlines.py # ITC claim deadline (Section 16(4))
├── report.py # Summary, supplier reminders, Excel report
├── service.py # One check, shared by website and command line
├── web.py # Website (FastAPI)
├── static/ # Web pages: index.html, app.js, style.css, privacy, terms
└── cli.py # Command line
tests/ # 87 tests
└── fixtures/
└── generate_sample.py # Fictional test data covering every situation
run_web.py # Starts the website
*.xlsx and data/ are gitignored.