<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hao Nguyen</title>
    <description>The latest articles on DEV Community by Hao Nguyen (@brokensmile2103).</description>
    <link>https://dev.to/brokensmile2103</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3220539%2Ff2095f61-e44f-4777-b538-c556b8be80a2.jpg</url>
      <title>DEV Community: Hao Nguyen</title>
      <link>https://dev.to/brokensmile2103</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/brokensmile2103"/>
    <language>en</language>
    <item>
      <title>InitOps: One-Command WordPress Deployment on Ubuntu</title>
      <dc:creator>Hao Nguyen</dc:creator>
      <pubDate>Wed, 07 Oct 2026 06:13:26 +0000</pubDate>
      <link>https://dev.to/brokensmile2103/initops-one-command-wordpress-deployment-on-ubuntu-1p8b</link>
      <guid>https://dev.to/brokensmile2103/initops-one-command-wordpress-deployment-on-ubuntu-1p8b</guid>
      <description>&lt;p&gt;Setting up a production-ready WordPress server on a fresh VPS often means going through a long list of tasks: installing Nginx, PHP-FPM, MariaDB, Redis, configuring firewall rules, setting up Fail2Ban, tuning PHP and database settings, enabling SSL, and preparing backups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;InitOps&lt;/strong&gt; is designed to simplify that entire process.&lt;/p&gt;

&lt;p&gt;InitOps is a single-file interactive Python CLI that can turn a fresh Ubuntu server into a production-ready WordPress host with a single command and a few configuration choices. It focuses on Ubuntu LTS servers and is designed to work across VPS sizes ranging from small 1 GB instances to larger dedicated servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is InitOps?
&lt;/h2&gt;

&lt;p&gt;InitOps provides a complete LEMP-based WordPress environment without requiring Docker, Ansible, or a large collection of shell scripts.&lt;/p&gt;

&lt;p&gt;The stack includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;li&gt;MariaDB&lt;/li&gt;
&lt;li&gt;PHP-FPM&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;WordPress&lt;/li&gt;
&lt;li&gt;iptables / nftables-based firewall configuration&lt;/li&gt;
&lt;li&gt;Fail2Ban&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also takes care of several common tasks that normally have to be configured manually, including performance tuning, backups, SSL renewal, domain migration, and server monitoring.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbtxc3o6pwsuk1hyn200r.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbtxc3o6pwsuk1hyn200r.webp" alt=" " width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ubuntu 24.04 and Ubuntu 26.04 Support
&lt;/h2&gt;

&lt;p&gt;InitOps v2.0.0 supports &lt;strong&gt;Ubuntu 24.04 LTS and Ubuntu 26.04 LTS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On Ubuntu 24.04, InitOps supports PHP 8.3, 8.4, and 8.5. On Ubuntu 26.04, PHP 8.5 is selected automatically and is installed from Ubuntu's official repositories without requiring a PPA. MariaDB and Redis versions are also adapted to the operating system version.&lt;br&gt;
InitOps also performs OS detection and stops installation on unsupported operating systems instead of blindly applying system-level configurations.&lt;/p&gt;
&lt;h2&gt;
  
  
  Automatic Server Performance Tuning
&lt;/h2&gt;

&lt;p&gt;One of the more interesting parts of InitOps is its hardware-aware configuration.&lt;/p&gt;

&lt;p&gt;The tool detects the server's RAM and CPU resources and selects one of six optimization profiles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;micro&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;small&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;standard&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;medium&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;large&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;xlarge&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each profile adjusts important components such as Nginx, PHP-FPM, MariaDB, Redis, and OPcache instead of using exactly the same configuration for every VPS.&lt;/p&gt;

&lt;p&gt;For example, PHP-FPM worker sizing is calculated based on the RAM remaining after accounting for MariaDB, Redis, and system overhead. OPcache is also configured according to the selected hardware profile.&lt;/p&gt;

&lt;p&gt;This is particularly useful for WordPress servers running on smaller VPS instances, where allocating too much memory to a single service can quickly become a problem.&lt;/p&gt;
&lt;h2&gt;
  
  
  PHP Version Manager
&lt;/h2&gt;

&lt;p&gt;InitOps is not limited to selecting a PHP version during the initial deployment.&lt;/p&gt;

&lt;p&gt;After deployment, the built-in PHP Version Manager can install additional PHP branches and switch between them without rebuilding the entire server. Old versions can remain installed so they can be restored when necessary.&lt;/p&gt;

&lt;p&gt;The switching workflow is designed to reduce downtime. InitOps prepares the new PHP-FPM configuration, validates it, starts the new PHP-FPM service alongside the current one, updates the Nginx virtual hosts, validates Nginx, and only then retires the old PHP-FPM service.&lt;/p&gt;

&lt;p&gt;For developers maintaining multiple WordPress projects, this can be much more convenient than manually rebuilding PHP-FPM configurations every time a site needs a different PHP branch.&lt;/p&gt;
&lt;h2&gt;
  
  
  Multi-Site WordPress Hosting
&lt;/h2&gt;

&lt;p&gt;InitOps can also host multiple WordPress installations on a single VPS.&lt;/p&gt;

&lt;p&gt;Each additional site gets its own database, Redis database index, Nginx virtual host, and web root. WP-Cron is also handled through the system cron with locking to avoid overlapping executions.&lt;/p&gt;

&lt;p&gt;Adding another site is available directly from the interactive menu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;initops
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then choose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[7] Add New Website
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the deployment process consistent even when a single server is hosting several independent WordPress websites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security by Default
&lt;/h2&gt;

&lt;p&gt;Security is another part of the default setup.&lt;/p&gt;

&lt;p&gt;InitOps configures firewall rules, enables Fail2Ban for SSH brute-force protection, hardens MariaDB, and uses Unix sockets for MariaDB and Redis instead of exposing them over TCP. It also applies several WordPress hardening settings and standard file permissions.&lt;/p&gt;

&lt;p&gt;For Ubuntu 24.04 and 26.04, InitOps uses different Fail2Ban backends according to the operating system, including iptables on 24.04 and nftables plus systemd journal on 26.04.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backups, Monitoring, and SSL
&lt;/h2&gt;

&lt;p&gt;InitOps includes several operational features that are easy to overlook when manually setting up a VPS.&lt;/p&gt;

&lt;p&gt;Database backups use WP-CLI, automatically compress the resulting SQL dump with gzip, and remove backups older than 30 days. The backup system can also handle individual sites or all configured sites.&lt;/p&gt;

&lt;p&gt;For monitoring, InitOps can send bilingual English/Vietnamese Discord alerts when disk space becomes critical, RAM usage is exhausted, CPU load becomes excessive, or MariaDB/MySQL goes down. It can also report service recovery events.&lt;/p&gt;

&lt;p&gt;For SSL, InitOps supports Cloudflare DNS-01 renewal. It can configure the Certbot Cloudflare plugin, store credentials securely, configure the renewal workflow, reload Nginx after successful renewal, and perform a dry-run test before finishing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domain Migration
&lt;/h2&gt;

&lt;p&gt;Changing a production domain can be surprisingly annoying because it involves more than just editing an Nginx configuration.&lt;/p&gt;

&lt;p&gt;InitOps provides a one-shot domain migration workflow that updates the Nginx virtual host, issues a new SSL certificate, performs a database search-replace while respecting serialized WordPress data, flushes Redis, and automatically rolls back when Nginx validation fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;On a fresh Ubuntu 24.04 or Ubuntu 26.04 LTS server, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/brokensmile2103/initops/main/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is also an installer endpoint provided by Init HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://inithtml.com/initops/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, launch InitOps with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;initops
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And update the engine with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;initops update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are the documented quick-start commands for InitOps v2.0.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;InitOps is aimed at a simple problem: &lt;strong&gt;making WordPress server deployment repeatable without turning every new VPS into a manual sysadmin project&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of starting with a blank Ubuntu server and configuring every component individually, InitOps provides an opinionated stack with hardware-aware tuning, security defaults, multi-site support, PHP version management, backups, monitoring, and SSL automation.&lt;/p&gt;

&lt;p&gt;For developers who regularly deploy WordPress on Ubuntu VPS servers, that can save a considerable amount of repetitive setup work.&lt;/p&gt;

&lt;p&gt;InitOps is open source and released under the &lt;strong&gt;MIT License&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; InitOps modifies system-level configuration such as Nginx, MariaDB, Redis, firewall rules, and cron. The project recommends testing on a non-production server or keeping a backup before deployment.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;→ &lt;a href="https://en.inithtml.com/tools/initops-automatically-deploy-lemp-stack-and-wordpress-on-ubuntu-with-a-single-command/" rel="noopener noreferrer"&gt;Project Page&lt;/a&gt;&lt;br&gt;
→ &lt;a href="https://github.com/brokensmile2103/initops" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>wordpress</category>
      <category>php</category>
    </item>
    <item>
      <title>Init Local Uploader: A Simple Self-Hosted Image Workflow for Developers</title>
      <dc:creator>Hao Nguyen</dc:creator>
      <pubDate>Wed, 30 Sep 2026 08:11:48 +0000</pubDate>
      <link>https://dev.to/brokensmile2103/init-local-uploader-a-simple-self-hosted-image-workflow-for-developers-1b3g</link>
      <guid>https://dev.to/brokensmile2103/init-local-uploader-a-simple-self-hosted-image-workflow-for-developers-1b3g</guid>
      <description>&lt;p&gt;Uploading an image is easy.&lt;/p&gt;

&lt;p&gt;Managing hundreds of images, processing them safely, keeping their URLs predictable, and finding them again later is where things get messy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Init Local Uploader&lt;/strong&gt; is a small self-hosted PHP tool built around that exact problem. Instead of sending your images to a third-party service, it lets you keep the entire workflow on your own server.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Upload → Process → Store → Generate HTML/Markdown → Find it again later
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why would a developer need this?
&lt;/h2&gt;

&lt;p&gt;For a personal blog, documentation site, or internal project, using a full image management platform can sometimes be unnecessary.&lt;/p&gt;

&lt;p&gt;You may already have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a VPS&lt;/li&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;li&gt;local storage&lt;/li&gt;
&lt;li&gt;a website serving the images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So why introduce another service just to upload a few screenshots?&lt;/p&gt;

&lt;p&gt;Init Local Uploader turns your existing server into a small image utility.&lt;/p&gt;

&lt;p&gt;You can drag and drop images, paste screenshots directly from the clipboard, resize them, optionally convert them to WebP, and immediately get ready-to-use HTML, Markdown, or URLs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The useful part is how it handles failure
&lt;/h2&gt;

&lt;p&gt;Image processing has more edge cases than it first appears.&lt;/p&gt;

&lt;p&gt;Large images can run into PHP memory limits. Transparent images can lose their alpha channel. Animated GIFs can accidentally be flattened. Some images simply cannot be processed safely.&lt;/p&gt;

&lt;p&gt;The uploader takes a conservative approach.&lt;/p&gt;

&lt;p&gt;When processing cannot be done safely, the original image can be preserved instead of being silently lost. Animated GIF, WebP, and APNG files are also kept intact rather than being flattened.&lt;/p&gt;

&lt;p&gt;That makes the tool more useful as a &lt;strong&gt;reliable upload workflow&lt;/strong&gt;, rather than simply an "image optimizer".&lt;/p&gt;

&lt;h2&gt;
  
  
  Each image is handled independently
&lt;/h2&gt;

&lt;p&gt;Multiple uploads are sent as individual requests.&lt;/p&gt;

&lt;p&gt;That means one failed image does not have to ruin the entire queue. Each file has its own progress and result, with retry support for failures.&lt;/p&gt;

&lt;p&gt;This is especially practical when uploading a large batch of screenshots or photos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your uploads are searchable
&lt;/h2&gt;

&lt;p&gt;Another useful feature is the local SQLite-backed history.&lt;/p&gt;

&lt;p&gt;Instead of wondering where an old screenshot went, you can search previous uploads by filename or ALT text, filter by folder, and copy the generated markup again.&lt;/p&gt;

&lt;p&gt;For a developer maintaining documentation or a content-heavy website, this can save more time than the actual upload itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-hosting also means fewer moving parts
&lt;/h2&gt;

&lt;p&gt;There is no external storage service, SDK, or API key required.&lt;/p&gt;

&lt;p&gt;The application runs directly on your PHP server and stores the images and history locally.&lt;/p&gt;

&lt;p&gt;That makes it a good fit for developers who prefer straightforward infrastructure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
   ↓
Your server
   ├── PHP application
   ├── SQLite history
   └── Uploaded images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You remain in control of the files and the URLs.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small tool with a practical scope
&lt;/h2&gt;

&lt;p&gt;Init Local Uploader is not trying to become a complete cloud media platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvprb9xp08ukwk2wtbf5u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvprb9xp08ukwk2wtbf5u.png" alt="Init Local Uploader Mockup" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Its purpose is much narrower:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give developers a simple, private place to upload images and immediately turn them into something usable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For self-hosted blogs, documentation, portfolios, staging environments, or internal tools, that can be exactly enough.&lt;/p&gt;

&lt;p&gt;The project also puts a fair amount of attention into the less visible parts of an uploader: file validation, CSRF protection, login rate limiting, safe deletion, filename normalization, and server-side handling of problematic images.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Sometimes the simplest architecture is the one you already have.&lt;/p&gt;

&lt;p&gt;When a server is already running PHP and has storage available, a lightweight self-hosted uploader can be a surprisingly practical alternative to adding another external service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Init Local Uploader&lt;/strong&gt; is essentially that idea packaged into a small, focused application.&lt;/p&gt;

&lt;p&gt;For the complete feature list, configuration options, deployment notes, and latest changes, see the project page: &lt;a href="https://en.inithtml.com/tools/init-local-uploader-a-simple-self-hosted-image-uploader-for-your-own-server/" rel="noopener noreferrer"&gt;https://en.inithtml.com/tools/init-local-uploader-a-simple-self-hosted-image-uploader-for-your-own-server/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>opensource</category>
      <category>selfhosted</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Init Pulse For Discord – Fast, Minimal Discord Notifications for WordPress</title>
      <dc:creator>Hao Nguyen</dc:creator>
      <pubDate>Tue, 29 Sep 2026 05:29:34 +0000</pubDate>
      <link>https://dev.to/brokensmile2103/init-pulse-for-discord-fast-minimal-discord-notifications-for-wordpress-2pgb</link>
      <guid>https://dev.to/brokensmile2103/init-pulse-for-discord-fast-minimal-discord-notifications-for-wordpress-2pgb</guid>
      <description>&lt;p&gt;&lt;strong&gt;Init Pulse For Discord&lt;/strong&gt; is a lightweight, backend-only Discord notification plugin for WordPress. It sends post publish and update notifications directly to Discord through webhooks — with rich embeds, role mentions, per-category/tag routing, and optional hot-post milestone alerts.&lt;/p&gt;

&lt;p&gt;No external SDKs. No frontend JavaScript. No unnecessary database tables.&lt;/p&gt;

&lt;p&gt;Just WordPress hooks, Discord webhooks, and a clean notification pipeline.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why Init Pulse For Discord?
&lt;/h3&gt;

&lt;p&gt;Keeping a Discord community informed about new WordPress content usually means connecting several systems together or relying on a large automation platform.&lt;/p&gt;

&lt;p&gt;Init Pulse For Discord takes a much simpler approach.&lt;/p&gt;

&lt;p&gt;Connect a Discord webhook, choose which post types to monitor, and WordPress can automatically notify your Discord server whenever tracked content is published or updated.&lt;/p&gt;

&lt;p&gt;But it goes further than a basic "new post" webhook.&lt;/p&gt;

&lt;p&gt;You can route specific categories and tags to their own Discord channels, mention specific Discord roles, customize webhook identities, send rich embeds, and trigger separate alerts when a post reaches a view milestone.&lt;/p&gt;

&lt;p&gt;Everything runs server-side with no frontend assets and no external SDK dependencies.&lt;/p&gt;

&lt;p&gt;It's part of the &lt;a href="https://en.inithtml.com/init-plugin-suite-minimalist-powerful-and-free-wordpress-plugins/" rel="noopener noreferrer"&gt;Init Plugin Suite&lt;/a&gt; — following the same minimalist, performance-first philosophy as the rest of the suite.&lt;/p&gt;




&lt;h3&gt;
  
  
  Features at a Glance
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Automatic WordPress Notifications
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Send notifications when content is published&lt;/li&gt;
&lt;li&gt;Optionally notify Discord when content is updated&lt;/li&gt;
&lt;li&gt;Select exactly which post types should trigger notifications&lt;/li&gt;
&lt;li&gt;Works with standard posts, pages, products, and Custom Post Types&lt;/li&gt;
&lt;li&gt;Markdown-ready message templates&lt;/li&gt;
&lt;li&gt;Placeholder-based dynamic content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Supported placeholders include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;title_url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;excerpt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;site_name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;author&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;post_type&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;date&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the plugin useful for blogs, news sites, editorial platforms, communities, WooCommerce stores, and custom WordPress applications.&lt;/p&gt;

&lt;h4&gt;
  
  
  Rich Discord Embeds
&lt;/h4&gt;

&lt;p&gt;Notifications can be delivered as formatted Discord embeds containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Title&lt;/li&gt;
&lt;li&gt;Description&lt;/li&gt;
&lt;li&gt;Accent color&lt;/li&gt;
&lt;li&gt;Footer&lt;/li&gt;
&lt;li&gt;Timestamp&lt;/li&gt;
&lt;li&gt;Optional featured image&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prefer something simpler?&lt;/p&gt;

&lt;p&gt;You can switch to plain-text messages with the Rich Embed toggle.&lt;/p&gt;

&lt;h4&gt;
  
  
  Role-Aware Mentions
&lt;/h4&gt;

&lt;p&gt;Assign Discord Role IDs directly to WordPress categories or tags.&lt;/p&gt;

&lt;p&gt;When content matching those terms is published or updated, Init Pulse For Discord can include the configured role mention in the notification.&lt;/p&gt;

&lt;p&gt;This is useful for communities where different Discord roles follow different topics.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WordPress category: Development
Discord role: &amp;lt;@&amp;amp;123456789012345678&amp;gt;

WordPress category: News
Discord role: &amp;lt;@&amp;amp;987654321098765432&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your WordPress taxonomy becomes a simple routing and notification layer for Discord.&lt;/p&gt;

&lt;h4&gt;
  
  
  Per-Category / Tag Webhooks
&lt;/h4&gt;

&lt;p&gt;Different types of content often belong in different Discord channels.&lt;/p&gt;

&lt;p&gt;Init Pulse For Discord lets any Category or Tag have its own Discord Webhook URL.&lt;/p&gt;

&lt;p&gt;For each term, you can configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discord Webhook URL&lt;/li&gt;
&lt;li&gt;Username override&lt;/li&gt;
&lt;li&gt;Avatar override&lt;/li&gt;
&lt;li&gt;"Only send to this webhook" behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By default, a matching post is delivered to both the term-specific webhook and the global webhook.&lt;/p&gt;

&lt;p&gt;Enable &lt;strong&gt;Only send to this webhook&lt;/strong&gt; to skip the global destination completely.&lt;/p&gt;

&lt;p&gt;If a post belongs to multiple categories or tags with dedicated webhooks, the plugin sends to every unique destination while deduplicating repeated webhook URLs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                WordPress Post
                      │
          ┌───────────┴───────────┐
          │                       │
     Category: Dev           Tag: WordPress
          │                       │
      Webhook A                Webhook B
          │                       │
          └───────────┬───────────┘
                      ↓
              Discord Channels
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same routing logic applies to publish/update notifications and Hot Post Milestones.&lt;/p&gt;

&lt;h4&gt;
  
  
  Hot Post Milestones
&lt;/h4&gt;

&lt;p&gt;Connect &lt;a href="https://wordpress.org/plugins/init-view-count/" rel="noopener noreferrer"&gt;Init View Count&lt;/a&gt; and turn view counts into Discord notifications.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,000 views
5,000 views
10,000 views
50,000 views
100,000 views
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a tracked post crosses one of those thresholds, Discord receives a dedicated milestone notification.&lt;/p&gt;

&lt;p&gt;Each milestone is sent &lt;strong&gt;once per post&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If a post jumps over several thresholds at once, only the highest milestone reached is sent.&lt;/p&gt;

&lt;p&gt;Hot Post Milestones have their own message template with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{views}
{views_short}
{milestone}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🎉 This post just reached {milestone} views!

Current views: {views_short}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The feature is completely optional. If Init View Count is not active, the setting simply remains dormant without affecting the rest of the plugin.&lt;/p&gt;

&lt;p&gt;Install Init View Count later and the feature starts working automatically — no re-save required.&lt;/p&gt;

&lt;h4&gt;
  
  
  Delivery Troubleshooting
&lt;/h4&gt;

&lt;p&gt;A lightweight &lt;strong&gt;Delivery Log&lt;/strong&gt; keeps a rolling snapshot of recent webhook deliveries.&lt;/p&gt;

&lt;p&gt;Each entry records whether a notification succeeded or failed.&lt;/p&gt;

&lt;p&gt;When a post is routed to several destinations, each webhook gets its own delivery-log entry.&lt;/p&gt;

&lt;p&gt;The log is stored lightly in &lt;code&gt;wp_options&lt;/code&gt; with &lt;code&gt;autoload = no&lt;/code&gt;, keeping it out of the normal frontend autoload path.&lt;/p&gt;

&lt;h4&gt;
  
  
  Built for Performance
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Backend-only implementation&lt;/li&gt;
&lt;li&gt;No frontend JavaScript&lt;/li&gt;
&lt;li&gt;No frontend CSS&lt;/li&gt;
&lt;li&gt;No external SDKs&lt;/li&gt;
&lt;li&gt;No external Discord API client libraries&lt;/li&gt;
&lt;li&gt;Lightweight WordPress options storage&lt;/li&gt;
&lt;li&gt;Timeout and retry handling&lt;/li&gt;
&lt;li&gt;Discord &lt;code&gt;429 Retry-After&lt;/code&gt; support&lt;/li&gt;
&lt;li&gt;Safe-by-default hook integration&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Core Modules
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Publish Notifications&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sends Discord alerts when tracked content is published&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Update Notifications&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optionally notifies Discord when tracked content is updated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Post Types&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Choose exactly which post types trigger notifications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rich Embeds&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Send formatted Discord embeds with title, description, color, footer, timestamp, and image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plain Text Mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Send simple Markdown-ready text instead of an embed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Role Mentions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Map WordPress categories/tags to Discord Role IDs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Per-Term Webhooks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Route categories/tags to dedicated Discord destinations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Webhook Identity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Override Username and Avatar per destination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Global Webhook&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Default Discord destination for notifications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hot Post Milestones&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Notify Discord when Init View Count thresholds are crossed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Delivery Log&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Track recent success/error results per destination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Test Message&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Verify a webhook directly from the settings screen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Retry Engine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Retry failed requests and respect Discord rate-limit responses&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;The notification flow is intentionally simple.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WordPress content changes
        ↓
Post type is checked
        ↓
Publish / update context is resolved
        ↓
Categories and tags are inspected
        ↓
Role mentions are resolved
        ↓
Webhook destinations are resolved
        ↓
Duplicate webhook URLs are removed
        ↓
Discord payload is generated
        ↓
Webhook request is sent
        ↓
Delivery result is logged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a normal publish/update notification:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;WordPress fires the relevant content hook.&lt;/li&gt;
&lt;li&gt;Init Pulse For Discord checks whether the post type is enabled.&lt;/li&gt;
&lt;li&gt;The plugin builds the notification using the configured template.&lt;/li&gt;
&lt;li&gt;Categories and tags are inspected for Discord Role IDs and dedicated webhooks.&lt;/li&gt;
&lt;li&gt;Global and per-term destinations are resolved according to the routing rules.&lt;/li&gt;
&lt;li&gt;Duplicate webhook URLs are deduplicated.&lt;/li&gt;
&lt;li&gt;The final payload is sent to each destination.&lt;/li&gt;
&lt;li&gt;Delivery results are recorded in the lightweight Delivery Log.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Hot Post Milestones flow is similar, but uses view-count thresholds from Init View Count.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Post view count changes
        ↓
Milestone thresholds checked
        ↓
Already notified?
   ┌────┴────┐
   │         │
  YES        NO
   │         │
  Skip    Build alert
             ↓
      Resolve webhooks
             ↓
        Send to Discord
             ↓
       Mark milestone sent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No polling service or external scheduler is required for the normal notification flow.&lt;/p&gt;




&lt;h3&gt;
  
  
  Message Templates
&lt;/h3&gt;

&lt;p&gt;The notification template is fully customizable.&lt;/p&gt;

&lt;p&gt;Available placeholders:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Placeholder&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{title}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Post title&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{title_url}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Post title with its URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{url}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Post permalink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{excerpt}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Post excerpt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{site_name}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;WordPress site name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{author}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Post author&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{categories}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Post categories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{tags}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Post tags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{post_type}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;WordPress post type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{date}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Publication/update date&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A simple template could look like:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```markdown id="qjz8z2"&lt;/p&gt;

&lt;h2&gt;
  
  
  {title}
&lt;/h2&gt;

&lt;p&gt;{excerpt}&lt;/p&gt;

&lt;p&gt;Read more: {url}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Site:&lt;/strong&gt; {site_name}&lt;br&gt;
&lt;strong&gt;Author:&lt;/strong&gt; {author}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


The same global message formatting is reused across all resolved destinations.

Per-term webhook routing changes **where** the notification goes and can optionally change the webhook identity, but the content and embed configuration remain shared.

---

### Hot Post Milestones

The optional Hot Post Milestones feature is built around [Init View Count](https://wordpress.org/plugins/init-view-count/).

Configure thresholds such as:



```plaintext
1000, 5000, 10000, 50000, 100000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then define a separate milestone template:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```markdown id="c9m4ea"&lt;/p&gt;

&lt;h2&gt;
  
  
  Hot Post Alert
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;{title}&lt;/strong&gt; just reached &lt;strong&gt;{milestone} views&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Current views: {views_short}&lt;br&gt;
URL: {url}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Supported milestone-specific placeholders:

| Placeholder     | Description                                 |
| --------------- | ------------------------------------------- |
| `{views}`       | Total view count, formatted with separators |
| `{views_short}` | Abbreviated view count such as `12.3K`      |
| `{milestone}`   | Threshold that was just crossed             |

Each milestone is sent once per post.

A post that jumps from 900 views to 12,000 views in one operation will not generate multiple Discord messages. The plugin sends only the highest milestone reached in that jump.

The same category/tag webhook routing used by publish/update notifications also applies to milestone alerts.

---

### Per-Category / Tag Webhook Routing

Per-term routing requires no custom code.

Open:



```plaintext
Posts → Categories → Edit
Posts → Tags → Edit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then configure the Discord webhook fields for the term.&lt;/p&gt;

&lt;p&gt;A term can have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Discord Webhook URL
Username
Avatar URL
Only send to this webhook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The routing rules are straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;No term webhook
    ↓
Global webhook only

Term webhook
    ↓
Term webhook + global webhook

"Only send to this webhook"
    ↓
Term webhook only
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When several matching terms have dedicated webhooks, every unique webhook receives the notification once.&lt;/p&gt;

&lt;p&gt;For example, if both &lt;code&gt;Development&lt;/code&gt; and &lt;code&gt;WordPress&lt;/code&gt; point to the same Discord webhook URL, that URL is still called only once for the post.&lt;/p&gt;




&lt;h3&gt;
  
  
  Developer Hooks
&lt;/h3&gt;

&lt;p&gt;Init Pulse For Discord provides filters for developers who need to modify outgoing Discord payloads without editing plugin source code.&lt;/p&gt;

&lt;p&gt;Modify the final publish/update payload:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```php id="1s0a4c"&lt;br&gt;
add_filter( 'init_plugin_suite_pulse_for_discord_payload', function( $payload, $post_id, $context ) {&lt;br&gt;
    $payload['content'] .= "\n— Sent from my custom filter";&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return $payload;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}, 10, 3 );&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


This filter runs once per post before the payload is dispatched to the resolved destinations, so the modification applies to the global webhook and per-term webhooks alike.

Webhook `username` and `avatar_url` overrides are resolved per destination afterward.

For Hot Post Milestones, use:



```php id="v4y4cg"
add_filter( 'init_plugin_suite_pulse_for_discord_milestone_payload', function( $payload, $post_id, $views, $milestone ) {
    $payload['content'] .= "\nMilestone: {$milestone} views!";

    return $payload;
}, 10, 4 );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This gives developers a simple extension point for adding custom content, mentions, metadata, or application-specific information to the final Discord payload.&lt;/p&gt;


&lt;h3&gt;
  
  
  Webhook Delivery
&lt;/h3&gt;

&lt;p&gt;The plugin keeps webhook delivery deliberately lightweight.&lt;/p&gt;

&lt;p&gt;It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configurable request timeout&lt;/li&gt;
&lt;li&gt;Retry handling&lt;/li&gt;
&lt;li&gt;Discord rate-limit support&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;429 Retry-After&lt;/code&gt; handling&lt;/li&gt;
&lt;li&gt;Success/error delivery logging&lt;/li&gt;
&lt;li&gt;Separate delivery records for multiple destinations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no Discord SDK to install and no external package manager dependency.&lt;/p&gt;

&lt;p&gt;The plugin communicates with Discord through its standard webhook endpoint.&lt;/p&gt;


&lt;h3&gt;
  
  
  Settings
&lt;/h3&gt;

&lt;p&gt;Navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Settings → Init Pulse For Discord
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Available settings include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Post Types&lt;/strong&gt; — select which post types trigger notifications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhook URL&lt;/strong&gt; — global Discord webhook destination&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send Test Message&lt;/strong&gt; — verify the webhook immediately&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bot Username&lt;/strong&gt; — global webhook username&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avatar URL&lt;/strong&gt; — global webhook avatar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Include Featured Image&lt;/strong&gt; — add the post thumbnail to the embed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Rich Embed&lt;/strong&gt; — switch between embed and plain-text output&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embed Color&lt;/strong&gt; — customize the Discord embed accent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timeout / Retries&lt;/strong&gt; — configure webhook delivery behavior&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message Template&lt;/strong&gt; — Markdown-ready publish/update template&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notify on View Milestones&lt;/strong&gt; — enable Hot Post Milestone alerts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;View Milestones&lt;/strong&gt; — configure thresholds such as &lt;code&gt;1000, 5000, 10000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Milestone Message Template&lt;/strong&gt; — separate template for view milestones&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The settings screen also contains the &lt;strong&gt;Delivery Log&lt;/strong&gt; for recent webhook results.&lt;/p&gt;

&lt;p&gt;Role IDs and per-term webhook destinations are configured directly on individual categories and tags.&lt;/p&gt;




&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;Install from &lt;a href="https://wordpress.org/plugins/init-pulse-for-discord/" rel="noopener noreferrer"&gt;WordPress.org&lt;/a&gt; or manually upload the plugin to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/wp-content/plugins/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Activate &lt;strong&gt;Init Pulse For Discord&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings → Init Pulse For Discord&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Paste your Discord webhook URL&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Send Test Message&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose which post types should trigger notifications&lt;/li&gt;
&lt;li&gt;Optionally assign Discord Role IDs to categories or tags&lt;/li&gt;
&lt;li&gt;Optionally configure dedicated webhooks for categories or tags&lt;/li&gt;
&lt;li&gt;Optionally install &lt;a href="https://wordpress.org/plugins/init-view-count/" rel="noopener noreferrer"&gt;Init View Count&lt;/a&gt; and enable Hot Post Milestones&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;Publish a tracked post and Discord receives the notification through your configured webhook destination.&lt;/p&gt;




&lt;h3&gt;
  
  
  Safe by Default
&lt;/h3&gt;

&lt;p&gt;Init Pulse For Discord does not attempt to take over WordPress publishing behavior.&lt;/p&gt;

&lt;p&gt;It listens to the relevant WordPress hooks and sends notifications when configured conditions are met.&lt;/p&gt;

&lt;p&gt;Optional features remain optional:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update notifications&lt;/li&gt;
&lt;li&gt;Role mentions&lt;/li&gt;
&lt;li&gt;Per-category/tag webhooks&lt;/li&gt;
&lt;li&gt;Hot Post Milestones&lt;/li&gt;
&lt;li&gt;Featured images&lt;/li&gt;
&lt;li&gt;Rich embeds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing extra is silently enabled just because another plugin happens to be installed.&lt;/p&gt;

&lt;p&gt;For example, Init View Count integration remains dormant until you explicitly enable &lt;strong&gt;Notify on View Milestones&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Where Data Lives
&lt;/h3&gt;

&lt;p&gt;Init Pulse For Discord keeps its storage footprint intentionally small.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delivery history is stored in &lt;code&gt;wp_options&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Delivery logs use &lt;code&gt;autoload = no&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;No custom database tables&lt;/li&gt;
&lt;li&gt;No external notification database&lt;/li&gt;
&lt;li&gt;No frontend storage&lt;/li&gt;
&lt;li&gt;No per-page frontend assets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple: keep the plugin focused on webhook delivery rather than turning notifications into another subsystem your WordPress database has to carry around.&lt;/p&gt;




&lt;h3&gt;
  
  
  Part of the Init Plugin Suite
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Init Pulse For Discord&lt;/strong&gt; is part of the &lt;a href="https://en.inithtml.com/init-plugin-suite-minimalist-powerful-and-free-wordpress-plugins/" rel="noopener noreferrer"&gt;Init Plugin Suite&lt;/a&gt; — a collection of lightweight, performance-focused WordPress plugins built for developers and creators who prefer clean implementations over feature-heavy stacks.&lt;/p&gt;

&lt;p&gt;WordPress publishes.&lt;/p&gt;

&lt;p&gt;Init Pulse routes the pulse.&lt;/p&gt;

&lt;p&gt;Discord gets the message.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Thanks for reading. Got feedback or questions?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://wordpress.org/plugins/init-pulse-for-discord/" rel="noopener noreferrer"&gt;WordPress.org&lt;/a&gt;&lt;br&gt;
→ &lt;a href="https://github.com/brokensmile2103/init-pulse-for-discord" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>plugin</category>
      <category>webhook</category>
      <category>discord</category>
    </item>
    <item>
      <title>Init Void Shield – Zero-DB, Honeypot, Anti-Spam for WordPress</title>
      <dc:creator>Hao Nguyen</dc:creator>
      <pubDate>Tue, 29 Sep 2026 05:26:18 +0000</pubDate>
      <link>https://dev.to/brokensmile2103/init-void-shield-zero-db-honeypot-anti-spam-for-wordpress-4e7j</link>
      <guid>https://dev.to/brokensmile2103/init-void-shield-zero-db-honeypot-anti-spam-for-wordpress-4e7j</guid>
      <description>&lt;p&gt;&lt;strong&gt;Init Void Shield&lt;/strong&gt; is a lightweight, zero-database honeypot anti-spam plugin for WordPress comments, core forms, WooCommerce, bbPress, BuddyPress, Contact Form 7, WPForms, Gravity Forms, and more.&lt;/p&gt;

&lt;p&gt;No CAPTCHA. No external JavaScript. No database tables. No user friction.&lt;/p&gt;

&lt;p&gt;It uses layered, context-bound honeypot protection, signed time tokens, delayed browser verification, headless-browser detection, non-browser User-Agent detection, and cross-site submission blocking to stop automated submissions while keeping the experience invisible to real users.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why Init Void Shield?
&lt;/h3&gt;

&lt;p&gt;Spam protection often comes with a trade-off: either annoy real users with CAPTCHA challenges or add another heavy plugin full of JavaScript, tracking, external services, and database records.&lt;/p&gt;

&lt;p&gt;Init Void Shield takes a different approach.&lt;/p&gt;

&lt;p&gt;The core comment guard is always enabled and requires no configuration to start protecting a site. Additional guards are explicitly opt-in, so enabling a new feature in a plugin update never silently changes which forms are protected.&lt;/p&gt;

&lt;p&gt;The plugin is designed to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Invisible to humans&lt;/strong&gt; — no CAPTCHA, puzzles, or extra UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A void to bots&lt;/strong&gt; — honeypots, signed tokens, browser verification, and behavioral checks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-DB&lt;/strong&gt; — no custom tables and no per-submission logs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache-aware&lt;/strong&gt; — optional Lazy Fetch refreshes tokens on genuinely loaded pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer-friendly&lt;/strong&gt; — a full filter API lets you customize almost every layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's part of the &lt;a href="https://en.inithtml.com/init-plugin-suite-minimalist-powerful-and-free-wordpress-plugins/" rel="noopener noreferrer"&gt;Init Plugin Suite&lt;/a&gt; and follows the same minimalist, performance-first philosophy.&lt;/p&gt;




&lt;h3&gt;
  
  
  Features at a Glance
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Layered Honeypot Protection
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Dynamic honeypot field names derived from context and site salt&lt;/li&gt;
&lt;li&gt;Optional custom field-name prefix&lt;/li&gt;
&lt;li&gt;CSS-clipped text and checkbox traps instead of &lt;code&gt;display:none&lt;/code&gt; or &lt;code&gt;visibility:hidden&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rotating CSS hiding techniques and trap field order&lt;/li&gt;
&lt;li&gt;Signed, context-bound, self-expiring time tokens&lt;/li&gt;
&lt;li&gt;HMAC verification with &lt;code&gt;hash_equals()&lt;/code&gt; to prevent timing attacks&lt;/li&gt;
&lt;li&gt;Per-form signed JavaScript proofs&lt;/li&gt;
&lt;li&gt;Configurable JavaScript delay with random jitter&lt;/li&gt;
&lt;li&gt;Headless-browser detection for common automation signals&lt;/li&gt;
&lt;li&gt;Selenium / ChromeDriver automation marker detection&lt;/li&gt;
&lt;li&gt;Non-browser User-Agent detection&lt;/li&gt;
&lt;li&gt;Cross-site submission blocking via &lt;code&gt;Sec-Fetch-Site&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Human-Friendly UX
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;No CAPTCHA&lt;/li&gt;
&lt;li&gt;No external JavaScript&lt;/li&gt;
&lt;li&gt;No CDN dependencies&lt;/li&gt;
&lt;li&gt;No additional fields visible to visitors&lt;/li&gt;
&lt;li&gt;Logged-in users bypass comment verification by default&lt;/li&gt;
&lt;li&gt;Submit Hold automatically waits for the guard when a real visitor submits too quickly, such as immediately after browser autofill&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A genuine visitor is never asked to solve anything. The protection happens in the background.&lt;/p&gt;

&lt;h4&gt;
  
  
  WordPress Core Forms
&lt;/h4&gt;

&lt;p&gt;Optional protection for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login&lt;/li&gt;
&lt;li&gt;Registration&lt;/li&gt;
&lt;li&gt;Lost Password&lt;/li&gt;
&lt;li&gt;Multisite Signup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each guard is independently configurable and disabled by default.&lt;/p&gt;

&lt;h4&gt;
  
  
  Form Plugin Integrations
&lt;/h4&gt;

&lt;p&gt;One-click protection for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contact Form 7&lt;/li&gt;
&lt;li&gt;WPForms&lt;/li&gt;
&lt;li&gt;Gravity Forms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The integration activates only when the corresponding plugin is detected as active.&lt;/p&gt;

&lt;h4&gt;
  
  
  WooCommerce &amp;amp; Community Integrations
&lt;/h4&gt;

&lt;p&gt;Optional protection for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WooCommerce Registration&lt;/li&gt;
&lt;li&gt;WooCommerce Login&lt;/li&gt;
&lt;li&gt;WooCommerce Lost Password&lt;/li&gt;
&lt;li&gt;bbPress New Topic&lt;/li&gt;
&lt;li&gt;bbPress Reply&lt;/li&gt;
&lt;li&gt;BuddyPress Registration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These integrations are also opt-in and automatically detect whether the target plugin is active.&lt;/p&gt;

&lt;h4&gt;
  
  
  Comment Content Filtering
&lt;/h4&gt;

&lt;p&gt;Behavioral honeypot checks are not always enough. Init Void Shield also provides optional content-based rules that inspect what was actually submitted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maximum Links per Comment&lt;/li&gt;
&lt;li&gt;Block BBCode Links&lt;/li&gt;
&lt;li&gt;Block URLs in Author Name&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These filters can catch spam even when the submission comes from a real browser or bypasses the normal honeypot flow.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cache-Safe Protection
&lt;/h4&gt;

&lt;p&gt;Aggressively cached WordPress sites can create a subtle problem: a timestamp generated when a page was cached is not the same as the time a real visitor loaded the page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lazy Fetch&lt;/strong&gt; solves that by refreshing the time token and signed JavaScript proof through a small same-origin &lt;code&gt;fetch()&lt;/code&gt; request after the page genuinely loads.&lt;/p&gt;

&lt;p&gt;No jQuery. No external API. If the request fails, Init Void Shield falls back to the original token.&lt;/p&gt;

&lt;h4&gt;
  
  
  Lightweight Statistics
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Blocked submission counter&lt;/li&gt;
&lt;li&gt;Statistics by channel&lt;/li&gt;
&lt;li&gt;Statistics by reason&lt;/li&gt;
&lt;li&gt;No per-submission logging&lt;/li&gt;
&lt;li&gt;No personal data storage&lt;/li&gt;
&lt;li&gt;Stored as a single non-autoloaded WordPress option&lt;/li&gt;
&lt;li&gt;Optional Dashboard widget&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Core Defense Layers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dynamic Honeypots&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Generates context-specific hidden trap fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CSS Trap Rotation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Randomizes how honeypots are hidden and ordered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Signed Time Token&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prevents instant submissions and token replay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Signed JS Proof&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Verifies the expected browser-side execution for that exact form&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Headless Detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Detects common Selenium, Puppeteer, Playwright, and headless-browser signals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Non-Browser UA Detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Blocks scripted HTTP clients such as curl, Python requests, HTTPX, aiohttp, axios, and similar clients&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-Site Blocking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rejects submissions reported by the browser as &lt;code&gt;Sec-Fetch-Site: cross-site&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Real User Interaction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optionally requires mouse, keyboard, touch, or scroll activity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Same-Site Referer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optionally validates the Referer header on comment submissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content Filters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optionally blocks excessive links, BBCode links, and URLs in author names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;REST API Guard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optionally blocks direct comment creation through &lt;code&gt;wp/v2/comments&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Submit Hold&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Temporarily holds early native submissions until the browser guard is ready&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Soft Kill&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Returns HTTP 200 OK to comment bots so they believe the submission succeeded&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;When a visitor opens a guarded form, Init Void Shield injects a set of protection values specific to that form.&lt;/p&gt;

&lt;p&gt;A simplified flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Visitor loads form
       ↓
Dynamic honeypots generated
       ↓
Signed time token issued
       ↓
Delayed JS proof scheduled
       ↓
Browser loads and verifies itself
       ↓
Visitor fills and submits form
       ↓
Server validates all enabled gates
       ↓
   ┌───────────────┐
   │ Valid human?  │
   └───────┬───────┘
           │
      ┌────┴────┐
      │         │
     YES        NO
      │         │
   Accept     Reject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On submission, the server can validate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The browser does not report the request as cross-site.&lt;/li&gt;
&lt;li&gt;The User-Agent does not identify a known scripted HTTP client.&lt;/li&gt;
&lt;li&gt;Honeypot fields remain empty.&lt;/li&gt;
&lt;li&gt;The signed JavaScript proof is present and matches the exact form and time token.&lt;/li&gt;
&lt;li&gt;No headless-browser or automation signal is reported.&lt;/li&gt;
&lt;li&gt;The time token is valid and bound to the form that issued it.&lt;/li&gt;
&lt;li&gt;The submission is not too fast.&lt;/li&gt;
&lt;li&gt;The token has not expired.&lt;/li&gt;
&lt;li&gt;Optional same-site Referer requirements are satisfied.&lt;/li&gt;
&lt;li&gt;Optional comment content rules pass.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If any enabled check fails, the submission is rejected.&lt;/p&gt;

&lt;p&gt;For the core comment form, the response can intentionally remain &lt;strong&gt;HTTP 200 OK&lt;/strong&gt; so automated spam software cannot easily distinguish a successful submission from a blocked one.&lt;/p&gt;




&lt;h3&gt;
  
  
  Core Modules
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Comment Guard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Always-on layered honeypot protection for WordPress comments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Core Form Guards&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optional login, registration, lost-password, and Multisite signup protection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Form Integrations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Contact Form 7, WPForms, and Gravity Forms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WooCommerce Guards&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Registration, login, and lost-password protection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Community Guards&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;bbPress topics/replies and BuddyPress registration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content Filters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Link limits, BBCode link blocking, and URL detection in names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Headless Detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Detects browser automation signals without external services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User-Agent Blocking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rejects scripted HTTP clients&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-Site Protection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Uses &lt;code&gt;Sec-Fetch-Site&lt;/code&gt; to detect cross-site submissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lazy Fetch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Refreshes tokens after real page load for cached environments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Submit Hold&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prevents genuine early submissions from being rejected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Statistics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lightweight blocked-submission counters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dashboard Widget&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optional blocked-submission summary in wp-admin&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Developer Hooks
&lt;/h3&gt;

&lt;p&gt;Init Void Shield is designed for developers who want precise control without modifying plugin core files.&lt;/p&gt;

&lt;p&gt;For example, you can bypass verification for a specific request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_skip_verification'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'__return_true'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Force-disable a specific WordPress core form guard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_skip_login_verification'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'__return_true'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_skip_register_verification'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'__return_true'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_skip_lostpassword_verification'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'__return_true'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_skip_multisite_signup_verification'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'__return_true'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add your own comment content rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_comment_content_violation'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$reason&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$commentdata&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Return a non-empty reason key to block the comment.&lt;/span&gt;
    &lt;span class="c1"&gt;// Return an empty string to allow it through.&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$reason&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Customize the honeypot markup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_honeypot_html'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$context&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Customize the minimum submit time and token lifetime:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_min_time'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$seconds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$context&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_max_time'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$seconds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$context&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;7200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Customize the JavaScript delay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_js_delay'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$milliseconds&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Customize the random delay jitter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_js_delay_jitter_max'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$milliseconds&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add your own non-browser User-Agent signature:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_blocked_user_agent_signatures'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$signatures&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$signatures&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'my-internal-test-client'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$signatures&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Force-exempt a request from cross-site submission blocking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_cross_site_exempt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$exempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$context&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$exempt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Control Submit Hold for a custom guard context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_submit_hold_enabled'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$enabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$context&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$enabled&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Customize how long Submit Hold waits for Lazy Fetch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_submit_hold_fetch_wait'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$milliseconds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$context&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$milliseconds&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The plugin also exposes filters for CSS trap variants, login scope exemptions, Referer checks, interaction timing, blocked messages, soft-kill response codes, and more.&lt;/p&gt;




&lt;h3&gt;
  
  
  Soft-Kill Responses
&lt;/h3&gt;

&lt;p&gt;For comment spam, Init Void Shield can intentionally return a successful HTTP status instead of exposing an obvious block response.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_kill_response_message'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$msg&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'Spam detected.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_kill_response_title'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$title&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'Blocked'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_void_shield_kill_response_code'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$code&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The default response code is &lt;code&gt;200&lt;/code&gt;, which makes the request look successful from the perspective of a basic spam bot.&lt;/p&gt;




&lt;h3&gt;
  
  
  Cache-Safe Tokens
&lt;/h3&gt;

&lt;p&gt;Full-page caching introduces a classic anti-spam problem.&lt;/p&gt;

&lt;p&gt;Imagine a page containing a token generated at 10:00 AM, cached by the server, and served to visitors at 12:00 PM. The token may now represent the cache time rather than the actual browser session.&lt;/p&gt;

&lt;p&gt;Init Void Shield's &lt;strong&gt;Lazy Fetch&lt;/strong&gt; feature refreshes the time token and signed JavaScript proof immediately after the page genuinely loads.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cached HTML
    ↓
Page loads in browser
    ↓
Same-origin fetch()
    ↓
Fresh signed token + JS proof
    ↓
Visitor submits
    ↓
Server validates fresh values
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The request uses plain JavaScript and has no dependency on jQuery.&lt;/p&gt;

&lt;p&gt;This is particularly useful on sites using aggressive full-page caching or CDN caching.&lt;/p&gt;




&lt;h3&gt;
  
  
  Login Guard Scope
&lt;/h3&gt;

&lt;p&gt;The Login Guard supports two modes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everywhere&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Protect both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wp-login.php
wp_login_form()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;wp-login.php only&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Protect only the native WordPress login page while leaving front-end &lt;code&gt;wp_login_form()&lt;/code&gt; usage untouched.&lt;/p&gt;

&lt;p&gt;This is useful when a custom front-end login form lives on a page that may be served through full-page caching and should remain unguarded.&lt;/p&gt;




&lt;h3&gt;
  
  
  Where Data Lives
&lt;/h3&gt;

&lt;p&gt;Init Void Shield is intentionally designed to keep its footprint close to zero.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No custom database tables&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No per-submission records&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No personal data stored for statistics&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One non-autoloaded WordPress option&lt;/strong&gt; for lightweight counters&lt;/li&gt;
&lt;li&gt;No external anti-spam service&lt;/li&gt;
&lt;li&gt;No external JavaScript or CDN dependency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means less database clutter and less runtime overhead compared with systems that persist every blocked request.&lt;/p&gt;




&lt;h3&gt;
  
  
  Settings
&lt;/h3&gt;

&lt;p&gt;Navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Settings → Init Void Shield
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The settings are grouped by protection layer.&lt;/p&gt;

&lt;h4&gt;
  
  
  Comments
&lt;/h4&gt;

&lt;p&gt;Configure the core comment guard, logged-in user bypass, REST API protection, Referer validation, and optional content filters.&lt;/p&gt;

&lt;h4&gt;
  
  
  Timing &amp;amp; Token Engine
&lt;/h4&gt;

&lt;p&gt;Tune:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimum Submit Time&lt;/li&gt;
&lt;li&gt;Account Forms Minimum Submit Time&lt;/li&gt;
&lt;li&gt;JavaScript Token Delay&lt;/li&gt;
&lt;li&gt;Maximum Token Age&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The separate account-form threshold is useful because browser autofill can allow legitimate login or registration submissions to happen much faster than a normal content form.&lt;/p&gt;

&lt;h4&gt;
  
  
  WordPress Core Forms
&lt;/h4&gt;

&lt;p&gt;Enable protection individually for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login&lt;/li&gt;
&lt;li&gt;Registration&lt;/li&gt;
&lt;li&gt;Lost Password&lt;/li&gt;
&lt;li&gt;Multisite Signup&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Form Plugin Integrations
&lt;/h4&gt;

&lt;p&gt;Enable guards for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contact Form 7&lt;/li&gt;
&lt;li&gt;WPForms&lt;/li&gt;
&lt;li&gt;Gravity Forms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only detected active plugins are eligible.&lt;/p&gt;

&lt;h4&gt;
  
  
  Community &amp;amp; E-commerce Integrations
&lt;/h4&gt;

&lt;p&gt;Enable guards for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WooCommerce Registration&lt;/li&gt;
&lt;li&gt;WooCommerce Login&lt;/li&gt;
&lt;li&gt;WooCommerce Lost Password&lt;/li&gt;
&lt;li&gt;bbPress Topics &amp;amp; Replies&lt;/li&gt;
&lt;li&gt;BuddyPress Registration&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Advanced Protection
&lt;/h4&gt;

&lt;p&gt;Configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom Field Prefix&lt;/li&gt;
&lt;li&gt;CSS Trap Rotation&lt;/li&gt;
&lt;li&gt;Headless Browser Detection&lt;/li&gt;
&lt;li&gt;Non-Browser User-Agent Blocking&lt;/li&gt;
&lt;li&gt;Cross-Site Submission Blocking&lt;/li&gt;
&lt;li&gt;Real User Interaction&lt;/li&gt;
&lt;li&gt;Lazy Fetch&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Statistics
&lt;/h4&gt;

&lt;p&gt;Track blocked submissions by channel and reason using the lightweight non-autoloaded statistics option.&lt;/p&gt;

&lt;p&gt;You can also enable the optional Dashboard widget.&lt;/p&gt;




&lt;h3&gt;
  
  
  Safe by Default
&lt;/h3&gt;

&lt;p&gt;Init Void Shield follows an intentionally conservative activation model.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;comment guard is enabled by default&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Everything else is opt-in.&lt;/p&gt;

&lt;p&gt;That means activating a new integration does not silently start modifying a login page, WooCommerce form, or community form simply because a supported plugin happens to be installed.&lt;/p&gt;

&lt;p&gt;You decide which surfaces should be protected.&lt;/p&gt;




&lt;h3&gt;
  
  
  Upgrading to 1.11
&lt;/h3&gt;

&lt;p&gt;Version &lt;strong&gt;1.11&lt;/strong&gt; introduces a new signed, per-form JavaScript proof instead of relying on a fixed JS token value.&lt;/p&gt;

&lt;p&gt;After upgrading, &lt;strong&gt;purge your page cache and CDN cache once&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A page still being served from a pre-1.11 cache contains the old script. Submissions from that stale HTML can fail with an &lt;code&gt;Invalid JS proof&lt;/code&gt; reason until the cache is refreshed.&lt;/p&gt;

&lt;p&gt;Version 1.11 also adds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Submit Hold for early native submissions&lt;/li&gt;
&lt;li&gt;Selenium / ChromeDriver automation detection&lt;/li&gt;
&lt;li&gt;Extended non-browser User-Agent detection&lt;/li&gt;
&lt;li&gt;Cross-site submission blocking&lt;/li&gt;
&lt;li&gt;Comment content filters&lt;/li&gt;
&lt;li&gt;WooCommerce Login protection&lt;/li&gt;
&lt;li&gt;WooCommerce Lost Password protection&lt;/li&gt;
&lt;li&gt;Signed per-form JS proofs&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;Install via &lt;a href="https://wordpress.org/plugins/init-void-shield/" rel="noopener noreferrer"&gt;WordPress.org&lt;/a&gt; or clone the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/brokensmile2103/init-void-shield.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload the plugin to &lt;code&gt;/wp-content/plugins/&lt;/code&gt; if installing manually&lt;/li&gt;
&lt;li&gt;Activate &lt;strong&gt;Init Void Shield&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings → Init Void Shield&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Review the comment protection settings&lt;/li&gt;
&lt;li&gt;Enable any optional core form, form plugin, WooCommerce, bbPress, or BuddyPress guards you need&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;Your WordPress comments are protected out of the box, while every additional guard stays under your control.&lt;/p&gt;




&lt;h3&gt;
  
  
  Part of the Init Plugin Suite
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Init Void Shield&lt;/strong&gt; is part of the &lt;a href="https://en.inithtml.com/init-plugin-suite-minimalist-powerful-and-free-wordpress-plugins/" rel="noopener noreferrer"&gt;Init Plugin Suite&lt;/a&gt; — a collection of minimalist, high-performance WordPress plugins built for developers and creators who care about speed, clean architecture, and practical UX.&lt;/p&gt;

&lt;p&gt;No bloat. No unnecessary services. No CAPTCHA.&lt;/p&gt;

&lt;p&gt;Just a quiet layer between your forms and automated spam.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Thanks for reading. Got feedback or questions?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://en.inithtml.com/" rel="noopener noreferrer"&gt;Project Page&lt;/a&gt;&lt;br&gt;
→ &lt;a href="https://github.com/brokensmile2103/init-void-shield" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>plugin</category>
      <category>antispam</category>
      <category>honeypot</category>
    </item>
    <item>
      <title>Share Code &amp; Notes Instantly with Init Note — No Account, No Setup</title>
      <dc:creator>Hao Nguyen</dc:creator>
      <pubDate>Wed, 22 Jul 2026 06:16:03 +0000</pubDate>
      <link>https://dev.to/brokensmile2103/share-code-notes-instantly-with-init-note-no-account-no-setup-5b6d</link>
      <guid>https://dev.to/brokensmile2103/share-code-notes-instantly-with-init-note-no-account-no-setup-5b6d</guid>
      <description>&lt;p&gt;Need to send a teammate a config file, a stack trace, or a quick checklist without opening Slack threads or spinning up a Gist? &lt;a href="https://note.inithtml.com/" rel="noopener noreferrer"&gt;Init Note&lt;/a&gt; turns any text — plain notes or syntax-highlighted code — into a shareable link in seconds. Type or paste, hit save, get a link. Done.&lt;/p&gt;

&lt;p&gt;No account. No install. No friction.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Init Note?
&lt;/h2&gt;

&lt;p&gt;Init Note is a free online pastebin/notepad hybrid built for speed. You type or paste content into a live editor with real &lt;strong&gt;syntax highlighting&lt;/strong&gt; for 15+ languages (JavaScript, TypeScript, PHP, Python, HTML, CSS, SQL, Bash, Go, Rust, Java, C, C++, JSON, Markdown), hit &lt;strong&gt;"Save &amp;amp; Get Link"&lt;/strong&gt;, and you have a URL anyone can open instantly — no login required on either end.&lt;/p&gt;

&lt;p&gt;The editor also runs in &lt;strong&gt;Markdown mode&lt;/strong&gt;, and here's the part developers actually love: you can &lt;strong&gt;paste an image directly with &lt;code&gt;Ctrl + V&lt;/code&gt;&lt;/strong&gt;, and it's automatically uploaded and inserted into the note as Markdown — no separate image host, no manual linking.&lt;/p&gt;

&lt;p&gt;Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sharing a code snippet or config with a teammate&lt;/li&gt;
&lt;li&gt;Sending a stack trace to get help debugging&lt;/li&gt;
&lt;li&gt;Quick notes and checklists during a meeting or while on the move&lt;/li&gt;
&lt;li&gt;Sensitive, one-time content that should self-destruct after being read&lt;/li&gt;
&lt;li&gt;Writing a quick Markdown doc with screenshots pasted straight in&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to Share a Note in Under 30 Seconds
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://note.inithtml.com/" rel="noopener noreferrer"&gt;note.inithtml.com&lt;/a&gt; and start typing or pasting.&lt;/li&gt;
&lt;li&gt;Pick a language, or let it auto-detect from what you pasted.&lt;/li&gt;
&lt;li&gt;Optionally set a custom slug, a password, or self-destruct-after-read.&lt;/li&gt;
&lt;li&gt;Hit &lt;strong&gt;"Save &amp;amp; Get Link"&lt;/strong&gt; (or &lt;code&gt;Ctrl + S&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Copy the link or scan the QR code — the recipient sees it instantly, no login needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Paste a stack trace → language auto-detected as JavaScript → save → send the link in Slack → your teammate sees it fully highlighted, no formatting lost.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Full How-To Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Write or Paste Your Content
&lt;/h3&gt;

&lt;p&gt;Open the editor and start typing, or paste in code, logs, or plain text. Switch to &lt;strong&gt;Markdown mode&lt;/strong&gt; if you're writing documentation or notes with formatting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Drop In Images with Ctrl + V
&lt;/h3&gt;

&lt;p&gt;This is the standout feature for Markdown notes: drag-and-drop an image, or just paste one straight from your clipboard, and Init Note uploads it and inserts the Markdown image syntax at your cursor automatically. No hunting for an image host, no manual &lt;code&gt;![]()&lt;/code&gt; linking.&lt;/p&gt;

&lt;p&gt;It pairs especially well with &lt;a href="https://en.inithtml.com/init-clipboard-image/" rel="noopener noreferrer"&gt;Init Clipboard Image&lt;/a&gt; when you're writing a customer-facing guide or tutorial: take a screenshot, annotate it in Init Clipboard Image (arrows, highlights, step numbers), copy the result with &lt;code&gt;Ctrl + C&lt;/code&gt;, then paste it straight into your Init Note with &lt;code&gt;Ctrl + V&lt;/code&gt;. The annotated image is uploaded and inserted as Markdown instantly — so your whole how-to article, screenshots included, comes together in one continuous workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Pick a Language (or Skip It)
&lt;/h3&gt;

&lt;p&gt;Choose from 15+ supported languages, or let the editor auto-detect the language when you paste code — it applies the right highlighting automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Customize the Link (Optional)
&lt;/h3&gt;

&lt;p&gt;Set a &lt;strong&gt;custom slug&lt;/strong&gt; so the URL is memorable (&lt;code&gt;note.inithtml.com/your-name&lt;/code&gt;) instead of a random string.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Add Protection (Optional)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Password&lt;/strong&gt; — lock the note so only people with the password can read it. Good for long-lived, private shares.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-destruct after read&lt;/strong&gt; — the note is permanently deleted after the first view. Good for one-time secrets like tokens or temporary credentials.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 6: Save and Share
&lt;/h3&gt;

&lt;p&gt;Hit &lt;strong&gt;"Save &amp;amp; Get Link"&lt;/strong&gt; or &lt;code&gt;Ctrl + S&lt;/code&gt;. A QR code appears immediately in the result window — handy for sharing to a phone. Copy the link, or save the &lt;strong&gt;Edit Key&lt;/strong&gt; you're given if you want to edit or delete the note later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Manage Your Notes
&lt;/h3&gt;

&lt;p&gt;Every note you create on a device shows up under &lt;strong&gt;"My Notes"&lt;/strong&gt;, so you don't have to keep track of links manually. Notes are auto-deleted after 30 days of no access.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real syntax highlighting&lt;/strong&gt; — 15+ languages, colored live as you type, not just monospaced plain text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto language detection&lt;/strong&gt; — paste code, get the right highlighting automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown mode with image paste&lt;/strong&gt; — &lt;code&gt;Ctrl + V&lt;/code&gt; an image and it's uploaded and inserted as Markdown instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant shareable link&lt;/strong&gt; — every note gets its own URL plus an auto-generated QR code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom slug&lt;/strong&gt; — memorable, brandable links&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password protection&lt;/strong&gt; — for long-term, private sharing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-destruct after read&lt;/strong&gt; — for one-time, sensitive content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit Key&lt;/strong&gt; — edit or delete a note anytime with a private key&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Word wrap toggle&lt;/strong&gt; — especially useful reading notes on mobile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Note history&lt;/strong&gt; — see every note you've created on a device under "My Notes"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bilingual UI&lt;/strong&gt; — English/Vietnamese, auto-detected from your browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fully responsive&lt;/strong&gt; — works well on desktop and mobile alike&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developers&lt;/strong&gt; — share a code snippet, config file, or script with a colleague via one link.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teams&lt;/strong&gt; — send instructions, checklists, or meeting notes without opening email or a doc tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical support&lt;/strong&gt; — paste an error log or stack trace and get it reviewed with full syntax highlighting intact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-the-go notes&lt;/strong&gt; — jot something down quickly, pick it back up from any device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensitive info&lt;/strong&gt; — use self-destruct-after-read for one-time secrets, or a password for longer-lived private notes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teaching&lt;/strong&gt; — share exercises, code examples, or reference material through a direct link.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick Markdown docs&lt;/strong&gt; — write notes with pasted screenshots included, no separate image hosting step.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Use Init Note?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No account, no install&lt;/li&gt;
&lt;li&gt;Actual syntax-highlighted editor, not just a plain textbox&lt;/li&gt;
&lt;li&gt;Auto language detection when you paste code&lt;/li&gt;
&lt;li&gt;Markdown mode with clipboard image paste built in&lt;/li&gt;
&lt;li&gt;Password protection for private, long-lived shares&lt;/li&gt;
&lt;li&gt;Self-destruct mode for sensitive, one-time content&lt;/li&gt;
&lt;li&gt;QR code generated automatically — easy to hand off to mobile&lt;/li&gt;
&lt;li&gt;Links work for 30 days, no login required to view&lt;/li&gt;
&lt;li&gt;Minimal, distraction-free interface&lt;/li&gt;
&lt;li&gt;Custom slugs for links that actually mean something&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;Head to &lt;a href="https://note.inithtml.com/" rel="noopener noreferrer"&gt;Init Note&lt;/a&gt;, paste a snippet or drop in some Markdown with an image or two, and see how fast you get a shareable link. If it becomes part of your daily workflow, I'd love to hear how you're using it in the comments.&lt;/p&gt;

</description>
      <category>note</category>
      <category>share</category>
      <category>markdown</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Convert, Resize &amp; Watermark Images 100% in Your Browser with Init Magick Studio</title>
      <dc:creator>Hao Nguyen</dc:creator>
      <pubDate>Wed, 22 Jul 2026 06:05:47 +0000</pubDate>
      <link>https://dev.to/brokensmile2103/convert-resize-watermark-images-100-in-your-browser-with-init-magick-studio-268i</link>
      <guid>https://dev.to/brokensmile2103/convert-resize-watermark-images-100-in-your-browser-with-init-magick-studio-268i</guid>
      <description>&lt;p&gt;Need to batch-convert a folder of PNGs to WebP, resize a hundred product photos to a social preset, strip GPS data before sharing, and slap a watermark on everything — without uploading a single file to a server? &lt;a href="https://inithtml.com/wasm/init-magick-studio/" rel="noopener noreferrer"&gt;Init Magick Studio&lt;/a&gt; does the whole pipeline, right in your browser, powered by ImageMagick compiled to WebAssembly.&lt;/p&gt;

&lt;p&gt;No account. No install. No upload. Just drag, convert, download.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Init Magick Studio?
&lt;/h2&gt;

&lt;p&gt;Init Magick Studio is a free, browser-based image converter built on &lt;strong&gt;ImageMagick WASM&lt;/strong&gt; — the same engine behind countless professional image pipelines, running entirely client-side. Every operation (format conversion, resize, compression, EXIF stripping, watermarking) happens on your device. Nothing is ever sent to a server, nothing is stored in the cloud.&lt;/p&gt;

&lt;p&gt;It supports &lt;strong&gt;100+ image formats&lt;/strong&gt; — JPEG, PNG, WebP, AVIF, GIF, BMP, TIFF, RAW, and more — with smart resizing, Entropy-based smart crop, quality control, metadata removal, custom watermarks, and one-click ZIP export.&lt;/p&gt;

&lt;p&gt;Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Batch format conversion for web performance (PNG → WebP/AVIF)&lt;/li&gt;
&lt;li&gt;Resizing images to exact social media dimensions&lt;/li&gt;
&lt;li&gt;Stripping EXIF/GPS before sharing sensitive photos&lt;/li&gt;
&lt;li&gt;Watermarking a whole batch of images at once&lt;/li&gt;
&lt;li&gt;Any image job you'd rather not upload to a random online converter&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to Convert a Batch of Images in Under a Minute
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the tool and drag in your images (or click to select).&lt;/li&gt;
&lt;li&gt;Pick an output format — JPEG, PNG, WebP, AVIF, GIF, TIFF, or BMP.&lt;/li&gt;
&lt;li&gt;Optionally set dimensions, or just pick a preset (Story, Square, A4, 4K...).&lt;/li&gt;
&lt;li&gt;Optionally tweak quality, strip metadata, or add a watermark.&lt;/li&gt;
&lt;li&gt;Hit &lt;strong&gt;"Convert &amp;amp; Download ZIP"&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Drop in 40 product photos → output as WebP → preset "Social" → Privacy Mode on → watermark logo bottom-right → one ZIP, ready to upload to your store.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Full How-To Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Add Your Images
&lt;/h3&gt;

&lt;p&gt;Drag and drop or click to select files. There's no cap on batch size — process 1 image or 100, limited only by your browser's memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Choose Output Format
&lt;/h3&gt;

&lt;p&gt;JPEG for photos, PNG for lossless, WebP or AVIF for modern, smaller web-ready files, or GIF/TIFF/BMP if that's what you need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Set Dimensions (Optional)
&lt;/h3&gt;

&lt;p&gt;Enter width/height manually, or grab one of the &lt;strong&gt;13 built-in presets&lt;/strong&gt;: FHD, Story, Square, Social, Thumb, A4, 4K, 2K, HD, Banner, FB Cover, IG Post, YT Thumb. Leave it empty to keep the original size.&lt;/p&gt;

&lt;p&gt;If you enter both width and height, you can also enable &lt;strong&gt;Smart Crop&lt;/strong&gt; — it runs an Entropy analysis to automatically keep the highest-detail region of the image instead of a naive center crop. Great for thumbnails and avatars.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Adjust Compression Quality
&lt;/h3&gt;

&lt;p&gt;A quality slider from 1–100 (default 85) lets you balance file size against visual fidelity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Toggle Privacy Mode
&lt;/h3&gt;

&lt;p&gt;Strips EXIF, GPS tags, camera profiles, and other device metadata. It's &lt;strong&gt;on by default&lt;/strong&gt; — worth knowing if you actually want to keep that data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Add a Watermark (Optional)
&lt;/h3&gt;

&lt;p&gt;Upload a watermark image (transparent PNG supported), place it on a 3×3 position grid, and adjust size (as % of image width) and opacity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Convert &amp;amp; Download
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;"Convert &amp;amp; Download ZIP"&lt;/strong&gt; or press &lt;code&gt;Ctrl + Enter&lt;/code&gt;. First run downloads the WASM engine (~14MB, cached afterward). Watch each file move through Pending → Processing → Done/Error in the log, then grab the ZIP — or download individual files straight from the list without waiting for the whole batch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100% client-side&lt;/strong&gt; — powered by ImageMagick WASM, no upload, no server ever sees your images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100+ formats&lt;/strong&gt; — read/write JPEG, PNG, WebP, AVIF, GIF, BMP, TIFF, RAW, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unlimited batch processing&lt;/strong&gt; with a per-file progress bar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Resize&lt;/strong&gt; — proportional scaling by max width/height, or exact crop with both dimensions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Crop (Entropy-based)&lt;/strong&gt; — auto-keeps the highest-detail region&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;13 dimension presets&lt;/strong&gt; for social, print, and banner formats&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compression quality control&lt;/strong&gt; with live size preview&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy Mode&lt;/strong&gt; — strips EXIF/GPS/metadata, on by default&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom watermark&lt;/strong&gt; — position, size, and opacity control, transparent PNG supported&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic ZIP export&lt;/strong&gt;, smart-compressed per format (STORE for PNG/AVIF/WebP, DEFLATE for JPEG/BMP)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Individual downloads&lt;/strong&gt; per file, no need to wait for the batch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detailed processing log&lt;/strong&gt; — every step timestamped, per-file status&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Space savings display&lt;/strong&gt; — original vs. new size with a ↓%/↑% badge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bilingual UI&lt;/strong&gt; — English/Vietnamese, auto-detected, saved to &lt;code&gt;localStorage&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard shortcut&lt;/strong&gt; — &lt;code&gt;Ctrl + Enter&lt;/code&gt; to start conversion&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developers &amp;amp; Designers&lt;/strong&gt; — batch-convert PNGs to WebP/AVIF for smaller, faster-loading websites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marketing &amp;amp; Content Creators&lt;/strong&gt; — resize to exact social dimensions in one drag-and-drop using built-in presets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photographers&lt;/strong&gt; — convert RAW to JPEG, export lossless PNG for print, strip GPS before sharing, add copyright watermarks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO &amp;amp; Web Performance&lt;/strong&gt; — bulk-optimize an image library to next-gen formats to improve load times and Core Web Vitals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick Sharing&lt;/strong&gt; — compress screenshots or phone photos to fit email/chat size limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy-First Processing&lt;/strong&gt; — handle IDs, contracts, or sensitive documents with zero server exposure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Education&lt;/strong&gt; — convert diagrams and illustrations for slides and documents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photo Library Management&lt;/strong&gt; — strip redundant metadata to shrink files and save cloud storage.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Use This Tool?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No registration, no software install&lt;/li&gt;
&lt;li&gt;100% client-side — your images never leave your device&lt;/li&gt;
&lt;li&gt;Powered by ImageMagick WASM, a genuinely professional-grade engine&lt;/li&gt;
&lt;li&gt;100+ formats, unlimited batch size&lt;/li&gt;
&lt;li&gt;Smart Crop, presets, watermarking, and metadata stripping all in one place&lt;/li&gt;
&lt;li&gt;Clean, dark, ad-free interface&lt;/li&gt;
&lt;li&gt;Works on any modern browser — desktop, laptop, tablet, or phone&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;Head to &lt;a href="https://inithtml.com/wasm/init-magick-studio/" rel="noopener noreferrer"&gt;Init Magick Studio&lt;/a&gt;, drop in a batch of images, and see how fast a fully local, no-upload converter can be. If it saves you time on a real workflow, I'd genuinely like to hear about it in the comments.&lt;/p&gt;

</description>
      <category>webassembly</category>
      <category>imageprocessing</category>
      <category>webdev</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Annotate Screenshots Instantly in Your Browser with Init Clipboard Image</title>
      <dc:creator>Hao Nguyen</dc:creator>
      <pubDate>Wed, 22 Jul 2026 05:54:54 +0000</pubDate>
      <link>https://dev.to/brokensmile2103/annotate-screenshots-instantly-in-your-browser-with-init-clipboard-image-5bmn</link>
      <guid>https://dev.to/brokensmile2103/annotate-screenshots-instantly-in-your-browser-with-init-clipboard-image-5bmn</guid>
      <description>&lt;p&gt;Ever needed to quickly mark up a screenshot — circle a bug, blur out an email address, number the steps of a tutorial — without opening Photoshop or installing yet another app? &lt;a href="https://en.inithtml.com/init-clipboard-image/" rel="noopener noreferrer"&gt;Init Clipboard Image&lt;/a&gt; does exactly that, right in your browser, in seconds.&lt;/p&gt;

&lt;p&gt;Paste, draw, blur, crop, copy back to clipboard. No install, no upload, no signup.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Init Clipboard Image?
&lt;/h2&gt;

&lt;p&gt;Init Clipboard Image is a free, 100% client-side screenshot annotation tool. You paste an image straight from your clipboard (&lt;code&gt;Ctrl + V&lt;/code&gt;), drag &amp;amp; drop a file, or pick one from your computer — then mark it up with a full annotation toolkit and copy or download the result instantly.&lt;/p&gt;

&lt;p&gt;Everything runs locally in the browser. Nothing is ever uploaded to a server, which makes it a solid choice for screenshots that contain sensitive info you're about to blur out anyway.&lt;/p&gt;

&lt;p&gt;Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bug reports &amp;amp; QA testing&lt;/li&gt;
&lt;li&gt;Step-by-step tutorials and documentation&lt;/li&gt;
&lt;li&gt;Design/UI feedback&lt;/li&gt;
&lt;li&gt;Redacting sensitive data before sharing&lt;/li&gt;
&lt;li&gt;Quick edits on anything you copy from chat, email, or docs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to Annotate a Screenshot in Under a Minute
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Copy a screenshot from anywhere (or have an image file ready).&lt;/li&gt;
&lt;li&gt;Paste it into the tool with &lt;code&gt;Ctrl + V&lt;/code&gt;, drag &amp;amp; drop it, or click to browse.&lt;/li&gt;
&lt;li&gt;Pick a tool — pencil, highlighter, arrow, rectangle, X mark, blur, crop, step marker, or text note.&lt;/li&gt;
&lt;li&gt;Mark up the image: highlight the bug, draw an arrow, blur out a token, number the steps.&lt;/li&gt;
&lt;li&gt;Copy the result back to your clipboard (&lt;code&gt;Ctrl + C&lt;/code&gt;) or download it (&lt;code&gt;Ctrl + S&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Paste a UI screenshot → draw an arrow at the broken button → add a text note "this throws a 500" → copy and paste straight into your bug tracker.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9aws6vnnf71oduooyxk5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9aws6vnnf71oduooyxk5.png" alt="Example" width="685" height="493"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Full How-To Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Get an Image In
&lt;/h3&gt;

&lt;p&gt;Paste with &lt;code&gt;Ctrl + V&lt;/code&gt;, drag &amp;amp; drop a file onto the page, or click to open the file picker. JPG, PNG, and WebP are all supported.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Pick Your Tool
&lt;/h3&gt;

&lt;p&gt;The toolbar covers everything you'd actually reach for on a screenshot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pencil&lt;/strong&gt; — freehand drawing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Highlighter&lt;/strong&gt; — soft, marker-style highlight, great for docs and screenshots&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arrow&lt;/strong&gt; — point at exactly what matters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rectangle&lt;/strong&gt; — frame a section of the image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;X Mark&lt;/strong&gt; — click to mark a spot, &lt;code&gt;Ctrl + Click&lt;/code&gt; to cross out the whole image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blur / Pixelate&lt;/strong&gt; — redact emails, phone numbers, tokens, API keys&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crop&lt;/strong&gt; — trim to just the part you need&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step Marker&lt;/strong&gt; — auto-numbered stamps for tutorials, click to place 1, 2, 3...&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text Note&lt;/strong&gt; — inline, multi-line text directly on the image&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Fine-Tune Stroke &amp;amp; Font Size
&lt;/h3&gt;

&lt;p&gt;Both line thickness and font size auto-scale to the image's resolution, so annotations look consistent whether you're marking up a tiny icon or a 4K screenshot. Hold &lt;code&gt;Shift&lt;/code&gt; while drawing to snap lines to a straight horizontal or vertical axis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Undo/Redo as Needed
&lt;/h3&gt;

&lt;p&gt;Full undo/redo history (&lt;code&gt;Ctrl + Z&lt;/code&gt; / &lt;code&gt;Ctrl + Y&lt;/code&gt;) so you can experiment freely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Copy or Download
&lt;/h3&gt;

&lt;p&gt;Hit &lt;strong&gt;Copy Image&lt;/strong&gt; to send the annotated image straight to your clipboard — ready to paste into Slack, an issue tracker, or an email — or &lt;strong&gt;Download&lt;/strong&gt; to save it as a file.&lt;/p&gt;




&lt;h2&gt;
  
  
  Keyboard Shortcuts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;B&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pencil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;H&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Highlighter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;A&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Arrow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;X mark&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;R&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rectangle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;M&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Blur / Pixelate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;K&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Crop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Step marker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;T&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Text note&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Shift&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Snap line to horizontal/vertical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl + C&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copy image to clipboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl + S&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Download image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Undo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Y&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Redo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Delete&lt;/code&gt; / &lt;code&gt;Backspace&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Clear current image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;?&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show shortcut cheat sheet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bug reports &amp;amp; QA&lt;/strong&gt; — highlight, arrow, or X-mark the exact issue instead of writing a paragraph describing where it is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tutorials &amp;amp; docs&lt;/strong&gt; — use the Step Marker to number a sequence of UI actions in seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design review&lt;/strong&gt; — annotate a Figma export or a live site screenshot with direct feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy before sharing&lt;/strong&gt; — blur out emails, phone numbers, tokens, and API keys before posting a screenshot publicly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teaching&lt;/strong&gt; — highlight key parts of a slide or document to explain visually.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everyday quick edits&lt;/strong&gt; — mark up anything from chat, email, or docs without switching apps.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Use This Tool?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero setup&lt;/strong&gt; — open the page, start pasting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No upload&lt;/strong&gt; — all processing happens on your device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full toolkit&lt;/strong&gt; — draw, highlight, arrow, blur, crop, number, and annotate with text, all in one place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-scaling&lt;/strong&gt; — stroke width and font size adapt to image resolution automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clipboard-first workflow&lt;/strong&gt; — paste in, copy out, no file management required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works everywhere&lt;/strong&gt; — modern Chrome, Edge, Firefox, and Safari.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tips for Faster Annotation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Learn the single-letter shortcuts (&lt;code&gt;B&lt;/code&gt;, &lt;code&gt;H&lt;/code&gt;, &lt;code&gt;A&lt;/code&gt;, &lt;code&gt;X&lt;/code&gt;, &lt;code&gt;M&lt;/code&gt;...) — switching tools becomes instant.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;Shift&lt;/code&gt; when drawing arrows or rectangles to keep them perfectly straight.&lt;/li&gt;
&lt;li&gt;Blur first, annotate second, if a screenshot has sensitive data — one less thing to forget.&lt;/li&gt;
&lt;li&gt;Use Step Marker instead of manually typing numbers for anything with more than 3 steps.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;Head over to &lt;a href="https://en.inithtml.com/init-clipboard-image/" rel="noopener noreferrer"&gt;Init Clipboard Image&lt;/a&gt; and paste your first screenshot — it takes less time than opening an image editor. If you build something useful with it (a bug report template, a tutorial workflow), share it in the comments!&lt;/p&gt;

</description>
      <category>clipboard</category>
      <category>annotate</category>
      <category>screenshot</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Init User Engine – A gamified, frontend-first user system for WordPress</title>
      <dc:creator>Hao Nguyen</dc:creator>
      <pubDate>Wed, 22 Jul 2026 05:37:11 +0000</pubDate>
      <link>https://dev.to/brokensmile2103/init-user-engine-a-gamified-frontend-first-user-system-for-wordpress-57m7</link>
      <guid>https://dev.to/brokensmile2103/init-user-engine-a-gamified-frontend-first-user-system-for-wordpress-57m7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Init User Engine&lt;/strong&gt; is a lightweight, no-bloat user system for modern WordPress sites. It replaces the default profile/login experience with a full gamification layer — EXP &amp;amp; levels, a Coin/Cash wallet, daily check-in, VIP membership, referrals, and an inbox — all rendered through a fast, modal-driven frontend powered by the REST API.&lt;/p&gt;

&lt;p&gt;No jQuery. Minimal settings. Smart by default.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why Init User Engine?
&lt;/h3&gt;

&lt;p&gt;Most "membership" or "points" plugins for WordPress are heavy, admin-ajax-based, and hard to theme. Init User Engine takes the opposite approach: everything dynamic — avatar, dashboard, check-in, inbox, VIP purchase — is rendered client-side in pure Vanilla JS and talks to a clean REST API. Drop in one shortcode and you get a full gamified account system on top of native WordPress users.&lt;/p&gt;

&lt;p&gt;It's the core user system behind the &lt;a href="https://en.inithtml.com/init-plugin-suite-minimalist-powerful-and-free-wordpress-plugins/" rel="noopener noreferrer"&gt;Init Plugin Suite&lt;/a&gt; — the same minimalist, performance-first philosophy as &lt;a href="https://wordpress.org/plugins/init-live-search/" rel="noopener noreferrer"&gt;Init Live Search&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Features at a Glance
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Gamified Progression
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;EXP &amp;amp; Level system with fully hookable progression logic&lt;/li&gt;
&lt;li&gt;Coin &amp;amp; Cash wallet with transaction logs (dedicated DB tables, not user meta)&lt;/li&gt;
&lt;li&gt;Daily check-in with streak milestones and an online-time bonus timer&lt;/li&gt;
&lt;li&gt;Daily task list, extensible via filter&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Frontend-First UX
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;One shortcode: &lt;code&gt;[init_user_engine]&lt;/code&gt; — avatar button + full modal dashboard&lt;/li&gt;
&lt;li&gt;Avatar system with upload, live preview, and revert-to-default support&lt;/li&gt;
&lt;li&gt;Login/Register modals for logged-out visitors, with custom redirect URLs&lt;/li&gt;
&lt;li&gt;Pure Vanilla JS — no jQuery, no server-rendered admin-ajax round trips&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Monetization &amp;amp; Retention
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;VIP membership, purchased with in-site Coin, with configurable duration tiers (including lifetime)&lt;/li&gt;
&lt;li&gt;VIP bonus system — extra Coin/EXP percentage for VIP members&lt;/li&gt;
&lt;li&gt;Redeem Code / Gift Code module — generate single-use or bulk codes, redeem for rewards&lt;/li&gt;
&lt;li&gt;Referral module with cookie-based signup tracking and rewards for both sides&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Communication
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Built-in inbox with pagination, category filters (System, Rewards, Activity...), read/claim/delete&lt;/li&gt;
&lt;li&gt;Admin panel to send notifications to selected users or the whole member base, with priority and expiration&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Built for Developers
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;REST API for every feature — register, check-in, claim reward, inbox, VIP purchase, redeem code, profile, and more&lt;/li&gt;
&lt;li&gt;Deep set of action/filter hooks: modify EXP curves, VIP prices, referral rewards, theme colors, VIP body classes, and more&lt;/li&gt;
&lt;li&gt;Transaction and EXP logs stored in dedicated tables with &lt;code&gt;wp_cache&lt;/code&gt; support and true paginated queries — built to scale, not just to demo&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Core Modules
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EXP &amp;amp; Level&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Award EXP via hook, auto level-up, customizable EXP curve per level&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Wallet (Coin/Cash)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dual-currency system with full transaction history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Check-in&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Daily rewards, streak milestones, online-duration bonus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VIP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Coin-based purchase, expiry tracking, bonus % on rewards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Referral&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cookie-based tracking, rewards for referrer and new user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Redeem Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single-use or bulk gift codes redeemable for Coin/Cash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inbox&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filterable, paginated notification center per user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Admin Notify&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Send targeted or broadcast messages from wp-admin&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  REST API
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Base:&lt;/strong&gt; &lt;code&gt;/wp-json/inituser/v1/&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST /register&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a new user account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST /checkin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Daily check-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST /claim-reward&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Claim reward after online duration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /transactions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Coin/Cash transaction log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /exp-log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;EXP log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /inbox&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inbox messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST /vip/purchase&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Purchase VIP package&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /referral-log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Referral history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST /avatar&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Upload new avatar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /profile/me&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Current user profile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST /exchange&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Convert Cash → Coin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST /redeem-code&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Redeem a gift code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 Full endpoint list in the &lt;a href="https://github.com/brokensmile2103/init-user-engine" rel="noopener noreferrer"&gt;plugin readme&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Developer Hooks
&lt;/h3&gt;

&lt;p&gt;Init User Engine ships with a wide surface of filters and actions so you're never stuck waiting on a plugin update to customize behavior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Change how much EXP is required per level&lt;/span&gt;
&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_user_engine_exp_required'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$required&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$level&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$level&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// React to a level-up&lt;/span&gt;
&lt;span class="nf"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'init_plugin_suite_user_engine_level_up'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$new_level&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// send a custom notification, unlock content, etc.&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other notable hooks include filters for VIP pricing, referral rewards, check-in milestones, daily tasks, theme colors, and VIP-related body classes — plus actions for EXP/Coin changes, referral completion, and admin notifications.&lt;/p&gt;




&lt;h3&gt;
  
  
  Where Data Lives
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;user_meta&lt;/code&gt; — EXP, level, Coin, Cash, VIP, referral&lt;/li&gt;
&lt;li&gt;Dedicated DB tables — transaction log and EXP log (migrated off user meta for scalability as of v1.5.0)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wp_init_user_engine_inbox&lt;/code&gt; — inbox messages&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;Install via &lt;a href="https://wordpress.org/plugins/init-user-engine/" rel="noopener noreferrer"&gt;WordPress.org&lt;/a&gt; or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/brokensmile2103/init-user-engine.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Activate the plugin&lt;/li&gt;
&lt;li&gt;Drop &lt;code&gt;[init_user_engine]&lt;/code&gt; into any page, post, or template&lt;/li&gt;
&lt;li&gt;Configure theme color, currency labels, and reward values under &lt;strong&gt;Settings → Init User Engine&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it — modals and logic load automatically.&lt;/p&gt;




&lt;h3&gt;
  
  
  Part of the Init Plugin Suite
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Init User Engine&lt;/strong&gt; is part of the &lt;a href="https://en.inithtml.com/init-plugin-suite-minimalist-powerful-and-free-wordpress-plugins/" rel="noopener noreferrer"&gt;Init Plugin Suite&lt;/a&gt; — a set of minimalist, high-performance plugins built for WordPress developers and creators who value speed, flexibility, and clarity.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Thanks for reading. Got feedback or questions?&lt;/strong&gt;&lt;br&gt;
→ &lt;a href="https://en.inithtml.com/plugin/init-user-engine/" rel="noopener noreferrer"&gt;Project Page&lt;/a&gt;&lt;br&gt;
→ &lt;a href="https://github.com/brokensmile2103/init-user-engine" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>plugin</category>
      <category>restapi</category>
      <category>user</category>
    </item>
    <item>
      <title>Tank 300IQ — A Smart Ricochet Tank Shooter Right in Your Browser</title>
      <dc:creator>Hao Nguyen</dc:creator>
      <pubDate>Fri, 28 Nov 2025 03:57:47 +0000</pubDate>
      <link>https://dev.to/brokensmile2103/tank-300iq-a-smart-ricochet-tank-shooter-right-in-your-browser-17lm</link>
      <guid>https://dev.to/brokensmile2103/tank-300iq-a-smart-ricochet-tank-shooter-right-in-your-browser-17lm</guid>
      <description>&lt;h1&gt;
  
  
  🚀 Introducing &lt;strong&gt;Tank 300IQ&lt;/strong&gt; — A Ricochet Tank Shooter With Adaptive AI
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Play now:&lt;/strong&gt; &lt;a href="https://en.inithtml.com/tank-300iq/" rel="noopener noreferrer"&gt;https://en.inithtml.com/tank-300iq/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you enjoy fast-paced arena shooters, physics-style ricochet mechanics, and bots that &lt;em&gt;actually learn&lt;/em&gt;, you’ll probably vibe with &lt;strong&gt;Tank 300IQ&lt;/strong&gt; — a tiny-but-chaotic browser tank game where bullets bounce, tanks dash, and both sides shoot down incoming fire mid-air.&lt;/p&gt;

&lt;p&gt;Runs directly in your browser (PC + Mobile), no downloads, no account — just play.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 What Makes Tank 300IQ Special?
&lt;/h2&gt;

&lt;p&gt;Tank 300IQ is built around smart ricochet combat and a tactical AI “brain” per difficulty. Each bot adapts based on how you play, storing its behavior profile in &lt;code&gt;localStorage&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 &lt;strong&gt;5 Difficulty Levels (Easy → Insane)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Bots can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lead shots and analyze angles
&lt;/li&gt;
&lt;li&gt;Perform ricochet &amp;amp; multi-bounce calculation
&lt;/li&gt;
&lt;li&gt;Read distance, danger, and advantage
&lt;/li&gt;
&lt;li&gt;Flank, spread out, crossfire, retreat or hold
&lt;/li&gt;
&lt;li&gt;Shoot down incoming bullets
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Insane bots can even short-teleport (“blink”) to dodge&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Use survival-weighted dodge vectors
&lt;/li&gt;
&lt;li&gt;Make shield-aware attack/retreat decisions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔥 Game Modes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Classic&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Fully customizable battles: difficulty, team sizes, bullet speed, bounce count, friendly fire…&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Adventure&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Multi-stage progression with unique maps and boss fights.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Survival / Endless&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Random maps, scaling waves, increasing chaos.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Team Presets&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instant 1v1, 1vN, full squads, ally teams, anything you want.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎮 Controls
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PC:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Move: WASD / Arrow keys
&lt;/li&gt;
&lt;li&gt;Aim: Mouse
&lt;/li&gt;
&lt;li&gt;Fire: Click
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mobile:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Left joystick: Move
&lt;/li&gt;
&lt;li&gt;Right joystick: Aim + hold to fire
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Supports &lt;strong&gt;manual control&lt;/strong&gt; or &lt;strong&gt;auto-aim/auto-fire&lt;/strong&gt; using the same tactical brain as the bots (great for mobile).&lt;/p&gt;




&lt;h2&gt;
  
  
  🛡️ Skills (Instant Cast)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PC:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;1&lt;/code&gt; — Shield
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;2&lt;/code&gt; — Triple Shot
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;3&lt;/code&gt; — Rally
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mobile:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tap skill icons
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Skill details:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shield:&lt;/strong&gt; Temporary bullet immunity
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Triple Shot:&lt;/strong&gt; Lane control, corner traps, multi-hit chains
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rally:&lt;/strong&gt; Player-only squad charge — a well-timed all-in that can flip any match&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 Sandbox Settings
&lt;/h2&gt;

&lt;p&gt;Tune almost anything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ally/enemy count
&lt;/li&gt;
&lt;li&gt;Difficulty
&lt;/li&gt;
&lt;li&gt;Tank &amp;amp; bullet speed
&lt;/li&gt;
&lt;li&gt;Max bounce
&lt;/li&gt;
&lt;li&gt;Friendly fire
&lt;/li&gt;
&lt;li&gt;Bullet break mode
&lt;/li&gt;
&lt;li&gt;And more…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything is saved in &lt;code&gt;localStorage&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
The entire game runs &lt;strong&gt;100% client-side JavaScript&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎮 Play Now
&lt;/h2&gt;

&lt;p&gt;👉 &lt;strong&gt;Link:&lt;/strong&gt; &lt;a href="https://en.inithtml.com/tank-300iq/" rel="noopener noreferrer"&gt;https://en.inithtml.com/tank-300iq/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you discover a sick multi-bounce trickshot, let me know — I absolutely want to see it.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>gamedev</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Init View Count – Accurate Post Views with REST API &amp; Custom Shortcodes</title>
      <dc:creator>Hao Nguyen</dc:creator>
      <pubDate>Thu, 26 Jun 2025 16:11:18 +0000</pubDate>
      <link>https://dev.to/brokensmile2103/init-view-count-accurate-post-views-with-rest-api-custom-shortcodes-2hpn</link>
      <guid>https://dev.to/brokensmile2103/init-view-count-accurate-post-views-with-rest-api-custom-shortcodes-2hpn</guid>
      <description>&lt;h2&gt;
  
  
  A fast, minimalist view counter for WordPress – REST-first and developer-friendly
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Init View Count&lt;/strong&gt; tracks post views using JavaScript + REST API for precision and flexibility. It includes shortcodes, tabbed rankings, template overrides, and works with any post type.&lt;/p&gt;

&lt;p&gt;No jQuery. No cookies. No fluff.&lt;/p&gt;




&lt;h3&gt;
  
  
  Features at a Glance
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Lightweight and Accurate
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Tracks views via REST API + scroll + delay logic&lt;/li&gt;
&lt;li&gt;Prevents duplicates with session/localStorage&lt;/li&gt;
&lt;li&gt;Optional batch mode: queue views and send in groups&lt;/li&gt;
&lt;li&gt;Optional strict IP-based filtering (no raw IP storage)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Flexible Shortcodes
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;[init_view_count]&lt;/code&gt; – show current post view count&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[init_view_list]&lt;/code&gt; – show list of most viewed posts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[init_view_ranking]&lt;/code&gt; – tabbed ranking by day/week/month/total&lt;/li&gt;
&lt;li&gt;Fully theme-overridable templates (&lt;code&gt;your-theme/init-view-count/*.php&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Format options: raw, formatted, short number, schema.org support&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Clean Admin Tools
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Dashboard widget to show top viewed posts&lt;/li&gt;
&lt;li&gt;Settings panel to enable post types, batch, delay, scroll, etc.&lt;/li&gt;
&lt;li&gt;Shortcode builders for all views with live preview&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Minimal Overhead
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;No assets loaded unless shortcode used&lt;/li&gt;
&lt;li&gt;CSS can be disabled completely&lt;/li&gt;
&lt;li&gt;No tracking, no analytics bloat&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Built for Developers
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Custom meta key support via filters&lt;/li&gt;
&lt;li&gt;Exposed REST API endpoints for tracking + top posts&lt;/li&gt;
&lt;li&gt;Fully filterable output and query logic&lt;/li&gt;
&lt;li&gt;Compatible with headless setups and SPAs&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  REST API Endpoints
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;POST /wp-json/initvico/v1/count&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Record one or more post views.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;post_id&lt;/code&gt; (int|array): One or more post IDs&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;GET /wp-json/initvico/v1/top&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Retrieve top posts by views.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parameters include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;range&lt;/code&gt;: &lt;code&gt;total&lt;/code&gt;, &lt;code&gt;day&lt;/code&gt;, &lt;code&gt;week&lt;/code&gt;, &lt;code&gt;month&lt;/code&gt;, &lt;code&gt;trending&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;number&lt;/code&gt;: Number of posts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;post_type&lt;/code&gt;, &lt;code&gt;category&lt;/code&gt;, &lt;code&gt;tag&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fields&lt;/code&gt;: &lt;code&gt;minimal&lt;/code&gt; or &lt;code&gt;full&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;no_cache&lt;/code&gt;: Disable transient caching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;a href="https://en.inithtml.com/wordpress/guide-to-using-the-top-rest-api-endpoint-in-init-view-count/" rel="noopener noreferrer"&gt;Full REST Guide&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Shortcode Examples
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcode&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[init_view_count]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show view count for current post&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[init_view_list]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Most viewed posts list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[init_view_ranking]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tabbed list by day/week/month/total&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Add &lt;code&gt;template&lt;/code&gt;, &lt;code&gt;range&lt;/code&gt;, &lt;code&gt;icon&lt;/code&gt;, &lt;code&gt;schema&lt;/code&gt;, &lt;code&gt;class&lt;/code&gt;, &lt;code&gt;field&lt;/code&gt;, and other options as needed.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://en.inithtml.com/wordpress/using-shortcodes-in-init-view-count-flexible-view-display/" rel="noopener noreferrer"&gt;Full Shortcode Guide&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Dev Tools You Get
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Filters like &lt;code&gt;init_plugin_suite_view_count_should_count&lt;/code&gt;, &lt;code&gt;*_meta_key&lt;/code&gt;, &lt;code&gt;*_top_args&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Modify output of &lt;code&gt;/top&lt;/code&gt; API with &lt;code&gt;init_plugin_suite_view_count_api_top_item&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Theme override with &lt;code&gt;view-list-sidebar.php&lt;/code&gt;, &lt;code&gt;view-list-grid.php&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;Zero jQuery. Zero cookies. Fully modular JS.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;Install via &lt;a href="https://wordpress.org/plugins/init-view-count/" rel="noopener noreferrer"&gt;WordPress.org&lt;/a&gt; or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/brokensmile2103/init-view-count.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then activate and configure in &lt;strong&gt;Settings → Init View Count&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ways to show views:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;[init_view_count]&lt;/code&gt; in post content&lt;/li&gt;
&lt;li&gt;Use auto-insert (before/after post content)&lt;/li&gt;
&lt;li&gt;Place view lists with &lt;code&gt;[init_view_list]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Show trending or ranked tabs with &lt;code&gt;[init_view_ranking]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Part of the Init Plugin Suite
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Init View Count&lt;/strong&gt; is part of the &lt;a href="https://en.inithtml.com/init-plugin-suite-minimalist-powerful-and-free-wordpress-plugins/" rel="noopener noreferrer"&gt;Init Plugin Suite&lt;/a&gt; – a set of minimalist, performance-first tools for WordPress developers.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Thanks for reading. Got feedback or ideas?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
→ &lt;a href="https://en.inithtml.com/plugin/init-view-count/" rel="noopener noreferrer"&gt;Project Page&lt;/a&gt;&lt;br&gt;&lt;br&gt;
→ &lt;a href="https://github.com/brokensmile2103/init-view-count" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>plugin</category>
      <category>restapi</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Create an Image Shuffle Minigame for Your Fanpage with Init Image Grid Shuffler</title>
      <dc:creator>Hao Nguyen</dc:creator>
      <pubDate>Sun, 08 Jun 2025 14:31:35 +0000</pubDate>
      <link>https://dev.to/brokensmile2103/create-an-image-shuffle-minigame-for-your-fanpage-with-init-image-grid-shuffler-1ll4</link>
      <guid>https://dev.to/brokensmile2103/create-an-image-shuffle-minigame-for-your-fanpage-with-init-image-grid-shuffler-1ll4</guid>
      <description>&lt;p&gt;Looking for a fun way to boost engagement on your social media or fanpage? Try creating a &lt;strong&gt;mini tile-shuffling game&lt;/strong&gt; using &lt;a href="https://en.inithtml.com/init-image-grid-shuffler/" rel="noopener noreferrer"&gt;Init Image Grid Shuffler&lt;/a&gt; — a lightweight, browser-based tool that lets you slice and scramble any image into a grid of tiles.&lt;/p&gt;

&lt;p&gt;Let your followers guess the original picture, solve the tile order, or even race to win prizes. No Photoshop or code needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Init Image Grid Shuffler?
&lt;/h2&gt;

&lt;p&gt;Init Image Grid Shuffler is a free online tool that splits an image into tiles and shuffles them. You can customize tile size, border, and difficulty level. Perfect for running:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Guess-the-image games
&lt;/li&gt;
&lt;li&gt;Puzzle-like challenges
&lt;/li&gt;
&lt;li&gt;Comment-based contests
&lt;/li&gt;
&lt;li&gt;Viral tag-your-friend posts&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to Create a Minigame
&lt;/h2&gt;

&lt;p&gt;Here's how to build a fun image challenge in under 5 minutes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prepare an image that fits your theme (e.g., a character, product, or meme).&lt;/li&gt;
&lt;li&gt;Upload it to the tool.&lt;/li&gt;
&lt;li&gt;Choose how many rows and columns to split into (e.g., 5×5 = 25 tiles).&lt;/li&gt;
&lt;li&gt;Generate the shuffled version.&lt;/li&gt;
&lt;li&gt;Download and post it to your fanpage with a catchy caption or puzzle prompt.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Can you guess what this image is? First 5 correct answers win a shoutout!”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Full How-To Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Upload Your Image
&lt;/h3&gt;

&lt;p&gt;Supported formats: JPG, PNG, WebP.&lt;br&gt;&lt;br&gt;
Use the “Choose an image…” button to upload.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Pick Grid Size
&lt;/h3&gt;

&lt;p&gt;Set how many rows and columns.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3×3 for casual players
&lt;/li&gt;
&lt;li&gt;5×5 or 7×7 for harder puzzles
&lt;/li&gt;
&lt;li&gt;Up to 10×10 if you’re evil 😈&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Customize Borders
&lt;/h3&gt;

&lt;p&gt;Choose border thickness (suggested: 5px–10px).&lt;br&gt;&lt;br&gt;
The tool will smartly auto-pick black or white based on image brightness for best contrast.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Generate the Shuffle
&lt;/h3&gt;

&lt;p&gt;Click the &lt;strong&gt;“Generate shuffled image”&lt;/strong&gt; button to preview. Adjust settings if needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Download and Share
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;“Download image”&lt;/strong&gt; and upload it to your social platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdvrb3xu6wzl22kj8e77r.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdvrb3xu6wzl22kj8e77r.webp" alt="Shuffled image example" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: (Optional) Show the Answer
&lt;/h3&gt;

&lt;p&gt;Want to reveal or save the correct layout? Hit &lt;strong&gt;“Show answer”&lt;/strong&gt; to see a numbered key.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzegrrh9e1owdzjv5nwl.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzegrrh9e1owdzjv5nwl.webp" alt="Answer key preview" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Creative Minigame Ideas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ask users to &lt;strong&gt;guess the image&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Let them &lt;strong&gt;comment the tile order&lt;/strong&gt; (e.g., “3, 7, 1, 5…”).&lt;/li&gt;
&lt;li&gt;Run a &lt;strong&gt;speed challenge&lt;/strong&gt; – fastest correct answer wins.&lt;/li&gt;
&lt;li&gt;Combine with &lt;strong&gt;tag-a-friend mechanics&lt;/strong&gt; for viral reach.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Use This Tool?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Zero setup — works directly in browser.
&lt;/li&gt;
&lt;li&gt;No design skills required.
&lt;/li&gt;
&lt;li&gt;Smart contrast for clean puzzle visuals.
&lt;/li&gt;
&lt;li&gt;Optional answer key included.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tips for Better Engagement
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use intriguing or funny images.
&lt;/li&gt;
&lt;li&gt;Set a &lt;strong&gt;timer or deadline&lt;/strong&gt; to boost urgency.
&lt;/li&gt;
&lt;li&gt;Highlight or pin the best answers.
&lt;/li&gt;
&lt;li&gt;Pair with small giveaways for more participation.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try it out
&lt;/h2&gt;

&lt;p&gt;Go to &lt;a href="https://en.inithtml.com/init-image-grid-shuffler/" rel="noopener noreferrer"&gt;Init Image Grid Shuffler&lt;/a&gt; and create your first puzzle. If you make something cool, share it in the comments — I’d love to see what you build!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>socialmedia</category>
      <category>fun</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Init Live Search – Smarter WordPress Search with Slash Commands &amp; REST API</title>
      <dc:creator>Hao Nguyen</dc:creator>
      <pubDate>Thu, 29 May 2025 05:26:45 +0000</pubDate>
      <link>https://dev.to/brokensmile2103/init-live-search-smarter-wordpress-search-with-slash-commands-rest-api-2jgm</link>
      <guid>https://dev.to/brokensmile2103/init-live-search-smarter-wordpress-search-with-slash-commands-rest-api-2jgm</guid>
      <description>&lt;h2&gt;
  
  
  A fast, flexible live search modal for WordPress – powered by REST API, Meilisearch &amp;amp; slash commands&lt;a href="https://dev.tourl"&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Init Live Search&lt;/strong&gt; replaces the default WordPress search with a modern modal. Built on the REST API, it works instantly, supports keyboard navigation, slash commands, and now offers optional &lt;strong&gt;Meilisearch&lt;/strong&gt; integration for typo-tolerant, sub-50ms relevance-ranked search — with automatic fallback to the local database if Meilisearch is ever unreachable.&lt;/p&gt;

&lt;p&gt;No jQuery. No page reloads. No broken search box, ever.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/nZocaTpi2hM"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  What's New in v1.9.x
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Optional Meilisearch Integration&lt;/strong&gt; — connect your own self-hosted or cloud Meilisearch instance as the primary search engine, with silent, automatic fallback to local DB search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-sync to Meilisearch&lt;/strong&gt; — posts are pushed/removed from the index on publish, update, trash, and delete (non-blocking)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WP-CLI Reindex&lt;/strong&gt; — &lt;code&gt;wp init-live-search meili-reindex&lt;/code&gt; for bulk indexing or full rebuilds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-site Search&lt;/strong&gt; — fetch &amp;amp; merge results from other Init Live Search-powered sites, no CORS or auth setup needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New Shortcodes&lt;/strong&gt; — &lt;code&gt;[init_live_search]&lt;/code&gt; and &lt;code&gt;[init_live_search_related_posts]&lt;/code&gt;, both buildable visually via the new &lt;strong&gt;Shortcode Builder UI&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Powered Related Posts&lt;/strong&gt; — &lt;code&gt;[init_live_search_related_ai]&lt;/code&gt; using multi-signal scoring (tags, ACF, series, views, comments, freshness)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Template-based Layouts&lt;/strong&gt; — &lt;code&gt;grid&lt;/code&gt;, &lt;code&gt;classic&lt;/code&gt;, &lt;code&gt;compact&lt;/code&gt;, &lt;code&gt;thumbright&lt;/code&gt;, overridable from your theme&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;404 Smart Redirect&lt;/strong&gt; — automatically redirects broken URLs to the most relevant post&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WooCommerce Slash Expansion&lt;/strong&gt; — added &lt;code&gt;/brand&lt;/code&gt;, &lt;code&gt;/attribute&lt;/code&gt;, &lt;code&gt;/variation&lt;/code&gt;, &lt;code&gt;/coupon&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search Operators&lt;/strong&gt; — &lt;code&gt;+musthave&lt;/code&gt; and &lt;code&gt;-mustnot&lt;/code&gt; terms now supported in queries&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Features at a Glance
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Minimalist, Modern UX
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Modal-based UI (&lt;code&gt;Ctrl + /&lt;/code&gt;, triple-click, &lt;code&gt;data-ils&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Instant results via REST API (no &lt;code&gt;admin-ajax&lt;/code&gt;, no jQuery)&lt;/li&gt;
&lt;li&gt;Infinite scroll support&lt;/li&gt;
&lt;li&gt;Local caching with &lt;code&gt;localStorage&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Smarter Search Logic
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Optional Meilisearch backend&lt;/strong&gt; — typo-tolerant, relevance-ranked, sub-50ms, with automatic local-DB fallback&lt;/li&gt;
&lt;li&gt;Match by title + tags with bi-gram fallback&lt;/li&gt;
&lt;li&gt;Search in SEO metadata (Yoast, Rank Math, AIOSEO, TSF, SEOPress)&lt;/li&gt;
&lt;li&gt;Support ACF fields (e.g. &lt;code&gt;company_name&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Tunable ranking (e.g. title &amp;gt; SEO &amp;gt; tags)&lt;/li&gt;
&lt;li&gt;Search operators: &lt;code&gt;+musthave&lt;/code&gt;, &lt;code&gt;-mustnot&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cross-site Search
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Query and merge results from other Init Live Search-powered sites&lt;/li&gt;
&lt;li&gt;No CORS or auth config — just &lt;code&gt;Site Name|https://example.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Results auto-labeled by source (e.g. "Init Docs")&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Related Posts, Two Ways
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;[init_live_search_related_posts]&lt;/code&gt; — static, SEO-friendly, JSON-LD ready&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[init_live_search_related_ai]&lt;/code&gt; — AI-scored, multi-signal (tags, ACF, series, views, comments, freshness)&lt;/li&gt;
&lt;li&gt;Auto-insert after content/comments — no shortcode required&lt;/li&gt;
&lt;li&gt;Layout templates: &lt;code&gt;grid&lt;/code&gt;, &lt;code&gt;classic&lt;/code&gt;, &lt;code&gt;compact&lt;/code&gt;, &lt;code&gt;thumbright&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Fully overridable from your theme (&lt;code&gt;init-live-search/related-posts-{template}.php&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Productivity Built-In
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Slash commands: &lt;code&gt;/recent&lt;/code&gt;, &lt;code&gt;/id&lt;/code&gt;, &lt;code&gt;/fav&lt;/code&gt;, &lt;code&gt;/product&lt;/code&gt;, &lt;code&gt;/sku&lt;/code&gt;, &lt;code&gt;/price&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;Full keyboard support: &lt;code&gt;↑ ↓ ← → Enter Esc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Quick search tooltip when selecting text&lt;/li&gt;
&lt;li&gt;Voice search via &lt;code&gt;SpeechRecognition&lt;/code&gt; (optional)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  WooCommerce Ready
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Filter by SKU, stock, price, sale status, brand, attribute, variation, coupon&lt;/li&gt;
&lt;li&gt;Show prices, badges, "Add to Cart"&lt;/li&gt;
&lt;li&gt;Slash commands: &lt;code&gt;/product&lt;/code&gt;, &lt;code&gt;/on-sale&lt;/code&gt;, &lt;code&gt;/stock&lt;/code&gt;, &lt;code&gt;/sku&lt;/code&gt;, &lt;code&gt;/brand&lt;/code&gt;, &lt;code&gt;/attribute&lt;/code&gt;, &lt;code&gt;/variation&lt;/code&gt;, &lt;code&gt;/coupon&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Theming &amp;amp; Customization
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Built-in style presets: &lt;code&gt;style-full.css&lt;/code&gt;, &lt;code&gt;style-topbar.css&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Theme override support (&lt;code&gt;style.css&lt;/code&gt; in theme)&lt;/li&gt;
&lt;li&gt;Optionally disable all plugin CSS&lt;/li&gt;
&lt;li&gt;Dark mode (&lt;code&gt;dark&lt;/code&gt;, &lt;code&gt;light&lt;/code&gt;, &lt;code&gt;auto&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Built for Developers
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;PHP filters to override queries, ranking, result data&lt;/li&gt;
&lt;li&gt;REST API endpoints: &lt;code&gt;/search&lt;/code&gt;, &lt;code&gt;/product&lt;/code&gt;, &lt;code&gt;/id&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;JS events: &lt;code&gt;ils:search-started&lt;/code&gt;, &lt;code&gt;ils:results-loaded&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;WP-CLI support for Meilisearch reindexing&lt;/li&gt;
&lt;li&gt;Complete developer docs + override guide&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Optional Lightweight Analytics
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Track query count, frequency, timestamps (no personal data)&lt;/li&gt;
&lt;li&gt;Grouped view, export as CSV&lt;/li&gt;
&lt;li&gt;Disabled by default, uses WordPress transients&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Meilisearch Integration (Optional)
&lt;/h3&gt;

&lt;p&gt;Init Live Search works great out of the box with zero setup — the built-in database search handles everything by default. If you want faster, typo-tolerant, relevance-ranked search at scale, connect your own Meilisearch instance in a few minutes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install and run Meilisearch yourself — self-hosted or via &lt;a href="https://www.meilisearch.com/cloud" rel="noopener noreferrer"&gt;Meilisearch Cloud&lt;/a&gt;. This plugin doesn't host or manage a server for you.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings → Init Live Search → Meilisearch&lt;/strong&gt;, enter your Host URL, Index Name, and a &lt;strong&gt;search-only&lt;/strong&gt; API key, then enable the integration.&lt;/li&gt;
&lt;li&gt;Index your existing content:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   wp init-live-search meili-reindex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Done — search requests are now answered by Meilisearch. New, updated, and deleted posts stay in sync automatically.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Built for safety, not lock-in:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If Meilisearch is disabled, unconfigured, or fails to respond, the plugin silently falls back to local DB search — visitors never see a broken search box&lt;/li&gt;
&lt;li&gt;The sensitive admin/indexing key can be set via the &lt;code&gt;INIT_LIVE_SEARCH_MEILI_ADMIN_KEY&lt;/code&gt; constant in &lt;code&gt;wp-config.php&lt;/code&gt; instead of the database&lt;/li&gt;
&lt;li&gt;Turn it off any time — core search never depends on Meilisearch being present&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Slash Command Examples
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/recent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show latest posts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/id 123&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Load post by ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/product&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List products&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/sku ABC123&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Find by SKU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/on-sale&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show sale items&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/price 100 500&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Filter by price range (supports &lt;code&gt;sort&lt;/code&gt;/&lt;code&gt;rsort&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/brand&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Filter by product brand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/coupon&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show active, usable coupons&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/fav&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show saved favorites (localStorage)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/random&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jump to a random post&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 &lt;a href="https://en.inithtml.com/wordpress/how-to-use-slash-commands-in-init-live-search/" rel="noopener noreferrer"&gt;Full Command Guide&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Dev Tools You Get
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;JS events like &lt;code&gt;ils:modal-opened&lt;/code&gt;, &lt;code&gt;ils:results-loaded&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;PHP filters for SEO fields, fallback logic, ranking, and more&lt;/li&gt;
&lt;li&gt;Theme override with custom &lt;code&gt;style.css&lt;/code&gt; and related-posts templates&lt;/li&gt;
&lt;li&gt;WP-CLI command for Meilisearch reindexing&lt;/li&gt;
&lt;li&gt;Zero jQuery. Zero forced dependencies.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;Install via &lt;a href="https://wordpress.org/plugins/init-live-search/" rel="noopener noreferrer"&gt;WordPress.org&lt;/a&gt; or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/brokensmile2103/init-live-search.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then activate and configure in &lt;strong&gt;Settings → Init Live Search&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ways to trigger the modal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Focus any &lt;code&gt;&amp;lt;input name="s"&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl + /&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Triple-click anywhere&lt;/li&gt;
&lt;li&gt;Click elements with &lt;code&gt;data-ils&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;?modal=search&amp;amp;term=seo&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Part of the Init Plugin Suite
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Init Live Search&lt;/strong&gt; is part of the &lt;a href="https://en.inithtml.com/init-plugin-suite-minimalist-powerful-and-free-wordpress-plugins/" rel="noopener noreferrer"&gt;Init Plugin Suite&lt;/a&gt; – a set of minimalist, performance-first tools for WordPress developers.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Thanks for reading. Got feedback or questions?&lt;/strong&gt;&lt;br&gt;
→ &lt;a href="https://en.inithtml.com/plugin/init-live-search/" rel="noopener noreferrer"&gt;Project Page&lt;/a&gt;&lt;br&gt;
→ &lt;a href="https://github.com/brokensmile2103/init-live-search" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>plugin</category>
      <category>restapi</category>
      <category>meilisearch</category>
    </item>
  </channel>
</rss>
