<?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: Jash Ambaliya</title>
    <description>The latest articles on DEV Community by Jash Ambaliya (@aj0070).</description>
    <link>https://dev.to/aj0070</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3937843%2F0d8b7cf7-88c4-402b-bbd3-84bd0cd382fd.jpeg</url>
      <title>DEV Community: Jash Ambaliya</title>
      <link>https://dev.to/aj0070</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aj0070"/>
    <language>en</language>
    <item>
      <title>What Is Generative UI? (And Why Text Output Is No Longer Enough)</title>
      <dc:creator>Jash Ambaliya</dc:creator>
      <pubDate>Mon, 01 Jun 2026 11:13:47 +0000</pubDate>
      <link>https://dev.to/aj0070/what-is-generative-ui-and-why-text-output-is-no-longer-enough-4c81</link>
      <guid>https://dev.to/aj0070/what-is-generative-ui-and-why-text-output-is-no-longer-enough-4c81</guid>
      <description>&lt;p&gt;Most AI apps still treat the model response as text.&lt;/p&gt;

&lt;p&gt;That is understandable. Text is the native output format of an LLM. It is easy to stream, easy to log, easy to copy, and easy to display in a chat bubble. If the user asks for an explanation, a summary, a draft, or a piece of code, text is often the right interface.&lt;/p&gt;

&lt;p&gt;But a lot of real software work is not just reading an answer. It is comparing options, editing fields, approving changes, inspecting data, choosing between actions, and moving through workflows. Those jobs do not become simple just because an LLM can describe them in a paragraph.&lt;/p&gt;

&lt;p&gt;That is the gap generative UI is trying to close.&lt;/p&gt;

&lt;p&gt;Generative UI is the practice of letting an AI system generate an interface, not just a text response, for the task the user is trying to complete. The model still reasons in language, but the product output can be a table, form, chart, card layout, confirmation step, or multi-part workflow assembled from components the application knows how to render.&lt;/p&gt;

&lt;p&gt;The short version:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Generative UI is AI output as interactive product UI instead of plain text.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sounds simple. The important part is what it is not.&lt;/p&gt;

&lt;p&gt;Generative UI is not "let the model write arbitrary React." It is not a random layout generator. It is not a replacement for product design or frontend engineering. A good generative UI system gives the model a controlled vocabulary of interface primitives and lets it compose those primitives based on user intent, available data, and application context.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbzmafanmz6dhcwpgpfy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbzmafanmz6dhcwpgpfy.png" alt="OpenUI Generation Flow" width="799" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Text Was the Default
&lt;/h2&gt;

&lt;p&gt;The first wave of AI products copied the chat interface because chat matches how LLMs work. A prompt goes in. Tokens come out. The UI can stream those tokens as they arrive.&lt;/p&gt;

&lt;p&gt;That model works well when the user's goal is informational:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Explain this error."&lt;/li&gt;
&lt;li&gt;"Summarize this meeting."&lt;/li&gt;
&lt;li&gt;"Write a follow-up email."&lt;/li&gt;
&lt;li&gt;"Generate a SQL query."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The answer can be a paragraph, a list, or a code block. The user reads it, copies it, or asks a follow-up question.&lt;/p&gt;

&lt;p&gt;The problem starts when the user's goal is operational:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Compare these vendors."&lt;/li&gt;
&lt;li&gt;"Create a refund request."&lt;/li&gt;
&lt;li&gt;"Show me which accounts need attention."&lt;/li&gt;
&lt;li&gt;"Prepare a deployment approval."&lt;/li&gt;
&lt;li&gt;"Find anomalies in this dashboard."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For these tasks, a wall of text is usually a lossy representation of the real job. It may contain the right information, but it does not give the user the right controls.&lt;/p&gt;

&lt;p&gt;A markdown table is not a data grid. A bullet list is not a workflow. A paragraph that recommends an action is not the same as a confirmation UI with permissions, context, and auditability.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Idea
&lt;/h2&gt;

&lt;p&gt;Generative UI starts from a different assumption: the model should not always answer with prose. It should answer with the interface shape that best fits the task.&lt;/p&gt;

&lt;p&gt;If the user asks for a comparison, generate a comparison table.&lt;/p&gt;

&lt;p&gt;If the user asks to submit something, generate a form.&lt;/p&gt;

&lt;p&gt;If the user asks what changed, generate a summary with supporting metrics.&lt;/p&gt;

&lt;p&gt;If the user is about to take a risky action, generate a review screen with explicit confirmation.&lt;/p&gt;

&lt;p&gt;The model is still doing what LLMs are good at: interpreting intent, selecting relevant information, and deciding what should come next. The difference is that the final response is not forced through a single text-shaped pipe.&lt;/p&gt;

&lt;p&gt;In practice, a generative UI system usually has five parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a component library the model is allowed to use,&lt;/li&gt;
&lt;li&gt;a prompt or schema that describes those components,&lt;/li&gt;
&lt;li&gt;a model that emits a structured UI description,&lt;/li&gt;
&lt;li&gt;a parser or renderer that turns that description into real UI,&lt;/li&gt;
&lt;li&gt;and application handlers for data, state, permissions, and actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That architecture matters because it keeps the model inside product boundaries. The model can choose a table or form, but the application still controls what a valid table or form is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same Prompt, Two Outputs
&lt;/h2&gt;

&lt;p&gt;Imagine a support agent asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create a refund request for order ORD-18392.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The same input prompt can lead to two very different product experiences.&lt;/p&gt;

&lt;p&gt;A text-only assistant might respond like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvgvykwag5t03a7llmeoa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvgvykwag5t03a7llmeoa.png" alt="Plain Text Response" width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is readable, but it is not much of an interface. The agent still has to trust the summary, move into another system, validate the amount, change the reason if needed, and take the actual approval action somewhere else.&lt;/p&gt;

&lt;p&gt;A generative UI response can answer the same prompt as an interactive form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root = Stack([header, orderInfo, sep1, formCard, callout])
header = Card([cardHeader], "clear")
cardHeader = CardHeader("Refund Request", "Submit a refund request for your order")
orderInfo = Card([orderRow], "sunk", "row", "s", "center", "between")
orderRow = Stack([orderLabel, orderTag], "row", "m", "center", "between")
orderLabel = TextContent("Order ID", "small")
orderTag = Tag("ORD-18392", null, "md", "info")
sep1 = Separator("horizontal", true)
formCard = Card([form])
form = Form("refund-request", formButtons, [reasonField, categoryField, amountField, descField, evidenceField, contactField])
reasonField = FormControl("Reason for Refund", Select("reason", reasonOptions, "Select a reason...", {required: true}), "Please select the primary reason for your refund request.")
reasonOptions = [SelectItem("damaged", "Item Damaged or Defective"), SelectItem("not-received", "Item Not Received"), SelectItem("wrong-item", "Wrong Item Sent"), SelectItem("not-as-described", "Item Not as Described"), SelectItem("changed-mind", "Changed My Mind"), SelectItem("duplicate", "Duplicate Order")]
categoryField = FormControl("Refund Type", RadioGroup("refund-type", refundTypeOptions, "full"), "Choose whether you'd like a full or partial refund.")
refundTypeOptions = [RadioItem("Full Refund", "Refund the entire order amount", "full"), RadioItem("Partial Refund", "Refund only part of the order amount", "partial")]
amountField = FormControl("Refund Amount (USD)", Input("amount", "e.g. 49.99", "number", {required: true, numeric: true, min: 0.01}), "Enter the amount you'd like refunded.")
descField = FormControl("Description", TextArea("description", "Please describe the issue in detail...", 4, {required: true, minLength: 20, maxLength: 1000}), "Provide as much detail as possible to help us process your request.")
evidenceField = FormControl("Supporting Evidence", TextArea("evidence", "Add any relevant order numbers, tracking IDs, or links...", 3), "Optional: Provide any additional evidence or references.")
contactField = FormControl("Contact Email", Input("contact-email", "your@email.com", "email", {required: true, email: true}), "We'll send updates about your refund to this email.")
formButtons = Buttons([submitBtn, cancelBtn])
submitBtn = Button("Submit Refund Request", Action([@ToAssistant("Submit refund request for ORD-18392")]), "primary")
cancelBtn = Button("Cancel", Action([@ToAssistant("Cancel refund request")]), "secondary")
callout = Callout("info", "Processing Time", "Refund requests are typically reviewed within 3–5 business days. You will receive an email confirmation once submitted.")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The input prompt did not change. The output contract changed.&lt;/p&gt;

&lt;p&gt;In the text-only version, the model describes the refund request. In the generative UI version, the model composes a reviewable surface from approved components: a title, a form, editable fields, a select menu, and action buttons. The application still decides what &lt;code&gt;submit:refund-request&lt;/code&gt; or &lt;code&gt;action:cancel&lt;/code&gt; actually does.&lt;/p&gt;

&lt;p&gt;Rendered through OpenUI, the same structured response becomes a product-native form:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymbem79sqfv7vdnmy4n0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymbem79sqfv7vdnmy4n0.png" alt="OpenUI Response" width="800" height="704"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the same OpenUI response being generated and rendered in the chat interface:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/_t5dhg4XlS4"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This example uses OpenUI Lang, but the concept is broader than one syntax. The important shift is that the model returns a structured interface description. The application renders that description using known components and decides what the actions actually do.&lt;/p&gt;

&lt;h2&gt;
  
  
  How This Differs From Dynamic UI
&lt;/h2&gt;

&lt;p&gt;Developers have built dynamic UI for decades. Feature flags, conditional rendering, CMS-driven pages, dashboards, and form builders all generate interfaces from data.&lt;/p&gt;

&lt;p&gt;Generative UI is different because the interface is chosen at runtime from user intent.&lt;/p&gt;

&lt;p&gt;A traditional dynamic UI might say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If the user is an admin, show the admin panel.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A generative UI system might say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The user is asking to compare quarterly pipeline risk. Generate a table, a few metric cards, and follow-up actions using the components this product allows.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The difference is not that generative UI is "more dynamic." It is that the model participates in deciding which interface is appropriate for the current task.&lt;/p&gt;

&lt;p&gt;That comes with tradeoffs. You need constraints. You need validation. You need fallback states when the model emits something invalid. You need to decide which actions can be triggered by generated UI and which actions require additional confirmation. Generative UI is powerful precisely because it is not just free-form generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  How This Differs From Tool Calling
&lt;/h2&gt;

&lt;p&gt;Tool calling lets a model request structured operations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;get_refund_status(orderId: "ORD-18392")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is useful, but it mostly answers the question, "What should the backend do?"&lt;/p&gt;

&lt;p&gt;Generative UI answers a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What should the user see and interact with next?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The two patterns work well together. A model might call a tool to fetch order details, then generate a form or confirmation UI from the result. Tool calling gives the model access to capabilities. Generative UI gives the user a usable surface for the next step.&lt;/p&gt;

&lt;p&gt;If tool calling is the bridge between AI and backend systems, generative UI is the bridge between AI and product experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for AI Products
&lt;/h2&gt;

&lt;p&gt;The more capable AI systems become, the more obvious the UI problem gets.&lt;/p&gt;

&lt;p&gt;When an assistant can only answer simple questions, a chat bubble is enough. When it can inspect business data, compare options, prepare workflows, and recommend changes, the output needs more structure.&lt;/p&gt;

&lt;p&gt;Text creates a few recurring problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It hides structure inside prose.&lt;/li&gt;
&lt;li&gt;It makes comparisons harder than they need to be.&lt;/li&gt;
&lt;li&gt;It turns workflows into instructions instead of controls.&lt;/li&gt;
&lt;li&gt;It makes risky actions harder to review.&lt;/li&gt;
&lt;li&gt;It forces users to copy information between systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generative UI does not remove the need for chat. In many products, chat remains the best input method. The user can describe intent in natural language. The difference is that the output can become product-native.&lt;/p&gt;

&lt;p&gt;The future shape is less "chatbot that answers everything in text" and more "assistant that creates the right working surface when text is not enough."&lt;/p&gt;

&lt;h2&gt;
  
  
  Where OpenUI Fits
&lt;/h2&gt;

&lt;p&gt;OpenUI is a concrete implementation of this idea.&lt;/p&gt;

&lt;p&gt;The OpenUI GitHub repository describes it as a full-stack generative UI framework built around OpenUI Lang, a compact streaming-first language, a React runtime, built-in component libraries, and chat/app surfaces. Its docs describe the basic flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define or reuse a component library.&lt;/li&gt;
&lt;li&gt;Generate model instructions from that library.&lt;/li&gt;
&lt;li&gt;Send those instructions to the model.&lt;/li&gt;
&lt;li&gt;Stream OpenUI Lang back to the client.&lt;/li&gt;
&lt;li&gt;Render it progressively with the React renderer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That design is important because it avoids two common extremes.&lt;/p&gt;

&lt;p&gt;On one side, plain text is too limited. It cannot represent rich interaction without making the user do the work manually.&lt;/p&gt;

&lt;p&gt;On the other side, asking a model to generate arbitrary frontend code is too loose for most production applications.&lt;/p&gt;

&lt;p&gt;OpenUI sits in the middle. The model emits a compact UI language constrained by components the developer has defined or allowed. The renderer maps that output to real React components. The application remains responsible for data access, state, permissions, and action behavior.&lt;/p&gt;

&lt;p&gt;That is a healthier contract for AI-native interfaces: generative where the product needs flexibility, controlled where the product needs safety.&lt;/p&gt;

&lt;p&gt;OpenUI also focuses on streaming. That matters because model-generated interfaces should not feel like waiting for a full JSON blob to finish before anything appears. A line-oriented format can be parsed and rendered progressively as the model emits output.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Developers Should Design
&lt;/h2&gt;

&lt;p&gt;If you are building with generative UI, the main design question changes.&lt;/p&gt;

&lt;p&gt;Instead of asking only, "What screens should we build?" you also ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What interface vocabulary should the model be allowed to compose?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That vocabulary might include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;metric cards,&lt;/li&gt;
&lt;li&gt;tables,&lt;/li&gt;
&lt;li&gt;forms,&lt;/li&gt;
&lt;li&gt;charts,&lt;/li&gt;
&lt;li&gt;recommendation cards,&lt;/li&gt;
&lt;li&gt;confirmation panels,&lt;/li&gt;
&lt;li&gt;tabs,&lt;/li&gt;
&lt;li&gt;step-by-step workflows,&lt;/li&gt;
&lt;li&gt;and action buttons.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to let the model invent your product's UI from scratch. The goal is to give it a safe set of primitives that match your product's real workflows.&lt;/p&gt;

&lt;p&gt;This makes frontend work more important, not less. Someone still has to design good components, define prop contracts, handle empty and error states, wire actions, enforce permissions, and decide where generated UI is appropriate.&lt;/p&gt;

&lt;p&gt;Generative UI moves some composition decisions to runtime. It does not remove engineering judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Definition
&lt;/h2&gt;

&lt;p&gt;Here is the definition I would use with a team:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Generative UI is a pattern where an AI system generates a structured, interactive interface from a controlled component vocabulary, based on the user's intent and current context.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That definition excludes raw text, arbitrary code generation, and static templates. It includes the pieces that matter in practice: structure, interaction, constraints, context, and rendering.&lt;/p&gt;

&lt;p&gt;It also explains why this pattern is becoming necessary. AI products are moving from answering questions to helping users do work. Work needs interfaces.&lt;/p&gt;

&lt;p&gt;Text will remain part of AI software. It is still the best format for explanation, narration, drafting, and conversation. But when the task involves comparing, editing, approving, exploring, or acting, text becomes a bottleneck.&lt;/p&gt;

&lt;p&gt;Generative UI is the next layer: not a replacement for chat, but the interface system that lets AI responses become usable software.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/thesysdev/openui" rel="noopener noreferrer"&gt;OpenUI GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.openui.com/docs" rel="noopener noreferrer"&gt;OpenUI documentation and playground&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thesys.dev/blogs/openui" rel="noopener noreferrer"&gt;Thesys Blog: OpenUI launch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.producthunt.com/products/thesys" rel="noopener noreferrer"&gt;OpenUI on Product Hunt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>ui</category>
      <category>ux</category>
    </item>
    <item>
      <title>GSoC 2026 Kickoff: Distributed Linear Solvers in LinearSolve.jl</title>
      <dc:creator>Jash Ambaliya</dc:creator>
      <pubDate>Sun, 31 May 2026 05:02:53 +0000</pubDate>
      <link>https://dev.to/aj0070/gsoc-2026-kickoff-distributed-linear-solvers-in-linearsolvejl-n82</link>
      <guid>https://dev.to/aj0070/gsoc-2026-kickoff-distributed-linear-solvers-in-linearsolvejl-n82</guid>
      <description>&lt;p&gt;Hello everyone!&lt;/p&gt;

&lt;p&gt;I am Jash Ambaliya, a pre-final year Computer Science and Engineering student from India, and I am excited to share that I will be contributing to &lt;strong&gt;SciML&lt;/strong&gt; this summer through &lt;strong&gt;Google Summer of Code 2026&lt;/strong&gt;. My project is &lt;strong&gt;distributed linear solver support in &lt;code&gt;LinearSolve.jl&lt;/code&gt;&lt;/strong&gt;, mentored by &lt;strong&gt;Chris Rackauckas&lt;/strong&gt; and &lt;strong&gt;Oscar Smith&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;LinearSolve.jl&lt;/code&gt; provides a common interface for solving linear systems across many backends, which makes it a key building block for the broader SciML ecosystem. A lot of downstream tooling can already switch between direct and iterative solvers without changing user code, but large distributed HPC workloads still need better support. This project is about closing that gap by extending &lt;code&gt;LinearSolve.jl&lt;/code&gt; so that distributed sparse and dense solves fit naturally into the same &lt;code&gt;solve(prob, alg)&lt;/code&gt; workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this project matters
&lt;/h2&gt;

&lt;p&gt;Large scientific and engineering problems often produce linear systems that are too big for a single machine. In practice, those systems are distributed across MPI ranks, and solving them efficiently requires distributed solver libraries. The goal of this project is to let users access those capabilities through the same high-level LinearSolve interface they already use for serial and shared-memory problems.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enabling MPI-based sparse solves through &lt;code&gt;PETSc.jl&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;extending &lt;code&gt;HYPRE.jl&lt;/code&gt; integration so communicator-aware distributed construction works directly from Julia inputs&lt;/li&gt;
&lt;li&gt;adding a &lt;code&gt;PartitionedSolvers.jl&lt;/code&gt; integration for &lt;code&gt;PSparseMatrix&lt;/code&gt; / &lt;code&gt;PVector&lt;/code&gt; workflows&lt;/li&gt;
&lt;li&gt;preserving LinearSolve’s extension-based design so users only pay for what they load&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core idea is not to build a separate distributed API, but to make distributed backends feel like a natural continuation of the existing LinearSolve design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project roadmap
&lt;/h2&gt;

&lt;p&gt;The project is organized into three main deliverables, plus one stretch goal.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. PETSc integration improvements
&lt;/h3&gt;

&lt;p&gt;The first deliverable is improving the distributed PETSc path in &lt;code&gt;LinearSolve.jl&lt;/code&gt;. The work here focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;distributed assembly for plain Julia &lt;code&gt;SparseMatrixCSC&lt;/code&gt; inputs on MPI communicators&lt;/li&gt;
&lt;li&gt;correct scatter/gather behavior so solves work cleanly across ranks&lt;/li&gt;
&lt;li&gt;cache reuse for repeated solves&lt;/li&gt;
&lt;li&gt;tests and documentation for the multi-rank workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is that users can start from ordinary Julia sparse matrices, run under MPI, and use &lt;code&gt;PETScAlgorithm&lt;/code&gt; without having to manually rebuild their problem in a separate abstraction.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. HYPRE distributed construction support
&lt;/h3&gt;

&lt;p&gt;The second deliverable is extending &lt;code&gt;HYPREAlgorithm&lt;/code&gt; with communicator-aware distributed construction. This includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adding a &lt;code&gt;comm&lt;/code&gt; keyword to &lt;code&gt;HYPREAlgorithm&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;automatically turning plain Julia matrices and vectors into distributed &lt;code&gt;HYPREMatrix&lt;/code&gt; / &lt;code&gt;HYPREVector&lt;/code&gt; objects&lt;/li&gt;
&lt;li&gt;verifying the new multi-rank path with tests and documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This should make HYPRE easier to use from standard Julia code while still keeping the serial path intact.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. PartitionedSolvers integration
&lt;/h3&gt;

&lt;p&gt;The third deliverable is adding a new &lt;code&gt;PartitionedSolversAlgorithm&lt;/code&gt; for &lt;code&gt;PartitionedArrays.jl&lt;/code&gt;-based distributed problems. This includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creating the extension and algorithm type&lt;/li&gt;
&lt;li&gt;validating &lt;code&gt;PSparseMatrix&lt;/code&gt; / &lt;code&gt;PVector&lt;/code&gt; inputs&lt;/li&gt;
&lt;li&gt;delegating solves to &lt;code&gt;PartitionedSolvers.jl&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;supporting cache reuse and automatic algorithm selection&lt;/li&gt;
&lt;li&gt;testing both serial debug-array and MPI-backed workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This part is especially interesting because it connects LinearSolve to a more native Julia distributed-array ecosystem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stretch goal: Elemental
&lt;/h3&gt;

&lt;p&gt;If the main deliverables are completed early and in stable shape, the stretch goal is an &lt;code&gt;Elemental.jl&lt;/code&gt; integration for dense distributed factorizations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical direction
&lt;/h2&gt;

&lt;p&gt;One of the guiding constraints of this project is to preserve &lt;code&gt;LinearSolve.jl&lt;/code&gt;’s extension-based architecture. These integrations should not turn distributed solvers into hard dependencies for everyone. Instead, each backend should remain a focused package extension that loads only when the relevant solver package is available.&lt;/p&gt;

&lt;p&gt;That keeps the design aligned with the rest of SciML:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;minimal dependency cost for users who do not need distributed solvers&lt;/li&gt;
&lt;li&gt;backend-specific logic isolated in extensions&lt;/li&gt;
&lt;li&gt;a consistent solver interface across serial and distributed settings&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I will share during the summer
&lt;/h2&gt;

&lt;p&gt;I plan to post regular updates as the project moves forward. Those posts will focus on both implementation and engineering tradeoffs, including topics like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;distributed sparse matrix assembly in PETSc&lt;/li&gt;
&lt;li&gt;communicator-aware solver construction in HYPRE&lt;/li&gt;
&lt;li&gt;cache reuse and repeated solves in distributed workflows&lt;/li&gt;
&lt;li&gt;how &lt;code&gt;PartitionedArrays.jl&lt;/code&gt; and &lt;code&gt;PartitionedSolvers.jl&lt;/code&gt; fit into the LinearSolve interface&lt;/li&gt;
&lt;li&gt;testing and documentation challenges for MPI-driven execution models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I want these updates to be useful both as progress reports and as technical notes for anyone interested in distributed solver integration in Julia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;I am grateful to the SciML community, and especially to my mentors Chris Rackauckas and Oscar Smith, for the opportunity to work on this project. I am looking forward to spending the summer pushing &lt;code&gt;LinearSolve.jl&lt;/code&gt; further into the distributed/HPC space and making these workflows easier to access from Julia.&lt;/p&gt;

&lt;p&gt;If you are interested in distributed scientific computing, solver interfaces, or SciML infrastructure, feel free to follow along. I will be sharing progress as the project develops.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>distributedsystems</category>
      <category>opensource</category>
      <category>science</category>
    </item>
    <item>
      <title>Gemma 4 Needs More Than a Chat Box: Why Local AI Needs Generative UI</title>
      <dc:creator>Jash Ambaliya</dc:creator>
      <pubDate>Sun, 24 May 2026 14:07:55 +0000</pubDate>
      <link>https://dev.to/aj0070/gemma-4-needs-more-than-a-chat-box-why-local-ai-needs-generative-ui-4fjk</link>
      <guid>https://dev.to/aj0070/gemma-4-needs-more-than-a-chat-box-why-local-ai-needs-generative-ui-4fjk</guid>
      <description>&lt;p&gt;Local AI is usually framed as an infrastructure story.&lt;/p&gt;

&lt;p&gt;Can the model run on your hardware? How much memory does it need? How fast are the tokens? Can you avoid sending private data to a cloud API? Can you keep costs predictable? Those questions matter, and Gemma 4 makes them more interesting because the model family spans tiny edge-friendly variants, a dense 31B model, and a 26B mixture-of-experts model built for higher-throughput reasoning.&lt;/p&gt;

&lt;p&gt;But there is another question that matters just as much:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Once a local model gives you an answer, what kind of interface should that answer become?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most local AI demos still end in a chat box. You type a prompt. The model streams text. Maybe you get markdown. Maybe you get a list. Maybe you get a paragraph that says what it would do if it were connected to the rest of your app.&lt;/p&gt;

&lt;p&gt;That is fine for experiments. It is not enough for real software.&lt;/p&gt;

&lt;p&gt;Gemma 4's capabilities make the interface problem more visible. Native multimodal input, advanced reasoning, and a 128K context window are not just reasons to ask longer questions. They are reasons to build applications where the model can inspect richer context and help users make decisions. Decisions need more than text. They need structure, controls, review states, and actions.&lt;/p&gt;

&lt;p&gt;That is where OpenUI fits.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Local Model Story Is Incomplete Without UI
&lt;/h2&gt;

&lt;p&gt;The Gemma 4 Challenge asks developers to build or write with Google's open models. The model family is intentionally broad:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2B and 4B effective parameter models for ultra-mobile, edge, and browser-style deployment,&lt;/li&gt;
&lt;li&gt;a 31B dense model that sits between server-grade performance and local execution,&lt;/li&gt;
&lt;li&gt;and a 26B mixture-of-experts model for high-throughput reasoning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That range matters because not every AI app needs the same model. A field technician's offline assistant has different constraints than a long-context code review tool. A privacy-sensitive document analyzer has different constraints than a creative multimodal prototype.&lt;/p&gt;

&lt;p&gt;But in each case, the model is only half the product.&lt;/p&gt;

&lt;p&gt;If the output is just text, the user still has to translate the answer into action. They copy facts into a form. They manually compare options. They scan a paragraph for the one number that matters. They ask follow-up questions to get a layout the application could have shown directly.&lt;/p&gt;

&lt;p&gt;The better question is not just "Can Gemma 4 run locally?"&lt;/p&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can Gemma 4 generate a useful working surface for the user?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Text Is the Wrong Endpoint for Many AI Tasks
&lt;/h2&gt;

&lt;p&gt;Text is a good format for explanation. It is not a good format for everything.&lt;/p&gt;

&lt;p&gt;Imagine a local Gemma 4 app that helps a small clinic process intake notes. The model can read a long patient note, identify missing fields, summarize risks, and suggest next steps. If the output is a paragraph, the staff member still has to copy that information into the clinic's workflow.&lt;/p&gt;

&lt;p&gt;A better output would be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a structured summary,&lt;/li&gt;
&lt;li&gt;a checklist of missing fields,&lt;/li&gt;
&lt;li&gt;an editable intake form,&lt;/li&gt;
&lt;li&gt;a risk callout,&lt;/li&gt;
&lt;li&gt;and clear buttons for "save draft," "request clarification," or "send for review."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model's reasoning is valuable, but the interface is what makes it usable.&lt;/p&gt;

&lt;p&gt;The same pattern shows up everywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A multimodal inventory assistant should return item cards and exception tables, not just prose.&lt;/li&gt;
&lt;li&gt;A local legal document reviewer should return clause highlights and review queues, not just a summary.&lt;/li&gt;
&lt;li&gt;A long-context engineering assistant should return grouped findings, file references, and action buttons, not just a wall of markdown.&lt;/li&gt;
&lt;li&gt;A Raspberry Pi-based home automation assistant should return device controls and confirmation steps, not just instructions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gemma 4 can make local AI more capable. Generative UI can make that capability easier to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Generative UI Means Here
&lt;/h2&gt;

&lt;p&gt;Generative UI does not mean letting a model write arbitrary frontend code.&lt;/p&gt;

&lt;p&gt;That is too loose for production. It is hard to validate, hard to secure, and hard to keep consistent with a product's design system.&lt;/p&gt;

&lt;p&gt;Generative UI means the model emits a structured interface description using components the app already knows how to render. The developer defines the vocabulary. The model chooses how to compose it.&lt;/p&gt;

&lt;p&gt;For example, instead of asking Gemma 4 to return markdown like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The battery backup is low. The west hallway sensor has not checked in for 42 minutes. You should inspect the device, replace the battery, and acknowledge the alert.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;I tested that flow in two ways.&lt;/p&gt;

&lt;p&gt;First, I ran a direct compatibility test with &lt;code&gt;google/gemma-4-31b-it:free&lt;/code&gt; through OpenRouter. The prompt gave Gemma 4 the OpenUI component signatures and asked it to create a small sensor health review interface. It returned valid OpenUI Lang on the first run:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root = Stack([title, warning, deviceTable, actions])

title = TextContent("Sensor Health Review", "large-heavy")

warning = Callout("warning", "Attention Required", "West Hallway sensor is offline and reporting low battery.")

deviceTable = Table([
    Col("Device", names),
    Col("Status", statuses),
    Col("Last Check-in", checkins)
])

names = ["West Hallway", "Front Door", "Garage"]
statuses = [
    Tag("Offline", null, "sm", "danger"),
    Tag("Online", null, "sm", "success"),
    Tag("Online", null, "sm", "success")
]
checkins = ["42 mins ago", "2 mins ago", "5 mins ago"]

actions = Buttons([
    Button("Reboot All", Action([@ToAssistant("Reboot all sensors")]), "primary"),
    Button("Dismiss Alerts", Action([@ToAssistant("Dismiss alerts")]), "secondary")
])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That output is still model-generated, but it is not arbitrary. The application controls what &lt;code&gt;Stack&lt;/code&gt;, &lt;code&gt;TextContent&lt;/code&gt;, &lt;code&gt;Callout&lt;/code&gt;, &lt;code&gt;Table&lt;/code&gt;, &lt;code&gt;Col&lt;/code&gt;, &lt;code&gt;Tag&lt;/code&gt;, &lt;code&gt;Button&lt;/code&gt;, and &lt;code&gt;Buttons&lt;/code&gt; mean. The model composes known primitives instead of inventing UI from scratch.&lt;/p&gt;

&lt;p&gt;I then parsed the response with &lt;code&gt;@openuidev/react-lang&lt;/code&gt; and rendered it with the OpenUI React renderer:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model: google/gemma-4-31b-it:free
parse: OK
render: OK (2487 html chars)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Rendered result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flcga71b4aej7rwnupyhh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flcga71b4aej7rwnupyhh.png" alt=" " width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I ran the same compatibility test again with a different prompt: a local clinic intake review. This time Gemma 4 generated a patient summary callout, a card for missing information, a table with status tags, and workflow buttons.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model: google/gemma-4-31b-it:free
parse: OK
render: OK (2761 html chars)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Second rendered result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2neq1cw3xfw4hkwhns64.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2neq1cw3xfw4hkwhns64.png" alt=" " width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Second, I tested the normal scaffolded OpenUI app flow. I created a new OpenUI app, kept the default &lt;code&gt;FullScreen&lt;/code&gt; chat surface and OpenUI component library, and changed the chat route to use OpenRouter as the OpenAI-compatible provider:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OPENAI_BASE_URL=https://openrouter.ai/api/v1
OPENAI_MODEL=google/gemma-4-31b-it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then I submitted a clinic intake prompt through the OpenUI chat UI and recorded the generation. This is the actual app rendering Gemma 4's streamed response, not a hand-built mockup:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://drive.google.com/file/d/1d-4QvdrmOHNaxNhoGkvJ9Gx9b1KpQebv/view?usp=sharing" rel="noopener noreferrer" class="c-link"&gt;
            gemma4-openui-app-generation.mp4 - Google Drive
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fssl.gstatic.com%2Fimages%2Fbranding%2Fproduct%2F1x%2Fdrive_2020q4_32dp.png" width="32" height="32"&gt;
          drive.google.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Final app-rendered result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsd5sjgmwpql1gjkpva8v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsd5sjgmwpql1gjkpva8v.png" alt=" " width="799" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The generated interfaces were not identical templates. The sensor example used a warning callout and a device status table. The clinic examples used a patient summary, missing-fields table, status tags, and workflow buttons. That is the useful part: the model was not just filling text into a fixed screen. It selected a different interface structure for a different task while staying inside OpenUI's component vocabulary.&lt;/p&gt;

&lt;p&gt;This was not a full production app, and it did not run the model on my laptop. It was a focused OpenRouter test: can Gemma 4 produce UI that the current OpenUI app, parser, and renderer accept? For these small interfaces, yes.&lt;/p&gt;

&lt;p&gt;This is the core value of pairing Gemma 4 with OpenUI: model reasoning can become interface generation instead of stopping at text. If you run Gemma 4 locally, that same pattern becomes local interface generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why OpenUI Is a Good Fit
&lt;/h2&gt;

&lt;p&gt;OpenUI gives developers a concrete way to build this pattern.&lt;/p&gt;

&lt;p&gt;The framework is built around OpenUI Lang, a compact language for describing UI. A developer can define or reuse a component library, generate model instructions from that library, send those instructions to a model, and render the model's response with a React renderer.&lt;/p&gt;

&lt;p&gt;That matters for Gemma 4 for three reasons.&lt;/p&gt;

&lt;p&gt;First, OpenUI keeps generation constrained. You are not asking the model to write React. You are asking it to compose approved components with known props. That is a much better contract for production software.&lt;/p&gt;

&lt;p&gt;Second, the format is streaming-friendly. Local models can have different latency profiles depending on hardware and model size. A line-oriented UI format lets the interface begin to appear progressively instead of waiting for a large object to complete.&lt;/p&gt;

&lt;p&gt;Third, OpenUI is model-agnostic at the boundary that matters. The renderer does not care whether the OpenUI Lang came from a cloud model, a local model, or a hosted open model. If Gemma 4 can be prompted to produce valid OpenUI Lang, the frontend can render it.&lt;/p&gt;

&lt;p&gt;That does not mean every Gemma 4 model is equally good at every UI generation task. Model choice still matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why OpenUI Is a Good Fit
&lt;/h2&gt;

&lt;p&gt;OpenUI gives developers a concrete way to build this pattern.&lt;/p&gt;

&lt;p&gt;The framework is built around OpenUI Lang, a compact language for describing UI. A developer can define or reuse a component library, generate model instructions from that library, send those instructions to a model, and render the model's response with a React renderer.&lt;/p&gt;

&lt;p&gt;That matters for Gemma 4 for three reasons.&lt;/p&gt;

&lt;p&gt;First, OpenUI keeps generation constrained. You are not asking the model to write React. You are asking it to compose approved components with known props. That is a much better contract for production software.&lt;/p&gt;

&lt;p&gt;Second, the format is streaming-friendly. Local models can have different latency profiles depending on hardware and model size. A line-oriented UI format lets the interface begin to appear progressively instead of waiting for a large object to complete.&lt;/p&gt;

&lt;p&gt;Third, OpenUI is model-agnostic at the boundary that matters. The renderer does not care whether the OpenUI Lang came from a cloud model, a local model, or a hosted open model. If Gemma 4 can be prompted to produce valid OpenUI Lang, the frontend can render it.&lt;/p&gt;

&lt;p&gt;That does not mean every Gemma 4 model is equally good at every UI generation task. Model choice still matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing the Right Gemma 4 Model for UI Generation
&lt;/h2&gt;

&lt;p&gt;The Gemma 4 Challenge explicitly asks participants to show intentional model selection. That is the right requirement, because "use the biggest model" is not always the best engineering answer.&lt;/p&gt;

&lt;p&gt;For an OpenUI + Gemma 4 project, I would think about model choice like this.&lt;/p&gt;

&lt;p&gt;Use the 2B or 4B models when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the UI vocabulary is small,&lt;/li&gt;
&lt;li&gt;the task runs close to the user,&lt;/li&gt;
&lt;li&gt;latency and device constraints matter,&lt;/li&gt;
&lt;li&gt;and the generated UI is simple: cards, checklists, basic forms, short tables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use the 31B dense model when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the task needs stronger instruction following,&lt;/li&gt;
&lt;li&gt;the context is large,&lt;/li&gt;
&lt;li&gt;the UI has several sections,&lt;/li&gt;
&lt;li&gt;and the app can afford heavier local or server-side inference.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use the 26B MoE model when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;throughput matters,&lt;/li&gt;
&lt;li&gt;the app serves many requests,&lt;/li&gt;
&lt;li&gt;the reasoning is more complex,&lt;/li&gt;
&lt;li&gt;and efficient routing matters more than running on a tiny device.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important part is to match the UI task to the model. A Raspberry Pi sensor dashboard and a 128K-context contract review tool should not use the same architecture just because both are "Gemma 4 apps."&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for Real Apps
&lt;/h2&gt;

&lt;p&gt;The strongest Gemma 4 apps will make a clear case for why a specific model size or architecture fits the job.&lt;/p&gt;

&lt;p&gt;A local multimodal field assistant is a good example. Gemma 4 could inspect equipment photos and notes, use long maintenance history as context, and identify missing inspection details. OpenUI could then turn that reasoning into a review screen with issue cards, missing-field checklists, severity levels, and action buttons.&lt;/p&gt;

&lt;p&gt;That kind of app is stronger than a generic chatbot because each part has a job:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gemma 4 handles local multimodal reasoning.&lt;/li&gt;
&lt;li&gt;The long context window supports manuals, logs, and historical inspections.&lt;/li&gt;
&lt;li&gt;Local inference helps when field data is private or connectivity is unreliable.&lt;/li&gt;
&lt;li&gt;OpenUI turns the model output into a workflow the user can review and act on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The general lesson is simple: model choice and interface design should be evaluated together. A smaller Gemma 4 model might be enough for a constrained device-control UI. A larger model may be worth it for long-context review, multimodal inspection, or complex reasoning. Either way, the output should become something more useful than a paragraph.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Point
&lt;/h2&gt;

&lt;p&gt;Open models make AI easier to run in more places. That is a big deal. But if the interface stays stuck in a chat window, a lot of that capability remains trapped in text.&lt;/p&gt;

&lt;p&gt;Gemma 4 is interesting because it widens the range of where useful AI can run: edge devices, phones, local workstations, servers, and hosted platforms. OpenUI is interesting because it widens the range of what the AI response can become: not just prose, but an interactive interface.&lt;/p&gt;

&lt;p&gt;Those two ideas fit together.&lt;/p&gt;

&lt;p&gt;Local AI gives developers more control over where reasoning happens.&lt;/p&gt;

&lt;p&gt;Generative UI gives developers more control over how that reasoning reaches the user.&lt;/p&gt;

&lt;p&gt;The next wave of local AI apps should not be judged only by whether they run without a cloud API. They should be judged by whether the model's output becomes something the user can actually work with.&lt;/p&gt;

&lt;p&gt;Gemma 4 can provide the local intelligence. OpenUI can provide the interface layer.&lt;/p&gt;

&lt;p&gt;That combination is where local AI starts to feel less like a demo and more like software.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/challenges/google-gemma-2026-05-06"&gt;Gemma 4 Challenge on DEV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aistudio.google.com/" rel="noopener noreferrer"&gt;Google AI Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/thesysdev/openui" rel="noopener noreferrer"&gt;OpenUI GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.openui.com/docs" rel="noopener noreferrer"&gt;OpenUI documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
    </item>
    <item>
      <title>From Static Dashboards to Living Interfaces: How AI Is Redefining the Way We Display Data</title>
      <dc:creator>Jash Ambaliya</dc:creator>
      <pubDate>Mon, 18 May 2026 10:43:18 +0000</pubDate>
      <link>https://dev.to/aj0070/from-static-dashboards-to-living-interfaces-how-ai-is-redefining-the-way-we-display-data-45o0</link>
      <guid>https://dev.to/aj0070/from-static-dashboards-to-living-interfaces-how-ai-is-redefining-the-way-we-display-data-45o0</guid>
      <description>&lt;p&gt;For a long time, the way software displayed data followed a simple rule: decide what people need to see, design a screen around it, and keep that screen stable until the next product cycle.&lt;/p&gt;

&lt;p&gt;That rule gave us monthly reports, executive dashboards, BI workbooks, embedded charts, admin panels, and KPI walls. It also gave us a lot of interfaces that feel strangely fixed in a world where the questions people ask are anything but fixed.&lt;/p&gt;

&lt;p&gt;A sales lead does not always want the same pipeline dashboard. On Monday, they might need a regional forecast. On Wednesday, they might ask why enterprise deals are slipping. On Friday, they might want a rep-by-rep coaching view with next actions. The underlying data may live in the same warehouse, but the useful interface changes with the question.&lt;/p&gt;

&lt;p&gt;That gap is where the next shift in data interfaces is happening.&lt;/p&gt;

&lt;p&gt;We are moving from static dashboards toward living interfaces: UI that is generated, personalized, connected to live data, and interactive on demand. This is not just a nicer chart library. It is a change in the contract between data, AI, and the frontend.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first era: reports as artifacts
&lt;/h2&gt;

&lt;p&gt;The earliest software reporting workflows treated data displays as artifacts. A report was designed ahead of time, generated on a schedule, and consumed after the fact. It might have been a PDF, a spreadsheet, a printed business report, or a hardcoded page inside an internal system.&lt;/p&gt;

&lt;p&gt;This worked because the audience was predictable. Finance needed month-end numbers. Operations needed throughput. Leadership needed a summary. The job of the interface was to present a known set of facts in a known format.&lt;/p&gt;

&lt;p&gt;The cost was flexibility. If the next question was not already represented in the report, the user had to export the data, request a new report, or ask an analyst to create another version. The interface was not part of the thinking process. It was the final output after the thinking had already happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second era: dashboards as self-service
&lt;/h2&gt;

&lt;p&gt;Tools like Tableau, Looker, Power BI, and Metabase improved that model by making dashboards more interactive and easier to build. Filters, drilldowns, drag-and-drop exploration, and reusable semantic models let more people answer questions without waiting for engineering.&lt;/p&gt;

&lt;p&gt;This was a huge step forward. Dashboards turned reporting from a static artifact into an exploratory surface.&lt;/p&gt;

&lt;p&gt;But the dashboard still had a hidden assumption: someone had to anticipate the useful views in advance. A dashboard is flexible inside the boundaries of its design. You can filter by region if the builder included region. You can drill into churn if the model supports churn. You can compare cohorts if the dashboard was designed for cohort comparison.&lt;/p&gt;

&lt;p&gt;The moment the user's question crosses those boundaries, the dashboard becomes a starting point rather than an answer.&lt;/p&gt;

&lt;p&gt;That is why so many data workflows still end in screenshots, CSV exports, Slack threads, and "can you build me a quick view for this?" requests. The dashboard is not broken. It is just not shaped like the way people actually ask questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The third era: chat as an analytics interface
&lt;/h2&gt;

&lt;p&gt;AI changed the input side first.&lt;/p&gt;

&lt;p&gt;Instead of forcing users to learn a dashboard's available filters or a BI tool's query model, teams started adding natural-language interfaces on top of data. Ask a question, get an answer. "Show me revenue by segment." "Why did activation drop last week?" "Which accounts are at risk?"&lt;/p&gt;

&lt;p&gt;This is powerful, but it introduced a strange regression: many AI analytics experiences take rich structured data and collapse it back into text.&lt;/p&gt;

&lt;p&gt;The model may query a database, reason over trends, calculate metrics, and compare segments. Then it responds with paragraphs, bullet points, or a markdown table. That may be acceptable for a quick explanation, but it is a poor endpoint for serious data work. People need to sort, filter, inspect, compare, annotate, approve, and act.&lt;/p&gt;

&lt;p&gt;Text is good for narration. It is not enough for operational decision-making.&lt;/p&gt;

&lt;p&gt;The next interface cannot be only conversational. It has to be conversational at the input layer and graphical at the output layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes an interface "living"?
&lt;/h2&gt;

&lt;p&gt;A living interface is not just a dashboard with an AI summary pasted on top. It has a few distinct properties.&lt;/p&gt;

&lt;p&gt;First, it is generated for the task. If the user asks for anomalies, the interface might produce a time-series chart, an outlier table, and a set of candidate explanations. If they ask for account prioritization, it might produce a ranked list with editable weights, filters, and CRM actions.&lt;/p&gt;

&lt;p&gt;Second, it is personalized to context. A CFO, product manager, support lead, and data analyst might ask similar questions but need different levels of detail, controls, and follow-up actions.&lt;/p&gt;

&lt;p&gt;Third, it is interactive after generation. The user should be able to refine, select, edit, drill down, trigger workflows, and keep working without starting over.&lt;/p&gt;

&lt;p&gt;Fourth, it is connected to live systems. A generated interface should not be a static mockup. It should be able to call tools, query data, update state, and reflect changes.&lt;/p&gt;

&lt;p&gt;This is the difference between "AI that tells you what the dashboard says" and "AI that creates the right working surface for the job."&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is more than a frontend problem
&lt;/h2&gt;

&lt;p&gt;It is tempting to describe this shift as a frontend design trend. That undersells the technical problem.&lt;/p&gt;

&lt;p&gt;If an LLM is going to generate an interface, it needs a reliable way to describe that interface to the application. Plain text is too weak. Raw code is too risky. JSON is common, but it is verbose and awkward for token-by-token streaming. A model can output a huge component tree, but the user may still wait for the whole object to become valid before anything useful appears.&lt;/p&gt;

&lt;p&gt;That middle layer matters. It is the protocol between reasoning and rendering.&lt;/p&gt;

&lt;p&gt;This is where generative UI becomes a real architecture, not just a UX pattern. The system needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a constrained component library the model is allowed to use,&lt;/li&gt;
&lt;li&gt;typed component contracts so outputs can be validated,&lt;/li&gt;
&lt;li&gt;a streaming format that can render progressively,&lt;/li&gt;
&lt;li&gt;state and action hooks so generated UI can remain interactive,&lt;/li&gt;
&lt;li&gt;and a renderer that maps model output to real application components.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without those pieces, "AI-generated dashboards" become fragile demos. With them, the interface becomes a runtime surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenUI as a solid foundation
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/thesysdev/openui" rel="noopener noreferrer"&gt;OpenUI&lt;/a&gt; is one of the clearest examples of this architectural shift. It is not merely a chart package or dashboard template. The project describes itself as a full-stack generative UI framework with a compact streaming-first language, a React runtime, built-in component libraries, and chat/app surfaces.&lt;/p&gt;

&lt;p&gt;The key idea is OpenUI Lang: instead of asking a model to return markdown or a large JSON object, the model returns a compact, line-oriented UI description constrained to a developer-defined component library. The OpenUI docs describe the flow clearly: define components, generate system instructions from that library, have the LLM respond in OpenUI Lang, and render the result progressively in React.&lt;/p&gt;

&lt;p&gt;For example, a user might ask, "Which enterprise regions are most at risk this quarter, and what should I do next?" Instead of returning a paragraph, the model can produce a small OpenUI Lang response using the default OpenUI component signatures:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root = Stack([title, note, table, actions])
title = TextContent("Pipeline risk by region", "large-heavy")
note = TextContent("Generated for enterprise deals slipping this quarter.", "medium")
table = Table([regionCol, pipelineCol, riskCol, actionCol])
regionCol = Col("Region", regions)
pipelineCol = Col("Open pipeline", pipeline, "number")
riskCol = Col("At-risk deals", risk, "number")
actionCol = Col("Next action", nextSteps)
regions = ["North America", "EMEA", "APAC"]
pipeline = [4200000, 3100000, 1800000]
risk = [12, 8, 5]
nextSteps = ["Review legal blockers", "Escalate procurement", "Confirm renewal owners"]
actions = Buttons([detailsBtn, forecastBtn], "row")
detailsBtn = Button("View details", "action:view-details", "secondary")
forecastBtn = Button("Recalculate forecast", "action:recalculate", "primary")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rendered through the application's component library, that becomes a native interface: a title, explanatory note, structured table, and action buttons. The button action strings are still application-defined; OpenUI supplies the language and renderer contract, while the host product decides what &lt;code&gt;action:view-details&lt;/code&gt; or &lt;code&gt;action:recalculate&lt;/code&gt; actually does. The model is not inventing React components. It is composing approved primitives the application already knows how to render.&lt;/p&gt;

&lt;p&gt;For data interfaces, that matters for two reasons.&lt;/p&gt;

&lt;p&gt;The first is latency. OpenUI's benchmark documentation compares OpenUI Lang with YAML and JSON-based UI formats across scenarios like tables, charts, forms, dashboards, pricing pages, and settings panels. In those benchmarks, OpenUI Lang uses 4,800 tokens across seven scenarios compared with 10,180 tokens for Vercel JSON-Render and 9,948 for Thesys C1 JSON. For a complex dashboard, fewer generated tokens means the interface can appear sooner and cost less to produce.&lt;/p&gt;

&lt;p&gt;The second is control. OpenUI does not ask the model to invent arbitrary frontend code. Developers define the components the model can use, with prop schemas and rendering behavior. That keeps the generated UI closer to the product's design system and reduces the security and maintainability problems that come with executing model-generated code.&lt;/p&gt;

&lt;p&gt;This is the important distinction: generative UI is not "let the model write React in production." It is closer to "let the model compose approved interface primitives based on intent, data, and context."&lt;/p&gt;

&lt;h2&gt;
  
  
  The dashboard does not disappear; it becomes a component
&lt;/h2&gt;

&lt;p&gt;Static dashboards will not vanish overnight. They are still useful for shared metrics, compliance reporting, executive summaries, and high-traffic workflows where the same view is needed every day.&lt;/p&gt;

&lt;p&gt;But their role changes.&lt;/p&gt;

&lt;p&gt;In a living interface, a dashboard is no longer the whole product surface. It becomes one possible view the system can generate. Sometimes the right answer is a classic KPI grid. Sometimes it is a chart. Sometimes it is a table with inline actions. Sometimes it is a guided workflow. Sometimes it is all of those, assembled for a specific question.&lt;/p&gt;

&lt;p&gt;This changes how teams should think about BI and internal tools.&lt;/p&gt;

&lt;p&gt;Instead of asking, "What dashboards should we build?" the better question becomes, "What component vocabulary should our AI be allowed to use when people ask questions about the business?"&lt;/p&gt;

&lt;p&gt;That vocabulary might include metric cards, time-series charts, cohort tables, anomaly panels, forecast ranges, approval forms, CRM actions, inventory controls, map views, and narrative summaries. The work shifts from prebuilding every possible page to designing trustworthy building blocks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for product and data teams
&lt;/h2&gt;

&lt;p&gt;For CTOs, this is an infrastructure question. If every AI feature returns text, the company will eventually rebuild UI logic around each use case. A shared generative UI layer gives teams a common way to turn model reasoning into product-native interfaces.&lt;/p&gt;

&lt;p&gt;For product leaders, this is a UX question. Users do not want to "chat with data" forever. They want the shortest path from question to decision. Sometimes that path includes conversation, but it usually ends in an interface they can manipulate.&lt;/p&gt;

&lt;p&gt;For data teams, this is a modeling question. Living interfaces are only useful if the underlying metrics, permissions, and business definitions are reliable. Generative UI does not remove the need for semantic layers, governed data, or clear metric ownership. It makes those foundations more visible because more users can ask more questions.&lt;/p&gt;

&lt;p&gt;For frontend engineers, this is a new design surface. The job is less about hardcoding every possible screen and more about building composable, typed, safe components that AI systems can assemble without breaking the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  The inflection point
&lt;/h2&gt;

&lt;p&gt;The old dashboard model assumed that useful questions could be anticipated. The AI-native model assumes the opposite: users will ask questions the product team did not explicitly design for.&lt;/p&gt;

&lt;p&gt;That does not mean interfaces become random or uncontrolled. The best version of this future is not an infinite UI generator. It is a governed system where AI can create the right surface from a trusted set of components, data connections, and actions.&lt;/p&gt;

&lt;p&gt;OpenUI is interesting because it points at that layer directly. Its focus on a streaming language, component contracts, renderer behavior, and token efficiency treats generative UI as infrastructure rather than decoration.&lt;/p&gt;

&lt;p&gt;That is the larger trend. Data display is moving from fixed pages to adaptive surfaces. Reports became dashboards. Dashboards became conversational. Now conversation is becoming visual, interactive, and generated in real time.&lt;/p&gt;

&lt;p&gt;The companies that benefit most will not be the ones that add an AI summary to every chart. They will be the ones that rethink the interface itself: not as a static destination, but as something the system can assemble around the user's intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/thesysdev/openui" rel="noopener noreferrer"&gt;OpenUI GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.openui.com/docs" rel="noopener noreferrer"&gt;OpenUI documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.openui.com/docs/openui-lang/benchmarks" rel="noopener noreferrer"&gt;OpenUI benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thesys.dev/blogs/openui" rel="noopener noreferrer"&gt;Why We're Open Sourcing OpenUI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://topaiproduct.com/2026/03/20/openui-by-thesys-wants-to-replace-json-as-the-language-between-ai-and-your-interface/" rel="noopener noreferrer"&gt;OpenUI coverage by Top AI Product&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>analytics</category>
      <category>data</category>
      <category>ui</category>
    </item>
  </channel>
</rss>
