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)