Open Net Worth
Open Net Worth는 직접 운영하는 오픈소스 개인 AI 자산 비서로, 전체 재무를 하나의 원장에 기록하고 사용자가 제어하는 AI가 관리
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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.