Origami CAPTCHA is a self-hosted, zero-JavaScript 'drag the item' CAPTCHA written in Go that uses native HTML/CSS interactions and server-side state to authenticate users.

Stars

5

7-day growth

No data

Forks

1

Open issues

0

License

MIT

Last updated

2026-07-28

AI repository intelligence
FR-AI / ANALYSIS

Why it is worth attention

It solves CAPTCHA without any client-side JavaScript by leveraging HTML radio inputs, CSS :checked states, and image input coordinate submission, making it suitable for Tor, NoScript, and privacy-focused environments.

Who it is for

  • Tor Browser users with JavaScript disabled
  • Privacy-conscious developers wanting self-hosted, tracker-free CAPTCHA
  • Accessibility advocates seeking JS-free alternatives
  • Web developers needing bot protection for static or low-JS sites

Use cases

  • Contact forms on privacy-oriented websites
  • Login pages requiring CAPTCHA without third-party scripts
  • Fallback CAPTCHA for accessibility or non-JS environments
  • Authorization flow for self-hosted applications

Strengths

  • Zero JavaScript dependency – works without client-side scripting
  • Self-hosted and privacy-friendly – no external tracking or behavioral analysis
  • Server-driven state – all challenge logic and verification on the backend
  • Simple deployment – single Go binary with minimal configuration

Considerations

  • Mobile uses tap-to-place instead of drag due to lack of cursor on touch devices
  • Requires Go 1.26+ to compile and run
  • Self-hosting overhead compared to managed CAPTCHA services

README quick start

Origami CAPTCHA

Origami CAPTCHA is a self-hosted, zero-JavaScript "Drag The Item" CAPTCHA authorization provider written in Go. Users solve a responsive visual puzzle by moving two origami objects onto their matching upright outlines.

Demo

Primary purpose

Origami CAPTCHA is designed for environments where client-side JavaScript is unavailable, unwanted, or deliberately disabled.

  • Tor Browser users running NoScript or higher security modes that disable JavaScript.
  • Privacy-focused deployments that want a CAPTCHA option without third-party scripts, tracking widgets, or browser-side behavioral collection.
  • Accessibility and compatibility fallback.
  • Additional CAPTCHA variation for Tor environments

How dragging works without JavaScript

The interaction uses native HTML form controls and CSS while the server keeps all challenge state:

  1. Each origami piece is a `` connected to a hidden radio input. Clicking or tapping the piece selects it without JavaScript.
  2. CSS uses the selected radio's :checked state to change the cursor into that origami piece.
  3. A transparent `` covers the challenge canvas. While it is active, CSS hides the original piece, creating the visual effect of picking it up and dragging it.
  4. When the user releases or taps the canvas, the browser natively submits pick.x and pick.y coordinates to /c/{challenge_id}.
  5. The server stores the submitted position and renders the updated challenge page. No position or solution state is stored in browser JavaScript.
  6. Pressing Confirm sends a normal form POST to /verify. The server checks whether both submitted coordinates are close enough to their matching upright outlines.

The essential browser behavior is provided by:


...

An image input automatically submits coordinates as pick.x and pick.y, which makes the server-driven drag interaction possible without executable client-side code.

Limitation on mobile

The desktop drag effect depends on a mouse cursor that can visually become the selected origami piece. Touch devices do not have that cursor, so a true drag effect is not available without client-side JavaScript. On mobile, the challenge intentionally uses a tap-to-place flow instead: tap an origami piece to select

Description

A self-hosted, zero-JavaScript "Drag The Item" CAPTCHA authorization provider for privacy-focused websites.

Related repositories

Similar projects matched by category, topics, and programming language.

m-novotny
Featured
m-novotny GitHub avatar

memguard-rs

A Rust library that provides secure memory handling primitives including zeroization on drop, memory locking, constant-time comparison, and compile-time guarded regions, with zero dependencies and no_std support.

Embedded & IoTSecurity
131
uzairansaruzi
Featured
uzairansaruzi GitHub avatar

hermex

Hermex is a native SwiftUI iPhone app that lets you control a self-hosted Hermes AI agent directly from your phone, with no subscriptions, tracking, or third-party relay.

AI & Machine LearningLarge Language Models
941
S40911120
Featured
S40911120 GitHub avatar

recensa

Recensa is a self-hosted web viewer that indexes Claude Code session transcripts into a local SQLite database, enabling full-text search, replay, and audit of all past agent conversations without uploading data anywhere.

AI & Machine LearningLarge Language Models
67