| Name | Provider | Platform | Plan | XP | Level | Dogs | Lessons | Live Sessions | Bonus Min | Joined | Last Sync |
|---|
Live Session Usage & Cost
| User | Sessions | Minutes | Voice in | Voice out | Video in | Text | Cost | Cost/min | Net rev | Margin |
|---|
| Day | Sessions | Minutes | Voice in | Voice out | Video in | Text | Cost ● | Cost/min |
|---|
live_session key live in the
Crashlytics console
— search the issue ID shown on each card.
User reports from the app (profile > Report). App Store guideline 1.2 expects objectionable-content reports to be acted on within 24 hours, so this queue is the half that makes the Report button mean something. Resolving is a record that you looked — it does not block or delete anyone; use Firebase Auth to disable an account.
Free Minute Burn Calculator
* Worst case assumes every NEW free signup burns their whole one-time trial. The trial is once per account, not a monthly allowance, so this is a cost per signup — not a recurring monthly cost per free user. Cost/min defaults to the $0.066 measured against real invoices — adjust if your rate moves.
Estimated Monthly Revenue
Projected Monthly Costs
* Estimates based on current user count and average usage patterns. Costs scale with users.
Downloads to Subscribers Calculator
Simulated Monthly Revenue
Projected Monthly Costs
* Infrastructure costs scale with total users. API costs use weighted averages by plan tier.
Barge-In Troubleshooting
Everything needed to tell whether a tester's device can actually interrupt the trainer — without their console.
- Force-quit and reopen the app. Flags are read once per launch and cached, so a launch older than the toggle above is still running tap-to-interrupt.
- Don't use the test phone for the call. An active cellular call owns the mic; the app cannot record over it. Use a second handset.
- End with the End button. Diagnostics ride on the session's end event. Force-killing the app writes nothing and shows up as an unmatched start.
- If unheard, keep talking past 20 seconds. The gate self-calibrates at 18s and may fix itself mid-session — "Heard (calibrated)" is a different result from "Heard".
| Constant | iOS | Android |
|---|---|---|
| Open gate (SPEECH_ON_RMS) | 0.045 | 0.12 |
| Close gate (SPEECH_OFF_RMS) | 0.012 | 0.03 |
| Threshold ceiling | 0.07 | 0.45 |
| Echo floor cap | 0.035 | 0.12 |
| Self-calibrate after | 18s, down to 55% of peak, floored at 0.02 | |
iOS runs Apple's Voice-Processing unit — quieter but genuinely cancelling (speech 0.039–0.079, echo peaks 0.030). Android captures UNPROCESSED with no AGC (speech 0.23–0.42, echo 0.125). One set of constants cannot serve both.
- User peak — loudest thing heard while the trainer was silent. On a working device that is the tester's own voice.
- Gate — the threshold actually in force, after any self-calibration.
- Peak / gate — well below 1.00x, the bar is too high for that hardware; near zero, the microphone produced nothing and the gate is beside the point. Above 1.00x is necessary but not sufficient: peak is one instant, while opening the gate needs 3 sustained frames (~190ms). A ratio over 1 with a failed verdict means a spike cleared the bar and sustained speech did not.
- Ambient / close threshold — room noise while nobody spoke, against the level it must fall below to end a turn. Ambient at or above it is the delay bug: noise too quiet to interrupt her is still loud enough to stop the turn ever closing.
- Voice : echo — how far their voice stands above her echo, measured with no user talking. 2x+ and a threshold fits between them comfortably. Under 1.3x they overlap and no threshold works at all — above the echo is unreachable, below it she interrupts herself. That is a signal problem, not a tuning one.
- Max hang — longest gap between the tester's last loud frame and the turn actually closing. She cannot begin answering until then, so this is her worst response delay. Hysteresis alone accounts for ~0.8s; multiple seconds is the stall.
For per-frame levels on a device you can hold, flip LOG_MIC_LEVEL in app/live-session.tsx and watch the [LiveSession] rms/floor/need triple. Every constant on the left came from it. It prints several times a second, so leave it off otherwise.