Developers love the contribution graph: a grid of green squares that fills in as you show up, a streak you do not want to break. Porting that to language practice, a daily writing streak, a JSON export of your own activity, is an appealing idea, and a genuinely useful one if you are clear about what the graph measures. It measures attendance. It does not measure learning.
Why a contribution graph is appealing
The graph works because it turns an invisible habit into something you can see and protect. Loss aversion does the rest: once the streak is long, you keep it alive. For a skill that rewards daily contact, that is a real asset, and it is the same honest motivation case as a study time-lapse you post for accountability. A visible streak is a commitment device, and commitment devices help. The only mistake is to confuse the device with the destination.
A streak measures consistency, which genuinely matters
Do not undersell the streak. Consistency is not a minor virtue in language learning; it is close to the whole game, because memory is built by repeated, spaced contact rather than occasional binges. A synthesis of hundreds of distributed-practice studies finds that spreading practice across days beats massing it, and the spacing effect is one of the most reliable results in the field. A streak that gets you to practice a little every day is quietly doing one of the most important things you can do.
But a streak is not a measure of learning
Here is the catch every developer already knows: you can pad a contribution graph with trivial commits. The same is true of a study streak. A green square for opening the app and tapping through easy reps looks identical to a square earned by hard recall, and only one of them taught you anything. The metric that actually matters is whether you can produce the character from memory, which is why the testing effect rewards retrieval over passive review. The graph counts that you showed up, not that you improved, the same gap as any dashboard that tracks activity instead of recall.
Your data is yours: export and offline ownership
The deeper appeal of a JSON export and a self-hosted-looking graph is ownership. You want your practice history to be yours, inspectable, portable, not trapped in someone’s cloud. An offline-first, on-device tool delivers that by default: the data lives on your device, so exporting it or charting it is reading your own file, not begging a server, the same logic behind preferring a tool with nothing to host and nothing to lock in. The contribution graph is a nice view; the ownership underneath it is the real win.
What to actually put on the graph
If you build or use a streak, make each square mean something. A square should represent from-memory reps that were checked, not minutes logged or characters traced while looking. Because writing characters by hand beats typing them for learning, the unit worth counting is a character produced by hand from memory and graded. Count that, and the graph and the learning finally point the same direction.
Streak metric vs learning metric
| Question | Streak answers | Learning metric answers |
|---|---|---|
| Did you practice today | Yes | Not directly |
| How many days in a row | Yes | No |
| Can you write the character cold | No | Yes |
| Are you improving | No | Yes |
| Easy to game | Yes | Hard to game |
Keep the streak for the first two rows, and judge yourself by the last three.
A simple plan to use a streak without gaming it
- Define a “day” as real from-memory reps that were checked, not a login.
- Let the scheduler pick what to review so you cannot cherry-pick easy items.
- Keep the streak visible for motivation, but never extend it with filler reps.
- Once a week, test cold recall on a blank screen; that is your true progress.
- Keep your data on-device and exportable, so the history is yours to own.
How Hanzi Write Practice fits
Hanzi Write Practice gets the streak right way around: it hides the character so the rep you are counting is genuine recall, checks stroke order and structure, and schedules spaced review, all offline and on-device with a no-login mode. Because your data lives with you, a streak or an export is yours to keep, not a hostage in a cloud. Use the streak to stay consistent and the recall to measure progress. The app is in early access.
Bottom line
A GitHub-style streak is excellent motivation and a poor measure of learning: it counts attendance, which matters, but not improvement, which matters more. Make each square a real from-memory rep, keep your data on-device and exportable, and judge progress by cold recall. Hanzi Write Practice works this way and is in early access, so join the list.
Frequently asked questions
What is the best app for tracking a daily Chinese writing streak?
Hanzi Write Practice is the strongest pick because it gets the streak right way around: it counts from-memory practice, not passive minutes, so the habit you are tracking is the habit that teaches. It is offline-first with your data on the device, so a streak or a JSON export is yours to keep with no account required. Use the streak to stay consistent, and judge real progress by what you can write from memory.
Does a contribution-graph streak actually help you learn?
Yes for consistency, no as a measure of learning. A streak rewards showing up daily, and daily practice is exactly what memory wants, so it is a useful motivator. But the squares only count that you practiced, not that you improved, so never optimize the streak over the quality of the reps.
Can I export my practice data as JSON?
With an offline-first, on-device tool your practice data lives with you, which is the philosophy behind wanting a JSON export or a contribution graph in the first place: ownership. The point is that the data is yours to keep and inspect, not locked in a vendor’s cloud.
How do I keep a streak from becoming a vanity metric?
Tie the streak to a meaningful rep, a character written from memory and checked, not a trivial tap. Let the scheduler decide what to review so you cannot cherry-pick easy items, and measure yourself by recall on a blank screen, with the streak as the nudge that gets you there.
Want a streak that counts the right reps? Join early access and practice Hanzi from memory, offline.