{"id":351575,"date":"2026-09-07T20:20:18","date_gmt":"2026-09-07T20:20:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/localfeedback\/"},"modified":"2026-09-07T20:19:51","modified_gmt":"2026-09-07T20:19:51","slug":"localfeedback","status":"publish","type":"plugin","link":"https:\/\/mk.wordpress.org\/plugins\/localfeedback\/","author":20658586,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.2","stable_tag":"1.5.2","tested":"7.1","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"LocalFeedback","header_author":"Matt Enser","header_description":"Visual, in-context feedback for WordPress. Leave pin, highlight and box annotations directly on the page. All feedback is stored in this site's own database \u2014 no external service, no connected hub site.","assets_banners_color":"24329b","last_updated":"2026-09-07 20:19:51","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/mattenser.me\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":31,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5.2":{"tag":"1.5.2","author":"mattenser14","date":"2026-09-07 20:19:51","revision":3685547}},"upgrade_notice":{"1.5.2":"<p>Fixes scrolling to a comment when following its link.<\/p>","1.4.0":"<p>Security release. Fixes an access-control flaw where an internal team left without a password could be unlocked by any visitor. Update immediately.<\/p>","1.3.2":"<p>Documentation tidy-up only. 1.3.1 fixed an empty Screenshots screen, so update if you are still on 1.3.0.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3685596,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3685596,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3685596,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3685596,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.5.2"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3685596,"resolution":"1","location":"assets","locale":"","width":1694,"height":959},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3685596,"resolution":"10","location":"assets","locale":"","width":1737,"height":614},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3685596,"resolution":"11","location":"assets","locale":"","width":1715,"height":681},"screenshot-12.png":{"filename":"screenshot-12.png","revision":3685596,"resolution":"12","location":"assets","locale":"","width":1758,"height":790},"screenshot-13.png":{"filename":"screenshot-13.png","revision":3685596,"resolution":"13","location":"assets","locale":"","width":1721,"height":569},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3685596,"resolution":"2","location":"assets","locale":"","width":1440,"height":294},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3685596,"resolution":"3","location":"assets","locale":"","width":1440,"height":589},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3685596,"resolution":"4","location":"assets","locale":"","width":1440,"height":342},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3685596,"resolution":"5","location":"assets","locale":"","width":1440,"height":550},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3685596,"resolution":"6","location":"assets","locale":"","width":1722,"height":759},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3685596,"resolution":"7","location":"assets","locale":"","width":1718,"height":911},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3685596,"resolution":"8","location":"assets","locale":"","width":1436,"height":383},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3685596,"resolution":"9","location":"assets","locale":"","width":1176,"height":319}},"screenshots":[]},"plugin_section":[],"plugin_tags":[4317,145645,107,108,19979],"plugin_category":[42,44],"plugin_contributors":[279614],"plugin_business_model":[],"class_list":["post-351575","plugin","type-plugin","status-publish","hentry","plugin_tags-annotation","plugin_tags-client-feedback","plugin_tags-comments","plugin_tags-feedback","plugin_tags-staging","plugin_category-contact-forms","plugin_category-discussion-and-community","plugin_contributors-mattenser14","plugin_committers-mattenser14"],"banners":{"banner":"https:\/\/ps.w.org\/localfeedback\/assets\/banner-772x250.png?rev=3685596","banner_2x":"https:\/\/ps.w.org\/localfeedback\/assets\/banner-1544x500.png?rev=3685596","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/localfeedback\/assets\/icon-128x128.png?rev=3685596","icon_2x":"https:\/\/ps.w.org\/localfeedback\/assets\/icon-256x256.png?rev=3685596","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/localfeedback\/assets\/screenshot-1.jpg?rev=3685596","caption":""},{"src":"https:\/\/ps.w.org\/localfeedback\/assets\/screenshot-2.png?rev=3685596","caption":""},{"src":"https:\/\/ps.w.org\/localfeedback\/assets\/screenshot-3.png?rev=3685596","caption":""},{"src":"https:\/\/ps.w.org\/localfeedback\/assets\/screenshot-4.png?rev=3685596","caption":""},{"src":"https:\/\/ps.w.org\/localfeedback\/assets\/screenshot-5.png?rev=3685596","caption":""},{"src":"https:\/\/ps.w.org\/localfeedback\/assets\/screenshot-6.png?rev=3685596","caption":""},{"src":"https:\/\/ps.w.org\/localfeedback\/assets\/screenshot-7.png?rev=3685596","caption":""},{"src":"https:\/\/ps.w.org\/localfeedback\/assets\/screenshot-8.png?rev=3685596","caption":""},{"src":"https:\/\/ps.w.org\/localfeedback\/assets\/screenshot-9.png?rev=3685596","caption":""},{"src":"https:\/\/ps.w.org\/localfeedback\/assets\/screenshot-10.png?rev=3685596","caption":""},{"src":"https:\/\/ps.w.org\/localfeedback\/assets\/screenshot-11.png?rev=3685596","caption":""},{"src":"https:\/\/ps.w.org\/localfeedback\/assets\/screenshot-12.png?rev=3685596","caption":""},{"src":"https:\/\/ps.w.org\/localfeedback\/assets\/screenshot-13.png?rev=3685596","caption":""}],"raw_content":"<!--section=description-->\n<p>LocalFeedback is a self-hosted feedback and annotation tool for the build and review phase of a WordPress project. Your team and your clients leave comments directly on the page \u2014 a pin on a spot, a highlight on a piece of text, or a box around an area \u2014 and every one of them is stored in this site's own database table.<\/p>\n\n<p>There is no connected hub site, no cross-site sync and no external service. That is the whole point: comments cannot fail to save because a remote dashboard was unreachable.<\/p>\n\n<p><strong>Core features<\/strong><\/p>\n\n<ul>\n<li>Pin, text highlight, box and general comment types<\/li>\n<li>Threaded replies on any comment<\/li>\n<li>Best-effort automatic screenshot of the annotated area<\/li>\n<li>Device type and exact viewport width recorded with every comment<\/li>\n<li>Status workflow (open \/ in progress \/ resolved), priority, tags and category<\/li>\n<li>Tags picked from a dropdown you control, with an optional \"Other\u2026\" for one-offs<\/li>\n<li>Teams, including internal-only visibility, an optional join password, and one-click review links for clients<\/li>\n<li>A screenshot library with the same filters as the feedback list, plus a one-click purge when a project wraps<\/li>\n<li>Guest commenting by default, or restrict to logged-in WordPress users<\/li>\n<li>A short welcome popup that shows first-time reviewers how to use the tools<\/li>\n<li>Optional follow-up emails so commenters hear about replies and status changes, with one-click unsubscribe<\/li>\n<li>A shareable link for every comment that opens the page and highlights the annotation<\/li>\n<li>Filterable, sortable admin table with customisable columns and CSV export<\/li>\n<li>Instant email notifications and an optional daily digest<\/li>\n<li>Documentation built into the plugin<\/li>\n<\/ul>\n\n<p><strong>Built for reliable saving<\/strong><\/p>\n\n<ul>\n<li>The comment box never clears until the server confirms the save<\/li>\n<li>Failed saves retry automatically with a growing delay<\/li>\n<li>Unsent text is kept in the browser, so a reload does not lose it<\/li>\n<li>Every save carries a unique key, so a retry can never create a duplicate<\/li>\n<li>If the REST API is blocked, the same request is retried through admin-ajax.php<\/li>\n<\/ul>\n\n<h3>License<\/h3>\n\n<p>This program is free software; you can redistribute it and\/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.<\/p>\n\n<p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.<\/p>\n\n<!--section=installation-->\n<p>Requires WordPress 6.2 or newer.<\/p>\n\n<ol>\n<li>Upload the <code>localfeedback<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP through Plugins \u2192 Add New.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Visit LocalFeedback \u2192 Settings to choose who can leave feedback.<\/li>\n<li>Open any page on the front end and use the Feedback button in the bottom right corner.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20any%20data%20leave%20my%20site%3F\"><h3>Does any data leave my site?<\/h3><\/dt>\n<dd><p>No. Feedback, screenshots and settings are stored in this WordPress installation. The only outbound message the plugin can send is an email you configure, or the optional \"Send an idea\" form, which is only sent when you fill it in and submit it.<\/p><\/dd>\n<dt id=\"can%20people%20leave%20feedback%20without%20a%20wordpress%20account%3F\"><h3>Can people leave feedback without a WordPress account?<\/h3><\/dt>\n<dd><p>Yes, that is the default. You can require a WordPress login instead in Settings.<\/p><\/dd>\n<dt id=\"where%20are%20screenshots%20stored%3F\"><h3>Where are screenshots stored?<\/h3><\/dt>\n<dd><p>In wp-content\/uploads\/localfeedback, with random filenames, deliberately outside your media library so review captures never mix in with your real content. Capture happens entirely in the visitor's browser and is best effort \u2014 cross-origin images, embedded media and strict content security policies can prevent it. The comment is always saved either way. LocalFeedback \u2192 Screenshots shows everything stored and can delete it all in one go.<\/p><\/dd>\n<dt id=\"can%20i%20share%20a%20screenshot%20outside%20wordpress%3F\"><h3>Can I share a screenshot outside WordPress?<\/h3><\/dt>\n<dd><p>Yes. Every screenshot has a direct URL with a long random filename, so you can paste one into a task in Asana, Teamwork, Slack or anywhere else and it will load for whoever opens it. The flip side is that the link is the only thing protecting the image: it is never shown to anyone who cannot already read the comment, and the filename cannot realistically be guessed, but a link you paste somewhere public is viewable by anyone who has it.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20caching%20plugins%3F\"><h3>Does it work with caching plugins?<\/h3><\/dt>\n<dd><p>Yes. The front end fetches its session and security token at runtime rather than reading them from the cached HTML.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20delete%20the%20plugin%3F\"><h3>What happens when I delete the plugin?<\/h3><\/dt>\n<dd><p>Nothing is removed unless you tick \"Delete all feedback\u2026\" in Settings first. Otherwise your data stays in place.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.2<\/h4>\n\n<ul>\n<li>Fixed: following a link to a comment further down a page did not scroll to it. Smooth scrolling is silently ignored by some themes and whenever the reader has asked for reduced motion, so the plugin now confirms the page actually moved and jumps directly if it did not.<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Fixed: following a link to a comment highlighted the card in the panel but not the pin or outlined area on the page. The emphasis was applied after drawing, so the redraw that runs once late-loading images settle removed it again.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Added: every comment now has its own link. Opening it loads the page, scrolls to the annotation and flashes the pin or outlined area, in the same spirit as a comment link in Google Docs.<\/li>\n<li>Added: \"Copy link\" under each comment on the front end, a \"View on page\" row action in the feedback list, a copyable link on the detail screen, and a link column in the CSV export.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Security: a team with no password could be joined on request, which meant an internal team left without one could be unlocked by any visitor. Joining now requires a password; internal teams without one are reached only through a WordPress account or a review link.<\/li>\n<li>Security: every REST route that changes something now verifies the request nonce itself, rather than relying on WordPress to do it for signed-in users only.<\/li>\n<li>Changed: the session endpoint returns only a token and the visitor's own permissions to anyone who cannot read or leave feedback. Configuration and team names are no longer sent to visitors who cannot use them.<\/li>\n<li>Changed: internal teams without a password are no longer listed on the front end.<\/li>\n<li>Changed: admin notices are confined to this plugin's own screens, and the review request appears only on the main feedback list.<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Changed: trimmed the readme changelog to the two most recent releases and moved the older history into changelog.txt, following the directory's guidance.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Fixed: the Screenshots screen showed nothing at all. Renaming variables for the 1.3.0 code review missed the matching names in the controller, so the template was reading values that no longer existed.<\/li>\n<li>Changed: the server capability check now tells you whether a format was blocked in transit, is genuinely unsupported, or simply switched off and available to enable.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Changed: every database query now binds its table name with a placeholder instead of building the SQL by hand. This is what raises the minimum WordPress version to 6.2, where identifier placeholders were introduced.<\/li>\n<li>Fixed: a team membership query was assembled by concatenation rather than prepared.<\/li>\n<li>Fixed: a translator comment sat two lines above its string instead of directly above it.<\/li>\n<li>Fixed: three admin form values were sanitised one step later than they should have been.<\/li>\n<li>Changed: renamed variables in the admin templates so they carry the full plugin prefix.<\/li>\n<\/ul>\n\n<p>Earlier entries are in changelog.txt, which ships with the plugin.<\/p>","raw_excerpt":"Visual, in-context feedback for WordPress. Pin, highlight and box annotations stored entirely in your own database.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/351575","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=351575"}],"author":[{"embeddable":true,"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mattenser14"}],"wp:attachment":[{"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=351575"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=351575"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=351575"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=351575"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=351575"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=351575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}