OpenPorte is a community-maintained fork of the retired ALTCHA Spam Protection plugin for WordPress (v1) - a free, open source, self-hostable, privacy-friendly CAPTCHA alternative.
Website: https://github.com/jcberthon/openporte
WordPress Plugin Directory: https://wordpress.org/plugins/openporte/
Tip
Need help? See SUPPORT.md.
Note
AI-assisted project. Architecture, security decisions, and final review are mine; AI tools (Claude, Mistral, and others) help with drafting code, tests, translations, and documentation — without them, one person couldn't keep this fork alive.
The original ALTCHA WordPress plugin v1 was open source (GPLv2). Its authors released a v2/3 that is no longer open source, moved some previously-free features behind a paywall, and no longer maintain v1 (they recommend migrating to v2/3).
OpenPorte continues the v1 line as free software (GPLv2 or later), for people who want to stay on a fully open-source, self-hosted solution. It is based on the last GPL release of ALTCHA v1 (1.26.1).
OpenPorte uses the upstream ALTCHA widget (MIT-licensed) as a bundled dependency.
Backward-compatible with ALTCHA v1: settings migrate automatically (the
original altcha_* options are left in place, so you can roll back), and the
[altcha] shortcode, the altcha/v1 REST namespace and the altcha_* hooks
keep working as deprecated aliases of their openporte equivalents.
Integrations for paid-only plugins (e.g. Enfold) are also deprecated and
will be removed.
- CoBlocks
- Contact Form 7
- Elementor Pro Forms (deprecated — paid plugin)
- Enfold Theme (deprecated — paid plugin)
- Formidable Forms
- Forminator
- GravityForms
- HTML Forms
- WPDiscuz
- WPForms
- WP-Members
- WordPress Login, Register, Password reset
- WordPress Comments
- WooCommerce
- Custom HTML (via the
[openporte]shortcode, or the deprecated[altcha]alias)
The plugin supports the Floating UI but with known limitations:
Currently the Floating UI does not work with:
- Forminator with multi-step forms
OpenPorte is listed in the WordPress.org plugin directory. So you can install it directly from the admin UI on your site.
- Open the WordPress admin UI
- Under Plugins → Add Plugin, search for openporte
- Install it and activate it.
- Review the settings and enable your integrations
You can also download the GitHub release and install it via the WordPress admin UI.
- Download the
.zipfrom the Releases. - Under Plugins → Add Plugin, click Upload Plugin and select the downloaded
.zipfile. - Activate the plugin through the 'Plugins' menu in WordPress
- Review the settings and enable your integrations
OpenPorte verifies submissions in one of two modes, selected in the settings (API Mode):
- Self-hosted (default) — a proof-of-work challenge is issued and verified by your own WordPress site via the REST API. Fully self-contained, no external service, no account.
- Custom — point the Challenge URL at your own ALTCHA-compatible backend (e.g. a self-hosted ALTCHA Sentinel); submissions are verified with your site's signing secret.
The paid altcha.org regional SaaS classifier offered by earlier versions has been removed; both remaining modes are free and self-hostable.
This plugin requires the WordPress REST API. If you are using any "Disable REST API" plugins, ensure that the endpoint /altcha/v1/challenge (now deprecated) and /openporte/v1/challenge is allowed.
The plugin provides several hooks to customize or extend its functionality.
Each hook below is also fired under its old altcha_* name as a deprecated
alias (via WordPress' deprecated-hook mechanism); use the openporte_* names.
-
apply_filters('openporte_challenge_url', $challenge_url)
Override the challenge URL.
Returns:string -
apply_filters('openporte_integrations', $integrations)
Modify the list of available integrations. Supported values:captcha,captcha_spamfilter,shortcode.
Returns:array<string> -
apply_filters('openporte_plugin_active', false, $name)
Check if an integration by$nameis active.
Returns:bool -
apply_filters('openporte_widget_attrs', $attrs, $mode, $language, $name)
Override widget attributes.
Returns:array<string, mixed> -
apply_filters('openporte_widget_html', $html, $mode, $language, $name)
Override the entire widget HTML.
Returns:string -
apply_filters('openporte_translations', $translations, $language)
Override translation strings.
Returns:array<string, string>
-
do_action('openporte_verify_result', $result)
Triggered after payload verification.-
$result:boolverification result. -
Full server verification payload is available via:
OpenPortePlugin::$instance->spamfilter_result
-
GPLv2 - see LICENSE