From 6a41b52950dba3645d6be6072dc0b483bc1f25b4 Mon Sep 17 00:00:00 2001
From: Sparsh Sam <110058692+sparshsam@users.noreply.github.com>
Date: Sun, 28 Jun 2026 00:21:56 -0400
Subject: [PATCH] website copy: clarify what OpenProof is, who uses it, and
when
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Homepage: new sections — Who uses OpenProof (8 audiences),
When to timestamp a file (4 scenarios), What a proof means
(proves vs doesn't prove), Privacy by design (4 pillars)
- About page: new Who uses OpenProof and When to use it sections
- Layout/SEO: enriched titles, descriptions, OG tags, keywords
with proof-of-existence, file fingerprinting, blockchain
timestamping, document integrity terms
- Create page: clearer header copy, 'only hash written onchain' note
- Verify page: clearer description mentioning onchain registry check
- FileDrop: improved helper text explaining SHA-256 privacy
- eslint: ignore android/ directory (auto-generated build artifacts)
---
eslint.config.mjs | 2 +
src/app/about/page.tsx | 68 ++++++++++++++++-
src/app/create/page.tsx | 5 +-
src/app/layout.tsx | 26 +++++--
src/app/page.tsx | 139 ++++++++++++++++++++++++++++++++++-
src/app/verify/page.tsx | 4 +-
src/components/file-drop.tsx | 2 +-
7 files changed, 231 insertions(+), 15 deletions(-)
diff --git a/eslint.config.mjs b/eslint.config.mjs
index cbe72c7..ba5b985 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -19,6 +19,8 @@ const eslintConfig = defineConfig([
"build/**",
"typechain-types/**",
"next-env.d.ts",
+ // Android native project — not source code
+ "android/**",
]),
]);
diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx
index 509347f..6feaccf 100644
--- a/src/app/about/page.tsx
+++ b/src/app/about/page.tsx
@@ -8,7 +8,7 @@ import { ExternalLink } from "lucide-react";
export const metadata = {
title: "About",
description:
- "What OpenProof is and why it exists — a privacy-first, open-source proof-of-existence infrastructure tool.",
+ "What OpenProof is, who it is for, and when to use it — a privacy-first, open-source proof-of-existence tool for file fingerprinting, blockchain timestamping, and document integrity verification.",
};
export default function AboutPage() {
@@ -37,6 +37,72 @@ export default function AboutPage() {
+ {/* ──────────── Who uses OpenProof ──────────── */}
+
+ Who uses OpenProof
+
+ OpenProof is for anyone who needs a permanent, independently verifiable
+ timestamp for a file — without uploading, storing, or exposing the file
+ itself.
+
+
+ {[
+ ["Developers", "Timestamp release builds, dependency manifests, and deployment artifacts. Verify that a deployed binary matches its source."],
+ ["Creators & artists", "Prove original work existed before sharing with collaborators, submitting to galleries, or publishing online."],
+ ["Researchers", "Establish priority for findings, datasets, and preprints before peer review. Protect against scooping."],
+ ["Legal professionals", "Create independently verifiable timestamps for contracts, disclosures, records of counsel, and evidence submissions."],
+ ["Journalists", "Anchoring source material, internal communications, and unpublished drafts — before publication or legal request."],
+ ["Businesses & compliance", "Document integrity verification for regulatory records, audit trails, and internal policy compliance."],
+ ["Archivists", "Long-term integrity checks for digital collections. Verify that archived files haven't drifted from their registered originals."],
+ ["Individuals", "Personal records — wills, letters, receipts, photos, certificates. Anyone can timestamp anything."],
+ ].map(([title, desc]) => (
+
+
{title as string}
+
{desc as string}
+
+ ))}
+
+
+
+ {/* ──────────── Typical use cases ──────────── */}
+
+ When to use OpenProof
+
+ Timestamp a file before any event where you might later need to prove
+ what you had, and when.
+
+
+ {[
+ [
+ "Before publishing or releasing",
+ "Timestamp a draft, dataset, or release artifact before making it public. If someone later claims priority or originality, the onchain fingerprint proves your file existed first.",
+ ],
+ [
+ "Before sharing with others",
+ "Send a file to a collaborator, client, or regulator? Timestamp it first. The registry preserves your version at that moment, independent of any later dispute.",
+ ],
+ [
+ "Before archiving or migrating",
+ "Timestamp a file before moving it to cold storage or converting formats. Years later, re-hash and verify the content is unchanged from the original.",
+ ],
+ [
+ "Before regulatory or legal submission",
+ "Records, logs, contracts, and disclosures benefit from an independent timestamp before submission. The onchain record is immutable and verifiable by anyone.",
+ ],
+ ].map(([title, desc], i) => (
+ -
+
+ {i + 1}
+
+
+
{title as string}
+
{desc as string}
+
+
+ ))}
+
+
+
{/* ──────────── Architecture diagram ──────────── */}
diff --git a/src/app/create/page.tsx b/src/app/create/page.tsx
index 0cba144..9e2e6b1 100644
--- a/src/app/create/page.tsx
+++ b/src/app/create/page.tsx
@@ -133,7 +133,8 @@ export default function CreateProofPage() {
on Base Sepolia.
- Timestamp a SHA-256 fingerprint onchain. The file never leaves your browser.
+ Timestamp a SHA-256 fingerprint onchain. Prove a file existed at this moment.
+ The file never leaves your browser.
@@ -174,7 +175,7 @@ export default function CreateProofPage() {
)}
- Base Sepolia testnet · No real funds required
+ Base Sepolia testnet · No real funds required · Only the hash is written onchain
{/* Status line */}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index aece90c..7be88f1 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -16,18 +16,28 @@ const geistMono = Geist_Mono({
export const metadata: Metadata = {
metadataBase: new URL("https://proof.kovina.org"),
title: {
- default: "OpenProof",
+ default: "OpenProof — Proof-of-Existence · File Fingerprinting · Blockchain Timestamping",
template: "%s | OpenProof",
},
description:
- "Open-source cryptographic proof infrastructure built on Base Sepolia. Timestamp file fingerprints onchain without uploading files anywhere.",
+ "Prove a file existed at a specific time — without uploading it. OpenProof is a privacy-first, open-source proof-of-existence tool. Hash a file locally with SHA-256, register the fingerprint on Base Sepolia, and verify independently. No uploads, no accounts, no backend. Used by developers, creators, researchers, and legal professionals for document integrity, digital evidence, and cryptographic timestamping.",
keywords: [
"OpenProof",
"proof of existence",
+ "file fingerprinting",
+ "blockchain timestamping",
+ "SHA-256 verification",
+ "cryptographic proof",
+ "document integrity",
+ "digital evidence",
+ "privacy-first",
"Base Sepolia",
"SHA-256",
"cryptographic proof",
- "privacy-first",
+ "privacy-preserving verification",
+ "file integrity verification",
+ "timestamping service",
+ "open source proof of existence",
"web3",
"Solidity",
"wagmi",
@@ -36,9 +46,9 @@ export const metadata: Metadata = {
canonical: "https://proof.kovina.org",
},
openGraph: {
- title: "OpenProof",
+ title: "OpenProof — Privacy-First Proof-of-Existence",
description:
- "Open-source cryptographic proof infrastructure built on Base Sepolia. Timestamp file fingerprints onchain without uploading files anywhere.",
+ "Prove a file existed without uploading it. Hash locally with SHA-256, timestamp the fingerprint on Base Sepolia, verify independently. No accounts, no backend, no tracking.",
url: "https://proof.kovina.org",
siteName: "OpenProof",
images: [
@@ -46,16 +56,16 @@ export const metadata: Metadata = {
url: "/og.png",
width: 1200,
height: 630,
- alt: "OpenProof cryptographic proof infrastructure built on Base",
+ alt: "OpenProof — privacy-first cryptographic proof-of-existence on Base Sepolia",
},
],
type: "website",
},
twitter: {
card: "summary_large_image",
- title: "OpenProof",
+ title: "OpenProof — Proof-of-Existence · File Fingerprinting · Blockchain Timestamping",
description:
- "Open-source cryptographic proof infrastructure built on Base Sepolia. Timestamp file fingerprints onchain without uploading files anywhere.",
+ "Prove a file existed without uploading it. Hash locally with SHA-256, timestamp the fingerprint onchain, verify independently.",
images: ["/og.png"],
},
appleWebApp: {
diff --git a/src/app/page.tsx b/src/app/page.tsx
index d9997d4..bc3f2de 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -35,10 +35,36 @@ export default function Home() {
+ {/* ── Who it's for — lean, readable ──────────────── */}
+
+ Who uses OpenProof
+
+ Anyone who needs to prove a file existed at a specific time — without
+ revealing or uploading the file itself.
+
+
+ {[
+ ["Developers", "Timestamp release artifacts, build outputs, and dependency manifests to verify integrity later."],
+ ["Creators & artists", "Prove your original work existed before publishing, sharing, or sending it to a collaborator."],
+ ["Researchers & academics", "Establish priority of findings, datasets, and preprints before peer review or publication."],
+ ["Legal professionals", "Create independently verifiable timestamps for contracts, disclosures, and records of counsel."],
+ ["Journalists", "Anchoring source material, internal communications, and unpublished drafts to a permanent timestamp."],
+ ["Businesses & compliance", "Document integrity checks for regulatory records, audit trails, and internal policy adherence."],
+ ["Archivists & preservationists", "Long-term integrity verification for digital collections, cultural records, and historical documents."],
+ ["Individuals", "Personal records — wills, letters, receipts, photos, certificates — anyone can timestamp anything."],
+ ].map(([title, desc]) => (
+
+
{title as string}
+
{desc as string}
+
+ ))}
+
+
+
{/* ── Editorial: How it works ──────────────────────
Large numbers. Horizontal rhythm. No cards.
───────────────────────────────────────────── */}
-
+
How it works
{[
@@ -57,6 +83,85 @@ export default function Home() {
+ {/* ── Real-world scenarios ───────────────────────── */}
+
+
+
When to timestamp a file
+
+ A blockchain timestamp is useful any time you want to prove a file
+ existed before an event — publication, collaboration, disclosure, or
+ loss. The hash captures the file's identity at that moment.
+
+
+ {[
+ {
+ t: "Before publishing",
+ d: "Timestamp a draft or dataset before you publish. If someone later claims you copied them, the onchain fingerprint shows your file existed first.",
+ },
+ {
+ t: "Before sharing with others",
+ d: "Send a file to a collaborator? Timestamp it first. If the relationship sours, you can prove you held the original at a known time.",
+ },
+ {
+ t: "Before archiving",
+ d: "Timestamp a file before moving it to cold storage or a new format. Years later, verify the content hasn't drifted from the original.",
+ },
+ {
+ t: "Before regulatory submission",
+ d: "Records, logs, and compliance documents can be timestamped before submission. The onchain record serves as an independent integrity checkpoint.",
+ },
+ ].map(({ t, d }) => (
+
+ ))}
+
+
+
+
+ {/* ── What it proves vs doesn't ──────────────────── */}
+
+ What a proof means
+
+
+
OpenProof proves
+
+ {[
+ "A specific SHA-256 fingerprint existed in the registry at a recorded block time.",
+ "A specific wallet address submitted that hash for registration.",
+ "A file you hold today produces the same hash (it is unchanged since registration).",
+ ].map((item) => (
+ -
+
+ ✓
+
+ {item}
+
+ ))}
+
+
+
+
OpenProof does not prove
+
+ {[
+ "Who created, owns, or has rights to the file.",
+ "That the file contents are true, accurate, or correct.",
+ "That the file is legally valid or compliant with any regulation.",
+ "Recovery of the original file if it is lost.",
+ ].map((item) => (
+ -
+
+ ✗
+
+ {item}
+
+ ))}
+
+
+
+
+
{/* ── Registry — sleek horizontal strip ──────────
Like a stock ticker. No box.
───────────────────────────────────────────── */}
@@ -72,10 +177,40 @@ export default function Home() {
+ {/* ── Privacy-first messaging ───────────────────── */}
+
+ Privacy by design
+
+ {[
+ {
+ t: "No uploads",
+ d: "Files are hashed locally in your browser using the native Web Crypto API. The bytes never leave your device. Only the 32-byte SHA-256 hash leaves your browser — and only when you choose to register it.",
+ },
+ {
+ t: "No accounts",
+ d: "There is no sign-up, no profile, no database of users. OpenProof has no backend. Your proof history lives in your browser's local storage, not on a server.",
+ },
+ {
+ t: "Permanent verification",
+ d: "Once a hash is registered on Base Sepolia, it is immutable. Anyone can verify the proof using the onchain record alone — no website, no account, no special software required.",
+ },
+ {
+ t: "No tracking",
+ d: "OpenProof contains no analytics scripts, no tracking pixels, no cookies, and no telemetry. There is nothing to opt out of because nothing is collected.",
+ },
+ ].map(({ t, d }) => (
+
+ ))}
+
+
+
{/* ── Brand statement ─────────────────────────────
Bold. Simple. No card, no border.
───────────────────────────────────────────── */}
-
+
OpenProof is proof-of-existence infrastructure. A SHA-256 fingerprint
on Base Sepolia. No backend, no database, no tracking. Just a hash
diff --git a/src/app/verify/page.tsx b/src/app/verify/page.tsx
index ad02d56..768a45c 100644
--- a/src/app/verify/page.tsx
+++ b/src/app/verify/page.tsx
@@ -82,7 +82,9 @@ export default function VerifyProofPage() {
Check a fingerprint
on Base Sepolia.
- Public read. No wallet required. Hash a file locally and check the onchain registry.
+ Public read. No wallet required. Hash a file locally and check whether
+ its fingerprint exists in the onchain registry. Prove a file is unchanged
+ since it was registered.
diff --git a/src/components/file-drop.tsx b/src/components/file-drop.tsx
index b8dacf7..7b1ca10 100644
--- a/src/components/file-drop.tsx
+++ b/src/components/file-drop.tsx
@@ -25,7 +25,7 @@ export function FileDrop({
const selectedCount = files.length || (file ? 1 : 0);
const defaultHelperText = file
? `${formatBytes(file.size)}`
- : `The file stays in your browser. Max: ${formatBytes(maxFileSizeBytes)}.`;
+ : `Your file stays in your browser. Only its SHA-256 fingerprint can leave. Max: ${formatBytes(maxFileSizeBytes)}.`;
function handleFiles(selectedFiles: File[]) {
if (!selectedFiles.length || disabled) return;