• v0.3.4 592ead1da6

    UltimateByte released this 2026-05-27 23:06:45 +02:00 | 53 commits to main since this release

    Beta milestone. The Newsletter module is now feature-complete and the toolkit has crossed alpha into beta. Combined with the SMTP, Logging, Contact Form and Captcha modules, the plugin now covers the full email lifecycle: collect → confirm → segment → send → track → engage — without leaving WordPress, without a third-party SaaS, and without bloated dependencies (~800 KB zip, no Composer, no React build).

    This release rolls up every commit since v0.3.3 into one beta tag.


    📬 Newsletter module — feature complete

    Composer + audience

    • Compose newsletters in Gutenberg; each newsletter lives on its own card with sender, audience, schedule and tracking settings inline. No metaboxes, no jumping between screens.
    • Smart audience picker — pick one or several lists from a grouped dropdown (Subscribers / WP users, system rows last). Live recipient count, with a clear − N opted out indicator showing exactly who will be skipped.
    • Default = no one. New newsletters target nobody until you pick a list. Can't accidentally email everyone before making a conscious choice.
    • Opt-out review with All / Opted-in / Opted-out tabs in the Show list preview, per-row Send anyway / Exclude overrides. Bypass opt-outs checkbox for legitimate operational messages (with strong warning at send time).
    • Schedule sends or send now. Pause / resume / abort mid-send. AJAX + Cron pipeline with SMTP circuit-breaker so a flaky relay pauses the send instead of looping.

    Tracking

    • Open + click tracking per recipient + per newsletter via HMAC-signed REST endpoints.
    • Cold-subscriber detection (sends-since-last-engagement) + bulk unsubscribe.
    • RFC 8058 one-click unsubscribe in headers — works with Gmail / Apple Mail's native unsubscribe button.
    • IP anonymised before storage (IPv4 /24, IPv6 /48); user-agent stored only on opt-in.

    Lists

    • Two kinds: Subscribers lists (manual membership) and WP users lists (rule-based — by role, WooCommerce customer status, active WooCommerce subscriptions, or a custom rule plugged in via filter).
    • System lists out of the box: All subscribers, All WP members, All WC customers, Active WC subscribers.
    • Public / Private visibility. Public lists surface on the subscriber preferences page for self-join; private lists stay admin-managed.
    • Per-list exclusions — pin specific users out even when a rule matches.
    • Rule preview with sample matched users, pagination, and "− N opted out" hint.

    Subscribers admin

    • Bulk UX: checkbox column, bulk actions toolbar (Trash / Restore / Delete permanently), per-admin column picker (15 columns).
    • CSV / paste import honouring every profile field (email, name, phone, gender, postal address, …).
    • Detail modal with prev/next nav, inline list-membership editor.
    • Subscriber self-edit: name, phone, postal address, gender editable from the preferences page; email change requires click-to-confirm on the new address with notice to the old.
    • Subscription emails (confirmation / reminder / refuse-ack) editable in Gutenberg with multiple variants per purpose and a clear "active template" badge.

    Categories → Lists merge

    • The legacy Categories concept has been retired. Every former category becomes a public Subscribers list automatically; subscribers who hadn't opted out are carried over. Simpler model: one segmentation primitive instead of two overlapping ones. Subscribers' preferences page now reads Mailing lists instead. Schema migration is automatic and idempotent — if you didn't use categories, the change is invisible.

    📝 Subscribe forms (Newsletter module)

    • Drag-and-drop form builder with multi-column rows, undo/redo, autosave.
    • Field types: text, email, phone (with international country picker + auto-detect), gender (dedicated field type with canonical M/F/Other/Prefer-not options), dropdown, list picker, captcha, submit.
    • Field "Maps to" chip on every field — wire it once to a subscriber column (first_name, address_postcode, gender, …) and the submission populates the right slot.
    • Quick-add presets: drop Full name / First+Last name / Phone / Postal address and several pre-mapped fields land in one click.
    • Full-form templates to start fast: Email-only, Email + name, Contact basics, Full profile.
    • Default lists per form (multi-pick) — new subscribers auto-join the picked lists.
    • Anti-spam stack: honeypot + time-trap + captcha out of the box.

    📩 Contact Form

    • File upload field with two-tier security blacklist (always-blocked PHP/ASP/JSP; opt-in for HTML/SVG/JS/EXE), content-type sniffing, image EXIF stripping, per-field delivery mode (save on server / attach to email / both), per-file + total size caps, image thumbnails.
    • Submissions inbox rewritten: bulk actions toolbar (mark spam / restore / delete), per-row inline actions, detail modal with ← → arrows + keyboard nav, AJAX filters + search, per-status retention, manual cleanup, captcha-outcome filter.
    • Notification email footer carries View in admin / Mark as spam / Delete buttons; spam + delete land on a confirm page (no silent state mutation from email link clicks).
    • Per-reason spam recording: keep honeypot/time-trap rows out of the inbox by default, captcha-failed rows in (legitimate users can fail captcha).
    • International phone field with country-code picker + flag emoji + auto-detect from browser locale; submits in E.164.
    • Theme-aware form text colors — fixes contrast on dark page sections by reading WP's contrast preset for inputs only, inheriting for labels.

    📊 Email Logs

    • Detail modal with prev/next — click a row's eye icon and step through entries with ←/→ keys.
    • Unified Storage modal (Retention + Display + Manual cleanup) replacing the old anchored popovers.
    • Shared RetentionToggle widget — checkbox + days input, the same idiom Submissions inbox now uses too.

    🛡️ Captcha

    • Cross-feature wiring: same captcha service feeds Contact Form + Newsletter signup + WordPress comments + lost-password + registration. Per-context routing with Inherit default fall-through.
    • Per-action nonces on every destructive endpoint (defense in depth on top of nonces + caps).
    • Built-in Math + Image challenges; hCaptcha provider shipped; Turnstile / reCAPTCHA designed to plug in (auto-discovery).

    🎨 Admin UX overhaul (Phases 1-5)

    • Single page-header chrome across every plugin page: [Title] [Toggle] [+ New X] →→→ [Tools] | [Nav].
    • Design tokens in admin-base.css — every color, radius, shadow, transition, spacing, input height. Adapt one, adapt all. Sets the stage for the upcoming Light / Dark / LRob theme system.
    • Shared primitives (.lrob-etk-card, .lrob-etk-data-table, .lrob-etk-filter-bar, .lrob-etk-icon-btn, .lrob-etk-detail-strip, .lrob-etk-menu--fixed, .lrob-etk-test-result, …) replacing per-module duplicates.
    • window.confirm() retired plugin-wide — every destructive action now goes through an in-modal or inline confirm with palette-aligned styling and Escape / backdrop dismiss.
    • Autosave everywhere — no explicit Save buttons in admin UIs; every editable field autosaves on blur/change with a Saving… / ✓ Saved / ✗ Error badge near the X button of the modal it sits in.
    • Plugin-wide save-status mechanic — modals listen for a bubbling lrob-etk:save-status event, every autosave path dispatches it.
    • Header buttons categorised: cross-page navigation (muted) vs. page tools (filled), with a vertical divider — admins know at a glance which buttons leave the current page.
    • + N other abbreviations dropped — pickers show the full list.

    🌍 Languages

    • 🇬🇧 English (source) · 🇫🇷 French — 100% coverage (1692 strings)

    ⬆️ Upgrading

    • Schema migration v11 → v14 runs automatically on activation. Migrates categories into lists, drops legacy artifacts, adds subscriber-profile columns + email-change confirm columns. Data preserved.
    • Subscribers' preferences URLs stay valid across the migration (tokens are stable).
    • AUTH_KEY rotation breaks stored SMTP / captcha credentials (encryption keys derived from AUTH_KEY). If you rotate, re-enter affected credentials.
    • Auto-update from earlier v0.3.x: this release is picked up by the auto-updater (not flagged as prerelease).

    Status

    Beta — the surface is stable, the schema is stable, the toolkit drives real sends on production sites. Bug reports + UX feedback welcome on GitHub Issues.

    Coming next: theme system (Light / Dark / LRob / Auto), statistics overhaul (Newsletter view + global Email Toolkit dashboard tiles), universal email tracking on Email Logs, marketing automation, bounce handling, GDPR toolkit. See todo.md.

    — LRob

    Downloads