DEV Community

Vinit Shinde
Vinit Shinde

Posted on

ShowUp: an offline no-show predictor that tells you when it can't be trusted

Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle Submission 💸

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

What I Built

Every missed appointment is an empty chair you still pay for. Solo salons, physios, tutors and small clinics feel this most, and the usual fixes are blunt: a deposit for everyone, including loyal regulars.

ShowUp is a local-first tool that helps these businesses reduce no-shows. The owner imports a CSV export of their bookings (Google Sheets, Calendly, Fresha, Excel). ShowUp calculates what no-shows cost them, ranks upcoming appointments by predicted risk, and drafts a polite WhatsApp reminder in English, Hindi or Marathi. The owner reviews it and sends it with one click through a wa.me link. Nothing is ever sent automatically.

Who would pay: a solo practitioner who loses slots and doesn't want to alienate regulars with deposit rules.

Pricing idea (untested): $9/month, or a $49 one-time license. Illustration, not measured data: 60 bookings a month at $60 with a 10% no-show rate is about $360 lost monthly, so recovering two slots a month beats the subscription.

Why it is different: client names, phone numbers and visit history never leave the computer. No cloud, no account, no per-message API fee.

Demo

. Everything shown is synthetic sample data, not a real business. I chose not to host a public version, because a public site where strangers upload client records would contradict the privacy promise.

Code

https://github.com/vinit-tech-source/ShowUp (Apache 2.0). Uses TabPFN-2 by Prior Labs; its weights carry their own license with an attribution requirement.

How I Built It

  • Local stack: Python, Streamlit, SQLite. After a one-time model download, it runs with Wi-Fi off.
  • Import: detects encoding and delimiter, fuzzy-matches column names, and reports valid, invalid and duplicate rows before saving.
  • Scoring ladder: simple rules under 30 visits, calibrated logistic regression with more history, and TabPFN-2 (CPU) as a candidate. Features use only data from before each appointment, so there is no leakage.
  • Honest selection: models are compared with 95% bootstrap confidence intervals, and the app won't call one "better" unless the gap is statistically meaningful.
  • Messages: local Llama 3.2 3B via Ollama, with template fallbacks and a guardrail that blocks guilt-tripping or shaming language. [State which languages come from the model vs templates.]
  • Tests: 159 passing, ruff clean, mypy --strict on the UI.

What the Numbers Say (and Don't)

On my 160-visit synthetic benchmark: TabPFN-2 ROC-AUC 0.526 and logistic regression 0.607. Both intervals include 0.50, so ShowUp reported no reliable signal. I generated that data myself, so this says more about my generator than about TabPFN, and I am not claiming real-world accuracy. I have not yet tested on a real business's data. The result I care about is the behavior: the app told me its predictions weren't trustworthy instead of sounding confident.

Why Does Open Innovation Matter?

A booking history is sensitive: names, phone numbers, treatments, habits. A cloud service means uploading it to someone else's server and paying per message. With open-weight models running locally, the owner keeps the data, pays nothing per reminder, and can swap the model in settings. I chose local TabPFN-2 over the newer hosted version on purpose, because the hosted API would break the offline guarantee.

Prize Categories

Best Use of TabPFN: TabPFN-2 runs locally on CPU inside the model-selection pipeline, benchmarked against logistic regression with bootstrap confidence intervals. On my synthetic data it did not beat the baseline, and I report that.

Top comments (0)