{"id":372943,"date":"2026-09-23T18:31:49","date_gmt":"2026-09-23T18:31:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/vifee-visual-feedback-client-website-review-bug-reporting\/"},"modified":"2026-09-24T12:26:13","modified_gmt":"2026-09-24T12:26:13","slug":"vifee-visual-feedback","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/vifee-visual-feedback\/","author":20866267,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.5","stable_tag":"1.0.5","tested":"7.1.2","requires":"6.6","requires_php":"8.1","requires_plugins":null,"header_name":"Vifee Visual Feedback \u2013 Client Website Review & Bug Reporting","header_author":"Grzegorz Puszka","header_description":"Private, local visual feedback for WordPress websites.","assets_banners_color":"f8f6f3","last_updated":"2026-09-24 12:26:13","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/ko-fi.com\/puszkadev","header_plugin_uri":"https:\/\/vifee.app\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":65,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.4":{"tag":"1.0.4","author":"grzegorzpuszka","date":"2026-09-23 18:31:13","revision":3709960},"1.0.5":{"tag":"1.0.5","author":"grzegorzpuszka","date":"2026-09-24 12:26:13","revision":3711268}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3709960,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3709960,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3709960,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3709960,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3709960,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.4","1.0.5"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3709960,"resolution":"1","location":"assets","locale":"","width":1440,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3709960,"resolution":"2","location":"assets","locale":"","width":1440,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3709960,"resolution":"3","location":"assets","locale":"","width":1440,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3709960,"resolution":"4","location":"assets","locale":"","width":1440,"height":900}},"screenshots":{"1":"A pin left directly on the page it refers to \u2014 no separate tool, no screenshot pasted into an email.","2":"The comment popover: priority, issue type, a reply, and a workflow status, all without leaving the page.","3":"The full comment sidebar, with status\/priority\/issue-type filters and the reply thread expanded.","4":"The admin kanban board: every review link's feedback triaged by status, with priority and issue-type badges."}},"plugin_section":[],"plugin_tags":[253348,145645,4038,63174,147509],"plugin_category":[50],"plugin_contributors":[277940],"plugin_business_model":[],"class_list":["post-372943","plugin","type-plugin","status-publish","hentry","plugin_tags-bug-report","plugin_tags-client-feedback","plugin_tags-screenshot","plugin_tags-visual-feedback","plugin_tags-website-feedback","plugin_category-media","plugin_contributors-grzegorzpuszka","plugin_committers-grzegorzpuszka"],"banners":{"banner":"https:\/\/ps.w.org\/vifee-visual-feedback\/assets\/banner-772x250.png?rev=3709960","banner_2x":"https:\/\/ps.w.org\/vifee-visual-feedback\/assets\/banner-1544x500.png?rev=3709960","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/vifee-visual-feedback\/assets\/icon.svg?rev=3709960","icon":"https:\/\/ps.w.org\/vifee-visual-feedback\/assets\/icon.svg?rev=3709960","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/vifee-visual-feedback\/assets\/screenshot-1.png?rev=3709960","caption":"A pin left directly on the page it refers to \u2014 no separate tool, no screenshot pasted into an email."},{"src":"https:\/\/ps.w.org\/vifee-visual-feedback\/assets\/screenshot-2.png?rev=3709960","caption":"The comment popover: priority, issue type, a reply, and a workflow status, all without leaving the page."},{"src":"https:\/\/ps.w.org\/vifee-visual-feedback\/assets\/screenshot-3.png?rev=3709960","caption":"The full comment sidebar, with status\/priority\/issue-type filters and the reply thread expanded."},{"src":"https:\/\/ps.w.org\/vifee-visual-feedback\/assets\/screenshot-4.png?rev=3709960","caption":"The admin kanban board: every review link's feedback triaged by status, with priority and issue-type badges."}],"raw_content":"<!--section=description-->\n<p><strong>Visual feedback and bug reporting, pinned right on the page<\/strong><\/p>\n\n<p>Send a client or teammate a review link. They click around your site and pin comments directly on the thing they mean \u2014 a headline, a button, a broken layout \u2014 with a screenshot attached if it helps. No account for them to create, no browser extension to install, no separate feedback tool to learn. \"The button on the homepage looks off\" becomes a pin your team can act on, whether it's a design note or a bug report.<\/p>\n\n<h4>Why teams pick Vifee for website feedback<\/h4>\n\n<p><strong>Pins that actually stay put<\/strong><\/p>\n\n<p>Most website feedback tools lose track of where a comment belongs the moment the page changes. Vifee anchors every pin with four fallback strategies \u2014 a CSS selector, an XPath, an element offset, and a document-percentage position \u2014 so pins survive a theme switch, a viewport resize, lazy-loaded content, and a full DOM rebuild. If the exact element is gone, the pin degrades gracefully instead of vanishing or jumping to the wrong spot.<\/p>\n\n<p><strong>Nothing leaves your server<\/strong><\/p>\n\n<p>Feedback, screenshots, and reviewer details are stored in your own WordPress database and a private, non-public uploads directory. Vifee makes no outbound requests, calls no third-party API, and sends no telemetry. For agencies working with public-sector, healthcare, or legal clients, \"the data never leaves our server\" is often a procurement requirement, not a nice-to-have.<\/p>\n\n<p><strong>A feedback widget, not a per-seat subscription<\/strong><\/p>\n\n<p>There's no per-user or per-project pricing here. You install the feedback widget once and use it on as many review links, client sites, and reviewers as you need.<\/p>\n\n<p><strong>How the visual feedback workflow works<\/strong><\/p>\n\n<ul>\n<li>A manager creates a review link from the Vifee admin screen.<\/li>\n<li>A reviewer who opens that link can leave pinned comments, screenshots and replies directly on the live site \u2014 no login required.<\/li>\n<li>Managers triage client feedback from a kanban-style admin screen: status, priority, filters and a detail view with the full reply thread and activity history.<\/li>\n<\/ul>\n\n<h4>A paid add-on is planned<\/h4>\n\n<p>A separate PRO add-on is planned for agencies managing feedback across multiple client sites. It will be entirely optional \u2014 nothing described above is disabled, watermarked, or held back in this free version to encourage an upgrade, and every feature here stays free, forever.<\/p>\n\n<h4>Multisite<\/h4>\n\n<p>Vifee keeps separate feedback for every site of a network. When the plugin is active on a site \u2014 individually or network-wide \u2014 that site gets its tables, keys, the <code>manage_vifee_feedback<\/code> capability for administrators and its daily maintenance on its first request, including sites added to the network later. Uninstalling honours each site's own \"delete all data\" setting.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>Feedback may contain a display name, an optional private email address, technical browser data, replies and screenshots. Optional email addresses are encrypted at rest, using a dedicated encryption key generated on activation, and are never exposed to other reviewers.<\/p>\n\n<p>Feedback is retained indefinitely by default; there is no automatic expiry, and older feedback must be removed manually from the Vifee admin screen. Review sessions expire automatically after 30 days.<\/p>\n\n<p>Go to <strong>Vifee \u2192 Settings<\/strong> to opt in to deleting all Vifee feedback, attachments and reviewer data when the plugin is uninstalled. This is disabled by default, so uninstalling the plugin normally leaves your feedback data in place.<\/p>\n\n<p>This plugin supports the WordPress Tools \u2192 Export\/Erase Personal Data screens. They find guest reviewers by the email they left and signed-in authors by their WordPress account, and cover the profile, submitted feedback, replies and attachments. Erasure replaces the person's text with a removal notice, clears browser details, deletes their screenshots and ends their review sessions.<\/p>\n\n<p>Screenshots are stored under random file names in a private uploads subdirectory protected by <code>.htaccess<\/code> \/ <code>web.config<\/code>. On servers that ignore those files (nginx) the random names keep them unguessable; to keep them out of the web root entirely, define <code>VIFEE_PRIVATE_DIR<\/code> in <code>wp-config.php<\/code> with a directory outside it.<\/p>\n\n<h3>Credits<\/h3>\n\n<p><strong>Bundled library<\/strong><\/p>\n\n<p>The review widget bundles html2canvas (MIT licence, GPL-compatible: https:\/\/github.com\/niklasvh\/html2canvas) to render the on-page screenshot capture entirely in the reviewer's browser. No image processing happens server-side and no third-party service is involved.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin directory to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate Vifee Visual Feedback.<\/li>\n<li>Configure review access and data-retention preferences from the Vifee admin screens.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20reviewers%20need%20an%20account%20or%20a%20browser%20extension%20to%20leave%20feedback%3F\"><h3>Do reviewers need an account or a browser extension to leave feedback?<\/h3><\/dt>\n<dd><p>No. A reviewer opens the review link you send them and pins comments, screenshots and replies straight on the live page \u2014 no WordPress account, no browser extension, no separate app to install.<\/p><\/dd>\n<dt id=\"can%20i%20use%20vifee%20to%20collect%20bug%20reports%20from%20clients%2C%20not%20just%20design%20feedback%3F\"><h3>Can I use Vifee to collect bug reports from clients, not just design feedback?<\/h3><\/dt>\n<dd><p>Yes. Every pin has an issue type \u2014 Task or Bug \u2014 plus a priority and a workflow status, so a client reporting \"this form is broken\" and a client suggesting \"make this button bigger\" both land on the same triaged board instead of two different inboxes.<\/p><\/dd>\n<dt id=\"can%20reviewers%20annotate%20a%20screenshot%20of%20the%20page%20instead%20of%20just%20leaving%20a%20comment%3F\"><h3>Can reviewers annotate a screenshot of the page instead of just leaving a comment?<\/h3><\/dt>\n<dd><p>Yes. A reviewer can attach a full-page or region screenshot to any pin and mark it up with shapes, arrows and a pixelation blur before sending \u2014 so a visual bug report carries the exact picture the manager needs, not just a text description.<\/p><\/dd>\n<dt id=\"does%20the%20visual%20feedback%20widget%20work%20with%20elementor%2C%20divi%2C%20or%20any%20page%20builder%3F\"><h3>Does the visual feedback widget work with Elementor, Divi, or any page builder?<\/h3><\/dt>\n<dd><p>Yes. The widget loads as a standard front-end script, independent of the theme or page builder that rendered the page, so it works the same way on Elementor, Divi, block-theme, or classic-theme sites.<\/p><\/dd>\n<dt id=\"can%20i%20use%20vifee%20for%20client%20feedback%20across%20multiple%20websites%3F\"><h3>Can I use Vifee for client feedback across multiple websites?<\/h3><\/dt>\n<dd><p>Yes \u2014 install it on as many WordPress sites as you like at no extra cost; there's no per-site, per-user or per-project fee. Each installation keeps its own feedback separate from every other one (see \"Who can see feedback?\" below for how that works within a single site).<\/p><\/dd>\n<dt id=\"does%20vifee%20send%20any%20data%20outside%20my%20wordpress%20installation%3F\"><h3>Does Vifee send any data outside my WordPress installation?<\/h3><\/dt>\n<dd><p>No. Feedback, screenshots and reviewer data are stored in your own database and a private, non-public uploads subdirectory. The plugin does not call any third-party service and does not send telemetry.<\/p><\/dd>\n<dt id=\"who%20can%20see%20feedback%3F\"><h3>Who can see feedback?<\/h3><\/dt>\n<dd><p>Only WordPress users with the <code>manage_vifee_feedback<\/code> capability (administrators, by default) and guests who used a valid, unexpired review link can see and submit feedback. The review widget is never shown to ordinary site visitors. Archived feedback is visible only in the admin panel, never in the widget.<\/p>\n\n<p>Note for agencies serving multiple clients on one installation: reviewers authenticated through any valid review link share ONE feedback space per site \u2014 a reviewer for Client A can read threads opened for Client B. Scope installations (or use WordPress multisite) accordingly.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20feedback%20when%20i%20uninstall%20the%20plugin%3F\"><h3>What happens to feedback when I uninstall the plugin?<\/h3><\/dt>\n<dd><p>By default, nothing \u2014 your database tables and any stored attachments are left in place so you can reinstall later without losing data. If you want uninstalling to permanently delete everything, enable that under <strong>Vifee \u2192 Settings<\/strong> before you uninstall.<\/p><\/dd>\n<dt id=\"does%20vifee%20require%20any%20particular%20php%20extensions%3F\"><h3>Does Vifee require any particular PHP extensions?<\/h3><\/dt>\n<dd><p>Yes: the GD extension (for screenshot processing) and the Fileinfo extension (for upload validation) are required in addition to PHP 8.1+. Most hosts enable both by default.<\/p><\/dd>\n<dt id=\"does%20vifee%20work%20on%20wordpress%20multisite%20networks%3F\"><h3>Does Vifee work on WordPress multisite networks?<\/h3><\/dt>\n<dd><p>Vifee is activated and configured per site, not network-wide. Activating it on one site in a network does not affect any other site, and network-activating it does not automatically set up a new site added to the network afterward \u2014 activate it individually on each site where you want it.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>[Fixed] A screenshot of the visible part of the page shows what is on screen, not the top of the page, when the page is scrolled.<\/li>\n<li>[Fixed] Screenshots place text exactly where it appears on the page, including on themes that display images as blocks, and centred layouts are no longer shifted sideways by half the scrollbar width.<\/li>\n<li>[Feature] The WordPress admin bar shows feedback managers how many feedback items are open, with a link to the board.<\/li>\n<li>[Feature] Compatible add-ons, such as the client portal in Vifee PRO, can let your client reply to feedback, move it between statuses and view its screenshots outside the widget, under the client's own name.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>[Fixed] Archived feedback is visible only in the admin panel: the widget shows neither its pins nor its threads, and reviewers can no longer read, reply to, edit or download attachments from archived items.<\/li>\n<li>[Feature] Reply to feedback from the details panel on the manager board (Markdown supported; Ctrl\/Cmd+Enter sends). The thread author is notified as for replies from the widget.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>[Fixed] The widget shows every pin on a page instead of the newest 50.<\/li>\n<li>[Fixed] The review-link screen lists every link instead of the newest 100, 50 at a time with a \"Show more\" button.<\/li>\n<li>[Fixed] Pages whose query parameters differ only in letter case no longer lose their pins.<\/li>\n<li>[Fixed] Confirming an unsubscribe shows a page instead of raw JSON.<\/li>\n<li>[Fixed] Reply notifications to guests no longer link to the admin board they cannot open.<\/li>\n<li>[Fixed] Impossible due dates such as 31 February are rejected instead of rolling into March.<\/li>\n<li>[Fixed] A view-only review link no longer offers replying or editing that the server then refuses.<\/li>\n<li>[Fixed] On multisite every site gets the capability, scheduled tasks and keys it needs; uninstalling cleans every site.<\/li>\n<li>[Feature] Revoked review links can be deleted permanently.<\/li>\n<li>[Changed] Review links expired for more than 90 days are deleted with their sessions by the daily maintenance.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>[Security] Attachment files are stored under a random name instead of their public identifier, so a server that ignores <code>.htaccess<\/code> (nginx) no longer serves a screenshot to anyone who has seen its id. Existing files are renamed in the background after the upgrade. The new <code>VIFEE_PRIVATE_DIR<\/code> constant moves storage outside the web root.<\/li>\n<li>[Security] A reviewer can keep at most 10 unsent attachments at a time.<\/li>\n<li>[Security] Failed review-link activations are limited per visitor, valid ones to 10 per 15 minutes per link, so reviewers behind one proxy or CDN address no longer lock each other out.<\/li>\n<li>[Security] Personal-data export and erasure also cover feedback written by signed-in WordPress users; erasure clears browser details and ends the reviewer's sessions.<\/li>\n<li>[Performance] Notification e-mails are sent after the response, so posting feedback no longer waits for the mail server.<\/li>\n<li>[Performance] One fewer database query on every page load, and cheaper reply counts.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>[Security] REST endpoints no longer treat every signed-in WordPress account as a reviewer. Reading feedback, posting it, replying and uploading attachments now require either the <code>manage_vifee_feedback<\/code> capability (administrators, by default) or an active review-link session. Before this release, on a site that lets visitors register, any signed-in account could read every feedback item and screenshot and add its own \u2014 without a review link and without being a feedback manager. The widget never offered those actions to such an account, but the REST API accepted them.<\/li>\n<li>[Fixed] A reviewer who happens to also be signed in to WordPress under an unrelated account is now served the widget and works as the guest their review link makes them, instead of being shut out.<\/li>\n<li>[Fixed] Opening a review link with a name made only of spaces returned a server error instead of telling the reviewer the name is required.<\/li>\n<li>[Fixed] Comment or reply text containing control characters could break the notification e-mail and turn a comment that had in fact been saved into an error response.<\/li>\n<li>[Fixed] A notification or add-on listener that fails no longer turns a saved comment into an error response.<\/li>\n<li>[Fixed] Fresh installations no longer replay historical database migrations. One of them re-created a column wide enough to exceed the database row limit, which could leave the schema incomplete on some hosts.<\/li>\n<li>[Fixed] The request rate limiter no longer stops counting on object-cache backends without an atomic increment, and no longer writes a log line on every request there.<\/li>\n<li>[Fixed] Two simultaneous first requests could each generate a different encryption key and the loser's key was kept, permanently invalidating every review link and stored reviewer address derived from it.<\/li>\n<li>[Fixed] The daily retention sweep now clears its whole backlog instead of at most 100 rows a day, so expired sessions and abandoned uploads can no longer pile up faster than they are removed.<\/li>\n<li>[Fixed] REST clients that authenticate with Application Passwords (rather than a browser session) can now write.<\/li>\n<li>[Performance] The feedback list no longer runs three unindexed text comparisons per row when no search term is given, and the table gained an index for the default sort order.<\/li>\n<li>[Performance] Editing or deleting a feedback item costs one database read instead of four, and the review-link screen no longer queries once per row.<\/li>\n<li>[Performance] Private attachment storage is prepared only when a request actually reads or writes a file, instead of on every REST request the site serves.<\/li>\n<li>[Feature] New <code>vifee_admin_feedback_filters<\/code> filter: an add-on can narrow the manager board by handing it a <code>uuidSource<\/code> descriptor, resolved as a SQL subquery against the add-on's own table.<\/li>\n<li>[Changed] Notification e-mails are now sent as HTML with a plain-text alternative: the comment sits in a quoted block, the page, priority and status are listed as details, and a button opens the feedback board. Nothing in the message is loaded from the network \u2014 no images, no web fonts, no tracking pixel \u2014 so reading one tells the sender nothing.<\/li>\n<li>[Changed] The <code>uuidIn<\/code> \/ <code>uuidNotIn<\/code> request parameters on the manager feedback endpoint are gone, replaced by the filter above \u2014 they required shipping a list of identifiers over HTTP.<\/li>\n<li>[Changed] Two tables created but never used by any release are dropped on upgrade.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release.<\/li>\n<\/ul>","raw_excerpt":"Visual feedback and bug reporting for client website reviews \u2014 pin comments and screenshots on any page, no login required.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/372943","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=372943"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/grzegorzpuszka"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=372943"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=372943"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=372943"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=372943"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=372943"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=372943"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}