Randy

Jan 6, 2026 · 9 min read

Niuma Clock: Twenty Thousand Downloads in Two Days

Notes on products and growth.

牛马时钟 on the App Store, iPhone ↗

牛马时钟 · Niuma ClockiPhone · 2025

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.

Black and green poster reading 你是天选牛马打工人吗 (are you a chosen niuma worker?) above a phone showing the clock at 22:11, a countdown to the end of work and today's earnings of ¥356.84
The launch poster: “Are you a chosen niuma worker? Counting every second for you. Who says niuma aren't worth anything?”

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

at work

day off

day off

running late

running late

the plough

the plough

Some of the stickers in the app, all drawn by GPT-4o. A couple are clearly horses, which is fair: 牛马 means both.

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

26,028
Jan ’25
Jan ’26
Oct ’26
Show the numbers
Jan 2025172
Feb 2025941
Mar 2025754
Apr 2025168
May 202526,028
Jun 20251,251
Jul 20251,521
Aug 20251,356
Sep 2025810
Oct 2025640
Nov 2025370
Dec 2025396
Jan 2026488
Feb 2026187
Mar 2026421
Apr 2026437
May 2026584
Jun 2026591
Jul 2026822
Aug 20261,969
Sep 2026469
Oct 20261,313
May 2025 alone is 26,028, more than every other month combined. Hover a bar, or open the table, for exact numbers.

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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:

WorkConfig.swiftSwift
// 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)}
Simplified. hoursPerDay is your working hours minus the lunch break, if you set one.

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

1,969
Jun ’25
Jan ’26
Oct ’26
Show the numbers
Jun 20251,251
Jul 20251,521
Aug 20251,356
Sep 2025810
Oct 2025640
Nov 2025370
Dec 2025396
Jan 2026488
Feb 2026187
Mar 2026421
Apr 2026437
May 2026584
Jun 2026591
Jul 2026822
Aug 20261,969
Sep 2026469
Oct 20261,313
From June 2025. The tail of the spike, a slow decline, then growth again with no new version and no posts from me.

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.