DEV Community

Cover image for ChaseLocal: An open-model tool that writes the invoice follow-up you've been putting off
Karthikeyan
Karthikeyan Subscriber

Posted on AI-assisted

ChaseLocal: An open-model tool that writes the invoice follow-up you've been putting off

Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle Submission đź’¸

This is a submission for Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle.

What I Built

ChaseLocal turns an overdue invoice into three ready-to-send follow-up emails, so freelancers can spend thirty seconds chasing a payment instead of twenty minutes wording a “just checking in” email to a client who owes them money.

Drop in an invoice (PDF or photo) or enter the details manually. ChaseLocal extracts the client name, amount, currency, due date, invoice number, and work description, calculates how overdue the payment is, and writes three drafts that escalate in tone:

  • Polite: A friendly check-in that assumes the delay was an oversight.
  • Firm: States the due date and how many days overdue the payment is, and asks when payment can be expected.
  • Final notice: The last reminder before escalation, while remaining professional.

You review the extracted details first and click Write follow-ups once everything looks right. ChaseLocal recommends the draft that best fits how late the payment is (e.g., “Day 18 · recommended” on Firm) and tells you when the next tone kicks in (“Still unpaid on Oct 22? The Final notice draft becomes the recommendation.”).

From there, you can tweak a draft (add a payment link, make it shorter or more direct), copy it, open it in your email app, or share the original PDF so it's ready to attach.

Who Would Pay for It?

Solo freelancers and small studios. A late invoice represents money they've already earned, and following up is the part people often put off because it feels awkward. It's a direct financial problem, not a nice-to-have.

A general chatbot can write an email, but you have to paste in the details, decide on the tone yourself, and check that it hasn't made anything up. ChaseLocal reads the invoice for you, selects the tone based on the due date, and sticks to the facts on the invoice without inventing deadlines or late fees.

Demo

Live app: https://chaselocal.vercel.app

Click Try a sample invoice to experience the entire flow without uploading any of your own documents.

ChaseLocal with the sample invoice read and the Firm draft recommended

It works on mobile, too, in both light and dark modes:

ChaseLocal drafts on mobile in dark mode

Code

ChaseLocal

Turn an overdue invoice into three ready-to-send follow-up emails — Polite, Firm, and Final notice — in under a minute.

Built for freelancers and small studios who'd rather not spend twenty minutes wording a "just checking in" email to a client who owes them money.

What it does

  1. Upload the invoice — PDF, JPG, or PNG. Or type the details in yourself, or click Try a sample invoice.
  2. Check the details — client, amount, currency, due date, invoice number, and work description are extracted for you. Any ISO currency works, and days overdue is calculated from the due date. Add the name to sign with (remembered on your device) and any earlier messages for context.
  3. Pick a tone — click Write follow-ups to get three escalating drafts, each with a subject line. The one that fits how late the payment is opens first, the stage tabs show the…

How I Built It

  • Tech stack: Next.js (App Router), React, Tailwind CSS, and shadcn/ui, deployed on Vercel.
  • Open-weight model: Llama 3.1 8B through Groq's OpenAI-compatible API. The provider and model are configurable through environment variables (OPENAI_BASE_URL, MODEL_NAME), so switching to Qwen, Gemma, or a self-hosted endpoint is just a configuration change.

  • Reading the invoice:

    • Photos are processed in the browser using tesseract.js, so the images themselves never leave your device.
    • PDFs are parsed on the server using pdf-parse.
    • The model converts the extracted text into structured fields: client name, amount, ISO currency, due date, invoice number, and work description.
  • Writing the drafts: A constrained prompt with stage-specific instructions. The Firm and Final notice drafts must state the due date and how many days overdue the payment is. The Firm draft must ask a direct question (“When can I expect payment?”). Stock phrases such as “at your earliest convenience” are banned, and the model is prohibited from inventing invoice numbers, deadlines, or late fees.

  • The details that make it feel finished:

    • Support for currencies worldwide, with proper formatting.
    • Stage dates calculated from the due date.
    • Your sign-off name filled in instantly without regenerating the drafts.
    • Clear error messages for password-protected, damaged, or scanned PDFs.
    • Per-IP rate limiting to prevent a single visitor from exhausting the model quota.

The open model does the core work twice: understanding the invoice and writing the emails. Everything else is UI and file handling built around it.

Why Does Open Innovation Matter?

For a tool that handles people's unpaid invoices, going open has practical benefits:

  • Privacy I can actually deliver. Photos are processed on the device, only the extracted text is sent to the model, and nothing is stored by the app. Because ChaseLocal uses an OpenAI-compatible API, I can switch to a compatible local inference server such as Ollama, making a fully offline version possible without redesigning the application.

  • No lock-in. If a better or cheaper open model becomes available, I can switch with one variable. I'm not tied to one company's pricing, terms, or model retirements.

  • Costs that fit the customer. Freelancers chasing late payments are price-sensitive. A small open model running on a cheap or free endpoint helps keep the tool free or nearly free, instead of adding a per-email bill that eats into its value.

  • Predictable behaviour. A small model with a tightly constrained prompt is easier to control, helping prevent it from inventing amounts or deadlines. That matters when the email is about money.

In short, open models let me build something genuinely useful for freelancers without ongoing API bills, vendor lock-in, or hand-waving about privacy.

What's Next?

  • Reminders: ChaseLocal already knows when each tone applies, so the next step is to remind users on those dates.
  • A self-hosted mode: An Ollama-based setup, documented and tested, for a fully offline experience.
  • Real payment links: Integration with Stripe or PayPal to replace the placeholder.

Thank you for reading, and thank you for organizing this Hacktoberfest challenge!

Top comments (0)