{"id":364283,"date":"2026-09-11T15:30:47","date_gmt":"2026-09-11T15:30:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/yumyoda-copwatchdog\/"},"modified":"2026-09-11T15:30:34","modified_gmt":"2026-09-11T15:30:34","slug":"yumyoda-copwatchdog","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/yumyoda-copwatchdog\/","author":18503964,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"3.0.2","stable_tag":"3.0.2","tested":"7.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Yumyoda CopWatchdog","header_author":"Vic Stizzi","header_description":"Officer accountability cards, data table and stats widget for police disciplinary-trial data served by your own CERBERUS_API server.","assets_banners_color":"","last_updated":"2026-09-11 15:30:34","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/yumyoda.com\/Projects\/copwatchdog\/","header_author_uri":"https:\/\/yumyoda.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":61,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"3.0.2":{"tag":"3.0.2","author":"stizzi","date":"2026-09-11 15:30:34","revision":3691674}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["3.0.2"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Officer cards, Yumyoda theme","2":"Officer detail with court-date history and articles","3":"Statistics widget"}},"plugin_section":[],"plugin_tags":[52653,280256,12555,280257,25098],"plugin_category":[],"plugin_contributors":[280258],"plugin_business_model":[],"class_list":["post-364283","plugin","type-plugin","status-publish","hentry","plugin_tags-accountability","plugin_tags-nypd","plugin_tags-police","plugin_tags-public-records","plugin_tags-transparency","plugin_contributors-stizzi","plugin_committers-stizzi"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/yumyoda-copwatchdog.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Yumyoda CopWatchdog displays police officer records \u2014 upcoming disciplinary court dates, charges, complaint and settlement history, assignment history, photos and press coverage \u2014 as cards, a sortable table and a headline-statistics widget.<\/p>\n\n<p>The plugin is the front end of the open COPWATCHDOG system (THOTH scraper \u2192 HERMES database \u2192 CERBERUS_API). It does not scrape or store officer data itself: it reads from a CERBERUS_API server that <strong>you<\/strong> run and configure under Settings \u2192 Copwatchdog \u2192 Connection (API URL and API key). No data is sent anywhere else, and nothing is sent to the plugin author.<\/p>\n\n<p><strong>Shortcodes<\/strong><\/p>\n\n<ul>\n<li><code>[yumcwd_cards limit=\"20\"]<\/code> \u2014 one card per officer, sorted by upcoming court date (also <code>orderby<\/code>, <code>order<\/code>, <code>hide_filters<\/code>, filter attributes)<\/li>\n<li><code>[yumcwd_table per_page=\"25\"]<\/code> \u2014 one row per court date, sortable and searchable<\/li>\n<li><code>[yumcwd_officer id=\"1234\"]<\/code> \u2014 a single officer card (<code>view=\"standard|compact|extended\"<\/code>)<\/li>\n<li><code>[yumcwd_funfacts]<\/code> \u2014 four headline numbers: settlements paid, officers on the calendar, trials this month, top charge<\/li>\n<\/ul>\n\n<p><strong>Themes<\/strong><\/p>\n\n<p>Four built-in looks (Settings \u2192 Copwatchdog \u2192 Theme): Yumyoda (dark, mono, orange), Cyberpunk Dark, Minimal Light, Investigative \u2014 or inherit your site's styles.<\/p>\n\n<p><strong>External service<\/strong><\/p>\n\n<p>This plugin communicates only with the CERBERUS_API server address you enter in its settings. Source and self-hosting instructions: https:\/\/github.com\/copwatchdog<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install the zip from Plugins \u2192 Add New.<\/li>\n<li>Activate it.<\/li>\n<li>Go to Settings \u2192 Copwatchdog \u2192 Connection, enter the URL and API key of your CERBERUS_API server, and click Test Connection.<\/li>\n<li>Put <code>[yumcwd_cards]<\/code> (and any other shortcode) on a page.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20does%20the%20data%20come%20from%3F\"><h3>Where does the data come from?<\/h3><\/dt>\n<dd><p>From the CERBERUS_API server you configure. The reference implementation and the scraper\/ETL that feed it are published at https:\/\/github.com\/copwatchdog.<\/p><\/dd>\n<dt id=\"test%20connection%20says%20unauthorized%20%2F%20401\"><h3>Test Connection says Unauthorized \/ 401<\/h3><\/dt>\n<dd><p>The server at the URL you entered did not accept your API key. Enter the URL of your own CERBERUS_API instance and the API_KEY from its <code>.env<\/code> file.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20phone%20home%3F\"><h3>Does the plugin phone home?<\/h3><\/dt>\n<dd><p>No. The only network requests go to the API URL you configured.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>3.0.2<\/h4>\n\n<ul>\n<li>Review round 2: AJAX and cron hook names carry the plugin prefix; public-field setting restricted to known keys; CSV setting sanitized cell by cell as plain text; shortcode error text escaped.<\/li>\n<\/ul>\n\n<h4>3.0.1<\/h4>\n\n<ul>\n<li>Plugin Check warnings cleared: template variables prefixed, CSV file name index validated.<\/li>\n<\/ul>\n\n<h4>3.0.0<\/h4>\n\n<ul>\n<li>Plugin-review round 1: all identifiers use the <code>yumcwd_<\/code> \/ <code>YUMCWD_<\/code> prefix (shortcodes are now <code>[yumcwd_cards]<\/code>, <code>[yumcwd_table]<\/code>, <code>[yumcwd_officer]<\/code>, <code>[yumcwd_funfacts]<\/code>; 2.x settings migrate automatically); admin CSS\/JS enqueued instead of inline; CSV upload goes through wp_handle_upload and every cell is sanitized; public REST routes enforce the Display allowlist \u2014 tax_id and email are hidden unless enabled.<\/li>\n<\/ul>\n\n<h4>2.13.2<\/h4>\n\n<ul>\n<li>Plugin URI now points to the project page (must differ from the author URI).<\/li>\n<\/ul>\n\n<h4>2.13.1<\/h4>\n\n<ul>\n<li>Passes the WordPress Plugin Check: all admin output escaped, debug logging only when WP_DEBUG_LOG is on, translator comments, input validation on the CSV upload and tab parameter, gmdate, direct-access guard in every template.<\/li>\n<\/ul>\n\n<h4>2.13.0<\/h4>\n\n<ul>\n<li>First WordPress.org-ready build: distribution package without repository files, text domain matches the plugin slug, no default API URL, fonts bundled locally instead of loaded from Google Fonts.<\/li>\n<\/ul>\n\n<h4>2.12.x<\/h4>\n\n<ul>\n<li>One card per officer sorted by court date, articles, Yumyoda theme, sort dropdown fix, secrets removed from code. See the project changelog on GitHub.<\/li>\n<\/ul>","raw_excerpt":"Officer accountability cards, a data table and a stats widget for police disciplinary-trial data served by your own CERBERUS_API server.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/364283","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=364283"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/stizzi"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=364283"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=364283"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=364283"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=364283"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=364283"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=364283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}