This app (“PLO Camp”, the “App”) is a Pot-Limit Omaha (PLO) poker training tool covering courses, drills and full-street practice hands. We care about your privacy and collect as little data as possible. This policy explains exactly what is and isn't collected: the anonymous milestone counts and usage statistics you can switch off in Settings, and the diagnostic information sent only when you choose to submit feedback.
Your training progress, statistics, streaks, skill rating, and review history are stored locally on your device only (localStorage). Your progress itself is never uploaded to us — it stays on your device and is removed if you uninstall the App or clear its data. What does leave your device is described below: the anonymous milestone counts and usage statistics (both switched off by one setting), and the feedback you explicitly choose to send.
This includes the usage counters the App keeps for itself — for example how many days of the Hold'em → PLO switch camp you have started and finished, and how many times you have opened the paywall. They are plain counters in the same local save file, they carry no identifier of any kind, and these counters themselves are never uploaded. There is no third-party analytics SDK in this App and no advertising technology of any kind; clearing the App's data clears these counters too. The only things sent are the anonymous milestone counts and usage statistics described in the next two sections.
On the website (plo.ai-speeds.com, and the same pages when reached through poker.ai-speeds.com) the App can send a small, fixed set of anonymous counts, and nothing else. This is the complete list — no milestone outside it is ever sent:
camp-d1-start — you start Day 1 of the Hold'em → PLO switch camp;camp-d1-aha — the first time Day 1 shows you a real worked number (the moment the camp is meant to make click);camp-graduate — you finish Day 7 of it;camp-d1-done, camp-d2-done, camp-d3-done, camp-d4-done, camp-d5-done, camp-d6-done — one when you finish each of Days 1 to 6 of the switch camp, so we can see which day people stop at rather than only how many finish. There is no separate count for Day 7: finishing Day 7 is the same moment as finishing the camp, already covered by camp-graduate above;paywall-graduate — you open the Pro page from the switch camp's graduation report;paywall-course — you open the Pro page at a lesson that is part of Pro;paywall-fsQuota — you open the Pro page after using up the free full-street hands for the week;paywall-proDetail — you open the Pro page from a leak in your profile that is part of Pro;paywall-planExec — you open the Pro page from the "train by plan" button;paywall-dailyQ — you open the Pro page after using up the day's free questions;paywall-challenge — you open the Pro page after using up the day's free challenge run;paywall-preflopDone — you open the Pro page from the preflop camp report card.Why: these numbers are the only way we can tell what fraction of people who start the camp actually finish it, and at which point people look at the Pro page. Those ratios decide whether we keep building this product, so we would rather collect them openly than guess.
Exactly what is sent: the milestone name (one of the names listed above, sent twice in the same message for compatibility with our feedback service), a fixed label saying it is a count, the app name, and the app's build version. That is the whole message. There is no account, no user ID, no device ID, no session ID, no cookie, no browser or operating-system details, no screen size, no language, no subscription status, and nothing about your answers or your training data. Nothing links one count to the other, or to any other count, or to you. (This describes the milestone counts only. The usage statistics in the next section are a separate stream that does carry a random install ID.) Each milestone is sent at most once per device — replaying Day 1 does not send it again. (The note of what was already sent lives in the App's own local save, so clearing the App's data or reinstalling resets it.)
Native apps never send these milestone counts. The iOS and Android builds do not send them under any setting. (The apps do send the usage statistics in the next section, unless you switch them off.)
How to switch it off: open Settings at the bottom of the App's home screen and untick "Share anonymous usage statistics". It takes effect immediately and nothing further is sent — the same switch also stops the usage statistics in the next section. The switch camp itself also states this on its own first screen.
How long we keep it: the counts are appended to a plain log file on our own server and retained for 24 months, then deleted. Our feedback service sees your IP address while the request is in flight, exactly as any web server does for any page you load — but for these milestone records the IP address is not written to the log, so the stored record contains nothing that could point back to you.
To find out where people get stuck — for example whether the Pro page loads its prices, or how many people finish their first lesson — the App (the website and the iOS and Android apps) sends short anonymous event messages to our server at feedback.ai-speeds.com. This is separate from the milestone counts above. Each message contains exactly this:
The complete list of event names:
first_open — the first time the App is opened on this device (with where you came from, if the link said so);app_open — each time the App starts, with how many days since it was first opened on this device;app_resume — you come back to the App after being away for 30 minutes or more;store_reset — the App found its local save damaged and had to start over;nav — which main section you opened (once per section per launch);onboard — the welcome questions were shown, finished or skipped (and the experience level you picked);camp_day — you start or finish a day of the switch camp, or graduate;placement_start — you start the placement test;placement_done — you finish it, with the score;course_start — you open a lesson or its drill;learn_done — you finish a lesson;course_done — you finish a drill, with the grade;review_start — you start a review session;daily_done — you finish the daily training or the question of the day (and whether that one was right);decisions — you reach 1, 5, 10, 25, 50, 100, 250, 500 or 1000 answered decisions in total;fs_hand — a full-street hand ends, with its letter grade and the street it ended on;challenge_done — a challenge run ends, with the mode and a rough number of questions;paywall_open — the Pro page opens, and from which place in the App;paywall_ready — whether the store prices loaded on the Pro page;paywall_click — you tap a plan on the Pro page;paywall_buy — a purchase goes through;paywall_fail — a purchase did not go through, and the store's reason code (for example “cancelled”);paywall_close — you close the Pro page without buying;paywall_active — the Pro page opened but you already have Pro;paywall_hub — the Pro page opened on poker.ai-speeds.com;exit_offer — the “not sure yet?” card was shown;restore — you tapped “Restore purchases”, and whether anything was found;notif_ask — the reminder permission was asked, and whether you allowed it;notif_tap — you opened the App from one of its reminders, and which kind;rate_ask — the App asked your device to show the rating prompt;share — you tapped a share button, and which one;lang — you changed the App language, and to which;feedback — you sent feedback, and its category (never the text);js_error — the App hit an error — a short error message and code location, at most once per launch;xpromo — you tapped one of our other trainers at the bottom of the home screen;It never includes the cards in a hand, the questions you answered or your answers, anything you type, your device model or user-agent, or your name, email or any account. Like any web request, our server also sees your IP address, and for these usage records it is stored with the record; we use it only to filter out automated test devices (such as app-store review machines) and never to identify you. The statistics are used only in aggregate to improve the App, are kept for at most 24 months, are never sold or shared, and are never used for advertising or to track you across apps or websites. When the App runs on a developer's own computer (a local address) it sends nothing.
To turn it off: Home → Settings → untick "Share anonymous usage statistics". The same switch also stops the milestone counts above. From then on nothing is sent, and anything still waiting on your device is deleted.
The App has an optional in-app feedback form (and a "Something wrong with this hand?" report link on drill questions). Nothing in this section is sent unless you write and submit a message. There is exactly one exception, and it only concerns messages you already wrote: if your submission fails because you are offline, it is kept on your own device and re-sent the next time you open the App. Nothing new is collected at that point, and the queue is emptied once it goes through. When you do, the following is sent to our feedback service at feedback.ai-speeds.com along with the message you typed:
Your IP address: like any web server, our feedback service sees the IP address the request comes from, and for feedback messages that IP address is saved together with the message. It is kept for as long as the message itself.
If you use the "Something wrong with this hand?" link on a specific drill question, we additionally attach a snapshot of that one question: the question's ID and its course, which kind of practice you were in (lesson drill, review, daily or placement), the board and hand cards, your position, the pot/street, the correct answer, the choice you picked, and whether you were marked right or wrong. This is the only way we can investigate a reported answer without asking you to retype the whole hand.
What this is used for: exclusively to fix bugs and to correct wrong training content. It is never used for advertising, and it is never linked to your identity or used to track you across apps — we don't collect anything (name, email, account ID) that could tie this diagnostic bundle back to you personally.
In-app purchases are processed by the App Store (iOS) or Google Play Billing (Android) and managed through RevenueCat, our subscription infrastructure provider. To process and restore purchases, RevenueCat receives a randomly generated anonymous app user ID, your purchase/subscription status, and basic device/store information. We never receive your Apple/Google account password or full payment card details.
The App involves poker strategy training (no real-money gambling; no chips, wagering, or payouts of any kind) and is intended for adults. It is not directed to children under 13, and we do not knowingly collect data from children.
You can clear all locally stored data at any time from the App's own "Clear data" setting, or by clearing the App's data / uninstalling it in your device settings. Sending feedback is always optional — if you never open the feedback form, none of the diagnostics above are ever sent. The anonymous milestone counts and the anonymous usage statistics described above can both be switched off at any time with one switch: Settings on the home screen → untick "Share anonymous usage statistics". (The milestone counts are never sent by the iOS and Android apps at all.) To manage or cancel a subscription, use your App Store or Google Play Store subscription settings.
We may update this policy from time to time. The “Last updated” date above reflects the latest version.
Questions about this policy? Email tangzy09@gmail.com.
本应用(“PLO 训练营”,下称“本应用”)是一款底池限注奥马哈(PLO)扑克训练工具,覆盖课程、专项练习与全街实战。我们重视你的隐私,尽可能少地收集数据。本政策如实说明哪些数据会、哪些不会被收集,包括仅在你主动提交反馈时才会发送的诊断信息。
你的训练进度、统计、连续打卡、技能评级与复习记录都仅保存在你的设备本地(localStorage)。你的进度本身从不上传给我们——只留在你的设备上,卸载应用或清除应用数据后即被删除。会离开你设备的见下文:匿名里程碑计数与匿名使用统计(同一个开关可以关掉),以及你主动选择发送的反馈内容。
这也包括应用自己记的那些使用次数——比如「德州 → PLO 转型营」你开始了几天、完成了几天,以及付费页被打开过几次。它们就是同一份本地存档里的几个计数器,不带任何标识符,这些计数器本身也不会被上传。本应用里没有任何第三方分析 SDK,也没有任何广告技术;清除应用数据时这些计数器一并清除。会发出去的只有下面两节说的匿名里程碑计数与匿名使用统计。
在网页版(plo.ai-speeds.com,以及经 poker.ai-speeds.com 访问到的同一批页面)上,应用会发出一组固定的匿名计数,除此之外不发别的。下面是完整清单——不在这张表上的里程碑一条都不会发:
camp-d1-start —— 你开始「德州 → PLO 转型营」第 1 天;camp-d1-aha —— 第 1 天里你第一次看到一个算出来的真数字(这个营想让你「开窍」的那一刻);camp-graduate —— 你走完第 7 天;camp-d1-done、camp-d2-done、camp-d3-done、camp-d4-done、camp-d5-done、camp-d6-done —— 你每完成转型营的第 1 至第 6 天各一条,这样我们能看出人们是在哪一天停下的,而不只是「有多少人走完」。第 7 天没有单独的计数:走完第 7 天与走完转型营是同一件事,已由上面的 camp-graduate 覆盖;paywall-graduate —— 你从转型营毕业报告打开专业版页面;paywall-course —— 你在一门属于专业版的课上打开专业版页面;paywall-fsQuota —— 你用完本周的免费全街手数后打开专业版页面;paywall-proDetail —— 你从漏洞画像里一条属于专业版的漏洞打开专业版页面;paywall-planExec —— 你从「按计划练」按钮打开专业版页面;paywall-dailyQ —— 你用完当天的免费题量后打开专业版页面;paywall-challenge —— 你用完当天的免费挑战局后打开专业版页面;paywall-preflopDone —— 你从翻前营成绩单打开专业版页面。为什么要收:这些数是我们唯一能知道「开始转型营的人里有多少真的走完」、以及「人们是在哪一步去看专业版页面」的办法。这些比率决定我们要不要继续做这个产品,与其靠猜,不如把它明明白白地收上来。
究竟发了什么:里程碑名称(上表中的某一个;为兼容我们的反馈服务,同一条消息里写了两遍)、一个表明「这是一条计数」的固定标签、应用名,以及应用的构建版本号。整条消息就这些。没有账号、没有用户 ID、没有设备 ID、没有会话 ID、没有 Cookie、没有浏览器或系统信息、没有屏幕尺寸、没有语言、没有订阅状态,也没有你的任何作答内容或训练数据。两条计数之间无从关联,与任何其他记录、与你本人也无从关联。(这里说的只是里程碑计数。下一节的匿名使用统计是另一条数据流,带一个随机安装编号。)每个里程碑在一台设备上最多发一次——重刷第 1 天不会再发。(「已经发过哪些」记在应用自己的本地存档里,所以清除应用数据或重装会把这条记录一并清掉。)
原生 app 不发这些里程碑计数。iOS 与安卓版本在任何设置下都不会发送它们。(app 会发送下一节的匿名使用统计,除非你把它关掉。)
怎么关掉:打开应用首页底部的「设置」,取消勾选「发送匿名使用统计」。即时生效,此后不再发送任何内容——同一个开关也会停掉下一节的匿名使用统计。转型营自己的第一屏上也写着这件事。
保留多久:这些计数追加写进我们自己服务器上的一个纯文本日志文件,保留 24 个月后删除。请求在途时,我们的反馈服务会像任何网站服务器处理任何一次页面访问那样看到你的 IP 地址——但对这类里程碑记录,IP 不写入日志,因此存下来的那条记录里没有任何能指回你的东西。
为了弄清大家卡在哪里——例如专业版页面的价格有没有加载出来、有多少人学完了第一节课——本应用(网页版以及 iOS 与安卓 app)会向我们的服务器 feedback.ai-speeds.com 发送简短的匿名事件消息。这与上面的里程碑计数是两回事。每条消息只包含以下内容:
完整的事件名称清单:
first_open —— 本设备上第一次打开应用(若链接里写了来源,附上来源);app_open —— 每次启动应用,附带距本设备第一次打开过了几天;app_resume —— 离开 30 分钟以上后回到应用;store_reset —— 应用发现本地存档损坏、只能重新开始;nav —— 你打开了哪个主要板块(每个板块每次启动只记一次);onboard —— 欢迎问卷被展示、完成或跳过(以及你选的水平档);camp_day —— 你开始或完成转型营的某一天,或者毕业;placement_start —— 你开始摸底测试;placement_done —— 你做完摸底测试,附带得分;course_start —— 你打开一节课或它的练习;learn_done —— 你学完一节课;course_done —— 你做完一组练习,附带评级;review_start —— 你开始一次复习;daily_done —— 你完成每日训练或每日一题(以及每日一题答对没有);decisions —— 你累计答满 1、5、10、25、50、100、250、500 或 1000 次决策;fs_hand —— 一手全街打完,附带字母评级和在哪条街结束;challenge_done —— 一局挑战结束,附带模式和大致题数;paywall_open —— 专业版页面被打开,以及是从应用里哪个位置打开的;paywall_ready —— 专业版页面上的商店价格有没有加载出来;paywall_click —— 你在专业版页面上点了某个方案;paywall_buy —— 一次购买成功;paywall_fail —— 一次购买没有成功,以及商店给出的原因代码(例如「已取消」);paywall_close —— 你没有购买就关掉了专业版页面;paywall_active —— 专业版页面打开了,但你已经是 Pro;paywall_hub —— 专业版页面在 poker.ai-speeds.com 上打开;exit_offer —— 「还没想好?」那张卡片被展示;restore —— 你点了「恢复购买」,以及有没有找到;notif_ask —— 询问了提醒权限,以及你是否允许;notif_tap —— 你从应用的某条提醒打开了应用,以及是哪一类提醒;rate_ask —— 应用请求设备弹出评分框;share —— 你点了某个分享按钮,以及是哪一个;lang —— 你切换了界面语言,以及切成了哪种;feedback —— 你发送了反馈,以及它的类别(绝不含文字内容);js_error —— 应用出错——一句简短的错误信息和代码位置,每次启动最多一条;xpromo —— 你点了首页底部我们的另外两个训练器;它绝不包含牌局里的牌、你答过的题或你的答案、你输入的任何文字、设备型号或 User-Agent,也不包含姓名、邮箱或任何账号。和任何网络请求一样,我们的服务器也会看到你的 IP 地址,而且对这类使用统计记录,IP 地址会随记录一起保存;我们只用它过滤自动化测试设备(例如应用商店的审核机器),绝不用来识别你。这些统计只以汇总形式用于改进应用,最多保留 24 个月,绝不出售或共享,绝不用于广告,也绝不用来跨 app 或网站追踪你。应用在开发者自己的电脑上(本机地址)运行时一条都不发。
如何关闭:首页 → 设置 → 取消勾选「发送匿名使用统计」。同一个开关也会停掉上面的里程碑计数。此后不再发送任何内容,你设备上尚未发出的也会一并删除。
本应用有一个可选的站内反馈表单(以及训练题里"这题有问题?"的就地纠错入口)。本节列出的内容,除非你写好并提交一条消息,否则不会发送。只有一个例外,而且它只涉及你已经写过并提交过的消息:如果提交时你正好离线、发送失败,那条消息会留在你自己的设备上,下次打开应用时重发一次。那一刻不会新采集任何东西,发送成功后队列即清空。此时,以下信息会连同你输入的文字一起发往我们的反馈服务 feedback.ai-speeds.com:
你的 IP 地址:和任何网站服务器一样,我们的反馈服务能看到请求来自哪个 IP 地址;对反馈消息,这个 IP 地址会与消息一起保存,保存多久与消息本身相同。
如果你是通过某道训练题上的"这题有问题?"入口发送反馈,我们还会额外附上那一道题的快照:题目编号与所属课程、你当时在哪种练习里(课程练习 / 复习 / 每日 / 摸底)、牌面与手牌、你的位置、底池/所在街、正确答案、你选的答案,以及判定对错。这是我们能在不用你重新打一遍整手牌的情况下核查一道题的唯一方式。
用途:仅用于修复程序问题与纠正训练内容错误。绝不用于广告投放,也绝不会关联你的身份或用来跨 app 追踪你——我们不收集任何能把这份诊断信息与你个人身份对上号的东西(姓名、邮箱、账号 ID 等)。
应用内购买由 App Store(iOS)或 Google Play 结算(Android)处理,并通过我们的订阅服务商 RevenueCat 管理。为完成与恢复购买,RevenueCat 会收到一个随机生成的匿名用户 ID、你的购买/订阅状态,以及基本的设备/商店信息。我们绝不会收到你的 Apple/Google 账号密码或完整支付卡信息。
本应用是扑克策略训练工具(不涉及真钱赌博;没有筹码、下注或任何形式的派彩),面向成年人,不面向 13 岁以下儿童,我们也不会有意收集儿童数据。
你可以随时通过应用内的"清除数据"设置,或在设备设置中清除本应用数据/卸载应用,删除全部本地存储的数据。发送反馈永远是可选的——如果你从未打开反馈表单,上述诊断信息就不会被发送。上面说的匿名里程碑计数与匿名使用统计可以用同一个开关随时关掉:首页的「设置」→ 取消勾选「发送匿名使用统计」。(里程碑计数在 iOS 与安卓 app 端根本不会发送。)管理或取消订阅请在 App Store 或 Google Play 商店的订阅设置中操作。
我们可能不时更新本政策,顶部"最后更新"日期为最新版本。
对本政策有疑问?请邮件联系 tangzy09@gmail.com。