• v0.3.0 17a9906137

    UltimateByte released this 2026-05-23 12:00:01 +02:00 | 69 commits to main since this release

    🚧 Alpha — do not use in production yet. The Newsletter module is feature-complete enough to test end-to-end but hasn't seen real-world send loads. Field testing welcome; feedback / bug reports via GitHub issues.

    What's in this release

    The Newsletter module ships with everything needed to actually run a campaign on a small list:

    • Subscribe forms with double-opt-in confirmation, RFC 8058 one-click unsubscribe, captcha + honeypot + time-trap, customisable templates.
    • Categories + Lists: opt-out by category at the recipient level; manual lists for targeting.
    • Per-recipient preferences page (public token URL + WP-profile section + Gutenberg block + shortcode).
    • Onboarding templates (confirmation / reminder / refuse-acknowledgment) edited in the block editor with a token registry.
    • Trash + refuse polish for subscribers.
    • Newsletter authoring via inline cards on the Newsletters admin view — every newsletter's settings, audience, sender identity, schedule, and send actions live on its card. Gutenberg is content-only. Send button is state-aware: "Send now" ⇄ "Schedule" ⇄ "Unschedule" (red).
    • Send pipeline with chunked recipient materialization, claim-based send loop (race-safe between AJAX and Cron), per-recipient status snapshot, real-time progress bar.
    • WP-Cron safety-net + pause/resume/abort + scheduled-send cron handoff.
    • SMTP circuit-breaker: consecutive-failure threshold trips the newsletter to `paused` with a red banner explaining "fix SMTP then Resume". "Retry failed (N)" bulk action re-queues failed recipients for another attempt.
    • Logging integration: failures are kept in the logs table, successes are pruned by default (data already lives in `newsletter_recipients`), per-newsletter "Log every send" override. Logs page has a tri-state Newsletter filter. Recipients drawer cross-links to each failed row's log entry.
    • WP-Cron health diagnostic at the bottom of the Newsletters view: last observed tick, next scheduled tick, `DISABLE_WP_CRON` flag, colour-coded verdict, manual Refresh button + opt-in 10s auto-refresh toggle. Tooltip explains what a cron is for non-technical users.
    • Live clock-tick + adaptive server-poll on the cards: relative-time displays update every second when a deadline is imminent, fall back to minute/hour cadence further out. Server-poll runs every 10s only when an interesting card exists; pauses when the tab is hidden; localStorage dedup so multiple tabs don't multiply server load.
    • Inline LRob tip when the site relies on pseudo-cron, suggesting a server cron for reliability.

    Other changes

    • Logging module schema migration v1→v2 (renamed reserved `campaign_id` → `newsletter_id`).
    • French translation sweep — 1113 entries, only the .po file header left untranslated.
    • `release.sh` polish: JS syntax check via `node --check`, dead-CSS scan with peel-once heuristic, per-language msgfmt stats, file-type + LoC stats.

    Coming next

    • Step 9 — Tracking: image-rewriter (primary open signal via media URLs) + GIF fallback for image-less emails + link rewriter for clicks + per-subscriber lifetime stats + "Cold subscribers" sub-tab with optional auto-cleanup.
    • Step 10 — Bounce handling.
    • Step 11 — Import wizard (CSV / JSON full-restore / Newsletter-plugin importer).

    Install

    1. Download `lrob-email-toolkit-0.3.0.zip` below.
    2. Upload via WP admin → Plugins → Add New → Upload Plugin.
    3. Enable the Newsletter module under Email Toolkit. (Requires SMTP module to be enabled for actual sending.)

    The auto-updater (shipped in 0.2.0) will pick this release up automatically on existing installs within an hour.

    Requires

    • WordPress 6.0+
    • PHP 8.1+
    Downloads