Dữ liệu & quyền riêng tư — sự thật kỹ thuật

Trang này mô tả đúng những gì mã của trang game làm, không phải văn bản pháp lý, không phải điều khoản dịch vụ, và không khẳng định gì về việc tuân thủ luật ở bất kỳ nước nào.

Số liệu đo bằng lệnh grep trên đúng bộ mã được phát hành, ngày 08/10/2026. Mọi dòng dưới đây bạn kiểm lại được.

Đây là bản thử nghiệm phần mềm của một dự án đang phát triển, chưa bán, chưa thử với trẻ, và không hứa hẹn kết quả học tập nào.

1. Trang này KHÔNG làm gì

Toàn bộ mã chạy trên máy của bạn là index.html, nfc.html, trang này, 17 tệp js/*.js, sw.js và 2 tệp css/*.css. Kết quả đo trên đúng bộ tệp đó:

Điều khẳng địnhLệnh kiểmKết quả
Không dùng cookiegrep -rF "document.cookie" js/ *.html0
Không có đo lường / phân tích / quảng cáogrep -rE "gtag|dataLayer|sendBeacon|googletag|fbq|plausible|umami" js/ *.html0
Không gọi ra máy chủ bên ngoàigrep -rn "https://" index.html nfc.html sw.js css/*.css js/*.js0 (chỉ còn tên không gian SVG www.w3.org, không phải một lượt tải)
Service worker bỏ qua mọi yêu cầu khác origingrep -n "url.origin !== self.location.origin" sw.js1 (dòng 63 — trả về ngay, không xử lý)
Không WebSocket, không IndexedDB, không XHRgrep -rE "WebSocket|indexedDB|XMLHttpRequest" js/0 / 0 / 0
Không gửi dữ liệu đi đâugrep -rE "method:\s*['\"]POST" js/0
Không micro, không máy ảnh, không ghi âmgrep -rE "getUserMedia|MediaRecorder|navigator\.mediaDevices" js/0
Không vị trígrep -rE "geolocation" js/0

Mã chỉ tải tệp của chính trang này: audio/manifest.json, audio/bank.*.json và các clip audio/<giọng>/…mp3. Trong js/audio.js có một chốt chặn cứng: nếu đường dẫn một clip là địa chỉ tuyệt đối (http://… hoặc //…) thì hàm trả về null và clip không được tải — nên dù ai sửa danh mục âm thanh cũng không trỏ được sang máy chủ khác.

2. Trang này KHÔNG thu thập gì về bé

Không hỏi tên, tuổi, ngày sinh, ảnh; không ghi âm, không ghi hình; không có ô đăng ký, không có tài khoản, không có nút gửi. Chúng tôi không biết ai đang chơi — vì không có chỗ nào để biết.

3. Có lưu gì trên máy — và lưu ở đâu

Trang dùng localStorage: một ngăn nhỏ bên trong trình duyệt của chính máy đó. Dữ liệu này không được gửi đi đâu, không đi sang máy khác, và chúng tôi không đọc được. Mọi lần đọc/ghi đều bọc trong try/catch, nên nếu bạn khoá lưu trữ của trang thì game vẫn chơi được, chỉ là không nhớ cài đặt.

KhoáNội dungĐể làm gì
kl.settings.v1nhân vật, bộ thẻ, chế độ, tắt tiếng, nói chậm, bong bóng, âm lượng, kiểu giọng, hiệu ứngnhớ cài đặt cho lần chơi sau
kl.music, kl.music.bgbật/tắt nhạc và nhạc nền (mặc định tắt)nhớ lựa chọn
kl.input.v1cách nhập (chạm hay thẻ NFC), kệ thẻ, gói thẻ, đã xem hướng dẫn chưanhớ lựa chọn
kl.vol.sfx, kl.vol.music, kl.audio.quietâm lượng tiếng động, âm lượng nhạc, chế độ giảm âmnhớ mức âm lượng đã chọn
kl.v2.starssố ngôi sao đã nhận, tổng và theo từng tròhiện tiến trình chơi
kl.demoAllbật xem thử tất cả các tròtuỳ chọn cho người lớn
kl.v2.ageoverridecho phép bé thử cả những trò gợi ý cho tuổi lớn hơntuỳ chọn cho người lớn
kl.session.v1mã phiên để nối thẻ với lượt chơi — tự hết sau 15 phútđọc thẻ đúng vào lượt đang chơi
klnfc.scanned, klnfc.whodanh sách mã số của các thẻ đã quét, nhân vật đã chọn (trang nfc.html)nhớ bộ thẻ của máy đó
klnfc.lognhật ký các thẻ vừa ghi trên máy đó: mã số món đồ, số byte, thời điểm (trang nfc.html, có nút xoá riêng)để người lớn biết đã ghi những thẻ nào

Đúng 14 khoá, không hơn. Bạn tự đếm lại được: grep -rhoE "'kl\.[a-z0-9_.]*'|'klnfc\.[a-z0-9_.]*'" js/*.js | sort -u. Hoặc mở công cụ dành cho người phát triển trong trình duyệt (phần “Local storage”) và xem tận mắt.

4. Thẻ NFC chỉ chứa SỐ

Thẻ chúng tôi dùng chỉ ghi một mã số của món đồ, không có tên bé, không có gì riêng tư. Việc đọc hay ghi thẻ chỉ xảy ra khi bạn bấm đồng ý theo cơ chế xin phép của chính trình duyệt (Web NFC trên Android Chrome), và việc xử lý diễn ra ngay trên máy. Không có lượt gửi nào ra ngoài.

5. Giọng nói

Giọng DoDo và MonMon là các clip âm thanh tổng hợp sẵn, tải kèm trang, phát ngay trên máy — không có máy chủ nào nghe thấy gì, vì không có micro nào được bật.

Khi thiếu clip cho một câu, mã có thể gọi Web Speech — bộ đọc chữ của chính trình duyệt. Cần nói rõ: ở một số trình duyệt, Web Speech xử lý chữ cần đọc trên máy chủ của nhà sản xuất trình duyệt chứ không phải trên máy bạn. Việc đó nằm ngoài tầm kiểm soát của trang này. Những gì được gửi trong trường hợp đó là câu tiếng Anh của trò chơi (ví dụ “Find the cat”), chứ không có thông tin gì về bé.

6. Bộ nhớ tạm của trình duyệt (chơi được khi mất mạng)

Trang có một service worker (sw.js): một đoạn mã nhỏ chạy trong trình duyệt để giữ bản sao các tệp của trang trên máy đó, nhờ vậy mở lại nhanh và chơi được khi mất mạng. Đó là bản sao các tệp của chính trang này — không phải dữ liệu về bạn, và không có gì được gửi đi.

7. Xoá sạch dữ liệu trên máy

Cách dùng được ngay: trong trình duyệt, xoá dữ liệu của trang này (“Cài đặt trang” → “Xoá dữ liệu”, hoặc xoá “Dữ liệu trang và cookie” cho địa chỉ này). Làm vậy là mất cả 14 khoá ở mục 3 và bộ nhớ tạm ở mục 6; game trở về như lần đầu mở.

Riêng nhật ký thẻ NFC (klnfc.log) có nút xoá riêng ngay trong trang nfc.html. Xoá nhật ký không ảnh hưởng gì tới thẻ thật.

Một nút “Xoá dữ liệu trên máy này” ngay trong cổng phụ huynh đang được làm, chưa có ở bản này.

8. Nhà cung cấp hạ tầng

Trang được phục vụ qua một nhà cung cấp hạ tầng web (Cloudflare). Như mọi máy chủ web, bên đó có bản ghi kỹ thuật ở mức dịch vụ của họ (ví dụ địa chỉ IP, thời điểm yêu cầu) để chạy dịch vụ. Phần đó thuộc nhà cung cấp, không do trang này tạo ra và chúng tôi không nói thay họ — bạn xem chính sách của họ nếu cần.

9. Cách tự kiểm lại

In English (short version)

This page is a software prototype of a game for young children, played together with an adult. It sets no cookies, loads no analytics, advertising or third-party scripts, and makes no network requests outside its own origin (measured by grep over the released code on 8 Oct 2026: 0 hits for cookies, analytics, external URLs, WebSocket, IndexedDB, XHR, POST uploads, microphone, camera and geolocation). It asks for no name, age or photo and records no audio or video. It does use localStorage — 9 keys listed in section 3 above — which stays inside the browser on that one device, is never transmitted, and can be removed by clearing the site's data in the browser. NFC tags hold only an item number, and tags are read only after the browser's own permission prompt. Voice lines are pre-rendered audio files played locally; when a line has no file, the browser's built-in Web Speech may be used, and in some browsers that text is processed on the browser vendor's servers, which is outside this page's control. A service worker keeps a copy of the page's own files on the device for offline play (app shell plus at most 600 voice clips, oldest dropped first); it stores nothing about the person using it. This is a factual description of what the code does; it is not a legal document and makes no claim about compliance with any law.