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.
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 định | Lệnh kiểm | Kết quả |
|---|---|---|
| Không dùng cookie | grep -rF "document.cookie" js/ *.html | 0 |
| Không có đo lường / phân tích / quảng cáo | grep -rE "gtag|dataLayer|sendBeacon|googletag|fbq|plausible|umami" js/ *.html | 0 |
| Không gọi ra máy chủ bên ngoài | grep -rn "https://" index.html nfc.html sw.js css/*.css js/*.js | 0 (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 origin | grep -n "url.origin !== self.location.origin" sw.js | 1 (dòng 63 — trả về ngay, không xử lý) |
| Không WebSocket, không IndexedDB, không XHR | grep -rE "WebSocket|indexedDB|XMLHttpRequest" js/ | 0 / 0 / 0 |
| Không gửi dữ liệu đi đâu | grep -rE "method:\s*['\"]POST" js/ | 0 |
| Không micro, không máy ảnh, không ghi âm | grep -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.v1 | nhâ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 ứng | nhớ cài đặt cho lần chơi sau |
kl.music, kl.music.bg | bật/tắt nhạc và nhạc nền (mặc định tắt) | nhớ lựa chọn |
kl.input.v1 | cách nhập (chạm hay thẻ NFC), kệ thẻ, gói thẻ, đã xem hướng dẫn chưa | nhớ 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 âm | nhớ mức âm lượng đã chọn |
kl.v2.stars | số ngôi sao đã nhận, tổng và theo từng trò | hiện tiến trình chơi |
kl.demoAll | bật xem thử tất cả các trò | tuỳ chọn cho người lớn |
kl.v2.ageoverride | cho phép bé thử cả những trò gợi ý cho tuổi lớn hơn | tuỳ chọn cho người lớn |
kl.session.v1 | mã 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.who | danh 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.log | nhậ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.
- Vỏ ứng dụng (
index.html, 2 tệp css, các tệp js — khoảng 0,8 MB) được lưu ngay khi mở trang, trong một bộ nhớ tạm tênkl-shell-<phiên bản>. Mỗi lần ra bản mới là một tên mới, và bản cũ bị xoá — nên không bị kẹt bản cũ. - Clip giọng đã nghe được giữ dần trong bộ nhớ tạm
kl-media-v1, trần 600 clip (khoảng 8 MB; tự hạ còn 300 nếu máy báo còn ít chỗ). Vượt trần thì clip cũ nhất bị xoá. Không tải trước cả kho giọng (kho đầy đủ khoảng 137 MB). - Yêu cầu tua trong thẻ âm thanh (HTTP Range) đi thẳng ra mạng, không lưu lại.
- Service worker này không nhận lệnh từ đâu khác, không gửi gì ra ngoài, và không lưu bất cứ thứ gì bạn nhập (trang cũng không có ô nhập nào).
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
- Mở công cụ người phát triển → tab “Network”, chơi một lượt: mọi dòng đều cùng địa chỉ của trang này.
- Tab “Application” → “Local storage”: chỉ thấy các khoá
kl.*/klnfc.*ở mục 3. - Tab “Application” → “Cookies”: trống.
- Xem mã nguồn: mọi tệp
js/vàcss/đều tải được và đọc được, không bị nén rố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.