Inspiration: Freelancers and small businesses still write invoices by hand or wrestle with heavy accounting tools for a simple job: 'Bill Acme Corp $2,500 for website development, due in 14 days.' That sentence already contains the whole invoice — so we built an assistant that understands it.
What it does: InvoicePilot takes one plain sentence (Indonesian or English) and turns it into a structured invoice — client, itemized amounts, currency, due date — then creates a real PayPal Sandbox checkout order from it through the PayPal Orders API and returns the payer approval link.
How we built it: The extraction runs on a local, open-weight LLM (Qwen2.5-3B-Instruct, GGUF Q4_K_M via llama-cpp-python) — fully offline, no cloud AI calls, so invoice data never leaves the machine. A defensive parser normalizes amounts ('1.500.000', '1,5 juta', '$2,500') and currencies (Rp to IDR, $ to USD), and an honest regex fallback is clearly labelled whenever the model is unavailable. The web app is a dependency-light Python http.server. The PayPal step reads credentials only from environment variables; with no credentials it answers honestly (no_credentials) instead of faking a link, and it refuses currencies PayPal Checkout does not support (e.g. IDR) with a clear unsupported_currency status.
Challenges: Running a 3B model on a small shared CPU box (2 cores, ~7.7 GB RAM) meant lazy model loading and keeping the model resident in the server process. Verification honesty mattered to us: the Orders API integration was tested against the real PayPal Sandbox (dummy credentials are rejected there with HTTP 401 invalid_client, proving the OAuth2 path is live), and the full success path can be reproduced by judges in about a minute with their own Sandbox credentials (instructions in the repo README).
Accomplishments: A working end-to-end prototype — sentence in, structured invoice out, PayPal Sandbox order ready — with every claim in the README backed by saved test evidence.
What we learned: Local open-weight models are now good enough for real structured-extraction work, and designing for honest failure modes makes a demo more trustworthy, not weaker.
What's next: Payment-status tracking and capture, AI-written polite payment reminders, and multi-item parsing improvements.
Built with: Python, llama-cpp-python, Qwen2.5-3B-Instruct (Apache-2.0), PayPal Orders API (Sandbox), HTML/CSS. AI tools used: Qwen2.5-3B-Instruct as the in-product extraction model (local inference); AI coding assistance during development.
Log in or sign up for Devpost to join the conversation.