Assert the text users actually see, not just what is in the DOM. RenderCheck takes a screenshot in your
Playwright or Cypress test, reads it with OCR on your machine, and fails the test when the rendered text is
wrong, too faint to read, or missing. No API key, no upload, no network calls.
Expected to find text "[Total: $14.00]" but OCR read "[Total: €14.00]" (Confidence: 96%)
Diff: Total: [$]14.00 → Total: [€]14.00
Check from a screenshot that text is really visible to users. Local, offline OCR.
2026-11-09
Stars
—
Tools
—
Uptime
—
npm install --save-dev @rendercheck/sdk
import { test } from '@playwright/test';
import { expect } from '@rendercheck/sdk/playwright';
test('checkout shows the right total', async ({ page }) => {
await page.goto('/checkout');
await expect(page).toShowText('Total: $14.00');
});
Status: developer beta. Cypress support has been run in Cypress 13 (Electron, Linux) only.
This repository also contains the free browser tool at getrendercheck.com, which extracts text from images
entirely in your browser (Tesseract.js, WebAssembly). The rest of this README describes that tool.
Free image-to-text tool
Free, private OCR that runs entirely in your browser: zero API costs, and your images never leave your device.
How it is built: see docs/ARCHITECTURE.md for the system, browser and SDK diagrams and a table mapping each privacy claim to the code and test that back it.
✨ Features
🚀 Fast - Runs on your device, so there is no upload wait
🔒 Private - Images are read in your browser and are not uploaded
🤖 Local OCR - Tesseract.js (WebAssembly) runs in your browser, self-hosted, with no model download
📊 Honest confidence - Low-confidence results are returned and flagged, not silently replaced
🎨 Image Enhancement - Preprocessing steps before recognition
💰 Completely Free - No API costs, no hidden fees
🌓 Dark/Light Mode - Beautiful UI with theme toggle
📱 Mobile Friendly - Responsive design for all devices
Accuracy depends on the image. There is no general accuracy figure; packages/rendercheck/benchmarks is a small self-made suite that shows the class of bug and lists the cases where it is wrong
🧩 Spec-Driven Development (SDD)
This repo uses Spec-Driven Development for reliability and accessibility. All features, APIs, schemas, and UX contracts are defined in /specs and enforced in CI.
Always read relevant specs before proposing changes
Update tests and contracts if specs change
Use BDD runner and schema guard helpers for validation
PR Checklist
If spec changed, update tests & ADR
BDD passing
Schema/contract diffs clean
No SEO/a11y regressions
CI Gates
npm run spec:lint: Spectral lint for OpenAPI
npm run spec:schemas: Validate JSON schemas and tokens
npm run spec:test: Playwright BDD tests
npm run spec:diff: OAS diff for breaking changes
Prerequisites
Node.js 20+
npm 10+ or yarn 4+
Quick Start (Development)
# Clone and setup
git clone https://github.com/ParthibanRajasekaran/text-from-image.git
cd text-from-image
npm install
# Start dev server
npm run dev
# Visit http://localhost:5173
# Run tests
npm run test
# Build for production
npm run build
🚀 Deployment
Deploy to Vercel (Production)
Deploy your EXACT local code to production with zero drift:
# First time setup
npm run vercel:link # Link to your Vercel project
npm run vercel:pull:prod # Pull production environment variables
# Deploy to production
npm run deploy:prod
After deployment, verify the footer shows the correct commit SHA matching your local git commit.
GitHub Actions (Automated Deploys)
This project uses controlled deployments to avoid accidental deploys:
Preview Deployments (Pull Requests):
Only triggers when PR has deploy:preview label
Deploys to preview URL, posted as PR comment
Cancelled automatically when new commits pushed
Production Deployments (Main Branch):
Automatically deploys on push to main branch
Skip with [skip deploy] in commit message
Only deploys if app files changed (not docs-only)
Manual Deployment:
GitHub UI: Actions → Deploy to Vercel → Run workflow
Required GitHub Secrets
Add these in Settings → Secrets and variables → Actions:
# Generate interactive bundle visualization
npm run analyze
# Opens stats.html with treemap of all chunks
The analyzer shows:
Which dependencies contribute most to bundle size
How code splitting distributes code across chunks
Gzipped and Brotli compressed sizes
Duplicate dependencies (if any)
How Code Splitting Works
1. Tesseract.js (23 KB)
// ❌ Before: Loaded upfront
import Tesseract from 'tesseract.js';
// ✅ After: Loaded when user starts OCR
const { recognize } = await import('tesseract.js');
2. jsPDF (40 KB)
// ❌ Before: CDN script tag in index.html
<script src="https://cdn.../jspdf.umd.min.js"></script>
// ✅ After: Loaded only when user exports PDF
const { default: jsPDF } = await import('jspdf');
Performance Impact
Metric
Before
After
Improvement
First load JS
~850 KB
~285 KB
67% reduction
Time to Interactive
~5.2s
~1.8s
3.4s faster
Lighthouse Score
72
94
+22 points
Build warnings
"Some chunks > 500 KB"
✅ None
Fixed
Best Practices
✅ DO:
Keep initial bundle under 300 KB (gzipped)
Use dynamic imports for heavy libraries
Analyze bundle regularly with npm run analyze
Lazy-load features users might not use
❌ DON'T:
Import entire libraries when you only need a few functions
Load OCR engines upfront before user uploads image
Bundle large assets (WASM, models) - serve from CDN or /public
services/*Service.ts - Dynamic imports for OCR engines
utils/fileUtils.ts - Dynamic import for jsPDF
package.json - Bundle analyzer script
🔒 No ads, no third-party scripts
The site ships no advertising and loads nothing from a third party at runtime. This is deliberate:
The Content-Security-Policy in vercel.json is script-src 'self' 'wasm-unsafe-eval' and connect-src 'self', so the OCR worker and WebAssembly run from the site's own origin and cannot be interfered with.
RenderCheck's pitch is that nothing leaves the browser. An ad network would fill the network panel with requests that make that claim hard to believe.
e2e/no-third-party.spec.ts fails if any route requests another origin or if the policy allows an ad host.
SEO:
All pages have unique meta tags and canonical URLs.
Guides and policy pages are crawlable and linked from Home/footer.
robots.txt and sitemap.xml are present.
Performance:
No OCR/UX regressions; light/dark mode consistent.