DEV Community

Cover image for Introducing BioKyn: Bot Protection Without CAPTCHA Puzzles
Aswanth R
Aswanth R

Posted on

Introducing BioKyn: Bot Protection Without CAPTCHA Puzzles

Bot protection that respects your users.

Today, I'm excited to introduce BioKyn — an open-source, self-hosted bot mitigation system designed to protect websites without forcing visitors through traditional CAPTCHA puzzles.

Website: https://biokyn.js.org/

GitHub: https://github.com/biokyn/biokyn

The problem with traditional CAPTCHA

We've all experienced it.

You're trying to access a website, and suddenly you're asked to:

  • Identify traffic lights.
  • Select buses.
  • Click every bicycle.
  • Solve puzzles just to continue browsing.

These challenges create friction for legitimate users, introduce accessibility barriers, and often depend on third-party services that collect additional information.

I wanted to explore a different approach.

What if bot protection could happen without making users prove they're human through puzzles?

That's the idea behind BioKyn.

What is BioKyn?

BioKyn is a free, open-source, privacy-focused alternative to traditional CAPTCHA-based bot protection.

Instead of relying on visual puzzles, BioKyn uses cryptographic verification and server-verifiable computational work to mitigate automated abuse.

Its design principles are:

  • Privacy first: No cookies, browser fingerprinting, or cross-site identifiers for verification.
  • Invisible by default: No traditional CAPTCHA puzzles or third-party verification widgets.
  • Accessible: The default verification lane doesn't require pointer interaction, and alternative verification paths are provided.
  • Self-hosted: Your verification infrastructure and data stay under your control.
  • Developer-friendly: Express and Next.js integrations, plus a compatible site verification endpoint.

How does it work?

BioKyn uses multiple verification mechanisms.

1. Argon2id Proof-of-Work

The browser performs computational work bound to a server-issued challenge.

The server independently verifies the result before granting a token.

2. RFC 9497 VOPRF

BioKyn uses the ristretto255-SHA512 VOPRF construction from RFC 9497.

This allows the issuance of cryptographically verifiable tokens while providing blindness properties that help prevent the issuer from linking issuance inputs to redeemed tokens.

3. WebAuthn

BioKyn also supports a WebAuthn verification lane using credentials registered with the server.

4. Behavioural signals

Browser kinematics, motion telemetry, and tamper signals can contribute to risk assessment.

An important architectural decision: these signals are advisory. They cannot independently grant verification tokens.

Only server-verifiable evidence grants tokens.

The architecture

BioKyn is organized into several packages:

Package Responsibility
@biokyn/protocol Cryptographic protocol, VOPRF, token formats, PoW and kinematics
@biokyn/client Browser-side verification and token issuance
@biokyn/server Verification, challenge issuance, WebAuthn and integrations
@biokyn/core Standalone HMAC-token primitives
@biokyn/shim Migration compatibility helpers

It also includes Redis-backed security stores, replay protection through nullifiers, rate limiting, key rotation, and Express/Next.js adapters.

Get started

Install the packages:

npm install @biokyn/server @biokyn/client
Enter fullscreen mode Exit fullscreen mode

Server-side example:

import {
  BioKynVerifier,
  biokynExpress,
  generateServerSecrets,
  createRateLimiter,
  MemoryRateLimitStore
} from '@biokyn/server';

const verifier = new BioKynVerifier({
  issuer: 'verify.example.com',
  ...generateServerSecrets(),
  sites: [{
    origin: 'http://localhost:3000',
    secret: process.env.BIOKYN_SITE_SECRET!
  }],
  pow: {
    memoryKiB: 19456,
    iterations: 1,
    parallelism: 1,
    difficultyBits: 8
  }
});

app.use(express.json());

app.use(biokynExpress(verifier, {
  basePath: '/biokyn',
  rateLimit: createRateLimiter({
    store: new MemoryRateLimitStore()
  })
}));
Enter fullscreen mode Exit fullscreen mode

Browser-side example:

import { requestInclusiveToken } from '@biokyn/client';

const { token } = await requestInclusiveToken({
  basePath: '/biokyn',
  expectedPublicKey
});
Enter fullscreen mode Exit fullscreen mode

Your backend can then submit the token to BioKyn's /siteverify endpoint.

For production deployments, configure persistent secrets, shared Redis stores, trusted proxies, TLS, and key rotation. See the deployment documentation before going live.

What's next?

BioKyn is an evolving open-source project.

Some of the directions I'm exploring include:

  • More framework integrations: Fastify, Hono, NestJS and Cloudflare Workers.
  • Privacy Pass interoperability.
  • Additional shared-store backends.
  • Public evaluation datasets and better calibration tools.
  • Expanded accessibility testing.

Independent cryptographic review, penetration testing, and real-world evaluation are also important outstanding milestones. A 1.0.0 release is not a security certification.

Get involved

BioKyn is released under the Apache-2.0 license.

You can explore the project, report issues, suggest improvements, and contribute.

Website: https://biokyn.js.org/

GitHub: https://github.com/biokyn/biokyn

Documentation: https://github.com/biokyn/biokyn/tree/main/docs

The web needs better bot protection. It shouldn't have to sacrifice user privacy or accessibility to get it.

Welcome to BioKyn.

Top comments (0)