{"id":398499,"date":"2026-11-10T01:45:32","date_gmt":"2026-11-10T01:45:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/grey-local-site-ai-assistant\/"},"modified":"2026-11-10T01:45:14","modified_gmt":"2026-11-10T01:45:14","slug":"grey-local-site-ai-assistant","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/grey-local-site-ai-assistant\/","author":23598877,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.3.15","stable_tag":"0.3.15","tested":"7.1.4","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"Grey Local Site AI Assistant","header_author":"","header_description":"A browser-only assistant that answers from this site's own pages.","assets_banners_color":"171b1f","last_updated":"2026-11-10 01:45:14","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":224,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.3.15":{"tag":"0.3.15","author":"00greyok00","date":"2026-11-10 01:45:14","revision":3793498}},"upgrade_notice":{"0.3.15":"<p>Review-compliance release: readable sources now ship inside the archive.\nNo behaviour change.<\/p>","0.3.12":"<p>Plugin Check clean: no warnings. No behaviour change.<\/p>","0.3.11":"<p>The GPU model library now ships with the plugin instead of being downloaded.<\/p>","0.3.10":"<p>Directory-compliance release: readme, GPL-2.0-or-later, filesystem helpers.\nNo behaviour change.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3793498,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3793498,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3793498,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3793498,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.3.15"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[1320,2364,2323,396,944],"plugin_category":[54,59],"plugin_contributors":[291734],"plugin_business_model":[],"class_list":["post-398499","plugin","type-plugin","status-publish","hentry","plugin_tags-assistant","plugin_tags-chatbot","plugin_tags-offline","plugin_tags-privacy","plugin_tags-search","plugin_category-security-and-spam-protection","plugin_category-utilities-and-tools","plugin_contributors-00greyok00","plugin_committers-00greyok00"],"banners":{"banner":"https:\/\/ps.w.org\/grey-local-site-ai-assistant\/assets\/banner-772x250.png?rev=3793498","banner_2x":"https:\/\/ps.w.org\/grey-local-site-ai-assistant\/assets\/banner-1544x500.png?rev=3793498","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/grey-local-site-ai-assistant\/assets\/icon-128x128.png?rev=3793498","icon_2x":"https:\/\/ps.w.org\/grey-local-site-ai-assistant\/assets\/icon-256x256.png?rev=3793498","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Local Assistant adds a small chat panel to the site. The visitor asks a\nquestion, the plugin finds the most relevant passages in the site's own pages,\nand a small language model that runs in the visitor's browser writes the answer.\nThe answer cites the page it came from. If the pages do not answer the question,\nthe assistant says so instead of inventing one.<\/p>\n\n<p>The site owner builds the search index once from the dashboard: the plugin walks\nthe sitemap, extracts the readable text of each page, and saves a searchable\nindex plus its vectors into <code>wp-content\/uploads\/local-assistant\/<\/code>. Nothing is\nsent to a server at any point.<\/p>\n\n<ul>\n<li><strong>Answers come from your pages.<\/strong> Retrieval runs against the index built from\nthis site; the model is instructed to refuse when the passages do not contain\nthe answer.<\/li>\n<li><strong>The model runs on the visitor's device.<\/strong> No server-side model, no API key,\nno per-answer cost, and question text never leaves the browser.<\/li>\n<li><strong>Works offline after the first visit.<\/strong> A service worker caches the widget\nand the index, so a returning visitor can ask again without a network.<\/li>\n<li><strong>Two engine paths.<\/strong> WebGPU is used when the browser offers it; a small CPU\nmodel is the fallback, and a plain search result is the last resort. The\nswitch is silent \u2014 the visitor sees an answer, not engine jargon.<\/li>\n<\/ul>\n\n<h4>External services<\/h4>\n\n<p>The plugin itself calls no external service, and the site server never sends\nvisitor data anywhere. On the visitor's device, the browser downloads model\nfiles the first time the assistant is used, after the visitor accepts the\nconsent card:<\/p>\n\n<ul>\n<li><strong>WebLLM<\/strong> (Apache-2.0) fetches the conversation model, by default\n  SmolLM2-360M-Instruct-q4f16_1-MLC, from the MLC model hub on Hugging Face.<\/li>\n<li><strong>Transformers.js<\/strong> (Apache-2.0) fetches the embedding model\n  Xenova\/all-MiniLM-L6-v2 and the CPU model <code>HuggingFaceTB\/SmolLM2-135M-Instruct<\/code>\nfrom Hugging Face.<\/li>\n<li><strong>ONNX Runtime Web<\/strong> (MIT) is bundled in the plugin; its WASM runtime is\nloaded from the plugin folder, not a CDN.<\/li>\n<li><strong>WebLLM's model library<\/strong> is a WebAssembly module the engine compiles on the\nvisitor's GPU. It ships inside the plugin\n(<code>dist\/vendor\/web-llm\/SmolLM2-360M-Instruct-q4f16_1_cs1k-webgpu.wasm<\/code>) and is\nloaded from the plugin folder, so no executable code is fetched from a third\nparty at runtime.<\/li>\n<\/ul>\n\n<p>Those downloads are the only network traffic the assistant causes, they are\nstarted only after consent, and they go directly from the visitor's browser to\nHugging Face under Hugging Face's own terms. The site owner can point the\ndownloads at another host with the <code>modelBaseUrl<\/code>, <code>modelLibUrl<\/code>, and\n    modelMirror settings.<\/p>\n\n<h4>See it live<\/h4>\n\n<p>The assistant runs on the author's own site \u2014 ask it something and watch it\ncite the page it read:<\/p>\n\n<ul>\n<li>Live demo: <a href=\"https:\/\/randybarham.com\">randybarham.com<\/a> (the chat panel opens\non every public page).<\/li>\n<li>Full readable source, build scripts, and tests:\n<a href=\"https:\/\/github.com\/greyok00\/local-assistant\">github.com\/greyok00\/local-assistant<\/a>.<\/li>\n<\/ul>\n\n<h3>Source Code<\/h3>\n\n<p>The WordPress package is generated from readable sources, and the full\nbuild is public:<\/p>\n\n<ul>\n<li>The readable sources and build scripts live at\n<a href=\"https:\/\/github.com\/greyok00\/local-assistant\">github.com\/greyok00\/local-assistant<\/a>\n\u2014 <code>src\/<\/code> holds the plugin's JavaScript modules, <code>scripts\/<\/code> the build tools.<\/li>\n<li>This zip also carries a readable copy of every script it was built from\nin its <code>source\/<\/code> folder.<\/li>\n<li>To build the package from source: <code>npm ci &amp;&amp; npm run vendor &amp;&amp; npm run\nbuild<\/code> (Node.js 20+), then <code>npm run release<\/code> for versioned zips.<\/li>\n<li>The third-party libraries in <code>dist\/vendor\/<\/code> are Transformers.js\n(Apache-2.0, <a href=\"https:\/\/github.com\/huggingface\/transformers.js\">sources<\/a>) and\nWebLLM (Apache-2.0, <a href=\"https:\/\/github.com\/mlc-ai\/web-llm\">sources<\/a>); exact\nversions are listed in the included <code>THIRD-PARTY-NOTICES.txt<\/code>.<\/li>\n<\/ul>\n\n<p>The two <code>.wasm<\/code> files flagged in review are required, and both are loaded\nonly from the plugin's own folder \u2014 the plugin never fetches executable\ncode from a third-party host:<\/p>\n\n<ul>\n<li><code>dist\/vendor\/transformers\/ort-wasm-simd-threaded.jsep.wasm<\/code> is the ONNX\nRuntime Web engine that runs the embedding model and the CPU fallback\nmodel inside Transformers.js; the plugin cannot function without it.<\/li>\n<li><code>dist\/vendor\/web-llm\/SmolLM2-360M-Instruct-q4f16_1_cs1k-webgpu.wasm<\/code> is\nWebLLM's compiled GPU program for the <code>SmolLM2-360M-Instruct-q4f16_1<\/code>\nchat model; it is the WebGPU conversation engine itself. The fetched copy\nis tracked in the repository under <code>scripts\/vendor-extra\/<\/code>.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>, or install the zip from\nPlugins &gt; Add New &gt; Upload Plugin. The zip already contains the built\n   dist\/ assets; no build step is needed.<\/li>\n<li>Activate the plugin through the Plugins screen.<\/li>\n<li>Open Settings &gt; Local Assistant and press \"Ingest site\". The index is built\nin your browser and saved under <code>wp-content\/uploads\/local-assistant\/<\/code>.<\/li>\n<li>The assistant appears in the bottom-right corner of every public page.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20send%20my%20visitors%27%20questions%20to%20a%20server%3F\"><h3>Does this send my visitors' questions to a server?<\/h3><\/dt>\n<dd><p>No. Retrieval and generation both run in the visitor's browser. The question is\nnot transmitted anywhere, and there is no analytics or telemetry call.<\/p><\/dd>\n<dt id=\"why%20does%20the%20first%20answer%20take%20longer%3F\"><h3>Why does the first answer take longer?<\/h3><\/dt>\n<dd><p>The first use downloads the model files (roughly 100-400 MB depending on the\nengine the browser supports) and caches them. Later visits start from the cache.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20gpu%3F\"><h3>Do I need a GPU?<\/h3><\/dt>\n<dd><p>No. WebGPU makes answers faster where it is available; otherwise the plugin\nloads a small CPU model, and if that cannot run it shows the closest matching\npage instead.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20page%20changes%3F\"><h3>What happens if a page changes?<\/h3><\/dt>\n<dd><p>Press \"Ingest site\" again. The index is rebuilt from the sitemap; there is no\nschedule and no background job.<\/p><\/dd>\n<dt id=\"is%20the%20index%20public%3F\"><h3>Is the index public?<\/h3><\/dt>\n<dd><p>It is written to <code>wp-content\/uploads\/local-assistant\/<\/code>, which is normally\nreadable by visitors \u2014 that is what makes offline answers possible. It contains\ntext already published on the site, not private content.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.3.15<\/h4>\n\n<ul>\n<li>WordPress.org review compliance release. The readable source of every\nminified script now ships inside the archive in the <code>source\/<\/code> folder, and\nthe repository now carries the sources and\nbuild scripts (<code>src\/<\/code>, <code>scripts\/<\/code>, package files) so the package can be\nrebuilt from source. The readme documents the source location and the\nthird-party library origins. No runtime behaviour changed.<\/li>\n<\/ul>\n\n<h4>0.3.12<\/h4>\n\n<ul>\n<li>Renamed Grey Local Site AI Assistant, so the directory slug names this plugin.<\/li>\n<li>Plugin Check reports no warnings: the settings flag uses filter_input(), and\nthe upload reader's remaining notices carry documented annotations.<\/li>\n<\/ul>\n\n<h4>0.3.11<\/h4>\n\n<ul>\n<li>The WebGPU model library is bundled and loaded from the plugin folder; the\nGPU engine no longer downloads executable WebAssembly from GitHub.<\/li>\n<li>The archive is under the directory's 10 MB limit: Node-only builds of the\nsearch runtime and the listing banners are no longer included.<\/li>\n<\/ul>\n\n<h4>0.3.10<\/h4>\n\n<ul>\n<li>Licensed GPL-2.0-or-later and added the readme required for distribution.<\/li>\n<li>File moves and checks use WP_Filesystem and core helpers.<\/li>\n<li>The admin mark prints as a fixed literal so its SVG stays intact.<\/li>\n<li>The plugin archive now ships readable sources for its minified scripts.<\/li>\n<\/ul>\n\n<h4>0.3.9<\/h4>\n\n<ul>\n<li>One source link per answer, without note numbers.<\/li>\n<\/ul>\n\n<h4>0.3.8<\/h4>\n\n<ul>\n<li>The answer bubble shows only the verified answer, never the model's draft.<\/li>\n<li>Label-only passages are refused instead of quoted.<\/li>\n<\/ul>","raw_excerpt":"A browser-run assistant that answers questions from this site's own pages. No server model, no API key.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/398499","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=398499"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/00greyok00"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=398499"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=398499"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=398499"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=398499"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=398499"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=398499"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}