Human verification
without hardware

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

@cernosh/react @cernosh/server
velocity_std
path_efficiency
pause_count
movement_onset_ms
jerk_std
angular_velocity_entropy
timing_cv
Score

Trace from green to red

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