Công cụ web miễn phí giúp xoá dữ liệu ẩn (toạ độ GPS, tên bạn, model điện thoại, giờ chụp, tên công ty…) khỏi ảnh, video và tài liệu trước khi bạn chia sẻ chúng lên mạng.
Toàn bộ việc xử lý diễn ra ngay trong trình duyệt trên máy người dùng. Không có file nào được tải lên máy chủ, không có thư viện bên ngoài, không có font từ Google, không có thống kê. Cả công cụ nằm gọn trong một file index.html duy nhất.
→ Dùng thử ngay ←
Không cần cài, không cần đăng ký, không cần tài khoản. Hoặc tải riêng file
index.html
về máy — mở lên là chạy, kể cả khi không có mạng.
Tiếng Việt bên dưới · English version
Hầu hết trang xoá metadata online đều bắt bạn tải file lên máy chủ của họ rồi hứa sẽ xoá sau. Với một tấm ảnh có toạ độ nhà bạn, lời hứa đó là thứ bạn phải tin mà không kiểm chứng được.
Còn các công cụ dòng lệnh (như exiftool, mat2) thì xoá rất tốt nhưng người không rành máy tính gần như không dùng nổi — phải cài Python, cài ffmpeg, gõ lệnh.
Công cụ này chọn đường thứ ba:
| Trang online thông thường | Công cụ dòng lệnh | Sạch | |
|---|---|---|---|
| File có rời khỏi máy không | Có, tải lên server | Không | Không |
| Cần cài đặt gì | Không | Python, exiftool, ffmpeg | Không |
| Người không rành máy dùng được | Được | Khó | Được |
| Dùng khi không có mạng | Không | Được | Được |
| Chi phí vận hành server | Có | — | 0 đồng |
| Định dạng | Xoá được | Chất lượng |
|---|---|---|
| JPG | EXIF, GPS, XMP, IPTC, ghi chú, dữ liệu thừa cuối file | Giữ nguyên từng byte ảnh |
| PNG | tEXt / iTXt / zTXt, eXIf, tIME | Giữ nguyên |
| WEBP | EXIF, XMP (kèm cập nhật cờ trong VP8X) | Giữ nguyên |
| GIF | Comment, application extension (giữ NETSCAPE để ảnh động vẫn chạy) | Giữ nguyên |
| MP4 / MOV / M4A | udta, meta, uuid, ilst, toạ độ GPS, ngày giờ quay trong mvhd/tkhd/mdhd |
Giữ nguyên, dung lượng không đổi |
| MP3 | ID3v1, ID3v2 | Giữ nguyên |
| Tác giả, tiêu đề, phần mềm tạo, ngày tạo/sửa, gói XMP | Nội dung và bố cục giữ nguyên | |
| DOCX / XLSX / PPTX / ODT | Người tạo, người sửa cuối, công ty, ngày tạo, thời gian trong file nén | File vẫn mở bình thường |
Các định dạng ảnh khác mà trình duyệt đọc được (HEIC trên Safari, AVIF, BMP…) sẽ được vẽ lại thành PNG sạch — công cụ ghi rõ trường hợp này trong kết quả để bạn biết.
Công cụ không nén lại ảnh hay video. Nó cắt đúng những khối byte chứa metadata:
- JPG — bỏ các segment
APPnvàCOM, giữ nguyên dữ liệu ảnh đã nén, đồng thời cắt phần dữ liệu thừa nằm sauEOI(chỗ hay bị giấu dữ liệu). - PNG / WebP / GIF — lọc theo danh sách chunk được phép giữ, chỉ giữ những chunk cần cho việc hiển thị.
- MP4 / MOV — đây là chỗ hay hỏng nhất nếu làm ẩu: xoá bớt byte sẽ làm lệch bảng offset
stco/co64và video không phát được. Công cụ vì vậy ghi đè các hộp metadata thành hộpfree(khoảng trống theo chuẩn ISO BMFF) và xoá nội dung bên trong. Mọi offset giữ nguyên, video chắc chắn vẫn phát, dung lượng không đổi. - PDF — ghi đè giá trị trong
/Infovà gói XMP bằng khoảng trắng đúng bằng số byte cũ, nên bảngxrefvẫn đúng và file không hỏng. - DOCX/XLSX/PPTX — dựng lại file nén, thay
docProps/core.xml,app.xml,custom.xmlbằng bản rỗng hợp lệ (thay vì xoá hẳn, vì xoá sẽ làm Word báo lỗi "unreadable content") và đặt lại toàn bộ dấu thời gian trong file nén.
Trang có sẵn nút file mẫu — chưa có ảnh nào có GPS trong tay vẫn thử được ngay. Năm file mẫu (ảnh có GPS, video có GPS, ảnh gắn mác AI, ảnh Stable Diffusion còn nguyên câu lệnh, file Word có tên công ty) được nhúng thẳng vào trang, nên bấm được cả khi không có mạng. Dữ liệu trong đó đều là bịa.
Muốn tự lưu về máy thì có hai cách:
Cách 1 — mở trực tiếp: tải file index.html về máy rồi mở bằng trình duyệt. Không cần mạng, không cần cài gì.
Cách 2 — đưa lên GitHub Pages để có một địa chỉ web chia sẻ cho người khác (xem bên dưới).
| Tab | Làm gì |
|---|---|
| Xoá metadata | Thả file vào, xem nó đang lộ gì, rồi tải về bản đã xoá sạch. |
| Chỉ kiểm tra | Chỉ đọc và báo lại, không sửa gì cả. Dùng khi bạn chỉ muốn biết một file chứa những gì — hoặc thả bản đã xoá vào để tự kiểm chứng. |
Tab kiểm tra đọc ra toàn bộ metadata, nhóm theo kiểu exiftool — File, Tổng hợp, EXIF, EXIF · GPS, XMP, ID3, cấu trúc chunk/box… — kèm ô tìm kiếm và nút xuất ra .txt. Toạ độ hiện cả dạng độ-phút-giây lẫn dạng thập phân.
Đây không phải exiftool: maker note riêng của từng hãng máy ảnh chỉ được báo là có chứ không giải mã, và các định dạng ngoài tám cái nêu ở trên thì không đọc được. Không có nút "chia sẻ link" — chia sẻ được nghĩa là dữ liệu phải rời khỏi máy bạn, mà công cụ này không làm thế; nút Xuất .txt ghi thẳng ra máy.
Ở chế độ kiểm tra, file không còn mục nào đọc được sẽ hiện "Không thấy gì". Lưu ý: đó không phải bằng chứng file hoàn toàn sạch — công cụ chỉ đọc được những phần nó hỗ trợ. Việc quan trọng thì kiểm tra lại bằng exiftool.
Chế độ kiểm tra đọc luôn các dấu hiệu cho biết file do AI sinh ra — với ảnh, video lẫn tài liệu:
| Dấu hiệu | Nằm ở đâu |
|---|---|
IPTC DigitalSourceType |
Câu tuyên bố chính thức trong gói XMP. Phân biệt được toàn bộ do AI với có phần do AI |
| C2PA / Content Credentials | APP11 của JPG, chunk caBX của PNG, chunk C2PA của WebP, box uuid của MP4 |
| Tên công cụ | Trường Software/CreatorTool, hoặc khối tham số sinh ảnh mà Stable Diffusion và ComfyUI để lại trong chunk PNG |
Ba điều cần hiểu đúng, nếu không thì tính năng này hại nhiều hơn lợi:
- Thấy mác nghĩa là file tự khai như vậy, không phải bằng chứng. Gắn mác dễ, mà gỡ cũng dễ. Riêng C2PA thì máy ảnh cũng gắn, nên bản thân nó chưa nói lên là AI.
- Không thấy mác thì không kết luận được ảnh do người tạo. Rất nhiều công cụ AI không gắn gì; chụp lại màn hình hay nén lại là mác bay mất.
- Watermark vô hình như SynthID của Google nằm trong pixel, không phải metadata. Không công cụ đọc metadata nào — kể cả
exiftool— nhìn thấy được.
Cần câu trả lời thật sự chắc chắn cho một bức ảnh đang tranh cãi thì metadata không giúp được; phải dùng dịch vụ giám định ảnh hoặc công cụ xác minh của chính nhà cung cấp.
Phần này viết cho người chưa từng dùng GitHub. Không cần cài Git, làm hết trên trình duyệt.
- Tạo tài khoản tại github.com nếu chưa có.
- Bấm nút
+ở góc trên bên phải → New repository. - Đặt tên repo, ví dụ
sach. Chọn Public. Bấm Create repository. - Ở trang vừa hiện ra, bấm uploading an existing file, rồi kéo thả file
index.html(vàREADME.md,LICENSEnếu muốn) vào. Bấm Commit changes. - Vào tab Settings → cột trái chọn Pages.
- Mục Source chọn Deploy from a branch, Branch chọn main và thư mục / (root). Bấm Save.
- Đợi khoảng 1–2 phút rồi tải lại trang. GitHub sẽ hiện địa chỉ dạng
https://<tên-tài-khoản>.github.io/sach/.
Xong. Địa chỉ đó chạy miễn phí vĩnh viễn, không tốn tiền server vì không có server nào cả.
Nếu bạn đẩy nguyên cả repo này lên (chứ không chỉ mỗi
index.html), ở bước 6 hãy chọn Source là GitHub Actions thay vì Deploy from a branch. Repo có sẵn.github/workflows/pages.ymltự build và deploy mỗi lần đẩy lên nhánhmain; chọn sai thì workflow đó sẽ báo lỗi.
Muốn dùng tên miền riêng (ví dụ sach.tenmiencuaban.com): trong Settings → Pages → Custom domain, nhập tên miền, rồi ở nhà cung cấp tên miền tạo bản ghi CNAME trỏ về <tên-tài-khoản>.github.io.
Cùng một engine, gọi được từ terminal hoặc từ script. Cần Node 20 trở lên, không cài thêm gì.
node bin/sach.mjs anh.jpgChạy trần như trên chỉ xem và báo cáo, không ghi file nào — chạy nhầm không mất dữ liệu. Muốn ghi thì chỉ rõ nơi ghi:
node bin/sach.mjs *.jpg --out sach/| Tuỳ chọn | Tác dụng |
|---|---|
--out <thư-mục> |
Ghi bản sạch vào thư mục này, tên có tiền tố sach_. Bản gốc không bị đụng tới. |
--in-place |
Ghi đè lên chính file gốc. Không hoàn tác được, có cảnh báo trước. |
--dry-run |
Chỉ xem, không ghi. Mặc định khi không có --out lẫn --in-place. |
--json |
In JSON cho máy đọc. Thông báo cho người đọc đi ra stderr nên stdout luôn parse được. |
--full |
Đọc ra toàn bộ metadata, nhóm theo kiểu exiftool — đúng những gì tab "Chỉ kiểm tra" hiển thị. |
--rename |
Đặt tên ngẫu nhiên, vì tên file cũng lộ thông tin. |
--no-icc |
Xoá luôn hồ sơ màu ICC. Mặc định giữ vì nó không chứa thông tin cá nhân. |
--recursive |
Duyệt cả thư mục con. |
Muốn xem hết mọi thứ trong file, giống tab "Chỉ kiểm tra" nhưng ở terminal:
node bin/sach.mjs anh.jpg --fullMã thoát: 0 mọi file đều xong, 1 có định dạng chưa hỗ trợ, 2 lỗi thật.
Muốn gõ sach ở bất cứ đâu thì chạy npm link một lần trong thư mục dự án.
skills/metadata-cleaner/ là một Agent Skill — chép vào ~/.claude/skills/ là các AI agent tự biết dùng công cụ này:
cp -r skills/metadata-cleaner ~/.claude/skills/Sau đó nói với agent một câu tự nhiên như "kiểm tra xem ảnh này có lộ vị trí không", nó sẽ tự chạy CLI. Skill bắt agent làm đúng ba bước: xem trước → báo cáo cho bạn → chỉ xoá khi bạn đồng ý, và mặc định ghi ra thư mục mới chứ không đè bản gốc. Skill cũng buộc agent nói rõ những gì công cụ không làm được, thay vì hứa quá.
Chi tiết cài đặt ở skills/README.md.
Mã nguồn nằm trong src/, còn index.html là file được sinh ra từ đó (vẫn commit vào repo để người dùng tải một file duy nhất và GitHub Pages phục vụ trực tiếp). Đừng sửa tay index.html — sửa src/ rồi build:
npm run build- Đổi màu, chữ, bố cục →
src/shell.html. Các màu chính khai báo trong khối:root. - Đổi câu chữ tiếng Việt / tiếng Anh → object
Tở đầusrc/ui.js. - Thêm định dạng mới → viết một hàm
cleanXXX(u8, opt)trongsrc/engine.jstrả về{ data, removed, found, mode }, rồi khai báo trongsniff()vàclean(). Xem CONTRIBUTING.md.
src/engine.js là nguồn sự thật duy nhất cho phần xử lý: build.js nhúng nó vào index.html, bin/sach.mjs import thẳng nó, và bộ test lại rút nó ra từ index.html đã build. Engine không được chạm vào DOM.
Trước khi mở PR, đọc AGENTS.md — mười nguyên tắc bất biến của dự án nằm ở đó.
Bộ kiểm thử chạy trực tiếp trên file index.html đang phát hành — không phải trên một bản copy nào khác.
npm install
npm testBốn trong sáu bộ test chỉ cần Node, chạy được ngay. Hai bộ còn lại cần file mẫu; thiếu thì chúng tự bỏ qua kèm thông báo chứ không báo lỗi giả. Muốn chạy đủ:
pip install pillow imageio-ffmpeg pypdf
npm run fixtures # tạo file mẫu có sẵn GPS, tên tác giả, ID3…
npm test
npm run verify # mở lại từng file đã xoá bằng phần mềm thật| Bộ test | Kiểm tra điều gì |
|---|---|
invariants |
Mười nguyên tắc bất biến, kiểm tra tĩnh trên chính file đã phát hành |
robustness |
File rỗng, cắt cụt, đảo byte ngẫu nhiên; APNG, VP8X, MP4 box 64-bit, ZIP có mật khẩu |
cli |
bin/sach.mjs chạy như một tiến trình thật |
skill |
Tài liệu skill có khớp với CLI thật không |
engine |
Engine trên file mẫu thật do Pillow/ffmpeg tạo |
ui |
Thả file thật vào giao diện trong jsdom |
verify.py là phần đáng chú ý nhất: nó mở lại từng file sau khi xoá bằng Pillow / ffmpeg / pypdf / zipfile để chắc chắn file vẫn dùng được, so sánh từng pixel với bản gốc, và tìm lại các chuỗi nhạy cảm để chắc chắn chúng đã biến mất thật.
- Chưa hỗ trợ ảnh RAW của máy ảnh chuyên nghiệp (CR2, NEF, ARW…), HEIC (trừ khi trình duyệt tự đọc được), và các định dạng video MKV, AVI, WebM.
- Nội dung hiển thị của file vẫn có thể nhận diện bạn: biển số xe, tên đường, khuôn mặt, chữ ký trong ảnh chụp giấy tờ. Không công cụ metadata nào xử lý được phần đó.
- Với PDF nhạy cảm, cách chắc chắn nhất vẫn là in lại ra một file PDF mới.
- Nhiều nền tảng (Facebook, Zalo…) tự xoá metadata khi bạn tải ảnh lên, nhưng cũng có nền tảng giữ nguyên hoặc thêm dữ liệu mới. Đừng dựa vào nền tảng.
- Nếu bạn đang trong tình huống rủi ro cao (nhà báo, người bảo vệ nhân quyền, người đang bị theo dõi), hãy dùng thêm công cụ chuyên dụng như mat2 và tự kiểm tra lại kết quả bằng
exiftool.
Phần mềm được cung cấp "nguyên trạng", không kèm bảo đảm nào.
Ý tưởng và tham khảo từ:
- exiftools.com — công cụ xem và xoá metadata trực tuyến
- Anish-M-code/Metadata-Remover — công cụ desktop dùng exiftool và ffmpeg
- mat2 — Metadata Anonymisation Toolkit
- Freedom of the Press Foundation — everything about media metadata
Không dùng lại mã nguồn của các dự án trên; toàn bộ phần xử lý được viết lại từ đầu bằng JavaScript thuần để chạy được trong trình duyệt.
Giấy phép MIT.
→ Try it ←
Sạch ("clean" in Vietnamese) is a free, single-file web tool that strips hidden metadata — GPS coordinates, your name, phone model, timestamps, company name — from photos, video and documents before you share them.
Everything runs inside the browser on the user's own machine. No uploads, no external libraries, no web fonts, no analytics. The entire tool is one index.html file.
Supported: JPG, PNG, WebP, GIF (EXIF / XMP / IPTC / text chunks / comments), MP4 / MOV / M4A (udta, meta, uuid, GPS, creation timestamps), MP3 (ID3v1/v2), PDF (/Info and XMP packets), DOCX / XLSX / PPTX / ODT (author, company, dates, archive timestamps).
Two modes. Remove metadata shows what a file exposes and hands back a cleaned copy. Just check reads and reports without changing anything — useful when you only want to know what is in a file, or to inspect an already-cleaned one. A file with nothing readable left is reported as "nothing found", which is deliberately not the same claim as "this file is clean": the tool only reads the parts it supports, so verify with exiftool when it matters.
AI provenance. Both modes surface whether a file declares it was machine-generated: the IPTC DigitalSourceType term, a C2PA / Content Credentials manifest (JPEG APP11, PNG caBX, WebP C2PA, MP4 uuid), or a generator naming itself. Treat a hit as a claim the file makes about itself, not as proof — these tags are trivial to add and trivial to strip, and C2PA alone does not mean AI since cameras write manifests too. Treat a miss as nothing at all: many generators write no marker, re-encoding drops any that exist, and invisible watermarks such as Google SynthID live in the pixels where no metadata reader can see them.
Nothing is re-encoded. Images and audio keep every original byte. Video metadata boxes are overwritten with standard ISO BMFF free padding so all chunk offsets stay valid and playback is never broken. PDF metadata is blanked in place so the xref table stays correct. Office documents are repacked with valid-but-empty property parts, since deleting them outright makes Word complain.
To publish it: upload index.html to any GitHub repository, then Settings → Pages → Deploy from a branch → main / root. It is a static file, so hosting is free and permanent. It also works offline — just save the file and open it.
From the command line: node bin/sach.mjs <file...> runs the same engine, needs only Node 20, and reports without writing unless you pass --out <dir> or --in-place. Add --json for machine-readable output, or --full to read out every metadata field grouped like exiftool. Exit codes: 0 all handled, 1 unsupported format, 2 real error.
For AI agents: skills/metadata-cleaner/ is an Agent Skill. Copy it to ~/.claude/skills/ and an agent will use the CLI on its own — dry run first, report what it found, and clean only once you agree.
To build it: the source lives in src/; index.html is generated by npm run build and committed so users can download one file. Never hand-edit it. AGENTS.md documents the ten invariants that must not be broken — most importantly that MP4 metadata is overwritten in place, never deleted, because deleting bytes desynchronises the stco/co64 offset tables and stops the video playing.
To test it: npm test. The suites run against the shipped index.html itself. fixtures.py builds sample files carrying real GPS and author data; verify.py re-opens every cleaned file with Pillow, ffmpeg, pypdf and zipfile to confirm the file still works, compares pixels against the original, and greps for the sensitive strings to confirm they are actually gone.
Limits: camera RAW, HEIC and MKV/AVI/WebM are not supported. Visible content — faces, street signs, licence plates — is never handled by any metadata tool. For high-risk situations, use mat2 as well and verify with exiftool.
MIT licensed. Provided as-is, without warranty.