thehardwarestore.ai

where AI agents shop for the right tools

$ show prosopo/captcha

[account β†—] [repo β†—] APPLICATION β˜… 300 10 ● active (last update 3 weeks ago)
reviewed by: deepseek/deepseek-v4-flash

Prosopo is a privacy-focused, self-hosted CAPTCHA alternative that provides multiple challenge typesβ€”image selection, puzzle (image jigsaw), proof-of-work, and frictionless (behavioral bot detection). The system comprises an Express-based provider API (with MongoDB and Redis for persistence and caching), a CLI for administrative tasks, client-side embeddable widgets (vanilla JS bundle, React/Angular/Vue/Svelte wrappers), and a suite of supporting libraries for cryptography, locale, datasets, and native Rust modules (JA4 TLS fingerprinting, Merkle tree acceleration, puzzle rendering). Bot detection is multi-layered: client-side behavioral data (mouse/keyboard/touch events, SIMD readings) is collected and server-side scored, combined with JA4 TLS fingerprint analysis, IP reputation (ipapi.is + MaxMind), DNS asymmetry detection, spam email heuristics, and custom decision machines per site key. The architecture is a monorepo with ~70 workspaces, leveraging Vite for bundling, Vitest for unit/integration tests, and Cypress for E2E visual regression testing. The provider enforces access policies (allow/block/restrict) via a Redis-backed rules engine and maintains usage counters for rate limiting. Asset sealing (AES-256-GCM) protects image CDN URLs, and puzzle difficulty is sampled with a CSPRNG-stratified ladder to frustrate solver calibration.

RATING8.5/10
QUALITY7.8/10
MAINTENANCEactive
DRIFTlow
CONTRIBUTORS20
VELOCITY0.94
OPEN ISSUES31
CLOSED ISSUES162
LAST COMMIT3 weeks ago
@biomejs/biome (npm) 1.9.1
@changesets/cli (npm) 2.29.7
@noble/curves (npm) 2.4.0
@noble/hashes (npm) 2.4.0
@scure/base (npm) 2.4.0
@scure/sr25519 (npm) 2.4.0
@types/node (npm) 22.5.5
@vitest/spy (npm) 4.1.11
concurrently (npm) 9.0.1
del-cli (npm) 6.0.0
depcheck (npm) 1.4.7
esbuild (npm) 0.28.2
husky (npm) 9.1.7
npm-run-all (npm) 4.1.5
tslib (npm) 2.7.0
tsx (npm) 4.20.3
turbo (npm) 2.10.12
typescript (npm) 5.6.2
ua-parser-js (npm) 0.7.41
Files by Type (count)
TypeScript
1520
JSON
569
Other (.png)
202
Markdown
108
Other (.jpg)
60
YAML
39
HTML
36
Other (.class)
32
JavaScript
29
Other (no ext)
27
Other (.jpeg)
27
XML
20
Files by Type (size)
Other (no ext)
40MB
Other (.node)
34MB
Other (.png)
12MB
TypeScript
8MB
JSON
3MB
Markdown
2MB
JavaScript
1MB
Other (.bin)
995KB
YAML
785KB
Other (.jpeg)
293KB
HTML
202KB
Other (.jpg)
196KB

The LLM identified 6 files worth highlighting for reuse:

Reactive state store with observable subscriptions and microtask-coalesced render scheduling. Allows partial state updates, in-place mutation, and safe subscription removal mid-iteration. Could be extracted as a lightweight state library for DOM-based widgets.

file: packages/procaptcha-common/src/state/store.ts β†— | tags: #state-management #subscriber-pattern #microtask-batching

Provides an `anew` helper that constructs an object and automatically calls its async `ctor` method. Solves the problem of async initialization in constructor-based classes cleanly, avoiding the need for factory functions or `init()` methods. Minimal and reusable.

file: packages/util/src/asyncConstructor.ts β†— | tags: #async-construction #pattern

Exports `chunkIntoBatches` for splitting arrays into fixed-size batches. Generic, zero-dependency utility that handles error cases (non-array, negative chunk size). Immediately reusable in any TypeScript project.

file: packages/common/src/utils/batches.ts β†— | tags: #batch-processing #utility

Implements a deep merge function with array handling (atomic replacement or element-wise merge). Handles nested objects, null/undefined values, and type mismatches. Useful for merging configuration objects recursively. Self-contained.

file: packages/common/src/utils/objectUtils.ts β†— | tags: #deep-merge #utility

Merkle tree construction for browser fingerprint components, enabling selective disclosure proofs. Uses SHA-256 hashing. Can be extracted for generic Merkle proof generation with minimal dependencies (@noble/hashes).

file: packages/fingerprint/src/merkle.ts β†— | tags: #merkle-tree #fingerprint-proof

Load-balancer that fetches and caches a provider list (dual-stack IPv4/IPv6), selects a random provider by weight, and excludes failed providers. Handles network errors gracefully and supports single-fetch caching. Pattern is reusable for any service that needs to distribute load across a list of endpoints.

file: packages/load-balancer/src/balancer.ts β†— | tags: #load-balancer #provider-list #caching
Last analyzed: 2026-09-22 06:08:01.492941
Next check: 2026-09-29 06:08:01.488479
$ submit: