Shipaton 2026 · Keep Them Coming Back
The lake texts you when a fish is biting.
worker/src/lib/onesignal.tssendBite()
"name": "bite:willow", "app_url": "lunker://bite/willow?nid=…", "ttl": 60
9:41Tuesday, September 22
Lunkernow
Your rod is twitching at Willow Lake
60s before it escapes.
60s before it escapes.
37
The hook
Sixty seconds. Then it’s gone.
ttl: 60
One line in the OneSignal request. After a minute, the push drops itself.
The problem · Wina
Every game push gets muted.
Wina mutes every game within a week. Not one push was worth it.
any game · mutedCome back for your daily reward!
Lunker · nowYour rod is twitching at Willow Lake
60s before it escapes.
60s before it escapes.
Top: any game (README). Bottom: Lunker.
The reel · one thumb
The push is the play.
- A bite arrives while the app is closed.
- Tap it: straight into the reel.
lunker://bite/… - Hold six seconds. Miss, and it escapes.

The line, in order
Seed first, then the push.
The demo · release APK on an emulator, 2026-09-26
Three real screens.



When it may speak · rendered from isWithinCadence()
Only when it matters.
0006121823
Willow Lakefree · 08–19 · 3–5 a day · up to rare
Reed Shallowsfree · 08–23 · 2–4 a day · up to uncommon
Quarry Pool1,200 COIN · 08–23 · 2–3 a day · up to rare
Deep SeaAngler’s Pass · 18–23 · 1–2 a day · up to legendary
may biteasleep — no lake bitesnever two bites within 1 hourrendered from isWithinCadence() · worker/src/lib/bite.ts
RevenueCat · the economy
The phone decides nothing.
It never names its fish.
POST /catch-resolvedbody
{ app_user_id, lake_id,
notification_id, outcome }
// no fish · no rarity · no coinsIt never moves its balance.
RevenueCat VC REST v2not confirmed
502 { settled: false } // never a balance the phone made up
The one number · /verify
A number we won’t fake.
Bites answered within 60 s of send, live:
no data yet
- measured from send, not open
- unanswered bites stay in
- fabricated ids rejected
- clock skew flagged
npm run benchfixture
VALIDATION DATA — NOT SUBMITTABLE Answered within window: 17 / 39 (43.6%) Open latency (ms): p50=9,000 p95=104,000 Fabricated ids rejected: 3 Never-opened (denominator only): 12
Status · 2026-09-26
What isn’t live yet.
- 274 tests, real SQLite
- 0 notifications sent so far
- Send bug fixed ·
81c7685 - COIN not yet in RevenueCat
- Ledger public, empty, says so
- Play listing, video: pending
The ask
Answer the first bite.
live lunker.edycu.dev
ledger lunker.edycu.dev/verify
code github.com/edycutjong/lunker
scan → https://lunker.edycu.dev/