Urgent.News

What's breaking now, across thousands of outlets.

Tech

Auditly: the shopkeeper talks, the ledger writes itself

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle What I Built My local kirana shop keeps its accounts in a paper khata. The owner writes in it twice a day, when the shop is quiet, from memory. Some days he doesn't. He has a smartphone. He has tried two accounting apps. Both wanted him to tap through four screens to record one sale of sugar — slower than the…

Auditly is an open-source AI application designed to help small shopkeepers in India keep their accounts in a paper ledger, called a khata, by speaking into it instead of typing. The owner of a kirana shop writes down transactions twice a day from memory, which often leads to inaccuracies and inefficiency. Auditly removes the need for typing and instead allows the shopkeeper to speak their transactions in Hindi or Hinglish, and the app converts them into structured records.

To use Auditly, the shopkeeper presses a green microphone button and says their transaction, such as "paanch kilo cheeni bechi do sau rupaye kilo" (sold five kilos of sugar at two hundred a kilo). The app then displays a record of the sale, including the quantity, price per kilo, and total amount. It also records any expenses, such as the electricity bill. The shopkeeper can review the day's transactions, make corrections, and save them.

Auditly uses an open-weight model called gpt-oss-120b, which is hosted via Groq's OpenAI-compatible endpoint. The model converts spoken transactions into JSON format and validates the data before saving. It handles various nuances of spoken Hindi, such as converting spoken numbers to the correct numerical values and identifying product names. Additionally, Auditly includes features like a review screen for checking transactions before saving and a voice feature that reads the day's records back to the shopkeeper in Hindi.

Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.

Read the original at dev.to →

More in Tech

The Double-Booking This Schema Is Built to Allow

Ask anyone who knows PostgreSQL how to stop two clients booking the same specialist at the same time, and the answer comes fast: an EXCLUDE constraint with btree_gist , one && on a tstzrange , done at…

  • KRI SaaS requires order-dependent booking rule
  • Simple UNIQUE or EXCLUDE constraints insufficient
  • Application transaction implements client-facing guard

A search daemon is a database server: 151 Manticore title matches

A search daemon is a database server: 151 Manticore title matches Manticore Search is a search engine that speaks a SQL-like query language and a MySQL-compatible protocol.

  • Manticore Search operates as a search daemon, functioning as a database server
  • 151 title matches found for "Manticore" by ZoomEye on October 14, 2026
  • Exposing the daemon's network access poses significant security risks

Building Adobe, Vecteezy and Dreamstime CSVs From One Folder of Assets

I still have the rejection email open in a tab from last March. I had generated a batch of 120 sticker assets, spent an evening building what I thought was a clean upload spreadsheet, pasted 120 rows…

  • Script "makemetadata.py" generates correct CSV headers for Adobe, Vecteezy, and Dreamstime.
  • Uploadtracker.py prevents duplicate submissions and maintains trust with reviewers.
  • Specific folder layout and minimal memory usage streamline the asset pipeline process.

Go error handling patterns that scale: wrapping, unwrapping, sentinels

Go's error handling gets a lot of criticism from developers coming from exception-based languages. But the real problem isn't if err != nil — it's the patterns that get built on top of it.

  • Wrapping errors with fmt.Errorf and %w preserves original error while adding context in Go 1.13+
  • Wrap errors at origin point, not mid-process, to avoid unnecessary noise
  • Sentinel errors useful for caller-based branching on error types, not needed for all internal errors

More from Sunday 18 October →