No new features. Hundreds of fixes. The story of nine months at full speed, and the two weeks of 18-hour days I spent cleaning up after myself.
In June 2009, Apple got up on stage at WWDC to announce the next major version of Mac OS X, and the slide behind Bertrand Serlet said, in type the size of a building: 0 New Features.
The room applauded. Snow Leopard became one of the most beloved Mac releases ever shipped, and the affection had nothing to do with what it added. It was Apple saying, “We moved fast, we built a lot, and now we are going to stop and make it all solid, because you live here.”
TimeNet Law 6.2.1 is my Snow Leopard. It is out today, and it has no new features worth advertising. What it contains is the result of me stopping everything, printing out my own application, and going through it line by line like opposing counsel.
Internally, I call it RAID EDITION. As in the bug spray. Kills them dead.
The sprint
Some context on why this release needed to exist.
Last November I started the largest development push of this application’s 23-year life. Version 6 was not a coat of paint or a few new features. It was new billing infrastructure, a new calendar system, a new document engine, an entirely new way to interact with the software, and eventually a local AI subsystem, running against a codebase that has been earning its keep since the first PowerBook G4.
Here is what actually shipped, and when:
- March 4: TimeNet Law for iPhone and iPad, version 1.0. First mobile app in our history.
- April 2: TimeNet Law 6.0. The release notes read like a manuscript. Users wrote me emails like it was 2003 again.
- April through May: 6.0.1, 6.0.2, 6.0.3. iOS 1.1, 1.2, 1.3.
- June 22: TimeNet Law 6.1, with Oasis: a full legal AI that runs on your Mac, works offline, and never sends a privileged word to anyone’s cloud, including mine.
- July 17: TimeNet Law 6.2, with Slipstream. Your invoices grow Pay by Card and Pay by eCheck buttons, payments post themselves to the right matter, and there is no monthly fee.
- July 18: iOS 1.4, same week. Create matters and clients from your phone, send pay links from the courthouse hallway.
- July 25th: iOS 1.4.1, more bug fixes.
Nine Mac releases and six iOS releases in nine months, from a company whose entire engineering department shares one desk with a dog under it.
I am proud of that sprint. And I want to be honest about what it cost.
The bill
When you rebuild that much that fast, you shake things loose. Most of what shook loose landed in my testing, or in the beta group’s. A few things did not. They landed in law firms.
An invoice could lose its time entries. Not often, and not randomly, but under specific sequences of editing and reissuing, an invoice would keep its number and its date and quietly let go of the work inside it, showing a zero or negative balance while the entries slid back to unbilled. If you bill for a living, you understand that this is not a bug. This is the bug. The one category of failure a billing application exists to make impossible.
A firm’s settings could revert to defaults. A Mac that joined a synced database before the sync finished could conclude the firm was brand new and helpfully write a blank settings file over the real one.
Firms with decades of history could wait half a minute at every launch. Cloud-synced databases could throw warnings about problems that did not exist. The Payment Center had a stretch where checking invoices stopped updating the payment amount. New customers could hit an error about a corrupt settings file on a database that was thirty seconds old.
Every one of those sentences represents real people at real firms who trusted my software with the part of their practice that pays for everything else. Some of them told me about it patiently. Some of them told me about it the way you tell someone whose dog bit you. Both were right.
The industry-standard move at this point is to say nothing, patch quietly, and let the release notes read “bug fixes and performance improvements.” I have read twenty years of those release notes from vendors whose software I compete with. I know exactly what they are hiding behind that sentence, because I know what I would have been hiding behind it.
So instead, here is what I actually did.
The raid
Two weeks ago I stopped all feature work. No 6.3 planning, no marketing, nothing. I exported every source file in the application, all 824 of them, into a repository whose whole purpose was one question: what touches billing data, and can I prove it behaves?
Then I audited every writer. Every code path that creates, modifies, or deletes a time entry, an invoice, a payment, a trust transaction, or a settings file, read line by line, with each suspicious finding independently re-verified before I trusted it enough to change code. Findings went on a wall. Fixes came off the wall one at a time, each one tested against reproductions of the actual customer reports that started this.
Some stories from inside the raid (this is the part I’d want to read).
The invoice bug was three doors into one room. The reason it survived my earlier fixes is that it was not one bug. A recalculation could run against a stale snapshot of the invoice list and conclude that billed entries belonged to no invoice, so it helpfully unbilled them. A reissue could run under a blank invoice number and stamp nothing. An edit dialog could compare the wrong rows and unbill an entry you never touched, even if you opened it and clicked OK without changing anything. Each door looked like the whole problem. Each fix made the reports rarer and made me more confused. The audit found all three because the audit did not start from the reports. It started from the code, looked at the data and asked who was allowed to write to it. All three doors are now closed, and if this ever happened to your firm, contact me, because your entries are recoverable, to the penny.
One firm’s cloud storage left 1,396 conflict files behind on update day. The old sync warning would have fired 1,396 times, which is why nobody read it, which is what made it worthless. I went through those files. 1,395 of them were the same data with trivial formatting differences, the digital equivalent of photocopies falling behind a desk. One contained real work that existed nowhere else. One. It was recovered in full. And that ratio redesigned the feature: TimeNet Law now opens every conflict file, reads it, and speaks up only when one contains work that is not in your data. A warning that fires 1,396 times is silence. A warning that fires once, correctly, is protection.
The settings file now has a bodyguard. The app keeps a separate protected copy of your firm settings, verifies the live file against it at every launch, and restores it silently if anything is wrong. But the deeper fix is stranger: TimeNet Law will now refuse to save. If a Mac believes the firm has no timekeepers while sitting next to a folder full of real matters, it does not write its empty opinion over your real settings. It declines, tells you why, and waits for the sync to finish. I spent two days making software refuse to do its job, on purpose, and it is one of the best features I have ever shipped. And nobody will ever see it.
The thirty-second launch was self-inflicted. Profiling showed more than half of every launch was being burned by version-migration machinery left over from the 6.0 transition, faithfully re-checking thousands of matters that had been checked a hundred launches ago. It is gone. Not optimized. Deleted. Launch on a large database went from coffee break to keystroke, and the lesson is old and evergreen: the fastest code is the code that is not there.
One customer helped me debug his hang from 2,000 miles away with a single Terminal command. He pasted one line, sent back one number, and that number eliminated half my theories in ten seconds. I will not pretend every Mac-using attorney wants to touch Terminal. But there is something about this platform and the people who choose it. My customers will meet me halfway in a way I do not believe any cloud vendor’s ticket queue has ever experienced.
The asterisk
Full disclosure: three small new things did sneak into 6.2.1, because they came directly out of the same support conversations as the bugs.
There is a new Import Database window that reads a Clio export and rebuilds your clients and matters in TimeNet Law, with a full preview before anything is written. There is a setting for which view opens when you double-click a client. And the Payment Center now lets you choose whether invoices start out pre-checked when you record a payment.
That is the entire feature list. The other several hundred lines of the release notes all start with the word “Fixed.” 230-plus hours of auditing, line by line, is what bought them.
Why this release is the point (and not a point release)
You are allowed to ask why I am telling you all this. Bugs in billing software, described in detail, by the person who wrote them. My competitors’ marketing departments would call this post a gift.
They can have it. Here is what I know after 23 years of this.
Software that handles your money earns trust in exactly one way: by telling you the truth about itself, especially when the truth is embarrassing. You are an attorney. Candor is not a virtue in your world, it is a duty with a rule number. You extend it under obligation every day. You almost never receive it from the companies you pay.
The cloud vendors ship bugs too. Constantly. You never hear about them, because continuous deployment means the bug arrived silently on Tuesday and left silently next Friday, and whatever it did to your data in between is a line in an incident log you will never be shown. When software lives on someone else’s servers, its failures are private property. Theirs, not yours. And your data is hostage to those bugs. You don’t have backups of a sane database from two weeks ago. You don’t have the phone number on your desk that rings the phone on my desk.
My failures ship in a downloadable installer with full release notes. They are yours to read, yours to weigh, and yours to hold me to. I think that is how it should work when the data is your money. And especially, your clients’ money. I also think the fact that this feels radical says more about legal tech than it says about me.
There is one more reason, and it is the honest one. TimeNet Law is 23 years old, independently owned, and I intend it to outlive every venture-funded competitor currently burning money to acquire the firms those competitors will later squeeze. You do not get to 30 years by sprinting forever. You get there by knowing when to stop, close the door, and spend two weeks with the bug spray.
Version 6 was the fastest nine months of building in this company’s history. 6.2.1 is me making sure the foundation deserves what comes next.
TimeNet Law 6.2.1 is live now. Choose Check for Updates, or download it here. If your firm ever saw an invoice lose its entries, contact me.
I will leave you with one more thing. No software is perfect. All software has bugs. And the best software isn’t the code that claims to work flawlessly. That code doesn’t exist. The best software is code supported by the same people who wrote it. Who listen with empathy, solve problems, and fix bugs quickly, working directly with the users who rely on it. You’ve given me your hard earned money, you’ve trusted your law firm’s operations in my hands, and you’ve supported TimeNet Law, allowing it to survive as the last independent legal billing software on the planet. I don’t take that lightly. Because when things go wrong, it doesn’t really matter what broke. What matters is who’s going to fix it. And that’s me.


