diff --git a/README.md b/README.md
index 8ff26ba..25c9b3d 100644
--- a/README.md
+++ b/README.md
@@ -56,6 +56,7 @@ Here is the list of all utilities:
- [Random String Generator](https://jam.dev/utilities/random-string-generator)
- [CSV file viewer](https://jam.dev/utilities/csv-file-viewer)
- [JSONL Validator](https://jam.dev/utilities/jsonl-validator)
+- [File Integrity Checker](https://jam.dev/utilities/file-integrity-checker)
### Built With
diff --git a/__tests__/pages/utilities/file-integrity-checker.test.tsx b/__tests__/pages/utilities/file-integrity-checker.test.tsx
new file mode 100644
index 0000000..f94cc52
--- /dev/null
+++ b/__tests__/pages/utilities/file-integrity-checker.test.tsx
@@ -0,0 +1,38 @@
+import { render, screen } from "@testing-library/react";
+import userEvent from "@testing-library/user-event";
+import FileIntegrityChecker from "../../../pages/utilities/file-integrity-checker";
+
+describe("FileIntegrityChecker", () => {
+ test("computes the sha256 hash automatically as soon as a file is uploaded", async () => {
+ render();
+
+ const user = userEvent.setup();
+ const file = new File(["hello world"], "hello.txt", {
+ type: "text/plain",
+ });
+
+ await user.upload(screen.getByTestId("input"), file);
+
+ expect(await screen.findByText(/sha-256 hash/i)).toBeInTheDocument();
+ expect(screen.getByDisplayValue(/^[a-f0-9]{64}$/i)).toBeInTheDocument();
+ });
+
+ test("switching algorithms clears the stale hash and recomputes for the new one", async () => {
+ render();
+
+ const user = userEvent.setup();
+ const file = new File(["hello world"], "hello.txt", {
+ type: "text/plain",
+ });
+
+ await user.upload(screen.getByTestId("input"), file);
+ await screen.findByDisplayValue(/^[a-f0-9]{64}$/i); // sha256 by default
+
+ await user.selectOptions(screen.getByLabelText(/hash algorithm/i), "md5");
+
+ expect(await screen.findByText(/md5 hash/i)).toBeInTheDocument();
+ expect(
+ await screen.findByDisplayValue(/^[a-f0-9]{32}$/i)
+ ).toBeInTheDocument();
+ });
+});
diff --git a/components/seo/FileIntegrityCheckerSEO.tsx b/components/seo/FileIntegrityCheckerSEO.tsx
new file mode 100644
index 0000000..16ae5da
--- /dev/null
+++ b/components/seo/FileIntegrityCheckerSEO.tsx
@@ -0,0 +1,101 @@
+export default function FileIntegrityCheckerSEO() {
+ return (
+
+
+
+ Generate a checksum (hash) of any file to confirm it wasn't
+ corrupted during download or transfer, or tampered with along the way.
+ If the hash you calculate matches the hash published by the
+ file's source, the file is identical, byte for byte, to the
+ original.
+
+
+
+
+
+ Drop a file into the tool above or click to browse for one. Large
+ files are streamed in chunks, so there's no file size limit and
+ nothing is ever uploaded anywhere.
+
+
+
+
+
How to Check File Integrity
+
+
+ Drop in or browse for your file: Drag and drop the
+ file directly or click to select it from your machine.
+
+
+ Pick the algorithm: Choose SHA-256, SHA-512, or MD5 to
+ match the hash you were given.
+
+
+ Wait for the hash to generate: Large files are
+ streamed in chunks, so even multi-gigabyte files can be checked
+ without running out of memory.
+
+
+ Verify against a known hash: Paste the published hash
+ into the verify field to confirm it matches.
+
+
+
+
+
+
SHA-256 vs SHA-512 vs MD5
+
+ SHA-256 is the most common choice today for verifying downloads and
+ software packages. SHA-512 offers a longer digest for the same family.
+ MD5 is faster and still widely used for detecting accidental
+ corruption, though it's not considered cryptographically secure
+ against deliberate tampering.
+
+
+
+
+
Why Use a File Integrity Checker?
+
+
+ Catch corrupted downloads: A hash mismatch tells you
+ immediately if a download was interrupted or damaged in transit.
+
+
+ Detect tampering: Comparing against a
+ publisher-provided hash confirms a file wasn't altered before
+ it reached you.
+
+
+ Works on any file size: Chunked streaming means
+ multi-gigabyte files are checked without loading the whole file into
+ memory.
+
+
+
+
+
+
FAQs
+
+
+ Is this tool safe for large or sensitive files? Yes.
+ Everything runs locally in your browser — files are never uploaded
+ anywhere.
+
+
+ Which algorithm should I use? Use whichever algorithm
+ matches the hash published by the file's source — SHA-256,
+ SHA-512, or MD5.
+
+
+ Is there a file size limit? No. Files are read and
+ hashed in chunks, so even very large files can be checked.
+
+
+ Is my file sent to a server? No. All hashing happens
+ locally in your browser. Your file never leaves your machine.
+