SplitBill: IOU manager for and by Geeks
There are hundreds of IOU softwares on the net. What makes SplitBill different is that it has no UI. Yes, you read that right – No UI. Now the more surprising part. It is a breeze to use and setup. In fact all you need is a sever with Python and MySql installed to host this, and then simply run the code after setting up the DB and it is ready.
You might be wondering now, how do we access the system? Easy; just send a mail to a pre-configured mail box. Suppose John owes you 100 bucks then simply send a mail to SplitBill with John in CC or To fields. In subject write Loan 100 For Pizza. Now just send the mail. You are done. Moments later SplitBill will reply to your mail, confirming that your transaction has been recorded.
So, SplitBill is like a command-line program, where your mail box is the Terminal window. We already have mail clients for pretty much every device hooked to the net. So, SplitBill is accessible to you from practically from everywhere. When you want to checkout who owes you or you owe whom, simply mail to SplitBill with Get in the mail’s subject. The response mail will have all the summary along with list of all last hundren transactions.
Because of the above design, SplitBill is inherently scalable. Many users can simultaneously send mails to SplitBill’s mail box without affecting it at all. It polls the mail server every five seconds (configurable) via IMAP connection and processes the mails in the order they were received. This way spikes in requests are eased out at mail server end. Mail server acts like a very large buffer for SplitBill system. Also if for some reason SplitBill crashes, the users can still file transaction, which will get processed when it is back online.
SplitBill System Design Assumptions
SplitBill is a simple product. To keep it simple to use and light, it has only basic abuse protection facility. For example, suppose you filed a transaction that John owes you 100 bucks. Now John can command SplitBill to simply delete that transaction. SplitBill will honor that and will purge that transaction without the possibility for rollback. However, when John is notified that his request has been fulfilled, you too will be CCed in that response mail. From the response mail you will come to what exact transaction has been deleted. You can then use that info to refile the transaction, and give a nice little trashing to John.
SplitBill has no mechanism for explicitly registering users. Whenever you send a mail to SplitBill, it will quietly register all new mail ids in it.
SplitBill Error Handling
In spite of its simplicity it does not trade off reliability. Most of the stuff you can checkout in its code, but there is one part you need to be aware of. When it errors out five consecutive times (configurable), then it auto shuts down. This is because if on consecutive tries if the command fails then it is assumed that something bad, like a DB crash, has happened which might take quite sometime or forever to be fixed.
It does not mark a mail as read unless and until the transaction has been successfully recorded in the database. However, if it is unable to mark the mail as read (even after retrying), then it shuts itself down to prevent recording the same transaction again. Unfortunately currently the mail UID is not recorded in database, preventing it from identifying if the current transaction has already been processed.
Whenever it shuts itself down, it sends mail to all registered owners, notifying the problem. The owners also receive mails with stack traces when they happen.
Me and my friends have been using this for couple of months now, and we have hardly faced any issues till now.
SplitBill Command Reference
There is already a separate page on this. Please see it here.
Get or fork SplitBill on GitHub - https://github.com/applegrew/splitbill.
Setting up SplitBill
- Make sure you have Python 2.6 or up installed on your server.
- Download and extract the splitbill sub-folder into your server.
- Install pytz package.
- Install MySql and MySql connector for Python.
- Run setup_db.sql script to setup your database. If you want your schema to be named something other than splitbill, then modify this sql file.
- In splitbill folder you will find settings.ini. Set the DB and mail credentials and other settings as required.
- Finally! Run SplitBill. You can run it from the parent folder of splitbill using command nohup python -m splitbill.main &.
A Little History
SplitBill was envisioned not by me, but my friend Rohit. He designed the original system and coded that in C#. Later when we wanted to move the system to my (Linux) server, I decided to recode it in Python. This version of SplitBill is only couple of months old and was coded by both of us. We had used the original version for almost a year, during which SplitBill architecture evolved to its current state.