<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ohcnwiki.tellmey.fyi/index.php?action=history&amp;feed=atom&amp;title=Contributing%2FPlugin_system</id>
	<title>Contributing/Plugin system - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://ohcnwiki.tellmey.fyi/index.php?action=history&amp;feed=atom&amp;title=Contributing%2FPlugin_system"/>
	<link rel="alternate" type="text/html" href="https://ohcnwiki.tellmey.fyi/index.php?title=Contributing/Plugin_system&amp;action=history"/>
	<updated>2026-07-06T07:11:32Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.4</generator>
	<entry>
		<id>https://ohcnwiki.tellmey.fyi/index.php?title=Contributing/Plugin_system&amp;diff=467&amp;oldid=prev</id>
		<title>Admin: Add Navbox contributing (via update-page on MediaWiki MCP Server)</title>
		<link rel="alternate" type="text/html" href="https://ohcnwiki.tellmey.fyi/index.php?title=Contributing/Plugin_system&amp;diff=467&amp;oldid=prev"/>
		<updated>2026-07-06T04:22:25Z</updated>

		<summary type="html">&lt;p&gt;Add Navbox contributing (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:52, 6 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 119:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 119:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[&amp;lt;nowiki/&amp;gt;https://github.com/ohcnetwork/care_scribe Care Scribe] is a published plugin that provides autofill functionality for the Care consultation forms. It is a useful reference for how a real plugin is structured across the backend and frontend.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[&amp;lt;nowiki/&amp;gt;https://github.com/ohcnetwork/care_scribe Care Scribe] is a published plugin that provides autofill functionality for the Care consultation forms. It is a useful reference for how a real plugin is structured across the backend and frontend.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Navbox contributing}}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Related}}&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Related}}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://ohcnwiki.tellmey.fyi/index.php?title=Contributing/Plugin_system&amp;diff=199&amp;oldid=prev</id>
		<title>Admin: OHC identity seed</title>
		<link rel="alternate" type="text/html" href="https://ohcnwiki.tellmey.fyi/index.php?title=Contributing/Plugin_system&amp;diff=199&amp;oldid=prev"/>
		<updated>2026-07-04T23:07:32Z</updated>

		<summary type="html">&lt;p&gt;OHC identity seed&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Doc header&lt;br /&gt;
|type=guide&lt;br /&gt;
|domain=contributing&lt;br /&gt;
|title=Plugin system&lt;br /&gt;
|order=3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Care is designed to be extended without forking the core. Functionality you do not want to maintain in the main codebase — a transcription service, a custom integration, a bespoke UI — ships as a &amp;#039;&amp;#039;&amp;#039;plugin&amp;#039;&amp;#039;&amp;#039;. There are two halves to the system:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Backend plugs&amp;#039;&amp;#039;&amp;#039; — Django apps loaded into the [&amp;lt;nowiki/&amp;gt;https://github.com/ohcnetwork/care &amp;lt;code&amp;gt;care&amp;lt;/code&amp;gt;] server through &amp;lt;code&amp;gt;plug_config.py&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Frontend Care Apps&amp;#039;&amp;#039;&amp;#039; — federated React bundles loaded into the [&amp;lt;nowiki/&amp;gt;https://github.com/ohcnetwork/care_fe &amp;lt;code&amp;gt;care_fe&amp;lt;/code&amp;gt;] host at runtime.&lt;br /&gt;
&lt;br /&gt;
A plugin can be backend-only, frontend-only, or both, depending on what it needs to do.&lt;br /&gt;
&lt;br /&gt;
== Backend plugs ==&lt;br /&gt;
&lt;br /&gt;
A backend plugin is a regular Django app. What makes it a Care plugin is that it is declared in &amp;lt;code&amp;gt;plug_config.py&amp;lt;/code&amp;gt; using the &amp;lt;code&amp;gt;Plug&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PlugManager&amp;lt;/code&amp;gt; classes from the &amp;lt;code&amp;gt;plugs&amp;lt;/code&amp;gt; package. The default Care image ships with &amp;#039;&amp;#039;&amp;#039;no&amp;#039;&amp;#039;&amp;#039; plugins enabled — &amp;lt;code&amp;gt;plug_config.py&amp;lt;/code&amp;gt; declares an empty list — and you opt in by overriding that file with your own.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;from plugs.manager import PlugManager&lt;br /&gt;
from plugs.plug import Plug&lt;br /&gt;
&lt;br /&gt;
my_plugin = Plug(&lt;br /&gt;
    name=&amp;quot;my_plugin&amp;quot;,&lt;br /&gt;
    package_name=&amp;quot;git+https://github.com/octo/my_plugin.git&amp;quot;,&lt;br /&gt;
    version=&amp;quot;@v1.0.0&amp;quot;,&lt;br /&gt;
    configs={&lt;br /&gt;
        &amp;quot;SERVICE_API_KEY&amp;quot;: &amp;quot;my_api_key&amp;quot;,&lt;br /&gt;
        &amp;quot;SERVICE_SECRET_KEY&amp;quot;: &amp;quot;my_secret_key&amp;quot;,&lt;br /&gt;
        &amp;quot;VALUE_1_MAX&amp;quot;: 10,&lt;br /&gt;
    },&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
plugs = [my_plugin]&lt;br /&gt;
&lt;br /&gt;
manager = PlugManager(plugs)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Each &amp;lt;code&amp;gt;Plug&amp;lt;/code&amp;gt; points at a &amp;lt;code&amp;gt;package_name&amp;lt;/code&amp;gt; (here a Git source) and a &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, and carries a &amp;lt;code&amp;gt;configs&amp;lt;/code&amp;gt; dictionary that is passed to the plugin.&lt;br /&gt;
&lt;br /&gt;
=== Load timing: build vs runtime ===&lt;br /&gt;
&lt;br /&gt;
Plugins can be installed either while the Docker image is being &amp;#039;&amp;#039;&amp;#039;built&amp;#039;&amp;#039;&amp;#039; or at &amp;#039;&amp;#039;&amp;#039;runtime&amp;#039;&amp;#039;&amp;#039;. Build-time loading is recommended — it bakes the plugin and its dependencies into the image so containers start with a known, reproducible set of plugins rather than resolving packages on boot.&lt;br /&gt;
&lt;br /&gt;
=== Config precedence ===&lt;br /&gt;
&lt;br /&gt;
Every plugin defines its own configuration variables, usually with sensible defaults, and may read values from the environment. When the same value is set in more than one place, Care resolves it in this order (highest priority first):&lt;br /&gt;
&lt;br /&gt;
# Values defined in &amp;lt;code&amp;gt;plug_config.py&amp;lt;/code&amp;gt; (the &amp;lt;code&amp;gt;configs&amp;lt;/code&amp;gt; dictionary on the &amp;lt;code&amp;gt;Plug&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Environment variables.&lt;br /&gt;
# Default values defined inside the plugin.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;plug_config.py&amp;lt;/code&amp;gt; always wins, environment variables fill the gaps, and the plugin&amp;#039;s own defaults are the fallback.&lt;br /&gt;
&lt;br /&gt;
=== URL mounting ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;PlugManager&amp;lt;/code&amp;gt; automatically wires up each plugin&amp;#039;s configuration and mounts its URLs under &amp;lt;code&amp;gt;/api/&amp;amp;lt;plugin-name&amp;amp;gt;/&amp;lt;/code&amp;gt;. A plugin named &amp;lt;code&amp;gt;my_plugin&amp;lt;/code&amp;gt; therefore exposes its routes under &amp;lt;code&amp;gt;/api/my_plugin/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Scaffolding a new plug ===&lt;br /&gt;
&lt;br /&gt;
A backend plugin follows the structure of a typical Django app — you define your models, views, and URLs inside the plugin folder. To start from a working skeleton, use the [&amp;lt;nowiki/&amp;gt;https://github.com/ohcnetwork/care-plugin-cookiecutter care-plugin-cookiecutter] template rather than wiring everything up by hand.&lt;br /&gt;
&lt;br /&gt;
=== Local development ===&lt;br /&gt;
&lt;br /&gt;
For local work, install the plugin in editable mode so your source edits are picked up without reinstalling:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;pip install -e /path/to/plugin&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If the plugin needs to inherit components from the core app, install Care itself in editable mode from inside the plugin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;pip install -e /path/to/care&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Tip|1=Set up the Care backend first — see [[Contributing/Local development/Backend setup|Backend local setup]] for getting the server running before you attach a plugin to it.}}&lt;br /&gt;
&lt;br /&gt;
== Frontend Care Apps ==&lt;br /&gt;
&lt;br /&gt;
On the frontend, a plugin is called a &amp;#039;&amp;#039;&amp;#039;Care App&amp;#039;&amp;#039;&amp;#039;: a separately built React bundle that the &amp;lt;code&amp;gt;care_fe&amp;lt;/code&amp;gt; host loads at runtime via Vite module federation. The host app is the federation &amp;lt;code&amp;gt;core&amp;lt;/code&amp;gt; and shares key dependencies — &amp;lt;code&amp;gt;react&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;react-dom&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;react-i18next&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;@tanstack/react-query&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;raviger&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sonner&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;decimal.js&amp;lt;/code&amp;gt; — so a plugin reuses the host&amp;#039;s single copy of each rather than bundling its own. Each Care App exposes a &amp;lt;code&amp;gt;./manifest&amp;lt;/code&amp;gt; (from &amp;lt;code&amp;gt;src/manifest.tsx&amp;lt;/code&amp;gt;) that declares the routes, components, tabs, and overrides it contributes; &amp;lt;code&amp;gt;src/pluginTypes.ts&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;care_fe&amp;lt;/code&amp;gt; is the source of truth for that manifest contract.&lt;br /&gt;
&lt;br /&gt;
=== How Care Apps are discovered ===&lt;br /&gt;
&lt;br /&gt;
The host resolves its effective plugin set from two sources and merges them:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source&lt;br /&gt;
! Where it comes from&lt;br /&gt;
! Behavior&lt;br /&gt;
|-&lt;br /&gt;
| Build-time&lt;br /&gt;
| &amp;lt;code&amp;gt;REACT_ENABLED_APPS&amp;lt;/code&amp;gt; env var, parsed into &amp;lt;code&amp;gt;careConfig.careApps&amp;lt;/code&amp;gt;&lt;br /&gt;
| Always enabled, read-only in the admin UI&lt;br /&gt;
|-&lt;br /&gt;
| API&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /api/v1/plug_config/&amp;lt;/code&amp;gt;&lt;br /&gt;
| Editable in the admin UI&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Build-time entries act as the base set, so they load even if the backend returns no matching &amp;lt;code&amp;gt;plug_config&amp;lt;/code&amp;gt; row. When both sources define the same plugin, the build-time entry wins for overlapping metadata and non-conflicting API metadata is preserved. Each &amp;lt;code&amp;gt;REACT_ENABLED_APPS&amp;lt;/code&amp;gt; entry takes the form &amp;lt;code&amp;gt;org/repo&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;org/repo@host/path/to/remoteEntry.js&amp;lt;/code&amp;gt;; when the host/path is omitted, Care defaults to GitHub Pages at &amp;lt;code&amp;gt;https://{org}.github.io/{repo}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For each resolved plugin, the host validates the remote URL, registers the remote with Vite federation under the plugin&amp;#039;s slug, loads its &amp;lt;code&amp;gt;./manifest&amp;lt;/code&amp;gt;, and exposes the loaded manifests through &amp;lt;code&amp;gt;CareAppsContext&amp;lt;/code&amp;gt;. If a remote is missing or fails to load, that plugin is logged and skipped — the rest of the app and other plugins keep working.&lt;br /&gt;
&lt;br /&gt;
=== Local development ===&lt;br /&gt;
&lt;br /&gt;
The recommended way to develop a Care App is &amp;#039;&amp;#039;&amp;#039;in-tree&amp;#039;&amp;#039;&amp;#039;: drop or symlink your plugin checkout into the host&amp;#039;s &amp;lt;code&amp;gt;apps/&amp;lt;/code&amp;gt; directory so its manifest lives at &amp;lt;code&amp;gt;apps/&amp;amp;lt;slug&amp;amp;gt;/src/manifest.tsx&amp;lt;/code&amp;gt;, then run the host dev server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;npm run dev&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The host&amp;#039;s &amp;lt;code&amp;gt;localPluginDevSupport()&amp;lt;/code&amp;gt; (in &amp;lt;code&amp;gt;vite.config.mts&amp;lt;/code&amp;gt;) auto-discovers every &amp;lt;code&amp;gt;apps/*/src/manifest.tsx&amp;lt;/code&amp;gt;, wires each plugin directly into the host&amp;#039;s own Vite module graph, and serves its static assets — no separate build, no &amp;lt;code&amp;gt;vite preview&amp;lt;/code&amp;gt;, and no &amp;lt;code&amp;gt;REACT_ENABLED_APPS&amp;lt;/code&amp;gt; entry needed. Editing plugin source hot-reloads through the host; adding or removing a manifest triggers a full reload. Because dependencies are shared and deduplicated, you avoid duplicate React copies and the hook-order errors they cause.&lt;br /&gt;
&lt;br /&gt;
When you need to exercise the real federated &amp;lt;code&amp;gt;remoteEntry.js&amp;lt;/code&amp;gt; loading path (for example, to test the production flow), run the plugin standalone as a remote and point the host at it via &amp;lt;code&amp;gt;REACT_ENABLED_APPS&amp;lt;/code&amp;gt;. In this mode there is no automatic HMR back to the host — the host only reloads after a plugin rebuild produces a fresh &amp;lt;code&amp;gt;remoteEntry.js&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Tip|1=To reuse a host component inside a plugin, &amp;lt;code&amp;gt;care_fe&amp;lt;/code&amp;gt; ships a &amp;lt;code&amp;gt;clone-component&amp;lt;/code&amp;gt; CLI (&amp;lt;code&amp;gt;scripts/clone-component.ts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;npm run clone-component&amp;lt;/code&amp;gt;) that copies a component and every local file it transitively imports into your plugin&amp;#039;s &amp;lt;code&amp;gt;src/&amp;lt;/code&amp;gt; tree, rewriting host path aliases as it goes. Cloned files are independent copies and do not stay in sync with the host.}}&lt;br /&gt;
&lt;br /&gt;
=== Override architecture ===&lt;br /&gt;
&lt;br /&gt;
Care Apps can change host UI without the host code knowing about them, through an &amp;#039;&amp;#039;&amp;#039;override&amp;#039;&amp;#039;&amp;#039; system. The mental model: instead of a component rendering itself, it asks the system what it should be and renders that.&lt;br /&gt;
&lt;br /&gt;
* Components opt in by wrapping their export with &amp;lt;code&amp;gt;register(&amp;amp;quot;ComponentName&amp;amp;quot;, Component)&amp;lt;/code&amp;gt;. Usage does not change — call sites still render the component normally.&lt;br /&gt;
* The host computes a &amp;#039;&amp;#039;&amp;#039;resolution map&amp;#039;&amp;#039;&amp;#039; once and serves most lookups from it, keeping per-component resolution close to O(1). Overrides can be context-aware (page, role, position in the render tree), with a slower stack-aware path reserved for the rare cases that need it.&lt;br /&gt;
* A plugin registers its overrides through its manifest, letting it inject or replace behavior without breaking existing call sites.&lt;br /&gt;
&lt;br /&gt;
{{Note|1=The override design note in &amp;lt;code&amp;gt;care_fe&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;docs/care-apps-override-architecture.md&amp;lt;/code&amp;gt;) is a design-intent document. The authoritative, shipped implementation lives in &amp;lt;code&amp;gt;care_fe/src/lib/override/&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;register.ts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;registry.ts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bridge.ts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;types.ts&amp;lt;/code&amp;gt;); where the note and the code disagree, the code wins.}}&lt;br /&gt;
&lt;br /&gt;
== Example plugin ==&lt;br /&gt;
&lt;br /&gt;
[&amp;lt;nowiki/&amp;gt;https://github.com/ohcnetwork/care_scribe Care Scribe] is a published plugin that provides autofill functionality for the Care consultation forms. It is a useful reference for how a real plugin is structured across the backend and frontend.&lt;br /&gt;
&lt;br /&gt;
{{Related}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>