{"id":311211,"date":"2026-06-23T15:07:20","date_gmt":"2026-06-23T15:07:20","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/kennelflow-vet\/"},"modified":"2026-06-30T02:36:40","modified_gmt":"2026-06-30T02:36:40","slug":"kennelflow-vet","status":"publish","type":"plugin","link":"https:\/\/twd.wordpress.org\/plugins\/kennelflow-vet\/","author":12029770,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.2.9","stable_tag":"0.2.9","tested":"6.8.5","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"KennelFlow Vet","header_author":"LandTech Web Designs","header_description":"Clinical foundation: patients, rooms, locations, and bookings with availability checks and REST API.","assets_banners_color":"526d5a","last_updated":"2026-06-30 02:36:40","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/kennelflow-vet\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":216,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.0":{"tag":"0.1.0","author":"brelandr","date":"2026-06-23 15:06:43"},"0.1.2":{"tag":"0.1.2","author":"brelandr","date":"2026-06-26 04:58:11"},"0.2.9":{"tag":"0.2.9","author":"brelandr","date":"2026-06-30 02:36:40"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3586735,"resolution":"256x256","location":"assets","locale":"","width":229,"height":223}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3586735,"resolution":"772x250","location":"assets","locale":"","width":764,"height":225}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3590768,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/\",\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"installPlugin\",\"options\":{\"activate\":true},\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"kennelflow-core\"}},{\"step\":\"installPlugin\",\"options\":{\"activate\":true},\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"kennelflow-vet\"}},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire_once '\\\/wordpress\\\/wp-load.php';\\n$loc_pt = function_exists( 'ltkf_get_location_post_type' ) ? ltkf_get_location_post_type() : 'kf_location';\\nwp_insert_post( array( 'post_title' => 'Main Campus', 'post_type' => $loc_pt, 'post_status' => 'publish' ) );\\n$owner_id = username_exists( 'demoowner' );\\nif ( ! $owner_id ) {\\n\\t$owner_id = wp_insert_user( array(\\n\\t\\t'user_login' => 'demoowner',\\n\\t\\t'user_pass' => 'password',\\n\\t\\t'user_email' => 'owner@kennelflow.demo',\\n\\t\\t'role' => 'subscriber',\\n\\t\\t'display_name' => 'Demo Owner',\\n\\t) );\\n}\\n$pet_pt = function_exists( 'ltkf_get_pet_post_type' ) ? ltkf_get_pet_post_type() : 'kf_pet';\\n$owner_key = function_exists( 'ltkf_get_pet_owner_user_meta_key' ) ? ltkf_get_pet_owner_user_meta_key() : 'kf_owner_user_id';\\nforeach ( array( 'Bailey (Golden Retriever)', 'Max (Labrador)' ) as $title ) {\\n\\t$pid = wp_insert_post( array( 'post_title' => $title, 'post_type' => $pet_pt, 'post_status' => 'publish' ) );\\n\\tif ( $pid && ! is_wp_error( $pid ) ) {\\n\\t\\tupdate_post_meta( $pid, $owner_key, (int) $owner_id );\\n\\t}\\n}\\nif ( class_exists( '\\\\Landtech\\\\KennelFlow\\\\Core\\\\OwnerPets' ) && $owner_id ) {\\n\\t\\\\Landtech\\\\KennelFlow\\\\Core\\\\OwnerPets::rebuild_user_pet_ids( (int) $owner_id );\\n}\\n$portal = wp_insert_post( array(\\n\\t'post_title' => 'Pet Owner Portal',\\n\\t'post_content' => \\\"<h1>My Pets<\\\/h1>\\\\n\\\\n[ltkf_dashboard]\\\\n\\\\n<p><em>Demo owner: demoowner \\\/ password<\\\/em><\\\/p>\\\",\\n\\t'post_status' => 'publish',\\n\\t'post_type' => 'page',\\n) );\\nif ( $portal && ! is_wp_error( $portal ) && ! (int) get_option( 'page_on_front' ) ) {\\n\\tupdate_option( 'show_on_front', 'page' );\\n\\tupdate_option( 'page_on_front', (int) $portal );\\n}\"},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire_once '\\\/wordpress\\\/wp-load.php';\\nwp_insert_post( array(\\n\\t'post_title' => 'Book a Vet Visit',\\n\\t'post_content' => '[kennelflow_vet_booking]',\\n\\t'post_status' => 'publish',\\n\\t'post_type' => 'page',\\n) );\"}]}"}},"all_blocks":[],"tagged_versions":["0.1.0","0.1.2","0.2.9"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3586735,"resolution":"1","location":"assets","locale":"","width":3174,"height":2970},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3586735,"resolution":"10","location":"assets","locale":"","width":3174,"height":2970},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3586735,"resolution":"11","location":"assets","locale":"","width":3174,"height":2970},"screenshot-12.png":{"filename":"screenshot-12.png","revision":3586735,"resolution":"12","location":"assets","locale":"","width":3174,"height":2970},"screenshot-13.png":{"filename":"screenshot-13.png","revision":3586735,"resolution":"13","location":"assets","locale":"","width":3174,"height":2970},"screenshot-14.png":{"filename":"screenshot-14.png","revision":3586735,"resolution":"14","location":"assets","locale":"","width":3174,"height":3242},"screenshot-15.png":{"filename":"screenshot-15.png","revision":3586735,"resolution":"15","location":"assets","locale":"","width":3174,"height":1640},"screenshot-16.png":{"filename":"screenshot-16.png","revision":3586735,"resolution":"16","location":"assets","locale":"","width":3174,"height":3234},"screenshot-17.png":{"filename":"screenshot-17.png","revision":3586735,"resolution":"17","location":"assets","locale":"","width":3174,"height":5360},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3586735,"resolution":"2","location":"assets","locale":"","width":3174,"height":3476},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3586735,"resolution":"3","location":"assets","locale":"","width":3174,"height":3054},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3586735,"resolution":"4","location":"assets","locale":"","width":3174,"height":2970},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3586735,"resolution":"5","location":"assets","locale":"","width":3174,"height":2970},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3586735,"resolution":"6","location":"assets","locale":"","width":3174,"height":2970},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3586735,"resolution":"7","location":"assets","locale":"","width":3174,"height":2970},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3586735,"resolution":"8","location":"assets","locale":"","width":3174,"height":3710},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3586735,"resolution":"9","location":"assets","locale":"","width":3174,"height":1640}},"screenshots":[]},"plugin_section":[],"plugin_tags":[7101,43578,2690,268559],"plugin_category":[40],"plugin_contributors":[251791],"plugin_business_model":[],"class_list":["post-311211","plugin","type-plugin","status-publish","hentry","plugin_tags-bookings","plugin_tags-clinic","plugin_tags-pets","plugin_tags-veterinary","plugin_category-calendar-and-events","plugin_contributors-brelandr","plugin_committers-brelandr"],"banners":{"banner":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/banner-772x250.png?rev=3586735","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/icon-256x256.png?rev=3586735","icon_2x":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/icon-256x256.png?rev=3586735","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-1.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-2.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-3.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-4.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-5.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-6.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-7.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-8.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-9.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-10.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-11.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-12.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-13.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-14.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-15.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-16.png?rev=3586735","caption":""},{"src":"https:\/\/ps.w.org\/kennelflow-vet\/assets\/screenshot-17.png?rev=3586735","caption":""}],"raw_content":"<!--section=description-->\n<p><strong><a href=\"https:\/\/app.instawp.io\/launch?s=kennelflow&amp;d=v2\">Launch the full KennelFlow suite demo on InstaWP<\/a><\/strong> \u2014 temporary WordPress site with Core, Boarding, Vet, Groom, sample data, and the KennelFlow demo theme; no install on your server.<\/p>\n\n<p>KennelFlow Vet provides clinical scheduling and record-keeping building blocks that integrate with KennelFlow shared pets and locations. Install <strong>KennelFlow Core<\/strong> first, then activate this add-on.<\/p>\n\n<p>Primary development and listings use the WordPress.org profile <strong><a href=\"https:\/\/profiles.wordpress.org\/brelandr\/\">@brelandr<\/a>.<\/strong> Optional commercial services are available via <strong>LandTech Web Designs<\/strong>.<\/p>\n\n<p><strong>Human-readable JavaScript\/CSS source (Guideline 4):<\/strong> Every release includes the unminified sources under <strong>assets\/src\/<\/strong> (see <strong>assets\/src\/README.txt<\/strong> for the dist-to-source map). Built files under <strong>assets\/dist\/<\/strong> are generated via <strong>npm run build<\/strong> (esbuild + Vite). The DICOM viewer bundles <strong>Cornerstone3D<\/strong> into <strong>assets\/dist\/dicom-viewer.js<\/strong>. Public source: https:\/\/github.com\/brelandr\/kennelflow-vet \u2014 see Developer notes for rebuild steps.<\/p>\n\n<h3>Try It Live - Preview This Plugin Instantly<\/h3>\n\n<p><strong>Full KennelFlow suite (InstaWP)<\/strong><\/p>\n\n<p><a href=\"https:\/\/app.instawp.io\/launch?s=kennelflow&amp;d=v2\">Launch KennelFlow on InstaWP<\/a> \u2014 explore clinic calendar, EMR, boarding desk, grooming schedule, owner portal, and sample pets on one temporary site. Log in as <strong>admin<\/strong> \/ <strong>password<\/strong> (demo owner: <strong>demoowner<\/strong> \/ <strong>password<\/strong>).<\/p>\n\n<p><strong>Vet + Core only (WordPress Playground)<\/strong><\/p>\n\n<p>Preview KennelFlow Vet in WordPress Playground: the blueprint installs <strong>KennelFlow Core<\/strong> and <strong>KennelFlow Vet<\/strong> from WordPress.org, seeds demo pets and an owner portal, adds a <strong>Book a Vet Visit<\/strong> page with <code>[kennelflow_vet_booking]<\/code>, and opens the <strong>Vet calendar<\/strong> in wp-admin. Log in as <strong>admin<\/strong> \/ <strong>password<\/strong> (demo owner: <strong>demoowner<\/strong> \/ <strong>password<\/strong>).<\/p>\n\n<p><a href=\"https:\/\/playground.wordpress.net\/?blueprint-url=https:\/\/raw.githubusercontent.com\/brelandr\/kennelflow-vet\/main\/blueprint.json\">Preview on WordPress Playground<\/a><\/p>\n\n<p>The blueprint ships as <code>blueprint.json<\/code> and <code>assets\/blueprints\/blueprint.json<\/code>. WordPress.org also serves a copy from plugin SVN for directory live preview.<\/p>\n\n<h3>Developer notes<\/h3>\n\n<h4>Frontend bundles (readable source and rebuild)<\/h4>\n\n<p><strong>Public source repository:<\/strong> https:\/\/github.com\/brelandr\/kennelflow-vet \u2014 clone with <code>git clone https:\/\/github.com\/brelandr\/kennelflow-vet.git<\/code>, then run <strong>npm ci<\/strong> and <strong>npm run build<\/strong> to regenerate all bundles from the readable sources in <strong>assets\/src\/<\/strong>.<\/p>\n\n<p><strong>WordPress.org release package:<\/strong> each <strong>trunk<\/strong> or <strong>tag<\/strong> revision shipped to WordPress.org should include <strong>assets\/src\/<\/strong>, <strong>vite.*.config.js<\/strong>, <strong>scripts\/build-assets.mjs<\/strong>, <strong>package.json<\/strong>, <strong>package-lock.json<\/strong>, <strong>tsconfig.json<\/strong>, and <strong>assets\/dist\/<\/strong> (including the Cornerstone3D-powered <strong>dicom-viewer.js<\/strong> bundle and <strong>kennelflow-vet-decode-worker.js<\/strong>).<\/p>\n\n<p><strong>Maintainer zip builds:<\/strong> From a git checkout you can run <strong>scripts\/build-wordpress-org-zip.sh<\/strong> locally (repo-only tooling); it stages <strong>release\/*.zip<\/strong> and verifies <strong><code>assets\/dist\/<\/code><\/strong> artefacts and core source entries. Install <strong>Plugin Check<\/strong> from https:\/\/wordpress.org\/plugins\/plugin-check\/ and validate the staged directory before uploading to WordPress.org.<\/p>\n\n<p><strong>esbuild bundles<\/strong> (<strong>scripts\/build-assets.mjs<\/strong>) produce <strong>booking-wizard<\/strong>, <strong>admin-calendar<\/strong>, <strong>facility-settings<\/strong> into <strong>assets\/dist\/<\/strong>.<\/p>\n\n<p><strong>Vite bundles<\/strong> rebuild <strong>assets\/dist\/ai-dictation.*** from **vite.ai-dictation.config.js<\/strong> and <strong>assets\/dist\/dicom-viewer.*** from **vite.dicom.config.js<\/strong> against the JSX sources listed in <strong>assets\/src\/README.txt<\/strong>. Run <strong><code>npm run build:vite<\/code><\/strong> to rebuild only the Vite targets, or <strong><code>npm run build<\/code><\/strong> \/ <strong><code>npm run build:all<\/code><\/strong> for the full pipeline (esbuild + both Vite configs).<\/p>\n\n<p><strong>DICOM \/ Cornerstone3D:<\/strong> <strong>npm run build<\/strong> compiles npm packages <strong>@cornerstonejs\/core<\/strong> and <strong>@cornerstonejs\/dicom-image-loader<\/strong> (upstream https:\/\/github.com\/cornerstonejs\/cornerstone3D) into <strong>assets\/dist\/dicom-viewer.js<\/strong> and <strong>assets\/dist\/kennelflow-vet-decode-worker.js<\/strong> via Vite \u2014 no <strong>assets\/vendor\/<\/strong> copies and no remote CDNs load imaging libraries at runtime.<\/p>\n\n<p>Shipped readable sources map to shipped bundles as follows (see <strong>assets\/src\/README.txt<\/strong> for the definitive table):<\/p>\n\n<ul>\n<li><strong>assets\/dist\/booking-wizard.js<\/strong> \/ <strong>booking-wizard.css<\/strong> \u2014 TypeScript\/React in <strong>assets\/src\/booking-wizard\/<\/strong> (entry <strong>main.tsx<\/strong>), plus <strong>booking-wizard.css<\/strong><\/li>\n<li><strong>assets\/dist\/admin-calendar.js<\/strong> \/ <strong>admin-calendar.css<\/strong> \u2014 <strong>assets\/src\/admin-calendar\/<\/strong> (<strong>main.tsx<\/strong>), plus <strong>admin-calendar.css<\/strong><\/li>\n<li><strong>assets\/dist\/facility-settings.js<\/strong> \/ <strong>facility-settings.css<\/strong> \u2014 <strong>assets\/src\/facility-settings\/<\/strong> (<strong>main.tsx<\/strong>), plus <strong>facility-settings.css<\/strong><\/li>\n<li><strong>assets\/dist\/ai-dictation.js<\/strong> \/ <strong>ai-dictation.css<\/strong> \u2014 <strong>assets\/src\/ai-dictation.js<\/strong> + JSX modules (including <strong>AIDictation.jsx<\/strong>) via <strong>Vite<\/strong><\/li>\n<li><strong>assets\/dist\/dicom-viewer.js<\/strong> \/ <strong>dicom-viewer.css<\/strong> \u2014 <strong>assets\/src\/dicom-viewer-entry.jsx<\/strong>, <strong>assets\/src\/DICOMViewer.jsx<\/strong>, <strong>assets\/src\/cornerstone3d-bootstrap.js<\/strong>, and <strong>assets\/src\/dicom-viewer.css<\/strong>, via <strong>Vite<\/strong> (bundles Cornerstone3D)<\/li>\n<li><strong>assets\/dist\/kennelflow-vet-decode-worker.js<\/strong> \u2014 DICOM decode Web Worker emitted by the same Vite build (URL passed from PHP; ships beside <strong>dicom-viewer.js<\/strong>)<\/li>\n<\/ul>\n\n<p>Fully regenerate bundles and the DICOM worker from the plugin root (<strong>Node.js current LTS<\/strong> recommended):<\/p>\n\n<ol>\n<li>npm ci<\/li>\n<li>npm run build   (alias: <strong>npm run build:all<\/strong> \u2014 esbuild, then AI dictation Vite, then DICOM Vite)<\/li>\n<\/ol>\n\n<p>Incremental development:<\/p>\n\n<ul>\n<li><strong>npm run watch<\/strong> \u2014 esbuild only (booking-wizard, admin-calendar, facility-settings)<\/li>\n<li><strong>npm run watch:vite:ai<\/strong> \u2014 Vite watch for <strong>ai-dictation<\/strong><\/li>\n<li><strong>npm run watch:vite:dicom<\/strong> \u2014 Vite watch for <strong>dicom-viewer<\/strong> and <strong>kennelflow-vet-decode-worker.js<\/strong><\/li>\n<\/ul>\n\n<p>Dependency versions remain pinned via <strong>package.json<\/strong> \/ <strong>package-lock.json<\/strong>.<\/p>\n\n<h4>Third-party libraries included in the bundled JS\/CSS<\/h4>\n\n<p>The bundled UI loads these runtime OSS libraries straight from the emitted JavaScript payloads (matching <strong>package.json<\/strong> majors):<\/p>\n\n<ul>\n<li>React and React DOM \u2014 https:\/\/react.dev\/<\/li>\n<li>FullCalendar (core, React adapters, calendars) \u2014 https:\/\/fullcalendar.io\/<\/li>\n<li>Cornerstone3D (<strong>@cornerstonejs\/core<\/strong>, <strong>@cornerstonejs\/dicom-image-loader<\/strong>) \u2014 https:\/\/github.com\/cornerstonejs\/cornerstone3D \u2014 https:\/\/www.cornerstonejs.org\/<\/li>\n<li>dicom-parser (transitive dependency of the DICOM image loader) \u2014 https:\/\/github.com\/cornerstonejs\/dicomParser\/<\/li>\n<\/ul>\n\n<p>esbuild, Vite, TypeScript, and <strong>@vitejs\/plugin-react<\/strong> are build-time-only developer dependencies.<\/p>\n\n<h4>Admin JavaScript (plain, non-compiled)<\/h4>\n\n<p>The following scripts under <strong>assets\/js\/<\/strong> are plain, human-readable JavaScript \u2014 no build step required:<\/p>\n\n<ul>\n<li><strong>assets\/js\/admin-ajax.js<\/strong> \u2014 AJAX helpers used across the admin EMR interface<\/li>\n<li><strong>assets\/js\/admin-emr-confirm.js<\/strong> \u2014 Confirmation dialog for destructive EMR actions<\/li>\n<li><strong>assets\/js\/admin-emr-pet-search.js<\/strong> \u2014 Pet search autocomplete for EMR admin pages<\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<p>This plugin avoids silent network calls beyond what WordPress administrators explicitly configure.<\/p>\n\n<h4>WordPress AI Client (optional SOAP dictation)<\/h4>\n\n<p>Purpose: Clinicians may dictate optional SOAP scaffolding on pet encounter forms. Audio captured in-browser is processed through the <strong>WordPress AI Client<\/strong> (<code>wp_ai_client_prompt()<\/code>) built into WordPress 7.0+ \u2014 KennelFlow Vet does <strong>not<\/strong> call third-party AI HTTP APIs directly.<\/p>\n\n<p>Administrator opt-in: <strong>Default-off until a connector is configured.<\/strong> Site administrators (typically under <strong>Settings \u2192 Connectors<\/strong>) choose and authorize an AI provider once at the site level. KennelFlow Vet stores <strong>no<\/strong> provider API keys. The plugin screen <strong>KennelFlow Vet \u2192 AI dictation<\/strong> links to Connectors and shows availability status.<\/p>\n\n<p>When transmissions occur: <strong>Only after<\/strong> WordPress reports AI support (<code>wp_supports_ai()<\/code>) <strong>and<\/strong> a permitted user (EMR edit capability) triggers dictation via the REST route. The configured connector\/provider handles outbound requests; if AI is unavailable, the route returns an error and no dictation runs.<\/p>\n\n<p>Data sent: (1) <strong>Audio<\/strong> \u2014 browser-captured dictation uploaded to your WordPress site, then passed to the AI Client with <code>with_file()<\/code> for transcription; (2) <strong>Transcripts and prompt snippets<\/strong> \u2014 plain text plus a fixed SOAP-structuring prompt sent through the same client. No patient identifiers are added by the plugin beyond what clinicians speak; follow clinic policy when dictating.<\/p>\n\n<p>Third-party providers: Which external service receives data depends entirely on the connector the site owner configures in WordPress (for example OpenAI, Anthropic, or Google). Review that provider\u2019s terms and privacy policy in Connectors documentation alongside your facility\u2019s HIPAA\/state privacy workflows.<\/p>\n\n<h4>DICOM imaging viewer<\/h4>\n\n<p>The bundled DICOM tooling uses self-hosted <strong>Cornerstone3D<\/strong> JavaScript compiled into <strong>assets\/dist\/dicom-viewer.js<\/strong> (with <strong>assets\/dist\/kennelflow-vet-decode-worker.js<\/strong> for decoding) and does <strong>not<\/strong>, by itself, relay patient imaging to third-party viewing platforms.<\/p>\n\n<h4>Laboratory webhook ingest (optional, inbound)<\/h4>\n\n<p>Purpose: Clinic staff may configure diagnostic\/lab vendors to POST result JSON to a KennelFlow Vet REST webhook when a shared secret is stored for that provider.<\/p>\n\n<p>When transmissions occur: <strong>Inbound only<\/strong> \u2014 external lab systems initiate HTTPS POST requests to your WordPress site at <strong><code>\/wp-json\/kennelflow-vet\/v1\/lab-integration\/webhook\/{provider}<\/code><\/strong> when an administrator or integration filter configures a webhook secret for the provider slug. No outbound calls are made to lab vendors by this feature.<\/p>\n\n<p>Authentication: Requests must present the configured shared secret via <strong><code>X-KF-Vet-Lab-Secret<\/code><\/strong>, <strong><code>X-KF-Vet-Lab-Token<\/code><\/strong>, or <strong><code>Authorization: Bearer<\/code><\/strong> header. Requests without a matching secret are rejected (401). If no secret is configured, the endpoint does not accept data.<\/p>\n\n<p>Data received: JSON lab result payloads (patient identifiers and result rows as supplied by the vendor\/integration). Parsed rows are stored in your WordPress database as EMR lab results for the matched pet. Review vendor agreements and your facility privacy policy before enabling inbound feeds.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>The plugin stores clinical and booking data in your WordPress database and media library per your configuration. Review your site privacy policy and any other active plugins for how data is shared.<\/p>\n\n<h3>Developer Resources<\/h3>\n\n<p>The uncompiled source code, along with build tools and instructions for this plugin, is publicly available for review, study, and contribution on GitHub: https:\/\/github.com\/brelandr\/kennelflow-vet . Clone the repo, install dependencies with <strong>npm ci<\/strong>, then run <strong>npm run build<\/strong> so <strong>esbuild<\/strong> and <strong>Vite<\/strong> (including the Cornerstone3D DICOM bundle) all execute (matching the WordPress.org upload layout).<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate <strong>KennelFlow Core<\/strong> from WordPress.org.<\/li>\n<li>Install KennelFlow Vet (upload zip or install from the Plugins screen). The folder name should match the plugin slug <code>\/wp-content\/plugins\/kennelflow-vet\/<\/code>.<\/li>\n<li>Activate KennelFlow Vet from the Plugins screen.<\/li>\n<li>Configure rooms, locations, and roles for your clinic.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20require%20another%20kennelflow%20plugin%20besides%20core%3F\"><h3>Does this require another KennelFlow plugin besides Core?<\/h3><\/dt>\n<dd><p>KennelFlow Vet requires KennelFlow Core. Other KennelFlow add-ons are optional.<\/p><\/dd>\n<dt id=\"does%20this%20send%20data%20to%20external%20services%3F\"><h3>Does this send data to external services?<\/h3><\/dt>\n<dd><p>Clinical and booking data ordinarily stay on your WordPress site. <strong>SMTP<\/strong> mail and other unrelated plugins remain outside KennelFlow Vet\u2019s scope. <strong>Laboratory ingest<\/strong> integrations do not transmit data externally unless clinic staff explicitly configure webhook or ingest flows that invoke other APIs.<\/p>\n\n<p><strong>AI SOAP dictation uses the WordPress AI Client (WordPress 7.0+).<\/strong> KennelFlow Vet does not store provider API keys. Site administrators configure AI connectors under <strong>Settings \u2192 Connectors<\/strong>; only then may permitted clinicians trigger dictation, which sends in-browser audio and derived text through the configured provider for transcription and SOAP structuring (see <strong>External Services<\/strong>). If no connector is configured, dictation is unavailable.<\/p>\n\n<p>The <strong>in-browser DICOM viewer<\/strong> uses bundled JavaScript shipped with the plugin; it does <strong>not<\/strong> upload medical images to a third\u2011party viewing service by default.<\/p><\/dd>\n<dt id=\"where%20is%20the%20non-minified%20javascript%20and%20css%20source%3F\"><h3>Where is the non-minified JavaScript and CSS source?<\/h3><\/dt>\n<dd><p>Human-readable sources live under <strong>assets\/src\/<\/strong> alongside <strong>assets\/src\/README.txt<\/strong> (dist-to-entry mapping). The same trees ship in every release alongside <strong>assets\/dist\/<\/strong>. Browse or fork from https:\/\/github.com\/brelandr\/kennelflow-vet. Run <strong>npm ci<\/strong> then <strong>npm run build<\/strong> from the plugin root after edits; see Developer notes for esbuild vs Vite entrypoints and bundled dependencies.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.2.9<\/h4>\n\n<ul>\n<li>Staff calendar visit photos: load and save on hub <code>kennelpress_booking<\/code> clinic rows; grant <code>upload_files<\/code> to clinical desk roles.<\/li>\n<li><strong>Live demo<\/strong>: InstaWP full KennelFlow suite link in readme; <strong>Live demo<\/strong> and <strong>Get Premium<\/strong> links on the Plugins screen.<\/li>\n<\/ul>\n\n<h4>0.2.8<\/h4>\n\n<ul>\n<li>Staff calendar <strong>Visit photos<\/strong> (intake \/ discharge) on clinic appointments: Take photo, Choose photo, admin meta box, and REST API.<\/li>\n<\/ul>\n\n<h4>0.2.7<\/h4>\n\n<ul>\n<li>Vet bookings: <strong>Reason for visit<\/strong> and <strong>Appointment notes<\/strong> fields on the admin booking editor, REST API, and registered post meta (<code>_kf_reason_for_visit<\/code>, <code>_kf_appointment_notes<\/code>).<\/li>\n<\/ul>\n\n<h4>0.2.6<\/h4>\n\n<ul>\n<li>Veterinarians can open kf_vet_booking appointment posts from the staff calendar (map_meta_cap for vet booking CPT).<\/li>\n<\/ul>\n\n<h4>0.2.5<\/h4>\n\n<ul>\n<li>Fix fatal error on Audit Log admin page (removed reference to undefined transient constant; object cache only).<\/li>\n<\/ul>\n\n<h4>0.2.4<\/h4>\n\n<ul>\n<li>Vet booking calendar: click an event for details plus <strong>Edit\/View appointment<\/strong>, <strong>Edit pet<\/strong>, <strong>Patient history<\/strong>, and <strong>Edit owner<\/strong> links (when permitted).<\/li>\n<\/ul>\n\n<h4>0.2.3<\/h4>\n\n<ul>\n<li>Veterinarian demo\/staff: front-end Staff Calendar defaults to <strong>clinic<\/strong> bookings (not boarding kennels).<\/li>\n<li>Fix Vet booking calendar and Facility rules admin React mounts (DOM id + localized settings matched to built assets).<\/li>\n<li>Hub menu access for clinical roles without boarding desk caps; veterinarians can open Pets, Locations, and Rooms.<\/li>\n<li>Pet search (Patient history picker and Hub Pets list) matches <strong>owner name<\/strong> as well as pet name.<\/li>\n<\/ul>\n\n<h4>0.2.2<\/h4>\n\n<ul>\n<li>Vet \/ clinical staff may view the front-end Staff Calendar (<code>ltkf_user_can_view_hub_calendar<\/code> filter).<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Boarding wizard add-ons: one <strong>pet size<\/strong> selector per selected pet (multi-pet stays); per-pet sizes sent to quote and booking APIs.<\/li>\n<li>Dates step: show allowed check-in\/out hours; block <strong>Check availability<\/strong> when times are outside facility windows.<\/li>\n<li>Add-ons: surface hours errors with <strong>Change check-in\/out times<\/strong>; emergency drop-off and extended pick-up flags respected on quote\/submit validation.<\/li>\n<\/ul>\n\n<h4>0.1.9<\/h4>\n\n<ul>\n<li>Boarding booking wizard no longer shows the provider\/clinician step; that setting applies to clinic scheduling, not kennel stays.<\/li>\n<li>Booking wizard add-ons step: show a formatted price estimate instead of raw JSON; explain when facility uses quote-only pricing (no online rate configured).<\/li>\n<\/ul>\n\n<h4>0.1.7<\/h4>\n\n<ul>\n<li>Fix fatal error in Vet room availability (undefined variable) that returned HTTP 500 on <strong>Check availability<\/strong>.<\/li>\n<li>Booking wizard: when KennelFlow Boarding is active, use the same boarding availability API as My Pets (hub location + kennels); submit bookings via boarding REST.<\/li>\n<\/ul>\n\n<h4>0.1.6<\/h4>\n\n<ul>\n<li>Booking wizard: skip the pet step when pets arrive from the My Pets portal (single or multiple); show <strong>Booking for: \u2026<\/strong> with <strong>Change pets<\/strong>.<\/li>\n<li>Multi-pet boarding: checkbox selection on the pet step; pet count and pricing follow selected pets; companion pet IDs sent on submit.<\/li>\n<\/ul>\n\n<h4>0.1.5<\/h4>\n\n<ul>\n<li>Booking wizard: read <code>kf_pet_id<\/code>, <code>kf_location<\/code> (hub location id), <code>kf_start<\/code>, and <code>kf_end<\/code> from the URL when arriving from the My Pets portal; map hub locations to Vet facility terms, prefill the wizard, and auto-check room availability.<\/li>\n<\/ul>\n\n<h4>0.1.4<\/h4>\n\n<ul>\n<li>Owner portal Medications tab: register <code>ltkf_portal_medications_panel<\/code> and <code>ltkf_portal_localize_vars<\/code> so KennelFlow Core shows prescriptions (fixes \"Medications are not available on this site\" when Vet is active).<\/li>\n<li>Refill buttons use Core portal AJAX (<code>data-kennelflow-vet-refill<\/code> \/ <code>kennelflow_vet_rx_refill<\/code>).<\/li>\n<\/ul>\n\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Fix undefined <code>$is_kfvet_cpt<\/code> variable in meta capability mapping (typo for <code>$is_kennel_vet_cpt<\/code>).<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>Fix Vet calendar and Facility rules admin screens not mounting (React mount element and localized config names now match PHP).<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release on WordPress.org.<\/li>\n<\/ul>","raw_excerpt":"Veterinary foundation: patients, rooms, locations, and bookings with availability checks and REST API. Requires KennelFlow Core.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/311211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=311211"}],"author":[{"embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/brelandr"}],"wp:attachment":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=311211"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=311211"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=311211"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=311211"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=311211"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=311211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}