200+
July 22, 2026
April 27, 2026
Twelve security modules. One lightweight plugin. Zero compromise.
Login Armor is a complete WordPress security stack built for agencies, freelancers and pros who deliver audit-ready sites. No premium tier, no bundled marketing dashboard, no telemetry. Every module runs locally, ships with safe defaults, and stays out of your way.
Stop juggling Wordfence’s bloat, Solid Security’s upsells, and Limit Login Attempts’ gaps — Login Armor delivers twelve independent modules in about one megabyte.
Built on the WordPress 7 native AI Client, one click turns your last thirty days of activity into a plain-language verdict, an IP picture and a short list of prioritised actions; “Explain with AI” does the same on a single incident. Minimised mode (anonymised signals) is the default and deep mode is an explicit opt-in. No API key is stored — it uses your own WordPress AI connector, so provider and cost stay yours. It always leads with a deterministic facts snapshot that works with or without AI.
GPL forever. PHP 8.1+. WordPress 6.8+. Zero dependencies.
Douze modules de sécurité. Une seule extension légère. Zéro compromis.
Login Armor est une stack complète de sécurité WordPress conçue pour les agences, les freelances et les pros qui livrent des sites prêts à passer un audit. Pas de version premium, pas de tableau de bord marketing intégré, pas de télémétrie. Chaque module tourne en local, embarque des réglages par défaut sécurisés, et reste discret.
Fini de jongler entre la lourdeur de Wordfence, les fenêtres d’upsell de Solid Security et les angles morts de Limit Login Attempts — Login Armor regroupe douze modules indépendants en environ un méga-octet.
Bâti sur le client IA natif de WordPress 7, un clic transforme vos trente derniers jours d’activité en un verdict en langage clair, un panorama des IP et une courte liste d’actions prioritaires ; « Expliquer avec l’IA » fait de même sur un incident. Le mode minimisé (signaux anonymisés) est par défaut, le mode approfondi est un opt-in explicite. Aucune clé API stockée : il utilise votre propre connecteur IA WordPress, le coût et le fournisseur restent les vôtres. Il s’ouvre toujours sur un instantané de faits déterministes, utile avec ou sans IA.
Login Armor est conçu et maintenu par Fabrice Ducarme de WPFormation, expert WordPress français obsédé par les sites propres, rapides et prêts pour l’audit. On l’utilise sur chaque site qu’on livre.
GPL pour toujours. PHP 8.1+. WordPress 6.8+. Zéro dépendance.
The AI Security Briefing and the “Explain with AI” incident analysis are powered by the WordPress 7 native AI Client (wp_ai_client_prompt()). When the administrator clicks the analysis button, LoginArmor asks WordPress to send a prompt to the AI connector that the administrator configured in their own WordPress (for example OpenAI, Anthropic or Google, depending on the connector). LoginArmor itself stores no API key and contacts no endpoint directly: the request, the provider and the cost are owned by the site’s own AI connector.
Data sent: a text prompt describing the security situation. In minimised mode (the default), only anonymised, non-identifying signals are included (counts, categories, severities, role buckets) – no IP address and no username in clear. In deep mode (an explicit, off-by-default opt-in), the prompt additionally includes real IP addresses and event details so the analysis can name specific sources. No data is ever sent unless the administrator clicks the analysis button.
This feature is inactive unless WordPress 7 (or the AI Building Blocks feature plugin) is present with a configured, approved AI connector. The applicable terms and privacy policy are those of the AI provider the administrator chose for their connector; please refer to that provider’s documentation.
When explicitly enabled and configured by the administrator in LoginArmor > Settings > Notifications, the plugin sends incident data to third-party services via webhooks.
Data sent: incident type, severity level, IP address, target username, event count, and site URL.
No data is sent unless the administrator actively enables and configures a notification channel.
The Activity Log tab uses WordPress core’s get_avatar() function to display user avatars. WordPress may send a hashed email address to Gravatar servers to retrieve avatar images. This is controlled by Settings > Discussion > Avatars.
When the administrator explicitly enables the Breach Check module (LoginArmor > Settings > Breach …
login-armor directory to /wp-content/plugins/For multisite: Network Activate the plugin to apply it across all sites.
my-login)If you forget your custom login URL:
login_armor_hide_slug row from the wp_options tablewp option delete login_armor_hide_slugNo. Hide Login always sends a one-time recovery URL to the admin email. If you lose the slug, check your inbox. The plugin also honors wp-cli fallback so you can reset anything from SSH.
No. Everything is lazy-loaded and indexed. On a normal login flow the extra SQL cost is under 2 ms.
Yes. IP detection honors trusted X-Forwarded-For headers; you pick the header in Settings.
Yes, subdomain and subfolder. Each site has its own modules, logs, and thresholds.
Yes, but disable overlapping modules on one side to avoid double lockouts.
Three custom tables in your own database: events, incidents, activity. Nothing leaves your server.
Settings are plain WordPress options. Export/import via WP-CLI or any standard options-sync tool.
Not currently. LoginArmor is fully free and open source. GPL forever.
Support forum: wordpress.org/support/plugin/login-armor/.
Accuracy release from a user report. Login Armor’s own blocks no longer count as failed passwords: a two-factor lockout, a two-factor rate limit, the mandatory-2FA gate, a honeypot catch and a reserved-username rejection each used to insert a brute-force attempt on top of their own sanction, so one mistyped 2FA code could push a legitimate user into the IP lockout while signing in with the correct password. Failed logins now record the real reason instead of always reporting “Wrong password”: the Events tab, the incident timeline, the Overview live tail and the CSV export distinguish a wrong password from an unknown account, cookies blocked by the browser, each of the plugin’s own gates, and a refusal coming from another plugin (shown with its code). Existing log rows keep the previous label. Also fixes a separate bug found while testing this release: the incidents table failed to create on MariaDB 11.7+/MySQL 9 because the vector column collided with a new reserved word, which silently disabled the whole Detection engine on those servers.
Hardening release from an external code audit; five confirmed issues fixed and each verified end-to-end (real HTTP flow locally, re-run under PHP 8.4, and validated on a live WordPress 7.0 / PHP 8.3 install). The Overview dashboard now computes the threat level and active-incident count over every active incident, so an older critical incident can no longer drop the headline back to “Normal”. A successful two-factor login now fires the canonical wp_login cycle, so failed-attempt counters reset, the login is logged, the single-session policy applies and third-party integrations run. Lockout escalation is now atomic under concurrency, so a burst of simultaneous failures can no longer turn a first offence into an immediate long ban. The Slack/Discord/generic notification webhooks are re-validated against private, reserved, link-local and IPv6-internal addresses before every send (SSRF), and CSV log exports neutralise spreadsheet formula injection from attacker-controlled fields. Plugin Check 0 ERROR.
Security release. Mandatory two-factor authentication is now a hard gate: a user in an enforced role who never enrolled and whose grace period has expired is blocked at login instead of being let in with only a redirect to their profile (reported by the WordPress Plugin Review Team). Existing users are never locked out unexpectedly – the grace window is started automatically the first time enforcement applies, and an admin can reopen it from the Users list (“Restart 2FA grace”) or via WP-CLI. Hardened: TOTP codes can no longer be replayed within their validity window (single-use per time-step, RFC 6238); the Activity Log webhook URL is validated against private, reserved, link-local and IPv6-internal addresses (SSRF), matching the notification channels; attacker-submitted usernames are neutralised before entering the optional AI incident prompt. A filter (login_armor_2fa_hard_enforcement) restores the previous soft behaviour if needed.
Coherence and lifecycle release. Fixes: deactivation now clears every scheduled task (three were left running); uninstall removes all options, user meta and caches from the newer modules (AI, Password Policy, Sessions, GeoIP, Firewall); disabling Two-Factor now asks for confirmation like every other module; the plugin’s own conflict warnings, silently hidden since 2.4.0, show again. Improvements: a composite database index speeds up brute-force lookups, open incidents are capped so the table cannot grow forever, and the admin UI is more consistent (numeric fields, empty states, module counters). New: a warning when a front-end login plugin such as Ultimate Member is active, since Two-Factor and Hide Login are not compatible with a front-end login form. No behaviour change on standard installs.
Fix: a “critical error” could occur during password recovery when another active plugin re-fires a WordPress core hook with an off-contract argument type or arity (for example a null passed to retrieve_password_message ahead of Login Armor). Strict parameter hints are relaxed, each with an internal type guard, on every core-hook callback across all modules; behaviour is unchanged on canonical WordPress calls. Generalises the 2.1.15 URL-builder fix to the whole plugin.
Feature release – request firewall, guided onboarding, fuller in-app docs.
Feature release – account-security hardening.
Feature release – the AI Security Briefing.
Fix: email/backup 2FA bouncing to “session expired” on browsers that don’t return the verification cookie; the form now also carries the session token. Security unchanged.
Fix: email/backup two-factor verification rejected in some browsers (notably Chrome); the form is now uncached and authenticated by the signed same-site cookie.
Fix: fatal error during authenticator-app setup on hosts whose wp-config.php does not define AUTH_KEY (e.g. some Infomaniak installs). Existing setups unaffected.
Fix: 2FA login screen – “use a different method” links now work, expired/locked sessions explain themselves, and the setup button reports errors.
Fix: the Security Score now counts default-on modules (Brute Force, Detection). Display and scoring only.
Cleaner user-agent labels in the Events table.
Migration-aware Activity Log integrity (amber “Keys changed” instead of a false TAMPERED alarm), an XML-RPC blind-spot warning, and a complete French translation.
Clearer attack-type labels on incidents, translatable admin toasts, French translation of the visible tabs, and an integrity-badge verify fix.
Fix: bulk actions now work when incidents are all resolved; the attack-vector pill shows only for XML-RPC/REST.
Incidents now record and show the attack vector (XML-RPC / REST / login form) and support bulk resolve/ignore.
Plain-permalink fixes (Hide Login URL, REST allowlist), activity-log coverage for 2FA/registration/reset, and Honeypot on WooCommerce and frontend forms.
Fix: fatal TypeError when plugins (e.g. WP Fastest Cache) call WordPress URL builders with off-contract argument types.
Fix: the prevent_author_enum toggle no longer blocks the legitimate ?author=N filter in the wp-admin Posts/Pages lists.
Fix: silent 2FA failure on non-trailing-slash permalinks (e.g. /%postname%) – the verify cookie path mismatched the request path.
Bug fixes, security hardening and i18n across the 2.1.x and 2.0.x series (Hide Login host-awareness, CSP, lockout delivery, REST scope, IPv6, HTTP/2, Activity Log integrity), through the initial 2.0.0 release. Full per-version notes: CHANGELOG.md in the plugin folder.
| Version | Download | Type |
|---|---|---|
| 2.4.5 | Download | Stable |
| 2.4.4 | Download | Stable |
| 2.4.3 | Download | Stable |
| 2.4.2 | Download | Stable |
| 2.4.1 | Download | Stable |
| 2.4.0 | Download | Stable |
| 2.3.0 | Download | Stable |
| 2.2.0 | Download | Stable |
| 2.1.26 | Download | Stable |
| 2.1.25 | Download | Stable |
| 2.1.23 | Download | Stable |
| 2.1.22 | Download | Stable |
| 2.1.21 | Download | Stable |
| 2.1.19 | Download | Stable |
| 2.1.18 | Download | Stable |
| 2.1.17 | Download | Stable |
| 2.1.16 | Download | Stable |
| 2.1.15 | Download | Stable |
| 2.1.14 | Download | Stable |
| 2.1.13 | Download | Stable |
| 2.1.12 | Download | Stable |
| 2.1.11 | Download | Stable |
| 2.1.10 | Download | Stable |
| 2.1.9 | Download | Stable |
| 2.1.8 | Download | Stable |
| 2.1.7 | Download | Stable |
| 2.1.6 | Download | Stable |
| 2.1.4 | Download | Stable |
| 2.1.3 | Download | Stable |
| 2.1.2 | Download | Stable |
| 2.1.1 | Download | Stable |
| 2.1.0 | Download | Stable |
| 2.0.5 | Download | Stable |
| 2.0.4 | Download | Stable |
| 2.0.3 | Download | Stable |
| 2.0.2 | Download | Stable |
| 2.0.1 | Download | Stable |
| 2.0.0 | Download | Stable |
| 1.0.2 | Download | Stable |
| Development | Download | Trunk |