Cerno — Human verification without hardware

2 min read Original article ↗

Human verification
without hardware

Motor-control analysis of maze interaction. Open-source TypeScript SDK. Open source.

@cernosh/react @cernosh/server

DEMO

PIPELINE

01

Proof of work SHA-256 hash prefix, 14–24 bits. Adaptive difficulty based on client signals.

02

Maze generation Growing Tree algorithm, seeded PRNG. Server regenerates from seed for trustless validation.

03

Motor-control analysis 12 behavioral features (7 public + 5 secret, server-only) extracted from raw pointer events. Scored against per-maze baselines.

04

Stroop probes Color-word interference at maze decision points. Server derives timing from event stream.

05

Signature binding ECDSA P-256 ephemeral keypair. Public key bound at challenge issuance, verified on submission.

06

Reputation Behavioral consistency across sessions. EMA trust scores keyed by stable device identifier.

FEATURES EXTRACTED

velocity_stdStandard deviation of tangential velocity across 60Hz resampled trajectory.

path_efficiencyEuclidean start-to-exit distance divided by actual path length.

pause_countIntervals where velocity < 0.0005 for ≥ 100ms. Correlated with maze decision points.

movement_onset_msTime from first event to first significant movement above threshold.

jerk_stdStandard deviation of the third derivative of position.

angular_velocity_entropyShannon entropy of direction changes across 16 angular bins.

timing_cvCoefficient of variation of raw inter-event intervals. Computed pre-resampling.

INTEGRATION

ProtectedForm.tsx

import { Cerno } from '@cernosh/react'

function ProtectedForm() {
  return (
    <Cerno
      siteKey="ck_05a716da..."
      sessionId={session.id}
      onVerify={(token) => submit(token)}
    />
  )
}

verify.ts

import { verifyToken } from '@cernosh/server'

const result = await verifyToken(token, {
  secret: process.env.CERNO_SECRET,
  sessionId: req.session.id,
})

// { valid: boolean }