Skip to content

Latest commit

 

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Effortless — Proof of Human Work

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.

Screenshots

Landing Page
Landing Page
Session Dashboard
Session Dashboard
Writing Editor
Writing Editor
How It Works
How It Works

What Problem Does This Solve?

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.

How It Works

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:

  1. The document is exported as a PDF.
  2. A SHA-256 hash is generated from the PDF.
  3. 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.

System Architecture

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
Loading

Component Architecture

  • 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.

What Effortless Proves

  • 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.

What Effortless Does Not Do

  • 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.

Features

  • 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)

Tech Stack

Frontend

  • React 18 + Vite
  • TypeScript
  • Tailwind CSS
  • shadcn/ui
  • Framer Motion
  • Tiptap

State & Data

  • TanStack Query
  • Supabase
  • React Hook Form
  • Zod

Testing & Quality

  • Vitest
  • Playwright
  • ESLint

Project Structure

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

Getting Started

Prerequisites

  • Node.js v18+
  • npm, yarn, or bun

Installation

  1. Clone the repository
git clone <repository-url>
cd effortless
  1. Install dependencies
npm install

Environment Variables

Create 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_key

Run Locally

npm run dev

The application will start on http://localhost:8080 (or another available port).

Scripts

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

Notes

  • 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.

License

This repository is provided for demonstration and portfolio purposes.

All rights reserved.

About

Software for verifying human-created work by analyzing the writing process and binding it to a cryptographic certificate.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages