Inspiration
What it does
How we built it
Challenges we ran into
Accomplishments that we're proud of
What we learned
What's next for smart_biashara
Inspiration Millions of small traders across Kenya and Africa — market vendors, produce sellers, mama mbuzi operators — run their businesses entirely from memory or paper notebooks that get lost, rained on, or go up in smoke. We watched a family member struggle to explain her produce business's profitability at the end of each month with nothing but a mental tally. That moment stuck. We wanted to build something that felt as natural as talking to a friend — no accounting degree required, no expensive software, no internet dependency. BiasharaLedger was born from the belief that every trader deserves a smart, dignified tool built specifically for their world.
What It Does BiasharaLedger is a smart bookkeeping app for informal traders. It lets you log income and expenses by speaking or typing in plain English or Swahili — "Sold tomatoes for 500 shillings" is all it takes. A live dashboard shows today's revenue, expenses, and profit at a glance, alongside a 7-day bar chart and category breakdown donut chart. The Transactions page gives a full searchable ledger, the Reports page generates automatic business insights, and everything can be exported as a CSV. It works as a full Flask web app with a SQLite database, and also as a single offline HTML file that runs entirely in the browser with no internet or installation needed.
How We Built It The backend is Python with Flask and SQLite, exposing a clean REST API for users, transactions, dashboard summaries, and a natural-language parse endpoint. The frontend is vanilla HTML, CSS, and JavaScript — deliberately no heavy frameworks — with Chart.js for visualizations and the Web Speech API for voice input. We built a rule-based NLP parser in Python that extracts transaction type, amount, item, and category from free-form text using keyword matching and regex patterns. The UI is styled around a warm African market aesthetic — terracotta, forest green, and gold — using Syne and DM Sans typefaces. We also produced a fully self-contained single-file version where all logic runs client-side with localStorage persistence.
Challenges We Ran Into The biggest challenge was making the natural-language parser reliable without a machine learning model or external API. Real trader speech is messy — amounts appear in different positions, currencies are named differently ("bob", "sh", "KES", "shillings"), and item names are mixed with quantities and units. Getting solid extraction across all these patterns required many iterations of regex and keyword heuristics. Responsive chart sizing was another battle: Chart.js requires an explicit pixel height on its container, and getting the bar and donut charts to look right across desktop, tablet, and small phones took careful CSS wrapper management and multiple breakpoints. Keeping the app fully offline-capable while also supporting a server-backed mode meant maintaining two code paths cleanly.
Accomplishments That We're Proud Of We're proud that the entire app works with zero internet connection as a single HTML file you can save to your phone and open in any browser. The voice log feature — where a trader can speak a transaction and see it parsed, categorized, and ready to save in seconds — feels genuinely magical in demos. We're also proud of the design: it doesn't look like a generic admin dashboard. The warm earth tones, bold typography, and fluid animations give it a sense of place and identity that resonates with the audience it was built for. Shipping both a production-ready Flask app and a standalone offline version from the same codebase was a satisfying engineering achievement.
What We Learned We learned that great UX for underserved users means removing every possible barrier — no sign-up, no login, no tutorial, just open and go. We deepened our understanding of how Chart.js handles responsiveness and why declarative height containers matter more than canvas attributes. Building the rule-based parser taught us how much mileage you can get from well-structured keyword heuristics before you need to reach for a full NLP model. We also learned how to architect a web app so it gracefully degrades from a full server-backed system all the way down to a single static file without changing the user experience.
What's Next for smart_biashara The immediate next step is replacing the rule-based parser with a lightweight LLM call — using the Anthropic API or a fine-tuned open model — to handle Swahili, Sheng, and ambiguous mixed-language input with far greater accuracy. We plan to integrate the Safaricom Daraja M-PESA API so that mobile money transactions auto-import in real time, eliminating manual entry entirely for the majority of Kenyan traders. On the infrastructure side, we'll migrate from SQLite to Supabase with user authentication so traders can access their books from any device. Longer term, we want to add a WhatsApp bot interface — so a trader with only a feature phone can text their transactions to a number and have them logged automatically — and explore a group lending and savings (chama) module tailored to informal savings circles common across East Africa.
Log in or sign up for Devpost to join the conversation.