- We stopped renting the tool that reads our own numbers back to us, and built one. Every chart the team looks at was being drawn by a large piece of off the shelf reporting software running on a machine of its own. It has been replaced by our own reader: eleven dashboards, one hundred and sixteen charts, on its own address behind a company sign in, with the charts drawn by the same components the launch day wall board already uses. The important design decision is where the dashboards themselves live. They are written and edited in the separate analytics project, and this reader fetches them while it is running, so editing a dashboard is an edit in that project and nothing else. An earlier version copied them in, which would have meant that changing one chart's title required deploying the entire product. The old machine is still standing but nothing points at it any more.
- The charts were confidently wrong, in four different ways, and every one of them was measured rather than argued about. This is the half of that work worth reading. A headline number showing "the latest value" was showing an arbitrary one, because the database returns rows in no particular order unless asked, and it was not being asked: eleven of twelve such tiles came back unsorted, so a rate labelled as current was reading a value from twenty four days earlier, with a scrambled trend line beside it. A chart with no stated size limit was silently capped at five hundred rows, so the model spend by agent chart was dropping a third of its data, a different third on every load. Twenty more charts died outright the moment a reader touched the date control, because the code had nominated a text column as the date column and asked the database to read a funnel stage name as a timestamp. And the date labels along the bottom of every daily chart were being drawn in the reader's own timezone, so two people in two countries read different labels off the same bar, and every one of them said three in the morning. All four are fixed, all four re-measured after: twelve of twelve sorted, seven hundred and thirty five rows of seven hundred and thirty five returned, one hundred and sixteen of one hundred and sixteen charts compiling, labels in one shared clock.
- Eleven big clients were told a specialist would call, and nobody was told. For twenty six hours, every handoff of a large client to customer success failed to write. Nothing raised a hand. The cause was that the write listed its values without naming the columns they belonged to, so it matched them up by position, and adding one harmless new field the day before shifted everything after it by one. The database refused, and because it refused while planning rather than while writing, it refused updates to existing clients too, not only new ones. Three things shipped. The write names its columns, so the next new field is harmless. Two alarms now watch it, one for the job failing and one for the quieter case where the job succeeds having written nothing at all, which is one misconfiguration away in any environment. And our staging environment finally got a real copy of the destination to rehearse against, since it previously had none and the whole thing met reality for the first time in production. The lost rows were recovered by replaying the original jobs, stamped with the moment the client was actually handed over rather than the moment of the replay.
- The talent search stopped deleting the specialist the brief was written for. A client asked for a designer who could build a particular kind of 3D web experience. The search returned eighteen people, none of whom could do it, eight of them working in unrelated tools, and the top pick replied saying plainly that they do not do 3D work. The obvious conclusion was that Fiverr has nobody. It has nineteen who advertise exactly that tool, and we removed them ourselves, in three separate places, before anybody was even judged. The seller quality floor took eight of them, including the single best match in the entire supply, because a specialist in a newer tool is usually a newer seller. The price band took five more, because their top price sat under the client's budget rather than over it, and being cheaper than the budget was being treated as harshly as being more expensive than it. And the searches themselves never asked: they searched for the role and not for the combination the specialists actually advertise. All three are fixed. Somebody who advertises the named capability skips the quality floor, being under budget is a ranking signal rather than a deletion, and each named tool is now paired with the role in the very first round of searching.
- Every filter we stated is now actually enforced, by us, and a requirement can no longer vanish by not being repeated. Two problems underneath the one above. Some of the filters we sent used names the search service does not recognise, and an unrecognised filter is silently dropped, which is why an on site brief in one country returned somebody in another and a German language brief returned somebody who speaks none. Beyond that, half the results we merge come from a route that enforces nothing at all, so even a correct filter was a suggestion. We now re screen every result ourselves, against country, region, language, level, delivery time and the rest, and the search can finally state all of those in the first place. Measured on a live pool of fifty eight people: twelve of twelve requirements held, no violations. Separately, a requirement could evaporate between rounds: a search that came back thin would try again, and anything the second attempt forgot to repeat was treated as deliberately cleared, so a brief that specified German ended up with a shortlist of people who speak none, with the filter apparently still set. Every stated requirement is now carried forward automatically, and can only be given up by naming it, one per round, and the loosest first. Each of those is recorded, because trading away something the client asked for is sometimes right but always a compromise they did not request.
- A talent setting their own terms shipped, grew four fixes, and came back out the same day. The idea: a talent can say "only work above five hundred dollars" or "no logo work" and have it honoured, captured from their own words, never applied until they explicitly approve the change, and enforced as a hard gate rather than a hint. Living with it for a few hours found four holes, all in the same direction, all fixed: a preference could be raised but never lowered, a second rule silently erased the first, the price floor was checked in only one of the three ways a talent gets contacted, and a failed read of the whole system was indistinguishable from nobody having set anything. Then it came out entirely. Not behind a switch, because a switch would leave the agent carrying the feature in its instructions with only a boolean promising it stays off, which is not the same as behaving as it did before. The removal was verified rather than assumed, character for character against the state before it landed. Both branches are kept and the table stays, so bringing it back needs no new groundwork.
- Sign in before any search, and let the budget alone decide which search you get. A client who finished their brief without signing in got an offer they could decline: sign in for the full service, or continue as a guest, or press escape and get nothing at all. That made signing in an input to which search you received, and let clients reach every later stage of the product with no account. Now the two questions are separate and asked in order. Anyone not signed in meets a gate with exactly one control and no way around it, including no escape key and no clicking the background. Once signed in, the budget alone routes you: modest budgets to the plain search, larger or unclassified ones to the full service. Signing in decides whether you continue. It no longer decides where you land.
- Two browser tabs stopped fighting over one project. Every open tab was listening on the same channel and reading which project was active from one shared place, so they effectively shared an identity: an update meant for one project folded into the tab showing another, a question card from one tab's turn landed on an unrelated project, and opening a new project would eventually drag every other tab onto it too. Each message now says which project it belongs to, the active project became a fact about the tab rather than about the browser, and a tab folds in an update only if it is about its own project or its own work. Reload history and cached data are kept per project as well, so restoring a tab cannot restore somebody else's workspace.
- A talent's question went unanswered, and a client was asked the same thing three times. Two linked faults on one conversation, found by investigating a talent who received the same "I have your updated terms" note four times. The first: after the terms were wrapped up, a talent writing in got nothing back at all, because the reply had been held aside for the wrap up note and, once that note had already been sent, nothing released it. Thirty one conversations in the first day, every one a talent message left unanswered, and on some of them the client's own answer was swallowed too. The second: the same question, asked of the client in three different phrasings within ninety seconds, produced three separate cards, because two questions only counted as the same one if they were worded identically. The client answered all three, and each answer sent a redundant round back to the talent, which is what produced the four identical notes. Re asked questions are now recognised as the same question and folded onto one card, conservatively: when the match is at all uncertain, nothing is folded and the new question gets its own card.
- Two conversations with the same talent, and neither of them complete. A race last week had created duplicate conversation records for the same talent on the same search, ten groups of them, forty four records. The creation bug was already fixed and reads already pick one of them consistently, but the losing records still held part of each talent's history and nothing ever read them, so both the agent composing the next message and the client reading the thread were seeing a truncated conversation. Each group is now folded into the one record everything already picks, with every attached message, offer and event moved across rather than dropped, and the database now refuses to hold two of them ever again. The set of things that had to be moved was worked out against the live database rather than taken from the write up, which turned up one that had been added since.
- A shared dashboard link answered "not found" while showing the page perfectly. Sending somebody a link to a specific dashboard returned a not found status with the working application in the body. The page rendered, so a person saw nothing wrong, while every monitor, link checker and automated test read a failure on the one address the tool is meant to be shared by. The storage layer serves the right page but cannot change the status, and the layer above had never been told to. It has been, on the one address and deliberately not on the two beneath it, because a genuinely missing data call or a missing script must stay visibly missing. The talent side of the product had exactly the same gap and was fixed with it.
- Structured data stopped being stored as plain text pretending to be structured. A full sweep found thirteen columns holding structured records as ordinary text, six of them with parts of the codebase disagreeing about the rules. That is the shape of a bug that broke real clients last week: one unprintable character sneaks in, the write succeeds, and every later attempt to read that record as structured data fails for everybody. All thirteen are now genuinely structured, each one repairing any record that would not survive the change before making it. The other half of the same effort finished too, adding the cleaning step to the last thirty five or so places that write text we did not author, including inbound messages from the platform, and extending it to cover the names of fields as well as their contents, which had been missed.
- Fiverr's own outcome data, in a room we cannot write to. Our view of a project goes dark the moment we hand the client over. Everything that says whether the work happened, whether they talked, whether an order was placed, whether they came back, is on Fiverr's side. That return path now exists: a Fiverr service writes post handoff outcomes into a dataset in our project that only our own services can read, and the quarantine is enforced by permissions rather than by convention, with two rules that refuse at planning time to grant the writer read access or to let any person outside the project in. Two columns carry more weight than they look, recording whether each handoff's identities actually resolved, because a handoff we could not match has unknown outcomes rather than zero, and treating those alike would understate the results. Deleting an account reaches these rows two ways.
- Paging arrows that sit beside the cards instead of on top of them, and a last page that fills itself. Yesterday's twelve talent reveal arrived with its arrows painted over the card text and the brief tab sitting on the right one. They now live in real reserved space either side of the deck, so they can never cover a card, they stay exactly one card gap out at every screen width from a laptop to a very wide monitor, and both stay level. A direction with nowhere to go renders no arrow at all rather than a greyed one, without shifting the deck. And a search that found four people no longer strands the fourth alone on a page of its own: the last page backs up to a full deck, which is what every carousel does.
- The live match rail shipped overnight and was turned down to zero the same day. The carousel of real talent that appears under the chat while a client is still describing their project went out as an experiment: nine in ten clients saw the old experience, one in ten saw the rail. It was turned down to nobody the same day, pending a decision on when to roll it out. Nothing was deleted or commented out, every part stays connected, and one number turns it back on. Testers can still switch themselves into it. Alongside that, the engine behind it stopped being an approximation and became the real search, running the full pipeline in a single round with smaller budgets, reading the conversation with the assistant, and building on the previous list rather than recomputing from nothing each time.
- Medians beside every average, and the client's actual name. The console's funnel now shows a median next to every average it reports, on budgets, on days spent at each stage, on transition times and on offer values, because an average is easily dragged by one very large project. The project page now names the client rather than showing only an email, preferring the account name and falling back to the name they gave the assistant. And the five long lists, alerts, big clients, searches, offers and declines, now filter and search across the whole store rather than only the pages already loaded, with the filter choices themselves gathered from everything rather than from what happens to be on screen.
A very big Tuesday, 52 commits, and the headline is that we stopped renting the tool that reads our own numbers back to us. Eleven dashboards and a hundred and sixteen charts now run on our own reader, on its own address, fetching the dashboard definitions from the analytics project while it runs so a chart edit no longer needs the product deployed. The half worth reading is what building it found: a headline number labelled current was showing a value from twenty four days earlier because nothing had asked the database to sort, a chart was silently dropping a third of its rows on every load, twenty charts died outright when a reader touched the date control because a funnel stage name was being read as a timestamp, and every daily label was drawn in the reader's own timezone. All four measured, fixed and re-measured. Elsewhere: a large client handoff wrote nothing for twenty six hours while eleven clients were told a specialist would call, because the write matched its values by position and one new field shifted everything after it. The talent search stopped deleting the specialists the brief was written for, in three separate places, and every filter we state is now enforced by us rather than hoped for. A talent setting their own terms shipped, grew four fixes and came back out the same day. Signing in became a gate rather than an offer, two browser tabs stopped fighting over one project, and a talent whose question went unanswered after a wrap up finally gets a reply.