<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Roger</title>
    <description>The latest articles on DEV Community by Roger (@roger_golem_ui).</description>
    <link>https://dev.to/roger_golem_ui</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4011139%2F9de9ca20-02cb-49eb-8da6-06d89fc4705f.png</url>
      <title>DEV Community: Roger</title>
      <link>https://dev.to/roger_golem_ui</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/roger_golem_ui"/>
    <language>en</language>
    <item>
      <title>GolemUI: the one stop shop for JS forms</title>
      <dc:creator>Roger</dc:creator>
      <pubDate>Fri, 31 Jul 2026 11:06:48 +0000</pubDate>
      <link>https://dev.to/roger_golem_ui/golemui-the-one-stop-shop-for-js-forms-57on</link>
      <guid>https://dev.to/roger_golem_ui/golemui-the-one-stop-shop-for-js-forms-57on</guid>
      <description>&lt;p&gt;Hi 👋&lt;/p&gt;

&lt;p&gt;There are three of us, with about fifty years of building software between us, most of it on enterprise projects expending a lot of time building forms. So we built the library we kept wishing existed.&lt;/p&gt;

&lt;p&gt;It's called GolemUI, it's MIT, and it's at &lt;strong&gt;&lt;a href="https://golemui.com" rel="noopener noreferrer"&gt;golemui.com&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There are five parts to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A JSON engine: forms as data you can move around
&lt;/h2&gt;

&lt;p&gt;Your whole form is one plain data definition. Fields, validation, conditional logic, layout, all of it is &lt;a href="https://golemui.com/dx/form-definition/how-it-works/" rel="noopener noreferrer"&gt;serializable JSON&lt;/a&gt;. When a form is data instead of code, some things become easy that normally aren't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Store it in a database.&lt;/strong&gt; A form definition is a row of JSON. Version it, diff it, roll it back, query it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish it from a CMS.&lt;/strong&gt; Ops or marketing change the form and it ships without a deploy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://golemui.com/dx/getting-started/build-with-ai/" rel="noopener noreferrer"&gt;Ask a model for one&lt;/a&gt;.&lt;/strong&gt; Schemas are small and regular, so an LLM can write one, review one, or repair one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The UI renders itself from the schema. Nothing else has to know.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. A typed authoring layer, so you're not writing JSON by hand
&lt;/h2&gt;

&lt;p&gt;Writing raw JSON by hand gets old fast, so the JSON isn't the authoring surface, it's the output format. You write against a typed &lt;code&gt;gui.*&lt;/code&gt; builder and it produces the definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signupForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="nx"&gt;gui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;textInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="nx"&gt;gui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dropdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;accountType&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Account type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Free&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enterprise&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;defaultValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Free&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="nx"&gt;gui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;textInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;companyName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Company name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$form.accountType !== "Free"&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="nx"&gt;gui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;button&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sign up&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;actionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is also our answer to the fair objection that declarative form formats fall apart on real UIs, that once you need conditional fields and validation across fields, the "declarative" format quietly grows a programming language inside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. A full component set, or bring your own
&lt;/h2&gt;

&lt;p&gt;GolemUI ships a complete widget library, everything from text inputs and dropdowns to date and time range pickers, repeaters, tag inputs, markdown editors and inline calendars. The current catalog is in the &lt;a href="https://golemui.com/dx/widgets-reference/input-fields/overview/" rel="noopener noreferrer"&gt;widgets reference&lt;/a&gt;, and it keeps growing. They're accessible out of the box (WCAG 2.1 AA, ARIA), keyboard navigable, with i18n and validation already wired. That's the plumbing you'd otherwise rebuild on every project.&lt;/p&gt;

&lt;p&gt;But it's an engine, not a fixed component set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Restyle ours.&lt;/strong&gt; Every widget reads one set of &lt;code&gt;--gui-*&lt;/code&gt; &lt;a href="https://golemui.com/dx/styling/theming/" rel="noopener noreferrer"&gt;custom properties&lt;/a&gt;, colour, spacing, radius, type ramp. Reskin an entire form in plain CSS: no component props, no theme provider, no rebuild.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://golemui.com/dx/styling/going-headless/" rel="noopener noreferrer"&gt;Go fully headless&lt;/a&gt;.&lt;/strong&gt; Skip the stylesheet and write all the CSS yourself against the BEM classes each widget emits. Accessibility, focus management and validation keep working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bring your own components.&lt;/strong&gt; Drop in Material, Shoelace, or &lt;a href="https://golemui.com/dx/form-definition/custom-widgets/" rel="noopener noreferrer"&gt;your own&lt;/a&gt;, and mix them in the same form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bring your own validators.&lt;/strong&gt; Any Standard Schema validator drops in: Zod, Valibot, others. Ours are built on Zod.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bring your own i18n.&lt;/strong&gt; Map your existing library in through an adapter and keep the features it's good at.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. One definition, five frameworks
&lt;/h2&gt;

&lt;p&gt;The same schema renders in &lt;strong&gt;React, Angular, Vue, Lit and vanilla JS&lt;/strong&gt;, unchanged. Not five ports with five different APIs, one engine with thin framework adapters over it.&lt;/p&gt;

&lt;p&gt;If you've ever migrated a large app between frameworks, you know the forms are the part that hurts most, because the form logic and the framework's state model grow into each other. Keeping the definition as data that no framework owns is the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. A deterministic MCP server
&lt;/h2&gt;

&lt;p&gt;This is the piece we're most interested in feedback on, and it's the newest.&lt;/p&gt;

&lt;p&gt;Letting a model generate a form definition is only useful if something guarantees the output is actually valid. So GolemUI ships an &lt;a href="https://golemui.com/dx/mcp/overview/" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt; that closes the loop: it &lt;a href="https://golemui.com/dx/mcp/tools-reference/" rel="noopener noreferrer"&gt;validates&lt;/a&gt; every definition the model produces against the real schema, generates JSON or framework code on demand, and refuses to hand your app an invalid form.&lt;/p&gt;

&lt;p&gt;The determinism is the whole feature. The model proposes, the engine decides.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get for free
&lt;/h2&gt;

&lt;p&gt;No plugins, no premium tier, no paid components:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Accessibility&lt;/td&gt;
&lt;td&gt;WCAG 2.1 AA, ARIA, keyboard, focus management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;i18n&lt;/td&gt;
&lt;td&gt;adapter based, bring your own library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validation&lt;/td&gt;
&lt;td&gt;schema driven, Standard Schema compatible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;14.32 kB gzipped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;0.19s LCP, Lighthouse 100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One accessibility detail worth calling out, because it's the kind of thing that's easy to get wrong: validation timing is configurable per form, &lt;code&gt;blur&lt;/code&gt;, &lt;code&gt;change&lt;/code&gt;, &lt;code&gt;submit&lt;/code&gt; or &lt;code&gt;eager&lt;/code&gt;. Marking a field invalid while someone is still typing their email address is a genuine a11y problem, and &lt;code&gt;blur&lt;/code&gt; is the right default for most forms.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs your agent, and your reviewer
&lt;/h2&gt;

&lt;p&gt;The landing page runs a live comparison: the same signup form, eight fields with three conditional ones and rules that read across fields, built idiomatically in each framework, versus the GolemUI version, with the full mountable component in both columns.&lt;/p&gt;

&lt;p&gt;Against React Hook Form:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;396 tokens vs 674&lt;/strong&gt; (&lt;code&gt;cl100k_base&lt;/code&gt;), about 41% fewer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0 conditional branches written by hand vs 8&lt;/strong&gt;, because the engine resolves the conditionals declaratively&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full methodology in the &lt;a href="https://golemui.com/blog/cross-framework-benchmark/" rel="noopener noreferrer"&gt;benchmark post&lt;/a&gt;. Fewer tokens and less branching pay off twice now: it's cheaper for an agent to write, and faster for a human to read in a pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;Install the engine, the shared builder, and your framework's adapter. For React:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i @golemui/core @golemui/gui-shared @golemui/react @golemui/gui-react &lt;span class="nt"&gt;--save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then load the stylesheet once, in your CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s2"&gt;'@golemui/gui-components/index.css'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Define a form and render it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;gui&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@golemui/gui-shared&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GuiForm&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@golemui/gui-react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formDef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;gui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;textInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;formDef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;golemui&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;FormPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;GuiForm&lt;/span&gt; &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Swap &lt;code&gt;@golemui/react&lt;/code&gt; and &lt;code&gt;@golemui/gui-react&lt;/code&gt; for the Angular, Vue or Lit adapter and the form definition stays exactly the same. The &lt;a href="https://golemui.com/dx/getting-started/installation/" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt; has the per framework commands, and there are &lt;a href="https://golemui.com/demos/" rel="noopener noreferrer"&gt;runnable demos on StackBlitz&lt;/a&gt; if you'd rather poke at something than read.&lt;/p&gt;




&lt;p&gt;That's the pitch. It's MIT, it's live, and the code is on &lt;a href="https://github.com/golemui/golemui" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are three of us and we'll be in the comments, so ask us anything: how the engine resolves conditionals, where the headless and bring your own story gets awkward, how the MCP validation actually works, or where treating forms as data breaks down. That last one is the question we most want answered, and we'd rather hear it from you now than discover it ourselves in six months.&lt;/p&gt;

&lt;p&gt;Go have a play at &lt;strong&gt;&lt;a href="https://golemui.com" rel="noopener noreferrer"&gt;golemui.com&lt;/a&gt;&lt;/strong&gt; and tell us what breaks. If you find a bug, &lt;a href="https://github.com/golemui/golemui/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt;, we fix them fast.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>showdev</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
