Live Demo: https://effortless-app.com
Effortless is a project I built to explore a simple question:
How can someone prove that a piece of work was created by a person without storing or analyzing the work itself?
Instead of looking at the final document and trying to guess whether AI was used, Effortless focuses on the writing process. It creates a verification certificate that is linked to a specific document and can later be used to verify that the document was produced during a real writing session.
The platform does not store or read document content.
Landing Page
|
Session Dashboard
|
Writing Editor
|
How It Works
|
With AI tools becoming more common, it is getting harder to know how a document was created.
Most AI detectors try to analyze the text itself and make a prediction. These systems are often unreliable and can incorrectly flag human-written work.
Effortless takes a different approach.
Instead of analyzing what was written, it focuses on how it was written.
A user writes inside the Effortless editor.
During the session, the application observes non-content signals such as:
- Typing patterns
- Pauses during writing
- Editing and revision behavior
The document content itself is never analyzed or stored.
When the session is finished:
- The document is exported as a PDF.
- A SHA-256 hash is generated from the PDF.
- A verification certificate is created using that hash.
Anyone can later verify that:
- The document matches the certificate.
- The certificate belongs to that exact document.
- The document was created during a recorded writing session.
Effortless never stores document content.
The following diagram illustrates how the editor, tracking code, scoring logic, and database work together to save and verify writing sessions:
flowchart TD
%% Styling Configuration
classDef client fill:#0d2a4a,stroke:#00a3ff,stroke-width:2px,color:#fff;
classDef db fill:#0b261a,stroke:#10b981,stroke-width:2px,color:#fff;
classDef ext fill:#26262b,stroke:#a1a1aa,stroke-width:2px,color:#fff;
subgraph Client ["Frontend App"]
UI["Editor UI (Tiptap Editor)"]:::client
SDK["Tracking SDK (tracking.ts)"]:::client
Scoring["Scoring Engine (scoring.ts)"]:::client
App["Supabase Client"]:::client
end
subgraph Backend ["Database (Supabase)"]
RLS["Row Level Security (RLS)"]:::db
SessionsTable[("Sessions Table")]:::db
ReportsTable[("Reports Table")]:::db
end
subgraph DocumentFlow ["Document Export"]
PDF["Generated PDF Document"]:::ext
Hash["SHA-256 Hash"]:::ext
end
%% Session Tracking Flow
UI -->|"User typing, pauses, tab-switches"| SDK
SDK -->|"Writing patterns (no text content)"| App
%% PDF Hashing Flow
UI -->|"1. Export to PDF"| PDF
PDF -->|"2. Generate SHA-256 Hash"| Hash
Hash -->|"3. Save hash to session"| App
%% Data Persistence Flow
App -->|"4. Save session data and hash"| RLS
RLS -->|"Enforce ownership rules"| SessionsTable
App -->|"5. Create verification report"| ReportsTable
%% Scoring Process
SessionsTable -.->|"Retrieve session metrics"| Scoring
Scoring -->|"6. Calculate score (0-100)"| UI
%% Verification flow
PublicUser["Public Verifier"]:::ext
PublicUser -->|"Upload Document & Certificate"| VerifyPage["Verification Tool (Verify.tsx)"]:::client
VerifyPage -->|"Extract text and compare hashes"| MatchResult{"Do hashes match?"}:::client
MatchResult -->|"Yes"| Valid["Verified Genuine"]:::client
MatchResult -->|"No"| Invalid["Verification Failed"]:::client
%% Online verification flow (Token gated)
PublicUser -->|"Open verification link"| App
App -->|"Find report by token"| ReportsTable
- Frontend App: Provides the writing workspace and runs the tracking and scoring code in the browser.
- Tracking SDK (
src/lib/tracking.ts): Monitors browser input events, window focus, and tab visibility to record writing patterns (such as pauses, keystrokes, and copy-paste sizes). It does not log raw text or keystrokes. - Scoring Engine (
src/lib/scoring.ts): Calculates the session score (0-100) using rules based on writing speed, focus time, and the volume of pasted text. - Database (Supabase): Stores session metrics and the PDF document hash. Row Level Security (RLS) ensures only the author can access their session details, while allowing public verification using a token.
- The document was created through a real writing process.
- The verification certificate is linked to a specific document.
- Any modification to the document invalidates the certificate.
- Store document text
- Log raw keystrokes
- Capture clipboard contents
- Record screens
- Analyze writing quality or meaning
- Determine whether AI was used
- Claim originality or authorship
The goal is to provide evidence about the writing process, not to judge the content.
- Privacy-focused verification system
- Verification certificates linked to individual documents
- Writing session tracking using behavioral signals
- Independent verification without requiring an account
- Clean writing dashboard and session management tools
- Secure data access using Supabase Row Level Security (RLS)
- React 18 + Vite
- TypeScript
- Tailwind CSS
- shadcn/ui
- Framer Motion
- Tiptap
- TanStack Query
- Supabase
- React Hook Form
- Zod
- Vitest
- Playwright
- ESLint
src/
├── components/ # Reusable UI components
│ ├── ui/ # shadcn primitives
│ └── ... # Feature-specific components
├── pages/ # Route-level pages
│ ├── Auth.tsx
│ ├── Sessions.tsx
│ ├── WritingSession.tsx
│ └── ...
├── hooks/ # Custom React hooks
├── lib/ # Utilities and helpers
├── integrations/ # External services (Supabase)
└── App.tsx # Application entry + routing- Node.js v18+
- npm, yarn, or bun
- Clone the repository
git clone <repository-url>
cd effortless- Install dependencies
npm installCreate a .env file:
VITE_SUPABASE_URL=your_supabase_project_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
VITE_EMAILJS_SERVICE_ID=your_emailjs_service_id
VITE_EMAILJS_TEMPLATE_ID=your_emailjs_template_id
VITE_EMAILJS_PUBLIC_KEY=your_emailjs_public_keynpm run devThe application will start on http://localhost:8080 (or another available port).
| Command | Description |
|---|---|
| npm run dev | Start the development server |
| npm run build | Build for production |
| npm run preview | Preview the production build |
| npm run lint | Run ESLint |
| npm test | Run unit tests |
- Verification certificates are linked to a specific document.
- Any change to the document after verification will invalidate the certificate.
- Users are responsible for storing their documents and certificates.
This repository is provided for demonstration and portfolio purposes.
All rights reserved.



