Jan 6, 2026 · 9 min read
Niuma Clock: Twenty Thousand Downloads in Two Days
Notes on products and growth.

Since you opened this page
¥0.00
What a ¥8,000-a-month job pays while you read, counted the way the app counts it: about 1.3 fen a second.
A year ago today I released a small iPhone app called Niuma Clock. You enter your monthly salary and your hours, and it shows what you have earned today, second by second. For four months almost nobody used it. Then, in two days, twenty thousand people downloaded it, and I did not know why.
This is not a tour of the app. It is what that year taught me about products and growth: about the idea, the spike, the week after it, the maths I got wrong, and what happened when I stopped.
Everyone is a niuma now
Niuma, 牛马, literally oxen and horses, is what office workers in China call themselves now: beasts of burden, worked hard and fed little. By the end of 2024 you heard it everywhere, almost always as a joke people made about themselves.
The app was nothing more than that joke with a number attached. If you are a beast of burden, you might as well know what you are worth by the second. I built it the way I built everything then, entirely with AI: Claude 3.5 Sonnet in Cursor wrote the Swift, and later Claude 3.7 Sonnet did the updates. Version 1.0 went live on January 6, 2025, with one screen, a poster I made three days before, and a post on my Xiaohongshu account, xxl.ai.

Four quiet months
The post got 81 likes. January ended with 172 downloads. The next three months brought 941, 754 and 168.
I kept working on it anyway. A home-screen widget in February, because a clock you have to open is a clock you forget. A first-run guide, so nobody landed on a screen full of zeros. More currencies in April. Later, a set of cows drawn by GPT-4o, one for each state of your working day. None of it moved the line. After four months the app had about 2,000 downloads.

at work

day off

running late

the plough
May 6
I did not see it happen. I opened App Store Connect on May 7 and the chart for the day before had a bar that did not fit on it.
Niuma Clock downloads, January 2025 to October 2026
First-time downloads per month, App Store Connect
Show the numbers
| Jan 2025 | 172 |
| Feb 2025 | 941 |
| Mar 2025 | 754 |
| Apr 2025 | 168 |
| May 2025 | 26,028 |
| Jun 2025 | 1,251 |
| Jul 2025 | 1,521 |
| Aug 2025 | 1,356 |
| Sep 2025 | 810 |
| Oct 2025 | 640 |
| Nov 2025 | 370 |
| Dec 2025 | 396 |
| Jan 2026 | 488 |
| Feb 2026 | 187 |
| Mar 2026 | 421 |
| Apr 2026 | 437 |
| May 2026 | 584 |
| Jun 2026 | 591 |
| Jul 2026 | 822 |
| Aug 2026 | 1,969 |
| Sep 2026 | 469 |
| Oct 2026 | 1,313 |
On May 5, 38 people had downloaded it. On May 6, 12,010 did. On May 7, while I was staring at that number, another 8,273. It felt completely sudden. Nothing I had done that week, or that month, explained it.
On the third or fourth day I went looking for the cause. App Store Connect could not tell me much. Almost every download had come through App Store search, which only says that people already knew the name. So I searched Douyin myself, and there it was: a video about the app that someone else had made, with more than 600,000 likes. I had never seen it and did not know who made it. It has since been taken down.
12,010
downloads on May 6, 2025
600K+
likes on the Douyin video, made by a stranger
98.7%
of downloads came through App Store search
5
downloads ever came from a Douyin link
The last two numbers belong together. Hundreds of thousands of people watched the video, and almost none of them tapped a link. They opened the App Store and typed 牛马时钟, which is exactly what you would type after watching a video about a clock for niuma.
The week after
Twenty thousand new users found my four-month-old Xiaohongshu post and filled it with comments. For the first time, people were telling me what was wrong. I answered almost all of them, usually within hours, and shipped three versions in six days: leave on May 7, custom schedules on May 8, and on May 12 a lunch break and buttons to hide your salary. A few of the comments, translated, with what I said and what happened:
May 6Xiaohongshu, from Germany
“Can the working day be split? There’s a lunch break in the middle.”
Me: “Wait for me to add it, very soon.”
Shipped: Shipped six days later: a lunch break that pauses the clock.
May 6Xiaohongshu
“Can the salary hide behind asterisks? Colleagues walk past and see it.”
Me: “Done! Go and update. (May 8)”
Shipped: Shipped: an eye button beside the salary and each total.
May 7Xiaohongshu
“Can you add other schedules? Four days on, four off. Two on, two off.”
Me: “OK! I’ll add a way for people to choose for themselves.”
Shipped: Shipped the next day: custom work days and repeating cycles.
May 7App Store review
“Add an optional spending line for the day, so the tiny income looks even more shocking.”
Me: “This suggestion is amazing, let me think about how to do it.”
Not shipped: Not shipped.
May 9Xiaohongshu
“Why is ¥8,000 a month ¥369.52 a day? With 22 workdays it should be ¥363.63.”
Me: “The algorithm has a small flaw, I’ll work on it.”
Not shipped: Not fixed.
What I shipped was small, visible and doable in a day. What I did not ship needed a real decision, like turning a clock into a budgeting app. And the comment that mattered most, the one saying the maths was wrong, was the one I said yes to and never did.
The maths I said I would fix
That commenter was right. Everything in the app comes down to what one second of work is worth, and the app gets it by dividing your salary by the working seconds in an average month:
// How many days a month you work, on averagevar workdaysPerMonth: Double { let weeksPerMonth = 52.0 / 12.0 // 4.33 switch workSchedule { case .fiveDay: return 5.0 * weeksPerMonth // 21.67 case .sixDay: return 6.0 * weeksPerMonth // 26 case .alternating: return 5.5 * weeksPerMonth // big week, small week case .custom(let c): return c.workdaysPerMonth }}// What one second of work is worthfunc secondRate() -> Double { monthlySalary / (workdaysPerMonth * hoursPerDay * 3600)}No real month has 21.67 workdays, so no month adds up to your salary. A month with 23 weekdays ends at 106% of it, a month with 20 at 92%. It roughly evens out over a year, which is probably why so few people noticed. It also knows nothing about public holidays, even though the App Store description promises “smart holiday recognition”, so on a 调休 Saturday, the makeup workday China schedules around long holidays, it says you are earning nothing while you sit at your desk. Big and small weeks can swap after New Year, and night shifts stop counting at midnight.
I did not write this code. A model did, and a model wrote that App Store description too. But ask for the average number of workdays in a month and 21.67 is the answer you get. I never asked whether an average was the right thing to use. The model wrote the bug, and I did not ask the question that would have caught it.
After I stopped
Version 1.5.1, on May 14, 2025, was the last. I had kept up with the comments for a week, and then I was done. Not with the idea, just with the energy. Building it was a sprint. Looking after it was a different job, and once the sprint was over I had nothing left for it.
The app kept going anyway.
After the spike, on its own scale
First-time downloads per month, App Store Connect
Show the numbers
| Jun 2025 | 1,251 |
| Jul 2025 | 1,521 |
| Aug 2025 | 1,356 |
| Sep 2025 | 810 |
| Oct 2025 | 640 |
| Nov 2025 | 370 |
| Dec 2025 | 396 |
| Jan 2026 | 488 |
| Feb 2026 | 187 |
| Mar 2026 | 421 |
| Apr 2026 | 437 |
| May 2026 | 584 |
| Jun 2026 | 591 |
| Jul 2026 | 822 |
| Aug 2026 | 1,969 |
| Sep 2026 | 469 |
| Oct 2026 | 1,313 |
Hundreds of people a month still find it, almost all of them by typing the name into a search box. Search for it now and the App Store also suggests a row of apps doing the same thing: income by the second, a countdown to clocking off, a countdown to retirement. Some are probably better looked after than mine. One review, from July 2025, asks to keep internship pay history after going full time, and reports losing their settings after an update.
What I think now
A feeling travels further than a feature. A salary clock is a calculator with a timer. What people downloaded was a joke they were already making about themselves. That is why a stranger made a video about it and why 600,000 people liked it. I would not have got there by adding features, and none of the features I added in those four quiet months changed anything.
I could not make the spike, but I could have been ready for it. My own launch did almost nothing, and someone else's video did more in a day than I had in four months. The one thing that was mine in that moment was the name. Because the name was what people would say out loud, they could find the app without a link. I think about naming very differently now: not what describes the product, but what people will type after hearing about it.
Attention is borrowed. The week after is yours. A video can send you twenty thousand people. It cannot make them stay. Replying within hours and shipping what they asked for within days is what turned some of that attention into users, and I think it is a big part of why the curve settled where it did instead of falling straight back to zero.
Finishing is not the end of the work. I treated the app as something to build and release. It turned out to be something people relied on, with a broken formula I had promised to fix and requests I had called great ideas. Without updates it still gets found, but it stops compounding, and other apps take the users I could have kept. If I build something like this again, I will plan for the year after the launch, not just the week.
The code was the cheap part. The joke, the name and one week of listening were the product.
A year ago I thought the hard part of making an app was the code. AI took care of that before I ever had to learn it. What was left was knowing what people already feel, giving it a name they will search for, and still being there when they finally show up.