<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Application Development Archives | DMC, Inc.</title>
	<atom:link href="https://static.dmcinfo.com/blog/category/application-development/feed/index.xml" rel="self" type="application/rss+xml" />
	<link></link>
	<description></description>
	<lastBuildDate>Wed, 02 Sep 2026 18:38:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://static.dmcinfo.com/wp-content/uploads/2025/04/site-icon-150x150.png</url>
	<title>Application Development Archives | DMC, Inc.</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Next.js 16 + Material UI Setup Guide for App Router + RSC: Dev Diary #2</title>
		<link>https://static.dmcinfo.com/blog/44831/material-ui-nextjs-16-app-router/</link>
		
		<dc:creator><![CDATA[Christopher Olsen]]></dc:creator>
		<pubDate>Mon, 01 Jun 2026 11:00:00 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[User Interface Design]]></category>
		<category><![CDATA[Next.js]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=44831</guid>

					<description><![CDATA[<p>In Part 1 of this two-part series, we walked through scaffolding a brand-new React application with Next.js. The result was a bare bones application with no styling to speak of. Early in any web application project, you have an important decision to make: are you going to build the look and feel of your app [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/44831/material-ui-nextjs-16-app-router/">Next.js 16 + Material UI Setup Guide for App Router + RSC: Dev Diary #2</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In <a href="https://static.dmcinfo.com/blog/41208/building-a-dba-dashboard-with-react-and-next-js-part-1/">Part 1</a> of this two-part series, we walked through scaffolding a brand-new React application with Next.js. The result was a bare bones application with no styling to speak of. Early in any web application project, you have an important decision to make: are you going to build the look and feel of your app from scratch with custom CSS and JavaScript, or are you going to leverage a third-party solution to achieve a more professional-looking UI than you would with a custom solution and with less development effort? Most people choose the latter, and we will too.</p>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--20)">At DMC, our preferred UI library is Material UI, a component library maintained by Google. I first used Material UI nearly a decade ago, before it even reached version 1.0. Since then, the library has evolved significantly and now includes first-class support for Next.js and React Server Components. In this post, we&#8217;ll walk through how to add Material UI to a new Next.js 16 application. At the time of writing, Material UI v9.0.0 is the version in use.</p>



<h2 class="wp-block-heading" id="h-installing-the-npm-packages-for-material-ui">Installing the NPM Packages for Material UI</h2>



<p class="wp-block-paragraph">First, run the following command to install the core Material UI packages using Yarn:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>yarn add @mui/material @emotion/react @emotion/styled


</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">yarn add @mui/material @emotion/react @emotion/styled</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">The Material UI documentation recommends installing <code>@fontsource/roboto</code> to use the Roboto font in your application. However, &nbsp;at the time of writing this post, that package causes the TypeScript server in my project to crash, resulting in the loss of IntelliSense support in Visual Studio Code. Because of this, I recommend skipping that package. Later in this post, we’ll import the Roboto font using a different approach.</p>



<p class="wp-block-paragraph">Next, run the following command to install the packages required to integrate Material UI with Next.js App Router:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>yarn add @mui/material-nextjs @emotion/cache


</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">yarn add @mui/material-nextjs @emotion/cache</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading" id="h-setting-up-a-material-ui-theme" style="padding-top:var(--wp--preset--spacing--30)">Setting Up a Material UI Theme</h2>



<p class="wp-block-paragraph">One of Material UI&#8217;s most useful features is its customizable themes. Material UI includes a default theme that can be extensively customized—everything from spacing, color palettes, and even border radius can be modified based on your design sensibilities.</p>



<p class="wp-block-paragraph">For this application, we&#8217;ll primarily use the default &nbsp;Material UI theme while enabling built-in light/dark mode functionality. We can initialize the theme using the <code>createTheme()</code> function:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src/theme.tsx
"use client";
import { createTheme } from "@mui/material/styles";

const theme = createTheme({
  typography: {
    fontFamily: "var(--font-roboto)",
  },
  cssVariables: {
    colorSchemeSelector: "class",
  },
  colorSchemes: {
    dark: true,
  },
});

export default theme;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// src/theme.tsx</span></span>
<span class="line"><span style="color: #CE9178">&quot;use client&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">import { createTheme } from </span><span style="color: #CE9178">&quot;@mui/material/styles&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> theme = </span><span style="color: #DCDCAA">createTheme</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">  typography: {</span></span>
<span class="line"><span style="color: #D4D4D4">    fontFamily: </span><span style="color: #CE9178">&quot;var(--font-roboto)&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  },</span></span>
<span class="line"><span style="color: #D4D4D4">  cssVariables: {</span></span>
<span class="line"><span style="color: #D4D4D4">    colorSchemeSelector: </span><span style="color: #CE9178">&quot;class&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  },</span></span>
<span class="line"><span style="color: #D4D4D4">  colorSchemes: {</span></span>
<span class="line"><span style="color: #D4D4D4">    dark: </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  },</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">export default theme;</span></span></code></pre></div>



<p class="wp-block-paragraph">This theme configuration does three things:</p>



<ol class="wp-block-list">
<li>Sets Roboto as the default font family for all Typography components.</li>



<li>Enables dark mode support. Light mode is enabled by default.</li>



<li>Enables CSS variables and configures the colorSchemeSelector to use CSS classes.</li>
</ol>



<p class="wp-block-paragraph">The final configuration helps prevent SSR flickering, which can occur because the server cannot detect a user’s preferred color mode during the initial render. With this setup, Material UI applies either a light or dark class to the &lt;html&gt; element on the client side and uses CSS variables to apply the appropriate theme colors. This approach provides a smoother transition between server-side rendering and client-side hydration while maintaining support for light and dark themes.</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="912" height="520" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-1.png" alt="Screenshot of a JavaScript code snippet manages theme switching between light and dark modes for a webpage." class="wp-image-44851" style="width:850px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-1.png 912w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-1-300x171.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-1-768x438.png 768w" sizes="(max-width: 912px) 100vw, 912px" /></figure>



<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="1055" height="292" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-2.png" alt="Image displays CSS code using the Material UI (mui) framework to style an app bar component when the application is in dark mode." class="wp-image-44852" style="aspect-ratio:3.6131774707757707;width:850px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-2.png 1055w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-2-300x83.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-2-1024x283.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-2-768x213.png 768w" sizes="(max-width: 1055px) 100vw, 1055px" /></figure>



<h2 class="wp-block-heading" id="h-color-mode-picker" style="padding-top:var(--wp--preset--spacing--30)">Color Mode Picker</h2>



<p class="wp-block-paragraph">Speaking of color mode (light/dark), it can be nice to offer users a way to switch between light mode and dark mode. With the way we&#8217;ve configured our theme, Material UI will automatically set the color mode based on the user&#8217;s system preference, set in their web browser. So if a user has configured &#8220;dark&#8221; mode in Chrome, for example, when they visit our application, they&#8217;ll automatically get the dark-mode version of our UI.</p>



<p class="wp-block-paragraph">Some users may want dark mode specifically for our application and light mode elsewhere, so to provide that flexibility, we&#8217;ll build a simple color mode selector. For this, we&#8217;ll use the tools Material UI provides, including input and label components, along with tools for customizing them.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// colorThemePicker.tsx
"use client";
import FormControl from "@mui/material/FormControl";
import Select, { SelectChangeEvent } from "@mui/material/Select";
import MenuItem from "@mui/material/MenuItem";
import { useColorScheme } from "@mui/material/styles";
import { FormLabel } from "@mui/material";

export default function ColorThemePicker() {
  const { mode, setMode } = useColorScheme();
  if (!mode) {
    return null;
  }
  const handleChange = (event: SelectChangeEvent) => {
    setMode(event.target.value as "system" | "light" | "dark");
  };

  return (
    &lt;FormControl
      sx={{
        display: "flex",
        flexDirection: "row",
        alignItems: "center",
        gap: 1,
      }}
    >
      &lt;FormLabel id="theme-select-label">Theme&lt;/FormLabel>
      &lt;Select
        labelId="theme-select-label"
        aria-labelledby="theme-select-label"
        id="theme-select"
        value={mode}
        label="Theme"
        onChange={handleChange}
        sx={{ minWidth: "10rem" }}
      >
        &lt;MenuItem value="system">System&lt;/MenuItem>
        &lt;MenuItem value="light">Light&lt;/MenuItem>
        &lt;MenuItem value="dark">Dark&lt;/MenuItem>
      &lt;/Select>
    &lt;/FormControl>
  );
}

</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// colorThemePicker.tsx</span></span>
<span class="line"><span style="color: #CE9178">&quot;use client&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">import FormControl from </span><span style="color: #CE9178">&quot;@mui/material/FormControl&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">import Select, { SelectChangeEvent } from </span><span style="color: #CE9178">&quot;@mui/material/Select&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">import MenuItem from </span><span style="color: #CE9178">&quot;@mui/material/MenuItem&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">import { useColorScheme } from </span><span style="color: #CE9178">&quot;@mui/material/styles&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">import { FormLabel } from </span><span style="color: #CE9178">&quot;@mui/material&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">export default function </span><span style="color: #DCDCAA">ColorThemePicker</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> { mode, setMode } = </span><span style="color: #DCDCAA">useColorScheme</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (!mode) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> null;</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> handleChange = (event: SelectChangeEvent) =&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">setMode</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">event</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">target</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">value</span><span style="color: #D4D4D4"> as </span><span style="color: #CE9178">&quot;system&quot;</span><span style="color: #D4D4D4"> | </span><span style="color: #CE9178">&quot;light&quot;</span><span style="color: #D4D4D4"> | </span><span style="color: #CE9178">&quot;dark&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  };</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;FormControl</span></span>
<span class="line"><span style="color: #D4D4D4">      sx={{</span></span>
<span class="line"><span style="color: #D4D4D4">        display: </span><span style="color: #CE9178">&quot;flex&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        flexDirection: </span><span style="color: #CE9178">&quot;row&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        alignItems: </span><span style="color: #CE9178">&quot;center&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        gap: </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      }}</span></span>
<span class="line"><span style="color: #D4D4D4">    &gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;FormLabel id=</span><span style="color: #CE9178">&quot;theme-select-label&quot;</span><span style="color: #D4D4D4">&gt;Theme&lt;/FormLabel&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;Select</span></span>
<span class="line"><span style="color: #D4D4D4">        labelId=</span><span style="color: #CE9178">&quot;theme-select-label&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        aria-labelledby=</span><span style="color: #CE9178">&quot;theme-select-label&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        id=</span><span style="color: #CE9178">&quot;theme-select&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        value={mode}</span></span>
<span class="line"><span style="color: #D4D4D4">        label=</span><span style="color: #CE9178">&quot;Theme&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        onChange={handleChange}</span></span>
<span class="line"><span style="color: #D4D4D4">        sx={{ minWidth: </span><span style="color: #CE9178">&quot;10rem&quot;</span><span style="color: #D4D4D4"> }}</span></span>
<span class="line"><span style="color: #D4D4D4">      &gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;MenuItem value=</span><span style="color: #CE9178">&quot;system&quot;</span><span style="color: #D4D4D4">&gt;System&lt;/MenuItem&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;MenuItem value=</span><span style="color: #CE9178">&quot;light&quot;</span><span style="color: #D4D4D4">&gt;Light&lt;/MenuItem&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;MenuItem value=</span><span style="color: #CE9178">&quot;dark&quot;</span><span style="color: #D4D4D4">&gt;Dark&lt;/MenuItem&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;/Select&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;/FormControl&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">I&#8217;ll explain this from the top down.</p>



<p class="wp-block-paragraph">We need a piece of state to track the user&#8217;s color mode selection: light, dark, or system (whatever they&#8217;ve selected in their browser settings). We also need a <strong>setter</strong> for that state so that we can update it based on the user&#8217;s actions. For that, we use a hook provided by Material UI: <a href="https://mui.com/material-ui/customization/dark-mode/#toggling-color-mode">useColorScheme()</a>. The <code>mode</code> returned by this hook is always undefined on the first render, so we handle that with a simple falsiness check:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>if(!mode) {
  return null;
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(!mode) {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> null;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Next, we have our return statement where we declare the UI that this component should render. We&#8217;re making use of a few components from Material UI:</p>



<ul class="wp-block-list">
<li><a href="https://mui.com/material-ui/api/form-control/" target="_blank" rel="noreferrer noopener">FormControl</a></li>



<li><a href="https://mui.com/material-ui/api/form-label/" target="_blank" rel="noreferrer noopener">FormLabel</a></li>



<li><a href="https://mui.com/material-ui/react-select/" target="_blank" rel="noreferrer noopener">Select and MenuItem</a></li>
</ul>



<p class="wp-block-paragraph">The latter two are kind of self-explanatory if you have a basic background in HTML. FormControl is a nice-to-have component that manages some state related to the input element that it wraps, such as focused state, filled state, error state, required state, etc.</p>



<p class="wp-block-paragraph">Something I want to point out is the use of the sx prop on the FormControl component. This is a CSS-in-JS styling solution from Material UI, intended for one-off customization. Our application has precisely one color theme picker, so it easily fits the definition of a one-off customization. You can read more about this system in the <a href="https://mui.com/system/getting-started/usage" target="_blank" rel="noreferrer noopener">Material UI documentation</a>.</p>



<p class="wp-block-paragraph">The purpose served by our use of the <code>sx</code> prop here is to apply some flexbox CSS properties to our <code>FormControl</code> to make its child elements (the <code>FormLabel</code> and <code>Select</code> components) appear side by side instead of displaying the form label above the select component.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;FormControl
  sx={{
    display: "flex",
    flexDirection: "row",
    alignItems: "center",
    gap: 1,
  }}
>/
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;FormControl</span></span>
<span class="line"><span style="color: #D4D4D4">  sx={{</span></span>
<span class="line"><span style="color: #D4D4D4">    display: </span><span style="color: #CE9178">&quot;flex&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    flexDirection: </span><span style="color: #CE9178">&quot;row&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    alignItems: </span><span style="color: #CE9178">&quot;center&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    gap: </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  }}</span></span>
<span class="line"><span style="color: #D4D4D4">&gt;/</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Under the hood, a CSS selector is generated and applied to the rendered DOM element, and a &lt;style&gt; tag containing the corresponding CSS rule(s) is inserted into the DOM (see the screenshot below). So the result is similar to what we would get with a style sheet, except that it is generated at runtime after the initial HTML document is served to the client, which introduces some overhead for applying style rules.</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="1377" height="158" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-3.png" alt="Image displaying a CSS style block generated by the Material-UI (MUI) library, specifically targeting a form label component." class="wp-image-44854" style="width:850px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-3.png 1377w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-3-300x34.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-3-1024x117.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-3-768x88.png 768w" sizes="(max-width: 1377px) 100vw, 1377px" /></figure>



<p class="wp-block-paragraph">In short, the trade-off is simpler code that&#8217;s easier to understand in exchange for a performance drop: up to 3x slower render time for 1,000 components, according to the documentation, which means you have to be rendering a lot of items to get a noticeable performance difference.</p>



<p class="wp-block-paragraph">Here&#8217;s what our color scheme picker looks like when rendered on the page:</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="274" height="227" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-4.png" alt="Image displaying a drop-down menu for selecting a user interface Theme with &quot;Light&quot; selected." class="wp-image-44855" style="width:280px"/></figure>



<p class="wp-block-paragraph">And in dark mode:</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="286" height="223" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-5.png" alt="Image displaying a drop-down menu for selecting a user interface Theme with &quot;Dark&quot; selected." class="wp-image-44856" style="width:280px"/></figure>



<p class="wp-block-paragraph">Not bad!</p>



<h2 class="wp-block-heading" id="h-client-components-and-building-a-nav-bar" style="padding-top:var(--wp--preset--spacing--30)">Client Components and Building a Nav Bar</h2>



<p class="wp-block-paragraph">Material UI has a <code>&lt;Link&gt;</code> component that makes it easy to render a professional-looking link on a web page. Since we&#8217;re using Next.js, we also want to use the <code>&lt;Link&gt;</code> component, which handles both server- and client-side routing. We&#8217;ll do this by providing the Next.js <code>&lt;Link&gt;</code> to the Material UI <code>&lt;Link&gt;</code> &#8220;component&#8221; prop, which essentially tells Material UI, &#8220;use this as the underlying component that you then attach all your fancy styles to.&#8221;</p>



<p class="wp-block-paragraph">However, with Next.js 16, this can result in an error: &#8220;Functions cannot be passed directly to Client Component&#8221;. As outlined in the Material UI documentation for Next.js integration, we can work around this by creating a client-side wrapper component for the Next.js <code>&lt;Link&gt;</code> component.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src\app\_components\link.tsx
'use client';
import Link, { LinkProps } from 'next/link';

export default Link;
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// src\app\_components\link.tsx</span></span>
<span class="line"><span style="color: #CE9178">&apos;use client&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">import Link, { LinkProps } from </span><span style="color: #CE9178">&apos;next/link&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">export default Link;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">This will come in handy when building our top nav bar for this application, which we can get started on:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src\app\_components\topNavBar.tsx 
import NextLink from "./link";
// (rest of import section omitted for brevity)

function TopNavBar() {
  return (
    &lt;AppBar position="static">
      &lt;Container
        maxWidth="xl"
        sx={{ display: "flex", justifyContent: "space-between" }}
      >
        &lt;Box
          sx={{
            display: "flex",
            justifyContent: "space-between",
            alignItems: "center",
          }}
          component="nav"
        >
          &lt;Link component={NextLink} href="/" color="inherit" underline="none">
            &lt;Typography
              variant="body1"
              component="span"
              sx={{ display: "flex", alignItems: "center", gap: 0.5 }}
            >
              &lt;Icon>home&lt;/Icon>
              Home
            &lt;/Typography>
          &lt;/Link>
        &lt;/Box>
        &lt;ColorThemePicker />
      &lt;/Container>
    &lt;/AppBar>
  );
}

export default TopNavBar;
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// src\app\_components\topNavBar.tsx </span></span>
<span class="line"><span style="color: #D4D4D4">import NextLink from </span><span style="color: #CE9178">&quot;./link&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #6A9955">// (rest of import section omitted for brevity)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">function </span><span style="color: #DCDCAA">TopNavBar</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;AppBar position=</span><span style="color: #CE9178">&quot;static&quot;</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;Container</span></span>
<span class="line"><span style="color: #D4D4D4">        maxWidth=</span><span style="color: #CE9178">&quot;xl&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        sx={{ display: </span><span style="color: #CE9178">&quot;flex&quot;</span><span style="color: #D4D4D4">, justifyContent: </span><span style="color: #CE9178">&quot;space-between&quot;</span><span style="color: #D4D4D4"> }}</span></span>
<span class="line"><span style="color: #D4D4D4">      &gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;Box</span></span>
<span class="line"><span style="color: #D4D4D4">          sx={{</span></span>
<span class="line"><span style="color: #D4D4D4">            display: </span><span style="color: #CE9178">&quot;flex&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            justifyContent: </span><span style="color: #CE9178">&quot;space-between&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            alignItems: </span><span style="color: #CE9178">&quot;center&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">          }}</span></span>
<span class="line"><span style="color: #D4D4D4">          component=</span><span style="color: #CE9178">&quot;nav&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        &gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          &lt;Link component={NextLink} href=</span><span style="color: #CE9178">&quot;/&quot;</span><span style="color: #D4D4D4"> color=</span><span style="color: #CE9178">&quot;inherit&quot;</span><span style="color: #D4D4D4"> underline=</span><span style="color: #CE9178">&quot;none&quot;</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;Typography</span></span>
<span class="line"><span style="color: #D4D4D4">              variant=</span><span style="color: #CE9178">&quot;body1&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">              component=</span><span style="color: #CE9178">&quot;span&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">              sx={{ display: </span><span style="color: #CE9178">&quot;flex&quot;</span><span style="color: #D4D4D4">, alignItems: </span><span style="color: #CE9178">&quot;center&quot;</span><span style="color: #D4D4D4">, gap: </span><span style="color: #B5CEA8">0.5</span><span style="color: #D4D4D4"> }}</span></span>
<span class="line"><span style="color: #D4D4D4">            &gt;</span></span>
<span class="line"><span style="color: #D4D4D4">              &lt;Icon&gt;home&lt;/Icon&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">              Home</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;/Typography&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          &lt;/Link&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/Box&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;ColorThemePicker /&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;/Container&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;/AppBar&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">export default TopNavBar;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">For our top nav bar, we&#8217;re using the <a href="https://mui.com/material-ui/react-app-bar" target="_blank" rel="noreferrer noopener">AppBar</a> component from Material UI. This component looks great at the top of the screen and is an ideal place for top-level links, action buttons, menus, a login/logout button, etc.</p>



<p class="wp-block-paragraph">We&#8217;re putting a couple of elements into our top nav bar to start out:</p>



<ol class="wp-block-list">
<li>A list of links (currently just a link to the home page)</li>



<li>The color theme picker (this will eventually be replaced with a &#8220;hamburger button&#8221; that opens a modal dialog with settings/options)</li>
</ol>



<p class="wp-block-paragraph">I want these two components to be evenly spaced across the app bar, which sounds like a job for flexbox. To make that happen, I need to wrap them in a component, and <a href="https://mui.com/material-ui/react-container" target="_blank" rel="noreferrer noopener">Material UI&#8217;s Container</a> component fits the bill. I&#8217;m using Container because it&#8217;s a responsive component—we can use the <code>maxWidth</code> prop to define how <em>wide</em> it&#8217;s allowed to get based on the screen size. I want this nav bar to resize responsively all the way up to large desktop screens, so I&#8217;m providing &#8220;xl&#8221; as the value here &#8211; the width of the container will automatically adjust to smaller screen sizes.</p>



<p class="wp-block-paragraph">We can use the <code>sx</code> prop here to provide custom styling rules for this component—in this case, that would be using the &#8220;display&#8221; and &#8220;justifyContent&#8221; CSS properties to declare that the children of this component should be spaced evenly across the width of this container.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;Container
  maxWidth="xl"
  sx={{ display: "flex", justifyContent: "space-between" }}
>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;Container</span></span>
<span class="line"><span style="color: #D4D4D4">  maxWidth=</span><span style="color: #CE9178">&quot;xl&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">  sx={{ display: </span><span style="color: #CE9178">&quot;flex&quot;</span><span style="color: #D4D4D4">, justifyContent: </span><span style="color: #CE9178">&quot;space-between&quot;</span><span style="color: #D4D4D4"> }}</span></span>
<span class="line"><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">To follow HTML best practices, we want to wrap our navigation links in a semantic <code>&lt;nav&gt;</code> element. But we also want to make sure that the links themselves are evenly spaced, so we need to apply some CSS rules to this <code>&lt;nav&gt;</code> element. The best way to accomplish this with Material UI is to use the generic <a href="https://mui.com/material-ui/react-box/" target="_blank" rel="noreferrer noopener">Box</a> component.</p>



<p class="wp-block-paragraph">Whenever you need to wrap other components with a containing element and apply style rules to it, <code>&lt;Box&gt;</code> is the go-to component. And we can tell Material UI which HTML element to render in the DOM by using the component prop, so we&#8217;ll pass the value &#8220;nav&#8221; to that prop to ensure it renders as a proper nav element. And again, we&#8217;re using the sx prop to define some basic flexbox properties and ensure that our link elements inside this box are spaced evenly and positioned nicely.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;Box
  sx={{
    display: "flex",
    justifyContent: "space-between",
    alignItems: "center",
  }}
  component="nav"
>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;Box</span></span>
<span class="line"><span style="color: #D4D4D4">  sx={{</span></span>
<span class="line"><span style="color: #D4D4D4">    display: </span><span style="color: #CE9178">&quot;flex&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    justifyContent: </span><span style="color: #CE9178">&quot;space-between&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    alignItems: </span><span style="color: #CE9178">&quot;center&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  }}</span></span>
<span class="line"><span style="color: #D4D4D4">  component=</span><span style="color: #CE9178">&quot;nav&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">To start with, we&#8217;re going to only have one link in our nav bar: &#8220;Home&#8221;. The simplest version of this would just be to use Material UI&#8217;s Link component, pass my wrapper for the Next.js Link to the &#8220;component&#8221; prop, and, of course, set href to &#8220;/&#8221;. Like the following:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;Link component={NextLink} href="/" color="inherit" underline="none">
  Home
&lt;/Link>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;Link component={NextLink} href=</span><span style="color: #CE9178">&quot;/&quot;</span><span style="color: #D4D4D4"> color=</span><span style="color: #CE9178">&quot;inherit&quot;</span><span style="color: #D4D4D4"> underline=</span><span style="color: #CE9178">&quot;none&quot;</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  Home</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/Link&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">But I also want to add a nifty little house icon to this link. Because I want this link to be inviting: &#8220;Come on home, you&#8217;re tired, and we have a nice fire going. You can take off your socks and cozy up by the fireplace with some hot cocoa and a grilled cheese sandwich.&#8221;</p>



<p class="wp-block-paragraph">Material UI makes that easy with its <a href="https://mui.com/material-ui/icons/" target="_blank" rel="noreferrer noopener">Icon</a> component. You can choose SVG or Font for the icons. To get off to a quick and easy start, I recommend the Font option. Later in this post, I&#8217;ll show how to enable that, but here&#8217;s what it&#8217;s going to look like in this component:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;Link component={NextLink} href="/" color="inherit" underline="none">
  &lt;Icon>home&lt;/Icon>
  Home
&lt;/Link>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;Link component={NextLink} href=</span><span style="color: #CE9178">&quot;/&quot;</span><span style="color: #D4D4D4"> color=</span><span style="color: #CE9178">&quot;inherit&quot;</span><span style="color: #D4D4D4"> underline=</span><span style="color: #CE9178">&quot;none&quot;</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  &lt;Icon&gt;home&lt;/Icon&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  Home</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/Link&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">This ends up looking like the following when rendered on the page:</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="188" height="74" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-6.png" alt="Screenshot of &quot;home&quot; link and &quot;home&quot; icon. The icon is positioned awkwardly off-center, making it look crooked." class="wp-image-44860" style="aspect-ratio:2.540772532188841;width:175px;height:auto"/></figure>



<p class="wp-block-paragraph">Oops! That icon is crooked! Or more accurately, it&#8217;s not vertically centered, so it looks awkward next to the text &#8220;Home&#8221;. We&#8217;ll fix that by applying some flexbox styling to the Link component:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;Link
  component={NextLink}
  href="/"
  color="inherit"
  underline="none"
  sx={{ display: "flex", alignItems: "center", gap: "0.5rem" }}
>
  &lt;Icon>home&lt;/Icon>
  Home
&lt;/Link>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;Link</span></span>
<span class="line"><span style="color: #D4D4D4">  component={NextLink}</span></span>
<span class="line"><span style="color: #D4D4D4">  href=</span><span style="color: #CE9178">&quot;/&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">  color=</span><span style="color: #CE9178">&quot;inherit&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">  underline=</span><span style="color: #CE9178">&quot;none&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">  sx={{ display: </span><span style="color: #CE9178">&quot;flex&quot;</span><span style="color: #D4D4D4">, alignItems: </span><span style="color: #CE9178">&quot;center&quot;</span><span style="color: #D4D4D4">, gap: </span><span style="color: #CE9178">&quot;0.5rem&quot;</span><span style="color: #D4D4D4"> }}</span></span>
<span class="line"><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  &lt;Icon&gt;home&lt;/Icon&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  Home</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/Link&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">The result looks so much better!</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="131" height="58" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-7.png" alt="Screenshot of &quot;home&quot; link and &quot;home icon&quot;, vertically aligned to look neater." class="wp-image-44861" style="aspect-ratio:2.2589298319920936;object-fit:cover;width:175px"/></figure>



<p class="wp-block-paragraph">Finally, after the nav links themselves, we have the color theme picker. Altogether, our nav bar looks like the following screenshot:</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="1230" height="232" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-8.png" alt="Screenshot of top nav bar." class="wp-image-44863" style="aspect-ratio:5.30214424951267" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-8.png 1230w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-8-300x57.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-8-1024x193.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-8-768x145.png 768w" sizes="(max-width: 1230px) 100vw, 1230px" /></figure>



<p class="wp-block-paragraph">Not bad, at least to start.</p>



<h2 class="wp-block-heading" id="h-updating-the-root-layout" style="padding-top:var(--wp--preset--spacing--30)">Updating the Root Layout</h2>



<p class="wp-block-paragraph">Now we&#8217;re ready to update our root layout (/src/app/layout.tsx) to use Material UI in our application.</p>



<h3 class="wp-block-heading" id="h-roboto-font-set-up" style="padding-top:var(--wp--preset--spacing--30)">Roboto Font Set Up</h3>



<p class="wp-block-paragraph">To enable using the Roboto font as the default font for our app, we need to use <a href="https://nextjs.org/docs/app/getting-started/fonts" target="_blank" rel="noreferrer noopener">Next.js font optimization</a>. The result of this step is that we end up self-hosting the Roboto font from Google:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>const roboto = Roboto({
  weight: &#91;"300", "400", "500", "700"&#93;,
  subsets: &#91;"latin"&#93;,
  display: "swap",
  variable: "--font-roboto",
});
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> roboto = </span><span style="color: #DCDCAA">Roboto</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">  weight: &#91;</span><span style="color: #CE9178">&quot;300&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;400&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;500&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;700&quot;</span><span style="color: #D4D4D4">&#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">  subsets: &#91;</span><span style="color: #CE9178">&quot;latin&quot;</span><span style="color: #D4D4D4">&#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">  display: </span><span style="color: #CE9178">&quot;swap&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  variable: </span><span style="color: #CE9178">&quot;--font-roboto&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">With that set up, we can give our HTML (root) element a new CSS class that will help give every typography element the Roboto font:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;html lang="en" className={roboto.variable} suppressHydrationWarning>

</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;html lang=</span><span style="color: #CE9178">&quot;en&quot;</span><span style="color: #D4D4D4"> className={</span><span style="color: #9CDCFE">roboto</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">variable</span><span style="color: #D4D4D4">} suppressHydrationWarning&gt;</span></span>
<span class="line"></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Remember how we set up our theme with the following property?</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>typography: {
  fontFamily: "var(--font-roboto)",
},
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">typography: {</span></span>
<span class="line"><span style="color: #D4D4D4">  fontFamily: </span><span style="color: #CE9178">&quot;var(--font-roboto)&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">},</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">That &#8220;var(&#8211;font-roboto)&#8221; element is a <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Cascading_variables/Using_custom_properties" target="_blank" rel="noreferrer noopener">CSS variable</a>. When combined, these two things result in a CSS variable named &#8220;&#8211;font-roboto&#8221; that&#8217;s <em>scoped</em> to a CSS class that&#8217;s generated at runtime and inserted into the stylesheet. This CSS class is then assigned to the <code>&lt;html&gt;</code> element so that any element in our HTML document can use that CSS variable. And by utilizing the &#8220;fontFamily&#8221; property of the &#8220;typography&#8221; section of our theme, we ensure that every typography element (MUI or not) uses the value of that variable for its &#8220;font-family&#8221; CSS property.</p>



<p class="wp-block-paragraph">The following screenshots from Chrome dev tools demonstrate this in action:</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="816" height="67" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-9.png" alt="HTML tag showing the dynamically-generated CSS class." class="wp-image-44875" style="width:850px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-9.png 816w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-9-300x25.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-9-768x63.png 768w" sizes="(max-width: 816px) 100vw, 816px" /></figure>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="552" height="101" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-10.png" alt="Screenshot showing the CSS variable &quot;--font-roboto&quot;" class="wp-image-44877" style="width:500px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-10.png 552w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-10-300x55.png 300w" sizes="(max-width: 552px) 100vw, 552px" /></figure>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="543" height="234" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-11.png" alt="Screenshot of a CSS rule for a label component, with the &quot;font-family&quot; property set to &quot;var(--font-roboto)&quot;" class="wp-image-44878" style="width:500px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-11.png 543w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-11-300x129.png 300w" sizes="(max-width: 543px) 100vw, 543px" /></figure>



<h3 class="wp-block-heading" id="h-material-icons-set-up" style="padding-top:var(--wp--preset--spacing--40)">Material Icons Set Up</h3>



<p class="wp-block-paragraph">We need to import the Material Icons font so that we can use icons in our app. The easiest way to do this is to get it from the CDN. We can use the <code>&lt;head&gt;</code> element in our root layout.tsx file to insert a stylesheet link into the HTML document, ensuring that the user&#8217;s browser downloads that font.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;head>
  &lt;link
    rel="stylesheet"
    href="https://fonts.googleapis.com/icon?family=Material+Icons"
  />
&lt;/head>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;head&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  &lt;link</span></span>
<span class="line"><span style="color: #D4D4D4">    rel=</span><span style="color: #CE9178">&quot;stylesheet&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    href=</span><span style="color: #CE9178">&quot;https://fonts.googleapis.com/icon?family=Material+Icons&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">  /&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/head&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">There&#8217;s also an NPM package you can install to self-host the font, but as I said earlier, it seems to crash the TypeScript server when using Next.js 16, so we&#8217;ll use the CDN until that gets sorted out.</p>



<h3 class="wp-block-heading" id="h-approutercacheprovider" style="padding-top:var(--wp--preset--spacing--30)">AppRouterCacheProvider</h3>



<p class="wp-block-paragraph">For optimal performance, it&#8217;s best to wrap your application with Material UI&#8217;s AppRouterCacheProvider component. According to the <a href="https://mui.com/material-ui/integrations/nextjs/#configuration" target="_blank" rel="noreferrer noopener">documentation</a>, this component &#8220;is responsible for collecting the CSS generated by MUI System on the server, as Next.js is streaming chunks of the .html page to the client.&#8221;</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;body>
  &lt;AppRouterCacheProvider>
    &lt;main>
      {children}
    &lt;/main>
  &lt;/AppRouterCacheProvider>
&lt;/body>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;body&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  &lt;AppRouterCacheProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;main&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      {children}</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;/main&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  &lt;/AppRouterCacheProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/body&gt;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="h-themeprovider" style="padding-top:var(--wp--preset--spacing--30)">ThemeProvider</h3>



<p class="wp-block-paragraph">For our application to use our custom theme, we need to wrap our application with the ThemeProvider component from Material UI, and provide our custom theme to the &#8220;theme&#8221; prop:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import theme from "../theme";
// ...
&lt;body>
  &lt;AppRouterCacheProvider>
    &lt;ThemeProvider theme={theme}>
      &lt;main>
        {children}
      &lt;/main>
    &lt;/ThemeProvider>
  &lt;/AppRouterCacheProvider>
&lt;/body>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">import theme from </span><span style="color: #CE9178">&quot;../theme&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #6A9955">// ...</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;body&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  &lt;AppRouterCacheProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;ThemeProvider theme={theme}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;main&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        {children}</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;/main&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;/ThemeProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  &lt;/AppRouterCacheProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/body&gt;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="h-cssbaseline" style="padding-top:var(--wp--preset--spacing--30)">CssBaseline</h3>



<p class="wp-block-paragraph">The <a href="https://mui.com/material-ui/react-css-baseline" target="_blank" rel="noreferrer noopener">CssBaseline</a> component allows us to clear out some undesirable CSS rules that browsers tend to have enabled by default. For example, without this component, there would be a default &#8220;margin&#8221; rule for <code>&lt;html&gt;</code> and <code>&lt;body&gt;</code>, resulting in a space around our actual page. So, our AppBar would not stretch all the way to the edges of the page, which is a jarring look. See the following screenshot for an example of what that looks like:</p>



<figure class="wp-block-image size-full is-resized has-custom-border"><img decoding="async" width="426" height="242" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-12-1.png" alt="Screenshot of the margin that appears by default if CssBaseline isn't used." class="has-border-color has-custom-black-border-color wp-image-44882" style="border-width:1px;aspect-ratio:1.7553438063353077;object-fit:cover;width:500px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-12-1.png 426w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-12-1-300x170.png 300w" sizes="(max-width: 426px) 100vw, 426px" /></figure>



<p class="wp-block-paragraph">So to avoid this, we simply have to add the CssBaseline component to our root layout:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;body>
  &lt;AppRouterCacheProvider>
    &lt;ThemeProvider theme={theme}>
      &lt;CssBaseline />
      &lt;main>
        {children}
      &lt;/main>
    &lt;/ThemeProvider>
  &lt;/AppRouterCacheProvider>
&lt;/body>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;body&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  &lt;AppRouterCacheProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;ThemeProvider theme={theme}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;CssBaseline /&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;main&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        {children}</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;/main&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;/ThemeProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  &lt;/AppRouterCacheProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/body&gt;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">That makes the margin disappear, as we can see in this screenshot:</p>



<figure class="wp-block-image size-full is-resized has-custom-border"><img decoding="async" width="387" height="224" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-13.png" alt="Screenshot of app without the browser default margin, thanks to CssBaseline." class="has-border-color has-custom-black-border-color wp-image-44883" style="border-width:1px;width:500px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-13.png 387w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-13-300x174.png 300w" sizes="(max-width: 387px) 100vw, 387px" /></figure>



<h3 class="wp-block-heading" id="h-initcolorschemescript" style="padding-top:var(--wp--preset--spacing--30)">InitColorSchemeScript</h3>



<p class="wp-block-paragraph">The <a href="https://mui.com/material-ui/react-init-color-scheme-script/#introduction" target="_blank" rel="noreferrer noopener">InitColorSchemeScript</a> component, when rendered before any of our actual content, will cause a script to run that attaches an attribute (a CSS class in our case) to the <code>&lt;html&gt;</code> element, indicating whether to use light or dark mode, depending on user preference. This runs <em>before</em> React itself starts doing client-side rendering and hydration; the result is that we prevent a &#8220;flicker&#8221; that would otherwise occur because the color scheme is not the default that&#8217;s assumed during server-side render.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;body>
  &lt;AppRouterCacheProvider>
    &lt;ThemeProvider theme={theme}>
      &lt;CssBaseline />
      &lt;InitColorSchemeScript attribute="class" />
      &lt;main>
        {children}
      &lt;/main>
    &lt;/ThemeProvider>
  &lt;/AppRouterCacheProvider>
&lt;/body>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;body&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  &lt;AppRouterCacheProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;ThemeProvider theme={theme}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;CssBaseline /&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;InitColorSchemeScript attribute=</span><span style="color: #CE9178">&quot;class&quot;</span><span style="color: #D4D4D4"> /&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;main&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        {children}</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;/main&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;/ThemeProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  &lt;/AppRouterCacheProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/body&gt;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="h-wrapping-app-contents-in-a-container-and-adding-the-nav-bar" style="padding-top:var(--wp--preset--spacing--30)">Wrapping App Contents in a Container and Adding the Nav Bar</h3>



<p class="wp-block-paragraph">To finish things up here, we&#8217;re going to wrap the child components (i.e., the contents of any given page) in a Container component so that they appear to be the same width as the content of our AppBar. Without this, the content of the app&#8217;s pages would stretch to the edge of the screen. See the following screenshot—it doesn&#8217;t look right.</p>



<figure class="wp-block-image size-full is-resized has-custom-border"><img decoding="async" width="470" height="212" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-14.png" alt="Screenshot of the web page's content stretching all the way to the edge of the browser window, making it wider than the nav bar's contents." class="has-border-color has-custom-black-border-color wp-image-44886" style="border-width:1px;width:500px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-14.png 470w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-14-300x135.png 300w" sizes="(max-width: 470px) 100vw, 470px" /></figure>



<p class="wp-block-paragraph">By wrapping <code>{children}</code> in a container and giving it <code>maxWidth</code> of &#8220;xl&#8221;, matching the approach used for the AppBar content, we ensure the entire application aligns cleanly and maintains a comfortable margin between the screen edge and the app’s content.</p>



<figure class="wp-block-image size-full is-resized has-custom-border"><img decoding="async" width="543" height="220" src="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-15.png" alt="Screenshot of the web page's content having the same margin from the edge of the screen as the nav bar's contents." class="has-border-color has-custom-black-border-color wp-image-44889" style="border-width:1px;width:500px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-15.png 543w, https://static.dmcinfo.com/wp-content/uploads/2026/05/adding-material-ui-next.js-image-15-300x122.png 300w" sizes="(max-width: 543px) 100vw, 543px" /></figure>



<p class="wp-block-paragraph">We&#8217;ll also render our custom TopNavBar component <em>before</em> the container, so that the nav bar always appears at the top of the page, with the current web page being displayed beneath it.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;body>
  &lt;AppRouterCacheProvider>
    &lt;ThemeProvider theme={theme}>
      &lt;CssBaseline />
      &lt;InitColorSchemeScript attribute="class" />
      &lt;main>
        &lt;TopNavBar />
        &lt;Container maxWidth="xl">{children}&lt;/Container>
      &lt;/main>
    &lt;/ThemeProvider>
  &lt;/AppRouterCacheProvider>
&lt;/body>
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;body&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  &lt;AppRouterCacheProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;ThemeProvider theme={theme}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;CssBaseline /&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;InitColorSchemeScript attribute=</span><span style="color: #CE9178">&quot;class&quot;</span><span style="color: #D4D4D4"> /&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;main&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;TopNavBar /&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;Container maxWidth=</span><span style="color: #CE9178">&quot;xl&quot;</span><span style="color: #D4D4D4">&gt;{children}&lt;/Container&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;/main&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;/ThemeProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  &lt;/AppRouterCacheProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/body&gt;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading" id="h-the-full-layout-tsx-file" style="padding-top:var(--wp--preset--spacing--30)">The Full layout.tsx File</h3>



<p class="wp-block-paragraph">Altogether, our layout.tsx file looks like this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src\app\layout.tsx
import type { Metadata } from "next";
import { AppRouterCacheProvider } from "@mui/material-nextjs/v15-appRouter";
import { Roboto } from "next/font/google";
import { ThemeProvider } from "@mui/material/styles";
import theme from "../theme";
import { Container, CssBaseline, InitColorSchemeScript } from "@mui/material";
import TopNavBar from "./_components/topNavBar";

const roboto = Roboto({
  weight: &#91;"300", "400", "500", "700"&#93;,
  subsets: &#91;"latin"&#93;,
  display: "swap",
  variable: "--font-roboto",
});

export const metadata: Metadata = {
  title: "DBA Dashboard",
  description:
    "A dashboard UI for exploring the results from the SQL Server First Responder Kit stored procedures",
};

export default function RootLayout({
  children,
}: Readonly&lt;{
  children: React.ReactNode;
}>) {
  return (
    &lt;html lang="en" className={roboto.variable} suppressHydrationWarning>
      &lt;head>
        &lt;link
          rel="stylesheet"
          href="https://fonts.googleapis.com/icon?family=Material+Icons"
        />
      &lt;/head>
      &lt;body>
        &lt;AppRouterCacheProvider>
          &lt;ThemeProvider theme={theme}>
            &lt;CssBaseline />
            &lt;InitColorSchemeScript attribute="class" />
            &lt;main>
              &lt;TopNavBar />
              &lt;Container maxWidth="xl">{children}&lt;/Container>
            &lt;/main>
          &lt;/ThemeProvider>
        &lt;/AppRouterCacheProvider>
      &lt;/body>
    &lt;/html>
  );
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// src\app\layout.tsx</span></span>
<span class="line"><span style="color: #D4D4D4">import type { Metadata } from </span><span style="color: #CE9178">&quot;next&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">import { AppRouterCacheProvider } from </span><span style="color: #CE9178">&quot;@mui/material-nextjs/v15-appRouter&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">import { Roboto } from </span><span style="color: #CE9178">&quot;next/font/google&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">import { ThemeProvider } from </span><span style="color: #CE9178">&quot;@mui/material/styles&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">import theme from </span><span style="color: #CE9178">&quot;../theme&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">import { Container, CssBaseline, InitColorSchemeScript } from </span><span style="color: #CE9178">&quot;@mui/material&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">import TopNavBar from </span><span style="color: #CE9178">&quot;./_components/topNavBar&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> roboto = </span><span style="color: #DCDCAA">Roboto</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">  weight: &#91;</span><span style="color: #CE9178">&quot;300&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;400&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;500&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;700&quot;</span><span style="color: #D4D4D4">&#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">  subsets: &#91;</span><span style="color: #CE9178">&quot;latin&quot;</span><span style="color: #D4D4D4">&#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">  display: </span><span style="color: #CE9178">&quot;swap&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  variable: </span><span style="color: #CE9178">&quot;--font-roboto&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">export </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> metadata: Metadata = {</span></span>
<span class="line"><span style="color: #D4D4D4">  title: </span><span style="color: #CE9178">&quot;DBA Dashboard&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  description:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;A dashboard UI for exploring the results from the SQL Server First Responder Kit stored procedures&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">export default function </span><span style="color: #DCDCAA">RootLayout</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">  children,</span></span>
<span class="line"><span style="color: #D4D4D4">}: Readonly&lt;{</span></span>
<span class="line"><span style="color: #D4D4D4">  children: </span><span style="color: #9CDCFE">React</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">ReactNode</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}&gt;) {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;html lang=</span><span style="color: #CE9178">&quot;en&quot;</span><span style="color: #D4D4D4"> className={</span><span style="color: #9CDCFE">roboto</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">variable</span><span style="color: #D4D4D4">} suppressHydrationWarning&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;head&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;link</span></span>
<span class="line"><span style="color: #D4D4D4">          rel=</span><span style="color: #CE9178">&quot;stylesheet&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">          href=</span><span style="color: #CE9178">&quot;https://fonts.googleapis.com/icon?family=Material+Icons&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        /&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;/head&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;body&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;AppRouterCacheProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          &lt;ThemeProvider theme={theme}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;CssBaseline /&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;InitColorSchemeScript attribute=</span><span style="color: #CE9178">&quot;class&quot;</span><span style="color: #D4D4D4"> /&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;main&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">              &lt;TopNavBar /&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">              &lt;Container maxWidth=</span><span style="color: #CE9178">&quot;xl&quot;</span><span style="color: #D4D4D4">&gt;{children}&lt;/Container&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;/main&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          &lt;/ThemeProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/AppRouterCacheProvider&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;/body&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;/html&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">We can also adjust the page.tsx (home page) component to be a bit more minimal, since it no longer needs to render its own <code>&lt;main&gt;</code>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// src\app\page.tsx
export default function Home() {
  return (
    &lt;>
      &lt;header>
        &lt;h1>DBA Dashboard&lt;/h1>
      &lt;/header>
      &lt;p>
        Welcome to the DBA Dashboard! There&apos;s not much here yet, but stay
        tuned for updates as we build out the UI for exploring the results from
        the SQL Server First Responder Kit stored procedures.
      &lt;/p>
    &lt;/>
  );
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// src\app\page.tsx</span></span>
<span class="line"><span style="color: #D4D4D4">export default function </span><span style="color: #DCDCAA">Home</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;header&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;h1&gt;DBA Dashboard&lt;/h1&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;/header&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;p&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        Welcome to the DBA Dashboard! There</span><span style="color: #CE9178">&apos;s not much here yet, but stay</span></span>
<span class="line"><span style="color: #CE9178">        tuned for updates as we build out the UI for exploring the results from</span></span>
<span class="line"><span style="color: #CE9178">        the SQL Server First Responder Kit stored procedures.</span></span>
<span class="line"><span style="color: #CE9178">      &lt;/p&gt;</span></span>
<span class="line"><span style="color: #CE9178">    &lt;/&gt;</span></span>
<span class="line"><span style="color: #CE9178">  );</span></span>
<span class="line"><span style="color: #CE9178">}</span></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading" id="h-conclusion" style="padding-top:var(--wp--preset--spacing--40)">Conclusion</h2>



<p class="wp-block-paragraph" style="padding-bottom:var(--wp--preset--spacing--40)">And that&#8217;s it! We&#8217;ve successfully set up Material UI with our Next.js 16 application—going forward, we can easily make every UI element we add to the app look professional with minimal effort. In the next post, we&#8217;ll get authentication set up&nbsp;using a library called Better Auth, along with Microsoft&#8217;s Entra ID authentication service.</p>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step">Have an upcoming project? DMC can help you take the next step.</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Take your project to the next level with engineering solutions from DMC. Learn more about our <a href="https://static.dmcinfo.com/services/application-development/">Application Development</a> solutions or contact us to get started today!</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://static.dmcinfo.com/blog/44831/material-ui-nextjs-16-app-router/">Next.js 16 + Material UI Setup Guide for App Router + RSC: Dev Diary #2</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Starting a DBA Dashboard with Next.js 16 and React: Dev Diary #1</title>
		<link>https://static.dmcinfo.com/blog/41208/building-a-dba-dashboard-with-react-and-next-js-part-1/</link>
		
		<dc:creator><![CDATA[Christopher Olsen]]></dc:creator>
		<pubDate>Mon, 04 May 2026 14:00:00 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Next.js]]></category>
		<category><![CDATA[React]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=41208</guid>

					<description><![CDATA[<p>React has been DMC&#8217;s JavaScript framework of choice for over 10 years. In recent years, we&#8217;ve been using it alongside Next.js to build maintainable, scalable, full-stack web applications. In this blog series, I&#8217;m going to demonstrate how to use React and Next.js to build a DBA dashboard that offers a variety of tools to spot [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/41208/building-a-dba-dashboard-with-react-and-next-js-part-1/">Starting a DBA Dashboard with Next.js 16 and React: Dev Diary #1</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">React has been DMC&#8217;s JavaScript framework of choice for over 10 years. In recent years, we&#8217;ve been using it alongside Next.js to build maintainable, scalable, full-stack web applications. In this <a href="https://static.dmcinfo.com/blog/44831/material-ui-nextjs-16-app-router/">blog series</a>, I&#8217;m going to demonstrate how to use React and Next.js to build a DBA dashboard that offers a variety of tools to spot and troubleshoot performance or reliability issues with a SQL Server instance.</p>



<p class="wp-block-paragraph">I plan to use Better-Auth for authentication and Material UI as a UI component library, and of course, I&#8217;ll be using SQL Server (a.k.a. MSSQL). So, if you&#8217;d like to learn how to build a React app with Next.js, Better-Auth, Material UI, and MSSQL using Prisma ORM, I&#8217;m going to show you how to set it all up.</p>



<h2 class="wp-block-heading" id="h-scaffolding-a-next-js-app">Scaffolding <strong>a Next.js App</strong></h2>



<p class="wp-block-paragraph">The first step to building a Next.js app is to run the create-next-app CLI tool. First, make sure you&#8217;ve installed Node.js version 24 or later. Then, run <code>npx create-next-app@latest</code> the CLI tool and create the application. It presents us with the following options:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1054" height="955" src="https://static.dmcinfo.com/wp-content/uploads/2026/02/image.png" alt="" class="wp-image-41398" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/02/image.png 1054w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-300x272.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-1024x928.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-768x696.png 768w" sizes="(max-width: 1054px) 100vw, 1054px" /></figure>



<p class="wp-block-paragraph">I recommend the following options:</p>



<ol class="wp-block-list">
<li><strong>TypeScript</strong> &#8211; at DMC, we&#8217;ve used it for React applications since 2016 and have adopted it as a standard. TypeScript is a superset of JavaScript that adds strong typing so that, for example, you&#8217;ll get a compiler error if you try to assign an integer value to a string variable. Fully explaining TypeScript is outside of the scope of this article, but I strongly recommend using it for all React applications.</li>



<li><strong>ESLint</strong> &#8211; this is the gold standard linter for JavaScript/TypeScript, and you really can&#8217;t go wrong by choosing it.</li>



<li><strong>React Compiler</strong> &#8211; I have been very eager to try this out on a project ever since it was introduced to React. Among other things, this makes it so you don&#8217;t need to explicitly use the useMemo or useCallback hooks &#8211; the compiler will take care of those optimizations for you so that you can focus on building your app.</li>



<li><strong>src directory</strong> &#8211; this is a pretty standard setup for JavaScript/TypeScript applications.</li>



<li><strong>App Router</strong> &#8211; the alternative is Page Router, which is the legacy version of Next.js.</li>
</ol>



<p class="wp-block-paragraph">By default, the CLI tool gets us set up with a package-lock.json file, but I prefer to use Yarn as my package manager, so I like to delete that file and run <code>yarn install</code>. Then I keep the yarn.lock file in source control.</p>



<p class="wp-block-paragraph">The app scaffolded by the CLI tool can be run locally with the command <code>yarn dev</code>. Doing so shows me a placeholder home page that looks like the following:</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="1396" height="1138" src="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-1.png" alt="" class="wp-image-41410" style="width:554px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-1.png 1396w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-1-300x245.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-1-1024x835.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-1-768x626.png 768w" sizes="(max-width: 1396px) 100vw, 1396px" /></figure>



<p class="wp-block-paragraph">When I&#8217;m building a new app, the first thing I do is clear out all the scaffolded content, like that placeholder page and the accompanying CSS. Once I&#8217;ve finished that, layout.tsx file and page.tsx file scaffolded by the CLI looks like the following:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TSX</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// layout.tsx
import type { Metadata } from "next";

export const metadata: Metadata = {
  title: "DBA Dashboard",
  description:
    "A dashboard UI for exploring the results from the SQL Server First Responder Kit stored procedures",
};

export default function RootLayout({
  children,
}: Readonly&lt;{
  children: React.ReactNode;
}>) {
  return (
    &lt;html lang="en">
      &lt;body>{children}&lt;/body>
    &lt;/html>
  );
}

// page.tsx
export default function Home() {
  return (
    &lt;div>
      &lt;main>
        &lt;header>
          &lt;h1>DBA Dashboard&lt;/h1>
        &lt;/header>
        &lt;p>
          Welcome to the DBA Dashboard! There's not much here yet, but stay
          tuned for updates as we build out the UI for exploring the results
          from the SQL Server First Responder Kit stored procedures.
        &lt;/p>
      &lt;/main>
    &lt;/div>
  );
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// layout.tsx</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">type</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">Metadata</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;next&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">metadata</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Metadata</span><span style="color: #D4D4D4"> = {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">title:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;DBA Dashboard&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">description:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;A dashboard UI for exploring the results from the SQL Server First Responder Kit stored procedures&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">RootLayout</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">children</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">}: </span><span style="color: #4EC9B0">Readonly</span><span style="color: #D4D4D4">&lt;{</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">children</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">React</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">ReactNode</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}&gt;) {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">html</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lang</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;en&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">body</span><span style="color: #808080">&gt;</span><span style="color: #569CD6">{</span><span style="color: #9CDCFE">children</span><span style="color: #569CD6">}</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">body</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">html</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// page.tsx</span></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Home</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">main</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">header</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">h1</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">DBA Dashboard</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">h1</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">header</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">p</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          Welcome to the DBA Dashboard! There&apos;s not much here yet, but stay</span></span>
<span class="line"><span style="color: #D4D4D4">          tuned for updates as we build out the UI for exploring the results</span></span>
<span class="line"><span style="color: #D4D4D4">          from the SQL Server First Responder Kit stored procedures.</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">p</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">main</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">And here&#8217;s the resulting home page of our new Next.js app:</p>



<figure class="wp-block-image size-full is-resized has-custom-border"><img decoding="async" width="1164" height="1282" src="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-2.png" alt="" class="has-border-color has-custom-black-border-color wp-image-41411" style="border-width:1px;width:631px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-2.png 1164w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-2-272x300.png 272w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-2-930x1024.png 930w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-2-768x846.png 768w" sizes="(max-width: 1164px) 100vw, 1164px" /></figure>



<p class="wp-block-paragraph">You may notice a little circular &#8220;N&#8221; button at the lower left corner &#8211; that&#8217;s a widget that Next.js gives us when running locally in dev mode. (TODO: Give more details about this, probably a link to documentation. This feature is new to me &#8211; apparently it&#8217;s called a &#8220;devIndicator&#8221;).</p>



<h2 class="wp-block-heading" id="h-configuring-the-next-js-app">Configuring the Next.js App</h2>



<p class="wp-block-paragraph">At the start of a new project, I like to get off on the right foot with regard to linting. Our scaffolded app is set up for ESLint out of the box, so I can run <code>yarn lint</code> to check for violations, and there are quite a few!</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1416" height="628" src="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-3.png" alt="" class="wp-image-41412" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-3.png 1416w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-3-300x133.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-3-1024x454.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-3-768x341.png 768w" sizes="(max-width: 1416px) 100vw, 1416px" /></figure>



<p class="wp-block-paragraph">These violations are coming from files that were created by the CLI tool &#8211; I didn&#8217;t write this code. Because of that, I&#8217;d like to ignore these files when doing lint checks &#8211; to do that, I can add the &#8220;types&#8221; folder to the eslint.config.mjs file:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">JavaScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import { defineConfig, globalIgnores } from "eslint/config";
import nextVitals from "eslint-config-next/core-web-vitals";
import nextTs from "eslint-config-next/typescript";

const eslintConfig = defineConfig([
  ...nextVitals,
  ...nextTs,
  // Override default ignores of eslint-config-next.
  globalIgnores(&#91;
    // Default ignores of eslint-config-next:
    ".next/**",
    "out/**",
    "build/**",
    "next-env.d.ts",
    // Custom ignores:
    "types/**",
  &#93;),
]);

export default eslintConfig;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">defineConfig</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">globalIgnores</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;eslint/config&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nextVitals</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;eslint-config-next/core-web-vitals&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nextTs</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;eslint-config-next/typescript&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">eslintConfig</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">defineConfig</span><span style="color: #D4D4D4">([</span></span>
<span class="line"><span style="color: #D4D4D4">  ...</span><span style="color: #9CDCFE">nextVitals</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  ...</span><span style="color: #9CDCFE">nextTs</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// Override default ignores of eslint-config-next.</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">globalIgnores</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Default ignores of eslint-config-next:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;.next/**&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;out/**&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;build/**&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;next-env.d.ts&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Custom ignores:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;types/**&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  &#93;),</span></span>
<span class="line"><span style="color: #D4D4D4">]);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">eslintConfig</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<p class="wp-block-paragraph">Now, if I run <code>yarn lint</code> again, it only raises one violation:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1212" height="394" src="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-4.png" alt="" class="wp-image-41413" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-4.png 1212w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-4-300x98.png 300w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-4-1024x333.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-4-768x250.png 768w" sizes="(max-width: 1212px) 100vw, 1212px" /></figure>



<p class="wp-block-paragraph">Looks like I forgot to use an HTML entity for that apostrophe in my hard-coded text. So I&#8217;ll just fix that:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TSX</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// page.tsx
export default function Home() {
  return (
    &lt;div>
      &lt;main>
        &lt;header>
          &lt;h1>DBA Dashboard&lt;/h1>
        &lt;/header>
        &lt;p>
          Welcome to the DBA Dashboard! There&apos;s not much here yet, but stay
          tuned for updates as we build out the UI for exploring the results
          from the SQL Server First Responder Kit stored procedures.
        &lt;/p>
      &lt;/main>
    &lt;/div>
  );
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// page.tsx</span></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Home</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">main</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">header</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">h1</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">DBA Dashboard</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">h1</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">header</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">p</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          Welcome to the DBA Dashboard! There&apos;s not much here yet, but stay</span></span>
<span class="line"><span style="color: #D4D4D4">          tuned for updates as we build out the UI for exploring the results</span></span>
<span class="line"><span style="color: #D4D4D4">          from the SQL Server First Responder Kit stored procedures.</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">p</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">main</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">After fixing that, ESLint raises no violations, so now we&#8217;re officially starting with a squeaky-clean codebase!</p>



<figure class="wp-block-image size-full"><img decoding="async" width="412" height="181" src="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-5.png" alt="" class="wp-image-41414" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/02/image-5.png 412w, https://static.dmcinfo.com/wp-content/uploads/2026/02/image-5-300x132.png 300w" sizes="(max-width: 412px) 100vw, 412px" /></figure>



<p class="wp-block-paragraph" style="margin-bottom:var(--wp--preset--spacing--50)">In the next blog post, we&#8217;ll be adding a component library to our project: Material UI. A high-quality component library like Material UI makes it easy to build a professional-looking user interface for our dashboard.</p>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step">Have an upcoming project? DMC can help you take the next step.</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Take your project to the next level with engineering solutions from DMC. Learn more about our <a href="https://static.dmcinfo.com/services/application-development/" id="https://static.dmcinfo.com/services/application-development/">Application Development</a> solutions or contact us to get started today!</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://static.dmcinfo.com/blog/41208/building-a-dba-dashboard-with-react-and-next-js-part-1/">Starting a DBA Dashboard with Next.js 16 and React: Dev Diary #1</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Replacing the NET.LOGIX InGear Driver with libplctag.NET</title>
		<link>https://static.dmcinfo.com/blog/41937/replacing-the-net-logix-ingear-driver-with-libplctag-net/</link>
		
		<dc:creator><![CDATA[Ben Harris]]></dc:creator>
		<pubDate>Thu, 12 Mar 2026 12:00:00 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[PLC]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=41937</guid>

					<description><![CDATA[<p>DMC strives to offer stable and up-to-date solutions for our clients. InGear’s NET.LOGIX driver was once a convenient and simple option for communicating between .NET software and various types of PLCs, including Allen Bradley ControlLogix, CompactLogix, SoftLogix, and Micro800 series controllers. However, as of 2026, the NET.LOGIX driver is no longer available or supported by [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/41937/replacing-the-net-logix-ingear-driver-with-libplctag-net/">Replacing the NET.LOGIX InGear Driver with libplctag.NET</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">DMC strives to offer stable and up-to-date solutions for our clients. InGear’s NET.LOGIX driver was once a convenient and simple option for communicating between .NET software and various types of PLCs, including Allen Bradley ControlLogix, CompactLogix, SoftLogix, and Micro800 series controllers. However, as of 2026, the NET.LOGIX driver is no longer available or supported by InGear, and the development license validation is no longer available. Here, DMC discusses an alternative driver: libplctag.NET.</p>



<h2 id="h-what-is-libplctag-net" class="wp-block-heading">What is libplctag.NET?</h2>



<p class="wp-block-paragraph">libplctag is an open-source C library that enables EthernNet/IP and Modbus TCP reading and writing tags on Rockwell/Allen-Bradley ControlLogix, Micro 850, and SLC 500 and MicroLogix PLCs. libplctag.NET is its .NET wrapper and is available on NuGet. You can find the <a href="https://github.com/libplctag/libplctag" type="link" id="https://github.com/libplctag/libplctag" target="_blank" rel="noreferrer noopener">libplctag</a> repository and the <a href="https://github.com/libplctag/libplctag.NET" type="link" id="https://github.com/libplctag/libplctag.NET" target="_blank" rel="noreferrer noopener">libplctag.NET</a> repository as well.</p>



<h3 id="h-advantages-of-libplctag-net" class="wp-block-heading">Advantages of libplctag.NET</h3>



<p class="wp-block-paragraph">One of the biggest advantages of libplctag.NET is that, because it is open source, it does not cost anything! Specifically, the library is dual-licensed under the Mozilla Public License 2.0 (MPL 2.0) and the GNU Lesser/Library General Public License 2+ (LGPL 2+). As mentioned above, libplctag.NET supports EtherNet/IP and Modbus TCP. The provided API is stable and is actively being supported and upgraded. The driver is lightweight, high-performance, and low on memory usage. The documentation and wiki provided in the repositories linked above are very robust and full of examples.</p>



<h3 id="h-example-tag-read-and-write" class="wp-block-heading">Example Tag Read and Write</h3>



<p class="wp-block-paragraph">Below is an example that demonstrates reading and writing a tag to an Allen-Bradley CompactLogix/ControlLogix PLC that was taken from the libplctag.NET documentation.</p>



<figure class="wp-block-image size-full has-custom-border"><img decoding="async" width="505" height="323" src="https://static.dmcinfo.com/wp-content/uploads/2026/03/allen-bradley-compactlogix-controllogix-plc.png" alt="Allen Bradley CompactLogix ControlLogix PLC" class="wp-image-41938" style="border-top-left-radius:20px;border-top-right-radius:20px;border-bottom-left-radius:20px;border-bottom-right-radius:20px" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/03/allen-bradley-compactlogix-controllogix-plc.png 505w, https://static.dmcinfo.com/wp-content/uploads/2026/03/allen-bradley-compactlogix-controllogix-plc-300x192.png 300w" sizes="(max-width: 505px) 100vw, 505px" /></figure>



<p class="wp-block-paragraph">As can be seen in the above example, a new tag can be configured using a simple constructor. Read() gets the current value, and Get[Type]([default]) converts this value to [Type]; in the above example, that would be GetInt32(0), which converts the value to an int. Similarly, writing a new value is as simple as Set[Type]([default], [new_value]), which is SetInt32(0, updatedValue) in the above example, and then calling Write().</p>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step"><strong>Modernize Your PLC Communications with DMC</strong></h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">DMC&#8217;s <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/" data-type="page" data-id="420">Automation</a> experts can bring your next AppDev project to the next level. Learn more about our expertise in <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/plc-programming/" data-type="page" data-id="441">PLC</a> programming.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/41937/replacing-the-net-logix-ingear-driver-with-libplctag-net/">Replacing the NET.LOGIX InGear Driver with libplctag.NET</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Smarter Asset Tracking with Cloud‑Based IoT Solutions</title>
		<link>https://static.dmcinfo.com/blog/41391/iot-solutions-asset-tracking-on-cloud-platforms/</link>
		
		<dc:creator><![CDATA[Kirsten Zimmerle]]></dc:creator>
		<pubDate>Wed, 25 Feb 2026 13:00:00 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[IoT]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=41391</guid>

					<description><![CDATA[<p>As our clients manage more connected devices than ever before &#8211; sensors, trackers, and more spread across cities, factories, or remote locations – DMC is often asked: How do I track and manage these assets in a centralized way? Cloud platforms have emerged as a powerful foundation for tracking IoT assets in real time. By [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/41391/iot-solutions-asset-tracking-on-cloud-platforms/">Smarter Asset Tracking with Cloud‑Based IoT Solutions</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">As our clients manage more connected devices than ever before &#8211; sensors, trackers, and more spread across cities, factories, or remote locations – DMC is often asked: How do I track and manage these assets in a centralized way?</p>



<p class="wp-block-paragraph">Cloud platforms have emerged as a powerful foundation for tracking IoT assets in real time. By combining IoT connectivity with cloud-based data processing and analytics, businesses can monitor device location, health, and performance throughout the entire asset lifecycle. This approach not only improves operational efficiency but also enhances security, reliability, and decision-making in increasingly connected environments. Here, DMC discusses various approaches for asset tracking in the field.</p>



<h2 id="h-options-for-tracking-assets-in-the-cloud" class="wp-block-heading">Options for Tracking Assets in the Cloud</h2>



<p class="wp-block-paragraph">A variety of tools exist to support an organizational strategy for cloud-based asset management. Since this is a broad solution category, with requirements differing from use case to use case, the best structure for a particular organization can vary. Different platforms present tradeoffs in how they model assets, where they run, and how much responsibility they place on engineering teams.</p>



<h3 id="h-open-source-and-self-managed-iot-platforms" class="wp-block-heading">Open-Source and Self-Managed IoT Platforms</h3>



<p class="wp-block-paragraph">Open-source platforms sit at the foundation layer of IoT. They provide the essential capabilities—device connectivity, telemetry ingestion, rules engines, and dashboards—without prescribing how your asset tracking solution should look or behave.</p>



<p class="wp-block-paragraph">These tools appeal to teams that want full control over their data, infrastructure, and deployment model. If your assets don’t fit neatly into predefined schemas or your workflows are non-standard, these platforms can provide the building blocks to model assets exactly the way your business requires. They’re also attractive for organizations that want to avoid vendor lock-in or support hybrid and multi-cloud deployments.</p>



<p class="wp-block-paragraph">The upside of this flexibility is transparency and extensibility. You can inspect the architecture, customize nearly every layer, and keep licensing costs relatively low at small to medium scale. The trade-off, however, is ownership: scaling, securing, and operating the platform requires in-house expertise or professional support.</p>



<p class="wp-block-paragraph">At their core, open-source platforms act as a foundation on which to build your solution, not a finished service you simply turn on.</p>



<p class="wp-block-paragraph"><strong>Examples: Thingsboard, EdgeX Foundry, KubeEdge, and fully custom implementations</strong>.</p>



<h3 id="h-cloud-provider-iot-platforms" class="wp-block-heading">Cloud Provider IoT Platforms</h3>



<p class="wp-block-paragraph">Large cloud providers offer IoT tooling that supports a different approach, with different trade-offs. Rather than focusing on the asset-focused elements of a solution, the core IoT offerings from these large providers tend to focus on doing a few things extremely well: secure device connectivity, massive-scale messaging, and deep integration with cloud services.</p>



<p class="wp-block-paragraph">Asset tracking on these platforms emerges by composing multiple services together—IoT hubs, databases, analytics tools, visualization layers, and automation pipelines. This model works particularly well for large-scale deployments with unpredictable growth, especially when the organization is already heavily invested in a specific cloud ecosystem.</p>



<p class="wp-block-paragraph">The strengths here are hard to ignore: proven global scalability, mature security and identity management, and seamless access to cloud-native analytics, AI, and automation services. The trade-offs are mostly architectural. Asset management is not turnkey, pricing models can be complex, and teams must make careful design decisions across many interconnected services.</p>



<p class="wp-block-paragraph">In short, building your solution with these tools and infrastructure can provide a lot of power and configurability, but the usefulness of the asset tracking solution is defined by how thoughtfully you assemble the stack on top of it.</p>



<p class="wp-block-paragraph"><strong>Examples: AWS IOT and Azure IoT Hub</strong>.</p>



<h3 id="h-edge-first-and-hybrid-iot-platforms" class="wp-block-heading">Edge-First and Hybrid IoT Platforms</h3>



<p class="wp-block-paragraph">It is also worth noting that there are both open-source and large cloud-provider-based options that focus on the edge elements of these solutions. These platforms shift asset tracking closer to where assets actually operate—factories, vehicles, and remote sites. Rather than relying on sending everything to the cloud, these systems enable local processing, decision-making, and resilience in environments with low-latency or intermittent connectivity.</p>



<p class="wp-block-paragraph">This model is especially valuable for safety-critical systems, bandwidth-constrained scenarios, or assets that must continue operating when disconnected. By reducing cloud dependency, edge platforms align more closely with real-world operating conditions.</p>



<p class="wp-block-paragraph">The trade-off is complexity. Edge deployments require device management strategies, careful orchestration, and are often paired with a cloud platform rather than used standalone.</p>



<p class="wp-block-paragraph">Edge-first platforms ultimately redefine asset tracking as distributed by nature, not purely cloud-centric.</p>



<p class="wp-block-paragraph"><strong>Examples: AWS Greengrass, Azure IoT Edge, and EdgeX Foundry</strong>.</p>



<h3 id="h-industrial-and-enterprise-asset-platforms" class="wp-block-heading">Industrial and Enterprise Asset Platforms</h3>



<p class="wp-block-paragraph">Companies focused on manufacturing, industrial, or enterprise applications offer platforms for managing assets that are tailored towards the idea that assets are not just devices emitting data, but long-lived physical entities with maintenance histories, operational constraints, and regulatory requirements.</p>



<p class="wp-block-paragraph">These platforms are common in manufacturing, utilities, energy, and transportation, where assets are expensive, critical, and expected to operate for decades. They excel at rich asset modeling and digital twins, and they often include built-in workflows for maintenance, reliability, and operations. Tight integration with ERP, EAM, and OT systems makes them especially powerful in asset-heavy enterprises.</p>



<p class="wp-block-paragraph">That depth comes at a cost. Implementations tend to be expensive and time-consuming; the solutions are frequently limited in their application, with minimal or limited flexibility for experimental or non-industrial use cases.</p>



<p class="wp-block-paragraph">Here, asset tracking is framed as part of operational activities, rather than merely a data collection exercise.</p>



<p class="wp-block-paragraph"><strong>Examples: Siemens MindSphere, IBM Maximo, and ThingWorx</strong>.</p>



<h3 id="h-managed-iot-and-asset-tracking" class="wp-block-heading">Managed IoT and Asset Tracking </h3>



<p class="wp-block-paragraph">Finally, a wide range of companies offer SaaS or PaaS products in the asset management space. For the most part, these products focus on one thing above all else: reducing complexity. They aim to deliver end-to-end asset tracking solutions with minimal setup, prebuilt dashboards, and opinionated workflows that cover the most common use cases.</p>



<p class="wp-block-paragraph">These tools are well-suited for teams that want faster time-to-value, small to mid-scale deployments, or lack the resources to manage complex cloud architectures. The experience is typically streamlined, pricing is clearer, and operational overhead is much lower than with self-managed platforms.</p>



<p class="wp-block-paragraph">The pain points with these products show up as deployments grow or requirements become more specialized. Customization options can be limited, advanced analytics may be constrained, and vendor lock-in becomes a real consideration.</p>



<p class="wp-block-paragraph">These platforms prioritize speed and reduced complexity over architectural freedom, which can be limiting depending on the application.</p>



<h2 id="h-custom-development-support-for-iot-asset-tracking" class="wp-block-heading">Custom Development Support for IoT Asset Tracking</h2>



<p class="wp-block-paragraph">There’s no single “best” IoT asset tracking platform—only platforms that align more closely with your organization’s scale, requirements, and data handling priorities. Additionally, regardless of the platform selected, some configuration and customization are required to make sure the solution works for your use case. In these cases, support from a team experienced in implementation can make all the difference in delivering a complete, useful tool for your business.&nbsp;</p>



<h3 id="h-infrastructure-and-system-setup" class="wp-block-heading">Infrastructure and System Setup</h3>



<p class="wp-block-paragraph"><a href="https://static.dmcinfo.com/services/application-development/custom-fleet-management-solutions/">Centralizing asset tracking</a> requires setting up the necessary <a href="https://static.dmcinfo.com/services/application-development/cloud-application-development/">cloud infrastructure</a> for managing telemetry from devices, running analytics, and providing user access to data. Working with a team familiar with the <a href="https://static.dmcinfo.com/services/application-development/devops/">tooling</a> and components required helps you to get up and running sooner, with a solution that balances robustness and cost considerations for your specific use case.</p>



<h3 id="h-dashboard-development-or-configuration" class="wp-block-heading">Dashboard Development or Configuration</h3>



<p class="wp-block-paragraph">Much of the value of cloud-based asset management comes from the ability to monitor device status and to run analytics on incoming telemetry. Visualization is an important component of making this data accessible to users, and working with a team familiar with a wide variety of available options ensures you get a result that matches your needs for user accessibility, brand look and feel, and ability to postprocess the data. This might include <a href="https://static.dmcinfo.com/services/application-development/user-interface-design/">UI/UX support</a>, customization of existing tooling, <a href="https://static.dmcinfo.com/services/digital-workplace-solutions/">integration with other applications</a>, <a href="https://static.dmcinfo.com/services/digital-workplace-solutions/business-intelligence/">BI dashboard developmen</a>t, or <a href="https://static.dmcinfo.com/services/application-development/web-application-development/">custom web portal development</a>.</p>



<h3 id="h-edge-device-customization-connectivity-and-firmware" class="wp-block-heading">Edge Device Customization, Connectivity, and Firmware</h3>



<p class="wp-block-paragraph">Whether you are looking to expand your devices&#8217; connectivity or update the capabilities to better support your centralized tracking and management, working with a proven team can ensure the effort is completed to a high technical standard without sacrificing cost and schedule efficiency. This could include hardware updates or a new design to <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/embedded-device-connectivity/">improve device connectivity</a> to the cloud, updating data reporting portions of <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/firmware-programming/">device firmware</a> to best take advantage of the configurability and visibility afforded by centralized asset management, or implementing Over-the-Air (OTA) updates for your device.</p>



<h2 id="h-explore-more-of-our-iot-resources" class="wp-block-heading">Explore more of our IoT resources:</h2>



<ul class="wp-block-list">
<li><a href="https://static.dmcinfo.com/blog/41266/custom-iot-development-services/">Custom IoT Development Services</a></li>



<li><a href="https://static.dmcinfo.com/services/application-development/custom-fleet-management-solutions/">Custom Fleet Management Solutions</a></li>
</ul>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step"><strong>Unlock real-time visibility with a custom IoT asset tracking solution from DMC.</strong></h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Ready to build your Asset Management Solution? Optimize your operations with DMC&#8217;s <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/iot-solutions/" id="704">IoT</a> and <a href="https://static.dmcinfo.com/services/digital-workplace-solutions/cloud-erp-solutions/" data-type="page" data-id="41005">cloud solutions</a> and learn more about our <a href="https://static.dmcinfo.com/services/application-development/" data-type="page" data-id="434">App Development</a> expertise.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/41391/iot-solutions-asset-tracking-on-cloud-platforms/">Smarter Asset Tracking with Cloud‑Based IoT Solutions</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Custom IoT Development Services</title>
		<link>https://static.dmcinfo.com/blog/41266/custom-iot-development-services/</link>
		
		<dc:creator><![CDATA[Kirsten Zimmerle]]></dc:creator>
		<pubDate>Mon, 02 Feb 2026 13:00:00 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[IoT]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=41266</guid>

					<description><![CDATA[<p>The Internet of Things (IoT) is a rapidly growing and evolving technical niche. Driven by the convenience and transparency gains associated with linking a physical object to a digital presence, more businesses are exploring IoT integration as part of their systems. Choosing a platform for an IoT solution is an important part of the process, [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/41266/custom-iot-development-services/">Custom IoT Development Services</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">The Internet of Things (IoT) is a rapidly growing and evolving technical niche. Driven by the convenience and transparency gains associated with linking a physical object to a digital presence, more businesses are exploring IoT integration as part of their systems. Choosing a platform for an IoT solution is an important part of the process, with many options and tradeoffs to consider. Here, we will be discussing when a custom IoT solution is a good choice.</p>



<h2 id="h-iot-solutions-overview" class="wp-block-heading">IoT Solutions Overview</h2>



<p class="wp-block-paragraph">IoT solutions are typically comprised of a fleet of field devices, a cloud-hosted hub to which the devices communicate, and a user portal providing visualization and control.&nbsp;</p>



<p class="wp-block-paragraph">The field devices could be a wide variety of &#8220;things&#8221;, including single-purpose sensors, consumer electronics, manufacturing equipment, vehicles, or many more. Each device is provided with a way to identify itself as unique compared to the rest of the fleet and a protocol for communicating with the hub.</p>



<p class="wp-block-paragraph">The hub system works to send and receive messages to the devices, and to process and save data for the portal to consume.</p>



<p class="wp-block-paragraph">The portal provides an interface for a user to view, handle, and react to the data provided by the field devices and may take the form of a web interface, a mobile application, or both.</p>



<p class="wp-block-paragraph">These solutions provide value for their end users through increased data availability and transparency, as well as convenient device management and control. On the reporting side, messaging from the devices can relay status, utilization, and data for aggregate reporting across the system. On the management side, the portal provides an easy way to view information about the devices, download updates to the devices, or control the configuration in the field.</p>



<h2 id="h-custom-vs-of-the-shelf" class="wp-block-heading">Custom VS. Of-the-Shelf</h2>



<p class="wp-block-paragraph">There are existing solutions available for purchase for a number of use cases that benefit from IoT integration; the most familiar of these might be consumer systems like thermostats or security systems. Other places you might see an off-the-shelf IoT solution could be inventory tracking for retail, or “smart building” solutions that monitor energy use and HVAC conditions.</p>



<p class="wp-block-paragraph">The alternative to an off the shelf is a custom-built solution, where the user application, cloud infrastructure, devices, or all three are self-managed. These solutions might provide a way to add additional visibility to an existing process or define a new system with unique reporting and management requirements, and can be applicable across any industry, with examples ranging from <a href="https://static.dmcinfo.com/our-work/iiot-interface-for-agricultural-irrigation-injection-system/">agriculture</a> to <a href="https://static.dmcinfo.com/our-work/package-delivery-kiosk-system/">logistics</a> to <a href="https://static.dmcinfo.com/our-work/turnkey-iot-product-development-for-morning-star-technology/">consumer products</a>.</p>



<p class="wp-block-paragraph">As such, a necessary choice when deciding to incorporate IoT is whether to go with an off-the-shelf solution or to build a custom setup.</p>



<h2 id="h-when-to-build-a-custom-iot-solution" class="wp-block-heading">When to Build a Custom IoT Solution</h2>



<p class="wp-block-paragraph">Custom IoT Solutions provide advantages in flexibility and control over their off-the-shelf counterparts. Here are some cases where those advantages might make building a custom IoT solution the right choice:</p>



<h3 id="h-creating-or-integrating-a-custom-device" class="wp-block-heading">Creating or Integrating a Custom Device</h3>



<p class="wp-block-paragraph">When working with a custom device, the ability to control the messaging capabilities, formatting, and frequency that a custom solution provides can be very useful. Additionally, setting up the cloud side of the system to work directly with the device allows for extended remote capabilities, such as Over the Air (OTA) updates to the devices and direct control of the device or device configuration.</p>



<h3 id="h-specific-management-or-reporting-requirements" class="wp-block-heading">Specific Management or Reporting Requirements</h3>



<p class="wp-block-paragraph">Making specific workflows or reports work with vendor systems can be a challenge. Therefore, custom solutions deliver value in this area by reducing or removing the dependency on external systems; if the solution is built custom, it can be built to match the desired workflows and provide the desired data from the end device without excessive configuration.</p>



<h3 id="h-maintaining-future-flexibility" class="wp-block-heading">Maintaining Future Flexibility</h3>



<p class="wp-block-paragraph">Custom solutions can change as the system does; if components change or new requirements come up, the solution can be updated to match. In addition to uncoupling the solution from a vendor’s roadmap, this can also facilitate the agile development of new systems by allowing solution components to evolve together.</p>



<h3 id="h-infrastructure-and-cost-control" class="wp-block-heading">Infrastructure and Cost Control</h3>



<p class="wp-block-paragraph">Custom solutions provide direct access to and control over the associated cloud resources. This&nbsp;provides complete control over how data is routed, stored, and secured relative to other business data, rather than depending on a third-party cloud tenant. If a business already maintains a cloud tenant, the infrastructure required for an IoT solution can frequently be added in a straightforward way. Direct access to these resources can also provide better visibility and control over recurring hosting costs, rather than this information being obscured by a license.</p>



<h2 id="h-advantages-of-working-with-a-software-engineering-firm-for-custom-iot-solutions" class="wp-block-heading">Advantages of Working with a Software Engineering Firm for Custom IoT Solutions</h2>



<p class="wp-block-paragraph">If building a custom IoT solution looks like the right option for your business, a software engineering firm can help your implementation project run smoothly and be completed successfully. Working with a team of engineers experienced in custom specifications and implementing the necessary components brings a breadth of experience to building the solution that you may not otherwise achieve.</p>



<h3 id="h-technology-expertise" class="wp-block-heading">Technology Expertise</h3>



<p class="wp-block-paragraph">The first advantage a firm like DMC can bring to your project is expertise in the technologies underlying <a href="https://static.dmcinfo.com/services/application-development/iot-solutions/">IoT solutions</a>. This includes experience <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/">designing and writing firmware</a> for custom devices, implementing <a href="https://static.dmcinfo.com/services/application-development/cloud-application-development/">cloud architectures</a>, and developing custom <a href="https://static.dmcinfo.com/services/application-development/web-application-development/">web</a> or <a href="https://static.dmcinfo.com/services/application-development/mobile-application-development/">mobile</a> applications. This expertise enables the team to build system components efficiently and cost-effectively and implement the communication interfaces between them. Additionally, experience in the platforms used means implementation can avoid common pitfalls.</p>



<h3 id="h-thorough-design-process" class="wp-block-heading">Thorough Design Process</h3>



<p class="wp-block-paragraph">Another advantage of working with a software firm to build out a custom IoT solution is the thorough design process. Since the team frequently works to customer specifications, there is an established process to make sure the solution is designed to best match all of your requirements.</p>



<p class="wp-block-paragraph">First, engineers will work with you to refine your requirements into specifications for user workflows and device communication. Then, the UI/UX team can develop mock-ups of the project interfaces. After review, the team can begin building the components and regularly review them with the client team to ensure alignment.</p>



<h3 id="h-project-management" class="wp-block-heading">Project Management</h3>



<p class="wp-block-paragraph">Finally, working with a software firm also brings the advantage of a dedicated project manager and an established project management process for your implementation. The project manager is familiar with the tasks required to deliver the solution successfully and is equipped with tools to track the schedule, budget, and requirements. A standard cadence of meetings and status updates keeps you involved in the development effort, able to provide feedback, ask questions, and guide the solution over the course of building the solution. Additionally, as the project evolves, the dedicated project manager can quickly reprioritize tasks and generate new specifications as needed.</p>



<h2 id="h-explore-our-work-in-iot" class="wp-block-heading">Explore Our Work in IoT</h2>



<div class="wp-block-group alignwide is-layout-flow wp-block-group-is-layout-flow">
<div class="wp-block-cb-carousel-v2 cb-carousel-block" data-cb-slides-per-view="1" data-cb-slides-per-group="1" data-cb-space-between="15" data-cb-speed="300" data-cb-navigation="true" data-cb-pagination="true" data-cb-loop="true" data-cb-autoplay="true" data-cb-autoplay-speed="3000" data-cb-breakpoints="{&quot;768&quot;:{&quot;slidesPerView&quot;:3,&quot;slidesPerGroup&quot;:1}}"><div class="swiper"><div class="cb-wrapper swiper-wrapper">
<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-15218 our_work type-our_work status-publish has-post-thumbnail hentry work_category-azure work_category-digital-workplace-solutions work_category-food-and-beverage work_category-internet-of-things-iot">
<figure class="wp-block-post-featured-image"><a href="https://static.dmcinfo.com/our-work/operational-technology-network-security-monitoring/" target="_self" ><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Operational-Technology-Network-Security-Monitoring.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Operational Technology Network Security Monitoring" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/Operational-Technology-Network-Security-Monitoring.png 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Operational-Technology-Network-Security-Monitoring-300x107.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Operational-Technology-Network-Security-Monitoring-1024x366.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Operational-Technology-Network-Security-Monitoring-768x274.png 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></figure>

<h4 class="has-link-color wp-elements-1 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/operational-technology-network-security-monitoring/" target="_self" >Operational Technology Network Security Monitoring</a></h4>
</li></ul></div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-15018 our_work type-our_work status-publish has-post-thumbnail hentry work_category-consumer-goods work_category-embedded-development-programming work_category-internet-of-things-iot work_category-product-development">
<figure class="wp-block-post-featured-image"><a href="https://static.dmcinfo.com/our-work/turnkey-iot-product-development-for-morning-star-technology/" target="_self" ><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-123.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Turnkey IoT Product Development for Morning Star Technology" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-123.png 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-123-300x107.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-123-1024x366.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-123-768x274.png 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></figure>

<h4 class="has-link-color wp-elements-2 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/turnkey-iot-product-development-for-morning-star-technology/" target="_self" >Turnkey IoT Product Development for Morning Star Technology</a></h4>
</li></ul></div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-14893 our_work type-our_work status-publish has-post-thumbnail hentry work_category-application-development work_category-battery-pack-test-systems work_category-consumer-goods work_category-internet-of-things-iot work_category-test-measurement-automation work_category-user-interface-design work_category-web-application-development">
<figure class="wp-block-post-featured-image"><a href="https://static.dmcinfo.com/our-work/aws-cloud-hosted-battery-management-system/" target="_self" ><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-96.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="AWS Cloud Hosted Battery Management System" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-96.png 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-96-300x107.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-96-1024x366.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-96-768x274.png 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></figure>

<h4 class="has-link-color wp-elements-3 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/aws-cloud-hosted-battery-management-system/" target="_self" >AWS Cloud Hosted Battery Management System</a></h4>
</li></ul></div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-14842 our_work type-our_work status-publish has-post-thumbnail hentry work_category-application-development work_category-azure work_category-digital-workplace-solutions work_category-internet-of-things-iot work_category-web-application-development">
<figure class="wp-block-post-featured-image"><a href="https://static.dmcinfo.com/our-work/iot-application-for-water-leak-detection-and-correction/" target="_self" ><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/IoT-Application-for-Water-Leak-AWSAM.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="IoT Application for Water Leak Detection and Correction" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/IoT-Application-for-Water-Leak-AWSAM.jpg 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/05/IoT-Application-for-Water-Leak-AWSAM-300x107.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/IoT-Application-for-Water-Leak-AWSAM-1024x366.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/05/IoT-Application-for-Water-Leak-AWSAM-768x274.jpg 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></figure>

<h4 class="has-link-color wp-elements-4 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/iot-application-for-water-leak-detection-and-correction/" target="_self" >IoT Application for Water Leak Detection and Correction</a></h4>
</li></ul></div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-14800 our_work type-our_work status-publish has-post-thumbnail hentry work_category-application-development work_category-azure work_category-chemical work_category-digital-workplace-solutions work_category-energy-and-utilities work_category-internet-of-things-iot work_category-manufacturing-automation-and-intelligence work_category-plc-programming work_category-siemens-plc work_category-user-interface-design work_category-web-application-development">
<figure class="wp-block-post-featured-image"><a href="https://static.dmcinfo.com/our-work/iiot-interface-for-agricultural-irrigation-injection-system/" target="_self" ><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-86.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="IIoT Interface for Agricultural Irrigation Injection System" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-86.png 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-86-300x107.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-86-1024x366.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-86-768x274.png 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></figure>

<h4 class="has-link-color wp-elements-5 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/iiot-interface-for-agricultural-irrigation-injection-system/" target="_self" >IIoT Interface for Agricultural Irrigation Injection System</a></h4>
</li></ul></div>
</div>
</div></div><div class="cb-pagination swiper-pagination"></div><div class="cb-button-prev swiper-button-prev"></div><div class="cb-button-next swiper-button-next"></div></div>
</div>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step"><strong>Looking for a custom IoT solution? DMC&#8217;s experts can help you build and scale it.</strong></h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Take your project to the next level with engineering solutions from DMC. Learn more about our <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/" id="420">Automation</a> and <a href="https://static.dmcinfo.com/services/test-and-measurement-automation/" id="428">Test &amp; Measurement</a> solutions for your next <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/iot-solutions/" data-type="page" data-id="704">IoT project</a>.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://static.dmcinfo.com/blog/41266/custom-iot-development-services/">Custom IoT Development Services</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A Complete Guide to Planning Your IIoT Solution</title>
		<link>https://static.dmcinfo.com/blog/20635/a-complete-guide-to-planning-your-iiot-solution/</link>
		
		<dc:creator><![CDATA[Chase Hollingsead]]></dc:creator>
		<pubDate>Fri, 26 Sep 2025 16:00:00 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Digital Workplace Solutions]]></category>
		<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[Ignition]]></category>
		<category><![CDATA[Manufacturing Automation & Intelligence]]></category>
		<category><![CDATA[Test and Measurement Automation]]></category>
		<category><![CDATA[Web Application Development]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=20635</guid>

					<description><![CDATA[<p>IoT or Internet of Things is a &#8220;system of interrelated computing devices, mechanical and digital machines, objects, animals, or people provided with unique identifiers and the ability to transfer data over a network without requiring human-to-human or human-to-computer interaction.&#8221; The Internet of Things continues to develop as technology advances, and the need to interact with [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/20635/a-complete-guide-to-planning-your-iiot-solution/">A Complete Guide to Planning Your IIoT Solution</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><a href="https://static.dmcinfo.com/services/application-development/iot-solutions">IoT or Internet of Things</a> is a &#8220;system of interrelated computing devices, mechanical and digital machines, objects, animals, or people provided with unique identifiers and the ability to transfer data over a network without requiring human-to-human or human-to-computer interaction.&#8221; The Internet of Things continues to develop as technology advances, and the need to interact with devices in a new way continues to develop.</p>



<p class="wp-block-paragraph">Out of IoT, IIoT, or the Industrial Internet of Things, is emerging as a common and necessary term. This guide provides insight into IIoT and into DMC&#8217;s process for completing successful IIoT projects.</p>


<hr />


<h2 id="h-table-of-contents" class="wp-block-heading"><a id="Table of Contents" name="Table of Contents">Table of Contents</a></h2>



<ul class="wp-block-list">
<li style="line-height:30px;font-size:18px"><a href="#IIoT Overview">IIoT Overview</a></li>



<li style="line-height:30px;font-size:18px"><a href="#Our Five-Step Process">Our Five-Step Process</a></li>



<li style="line-height:30px;font-size:18px"><a href="#Step One: Field Device Platform Selection">Step One: Field Device Platform Selection</a></li>



<li style="line-height:30px;font-size:18px"><a href="#Step Two: Determine Communications">Step Two: Determine Communications</a></li>



<li style="line-height:30px;font-size:18px"><a href="#Step Three: Determine Cloud Platform">Step Three: Determine Cloud Platform</a></li>



<li style="line-height:30px;font-size:18px"><a href="#Step Four: Web Application Development">Step Four: Web Application Development</a></li>



<li style="line-height:30px;font-size:18px"><a href="#Step Five: Go Live and Maintenance">Step Five: Go Live and Maintenance</a></li>
</ul>


<hr />


<h2 id="h-iiot-overview" class="wp-block-heading"><a id="IIoT Overview" name="IIoT Overview"></a>IIoT Overview</h2>



<p class="wp-block-paragraph">Much like IoT, IIoT uses sensors and other technology but in an industrial setting to leverage real-time data to monitor and control devices in the field and communicate and display that data in a way that allows for better decision making in industrial processes.</p>


<hr />


<h2 id="h-our-five-step-process" class="wp-block-heading"><a id="Our Five-Step Process" name="Our Five-Step Process"></a>Our Five-Step Process</h2>



<p class="wp-block-paragraph">DMC has completed hundreds of projects incorporating a wide range of solutions. Through experience, our engineers have developed a process for implementing IIoT solutions. We begin by starting at the lowest level and then fill in the gaps, going up the stack.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/IIoT-DMC-Five-Steps.png" alt="DMC IIoT Five Step Process"/></figure>



<h2 id="h-step-one-field-device-platform-selection" class="wp-block-heading"><a id="Step One: Field Device Platform Selection" name="Step One: Field Device Platform Selection"></a>Step One: Field Device Platform Selection</h2>



<p class="wp-block-paragraph">Getting reliable, accurate data from the physical system is the primary challenge for any system design and the most important decision you can make. Once you secure the data, you can do anything you want with it. Answer the following questions to select hardware used in the field:</p>



<ul class="wp-block-list">
<li>What are you trying to measure or control?</li>



<li>What does the device in the field need to be able to do on its own? How complex?</li>



<li>How many devices do you anticipate on deploying?</li>



<li>Are you the end-user and maintainer of this equipment, or are you selling a solution (operated and maintained by others)?</li>



<li>What does new device provisioning look like? (the ideal process)</li>



<li>How will this device be powered?</li>
</ul>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/IIOT-Process-Step-One-Chart.png" alt="Step One"/></figure>



<p class="wp-block-paragraph">Keep in mind, the software platform is determined by hardware selection. For example, when you pick a particular PLC, you have to use the manufacturer&#8217;s&nbsp;software to program it. For an embedded device this will be C++, etc.</p>



<p class="wp-block-paragraph"><strong>Device Hardware: Selecting the Right Parts</strong></p>



<p class="wp-block-paragraph">Let’s say the average PLC costs $1,000, so every time you put one out in the field, that is another $1,000 of hard costs. PLCs are great for&nbsp;some things while NI has developed expert tech for other uses. DMC engineers can leverage experience from hundreds&nbsp;of completed projects to&nbsp;advise on making the best choice for each project.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Device-Hardware-Selecting-the-right-parts-graphic.png" alt=""/></figure>



<p class="wp-block-paragraph"><strong>0-10 Devices</strong> – Small Deployments</p>



<p class="wp-block-paragraph"><strong>10-100 Devices </strong>– Larger Deployment, off the shelf products, but start to have cost-optimized decisions</p>



<p class="wp-block-paragraph"><strong>100-1000+ Devices</strong> &#8211; Discuss an embedded solution because the hardware starts to get expensive</p>



<h2 id="h-step-two-determine-communications" class="wp-block-heading"><a id="Step Two: Determine Communications" name="Step Two: Determine Communications"></a>Step Two: Determine Communications</h2>



<p class="wp-block-paragraph">After determining your device platform, deciding how your networking devices are configured is key. Consistent communication between devices is essential. DMC&#8217;s engineers help scope what needs to be done. Consider the following:</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Step-Two-Determine-Communications-Graphic.png" alt=""/></figure>



<ul class="wp-block-list">
<li>How are you going to communicate with devices?</li>



<li>Where is the internet coming from?
 
 
<ul class="wp-block-list">
<li>Cellular, Wi-Fi, from the plant?</li>
</ul>
</li>



<li>What happens when the internet is not available?
 
 
<ul class="wp-block-list">
<li>Local caching, buffer and retry, operational impacts</li>
</ul>
</li>



<li>What are the protocol security requirements?
 
 
<ul class="wp-block-list">
<li>Encryptions, certificates, secure comm management</li>
</ul>
</li>
</ul>



<h2 id="h-step-three-determine-cloud-platform" class="wp-block-heading"><a id="Step Three: Determine Cloud Platform" name="Step Three: Determine Cloud Platform"></a>Step Three: Determine Cloud Platform</h2>



<p class="wp-block-paragraph">There are a lot of cloud platforms to choose from when you reach this phase of the process.&nbsp;Ask yourself, what out of the box services (provided by these hosting entities) will your application need/or take advantage of? Some cloud platforms include&nbsp;Azure,&nbsp;AWS, and&nbsp;Google.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Cloud-Platforms.png" alt=""/></figure>



<p class="wp-block-paragraph">This phase is when we need to assess how to save on custom development, and where it&#8217;s possible to use solid foundational pieces already developed for these types of applications. Ask yourself:</p>



<ul class="wp-block-list">
<li>Do you need a website?</li>



<li>Do you need database(s)?</li>



<li>Do you need user management?</li>



<li>Do you need integrations to other cloud services?</li>



<li>Do you need SMS, e-Mail, or other mass notification capabilities?</li>



<li>Do you need an AI engine or advanced analytics support?</li>



<li>Do you need a flexible reporting framework (points to things like PowerBI)?</li>



<li>What type of data store is needed?
 
 
<ul class="wp-block-list">
<li>How much data?</li>



<li>How often will it be sampled?</li>



<li>How will the data be used?</li>
</ul>
</li>



<li>Where and how will security be enforced for cloud resources?</li>



<li>How many monthly active users do you anticipate on this cloud application?</li>



<li>What in house cloud/web development resources do you have?
 
 
<ul class="wp-block-list">
<li>What are they comfortable with and willing to maintain?</li>
</ul>
</li>
</ul>



<h2 id="h-step-four-web-application-development" class="wp-block-heading"><a id="Step Four: Web Application Development" name="Step Four: Web Application Development"></a>Step Four: Web Application Development</h2>



<p class="wp-block-paragraph">DMC’s full-stack development team builds custom web applications with&nbsp;<a href="https://static.dmcinfo.com/services/application-development/#interfaces-and-backends">intuitive interfaces designed for usability and stable back ends designed for scalability.</a>&nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/C2Sense-Dashboard-Updated-2-1.png" alt=""/></figure>



<p class="wp-block-paragraph">Consider the following during this step:</p>



<ul class="wp-block-list">
<li>Define the UI/UX experience</li>



<li>How are you going to onboard new users?</li>



<li>How are you going to onboard new devices?</li>



<li>How are you going to manage devices?</li>



<li>How are users going to view data?</li>



<li>What access restrictions should apply? (user levels)</li>



<li>What types of notification and alerts are required?</li>



<li>When should devices be alerted to changes?</li>



<li>What visualizations for data or information are required?</li>



<li>What type of reporting is required? How are users notified of reports?</li>



<li>Is a native Mobile App also required?</li>



<li>Is a generic API (accessible by third parties) required?</li>



<li>Define support plan for end-users of the application</li>
</ul>



<h2 id="h-step-five-go-live-and-maintenance" class="wp-block-heading"><a id="Step Five: Go Live and Maintenance" name="Step Five: Go Live and Maintenance"></a>Step Five: Go Live and Maintenance</h2>



<ul class="wp-block-list">
<li>Are you using continuous Integration tools in Development, Staging, and Production environments?</li>



<li>Do you have planned downtime for production-level updates?</li>



<li>Are database migrations required? Data integrity checks?</li>



<li>Deploy and active service health monitors?</li>



<li>Are support and service avenues (emails/phone) active and being monitored?</li>
</ul>



<div class="wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-69f7dce8 wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--60);padding-right:0;padding-bottom:var(--wp--preset--spacing--60);padding-left:0">
<div class="wp-block-group alignwide is-layout-flow wp-block-group-is-layout-flow">
<h2 id="h-industry-credentials" class="wp-block-heading">Industry Credentials</h2>



<p class="wp-block-paragraph">DMC holds several key industry credentials with leading technology providers.</p>



<div class="wp-block-cb-carousel-v2 cb-carousel-block" data-cb-slides-per-view="1" data-cb-slides-per-group="1" data-cb-space-between="20" data-cb-speed="300" data-cb-navigation="true" data-cb-pagination="true" data-cb-loop="true" data-cb-autoplay="true" data-cb-autoplay-speed="1500" data-cb-breakpoints="{&quot;768&quot;:{&quot;slidesPerView&quot;:5,&quot;slidesPerGroup&quot;:1}}"><div class="swiper"><div class="cb-wrapper swiper-wrapper">
<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-group has-custom-light-gray-neutral-2-background-color has-background has-global-padding is-layout-constrained wp-container-core-group-is-layout-aa06d7d7 wp-block-group-is-layout-constrained" style="border-radius:20px;min-height:175px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-6d407f44 wp-block-group-is-layout-flex" style="min-height:130px">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="500" height="308" src="https://static.dmcinfo.com/wp-content/uploads/2025/09/Silver-Alliance-Partner-Membership-Logo.png" alt="National Instruments membership logo" class="wp-image-38744" style="object-fit:cover;width:161px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/09/Silver-Alliance-Partner-Membership-Logo.png 500w, https://static.dmcinfo.com/wp-content/uploads/2025/09/Silver-Alliance-Partner-Membership-Logo-300x185.png 300w" sizes="(max-width: 500px) 100vw, 500px" /></figure>
</div>
</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-group has-custom-light-gray-neutral-2-background-color has-background has-global-padding is-layout-constrained wp-container-core-group-is-layout-aa06d7d7 wp-block-group-is-layout-constrained" style="border-radius:20px;min-height:175px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<div class="wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-ec272ca4 wp-block-group-is-layout-flex" style="min-height:130px">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="700" height="340" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/siemens-solution-partner-logo-1.jpg" alt="siemens solution partner logo" class="wp-image-20625" style="width:164px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/siemens-solution-partner-logo-1.jpg 700w, https://static.dmcinfo.com/wp-content/uploads/2025/05/siemens-solution-partner-logo-1-300x146.jpg 300w" sizes="(max-width: 700px) 100vw, 700px" /></figure>
</div>
</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-group has-custom-light-gray-neutral-2-background-color has-background has-global-padding is-layout-constrained wp-container-core-group-is-layout-aa06d7d7 wp-block-group-is-layout-constrained" style="border-radius:20px;min-height:175px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<div class="wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-ec272ca4 wp-block-group-is-layout-flex" style="min-height:130px">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="1452" height="335" src="https://static.dmcinfo.com/wp-content/uploads/2025/06/Microsoft-Solutions-Partner-logo.png" alt="Microsoft Solutions Partner" class="wp-image-31568" style="width:155px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/06/Microsoft-Solutions-Partner-logo.png 1452w, https://static.dmcinfo.com/wp-content/uploads/2025/06/Microsoft-Solutions-Partner-logo-300x69.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/06/Microsoft-Solutions-Partner-logo-1024x236.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/06/Microsoft-Solutions-Partner-logo-768x177.png 768w" sizes="(max-width: 1452px) 100vw, 1452px" /></figure>
</div>
</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-group has-custom-light-gray-neutral-2-background-color has-background has-global-padding is-layout-constrained wp-container-core-group-is-layout-aa06d7d7 wp-block-group-is-layout-constrained" style="border-radius:20px;min-height:175px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<div class="wp-block-group wp-container-content-69bc4bdf is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-ec272ca4 wp-block-group-is-layout-flex" style="min-height:130px">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="350" height="350" src="https://static.dmcinfo.com/wp-content/uploads/2025/04/image-120.png" alt="Ignition Premier Integrator" class="wp-image-2545" style="object-fit:cover;width:108px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/04/image-120.png 350w, https://static.dmcinfo.com/wp-content/uploads/2025/04/image-120-300x300.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/04/image-120-150x150.png 150w" sizes="(max-width: 350px) 100vw, 350px" /></figure>
</div>
</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-group has-custom-light-gray-neutral-2-background-color has-background has-global-padding is-layout-constrained wp-container-core-group-is-layout-aa06d7d7 wp-block-group-is-layout-constrained" style="border-radius:20px;min-height:175px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<div class="wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-ec272ca4 wp-block-group-is-layout-flex" style="min-height:130px">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="4000" height="1484" src="https://static.dmcinfo.com/wp-content/uploads/2025/06/AVEVA-Partner-Badge_System-Integrator_Certified_RGB.png" alt="Aveva Partner badge" class="wp-image-33216" style="object-fit:cover;width:144px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/06/AVEVA-Partner-Badge_System-Integrator_Certified_RGB.png 4000w, https://static.dmcinfo.com/wp-content/uploads/2025/06/AVEVA-Partner-Badge_System-Integrator_Certified_RGB-300x111.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/06/AVEVA-Partner-Badge_System-Integrator_Certified_RGB-1024x380.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/06/AVEVA-Partner-Badge_System-Integrator_Certified_RGB-768x285.png 768w, https://static.dmcinfo.com/wp-content/uploads/2025/06/AVEVA-Partner-Badge_System-Integrator_Certified_RGB-1536x570.png 1536w, https://static.dmcinfo.com/wp-content/uploads/2025/06/AVEVA-Partner-Badge_System-Integrator_Certified_RGB-2048x760.png 2048w" sizes="(max-width: 4000px) 100vw, 4000px" /></figure>
</div>
</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-group has-custom-light-gray-neutral-2-background-color has-background has-global-padding is-layout-constrained wp-container-core-group-is-layout-aa06d7d7 wp-block-group-is-layout-constrained" style="border-radius:20px;min-height:175px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<div class="wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-ec272ca4 wp-block-group-is-layout-flex" style="min-height:130px">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="700" height="168" src="https://static.dmcinfo.com/wp-content/uploads/2025/03/kepware-logo-resized.png" alt="Kepware logo" class="wp-image-136" style="width:152px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/03/kepware-logo-resized.png 700w, https://static.dmcinfo.com/wp-content/uploads/2025/03/kepware-logo-resized-300x72.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></figure>
</div>
</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-group has-custom-light-gray-neutral-2-background-color has-background has-global-padding is-layout-constrained wp-container-core-group-is-layout-aa06d7d7 wp-block-group-is-layout-constrained" style="border-radius:20px;min-height:175px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<div class="wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-ec272ca4 wp-block-group-is-layout-flex" style="min-height:130px">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="750" height="233" src="https://static.dmcinfo.com/wp-content/uploads/2025/06/Rockwell-Gold-System-Integrator-2.png" alt="Rockwell Gold System Integrator" class="wp-image-32507" style="width:167px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/06/Rockwell-Gold-System-Integrator-2.png 750w, https://static.dmcinfo.com/wp-content/uploads/2025/06/Rockwell-Gold-System-Integrator-2-300x93.png 300w" sizes="(max-width: 750px) 100vw, 750px" /></figure>
</div>
</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-group has-custom-light-gray-neutral-2-background-color has-background has-global-padding is-layout-constrained wp-container-core-group-is-layout-aa06d7d7 wp-block-group-is-layout-constrained" style="border-radius:20px;min-height:175px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<div class="wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-ec272ca4 wp-block-group-is-layout-flex" style="min-height:130px">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="350" height="134" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Xively-Partner-Logo_1.png" alt="Xively Partner Logo 1" class="wp-image-20631" style="width:167px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/Xively-Partner-Logo_1.png 350w, https://static.dmcinfo.com/wp-content/uploads/2025/05/Xively-Partner-Logo_1-300x115.png 300w" sizes="(max-width: 350px) 100vw, 350px" /></figure>
</div>
</div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-group has-custom-light-gray-neutral-2-background-color has-background has-global-padding is-layout-constrained wp-container-core-group-is-layout-aa06d7d7 wp-block-group-is-layout-constrained" style="border-radius:20px;min-height:175px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)">
<div class="wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-ec272ca4 wp-block-group-is-layout-flex" style="min-height:130px">
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="2560" height="652" src="https://static.dmcinfo.com/wp-content/uploads/2019/10/MQTT-logo.png" alt="MQTT-logo" class="wp-image-38746" style="width:167px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2019/10/MQTT-logo.png 2560w, https://static.dmcinfo.com/wp-content/uploads/2019/10/MQTT-logo-300x76.png 300w, https://static.dmcinfo.com/wp-content/uploads/2019/10/MQTT-logo-1024x261.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2019/10/MQTT-logo-768x196.png 768w, https://static.dmcinfo.com/wp-content/uploads/2019/10/MQTT-logo-1536x391.png 1536w, https://static.dmcinfo.com/wp-content/uploads/2019/10/MQTT-logo-2048x522.png 2048w" sizes="(max-width: 2560px) 100vw, 2560px" /></figure>
</div>
</div>
</div>
</div></div><div class="cb-pagination swiper-pagination"></div><div class="cb-button-prev swiper-button-prev"></div><div class="cb-button-next swiper-button-next"></div></div>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-outline is-style-outline--1"><a class="wp-block-button__link wp-element-button" href="https://static.dmcinfo.com/about/partners/">View all partners</a></div>
</div>
</div>
</div>



<h2 id="h-our-work" class="wp-block-heading">Our Work</h2>



<div class="wp-block-group alignwide is-layout-flow wp-block-group-is-layout-flow">
<div class="wp-block-cb-carousel-v2 cb-carousel-block" data-cb-slides-per-view="1" data-cb-slides-per-group="1" data-cb-space-between="15" data-cb-speed="300" data-cb-navigation="true" data-cb-pagination="true" data-cb-loop="true" data-cb-autoplay="true" data-cb-autoplay-speed="3000" data-cb-breakpoints="{&quot;768&quot;:{&quot;slidesPerView&quot;:3,&quot;slidesPerGroup&quot;:1}}"><div class="swiper"><div class="cb-wrapper swiper-wrapper">
<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-14893 our_work type-our_work status-publish has-post-thumbnail hentry work_category-application-development work_category-battery-pack-test-systems work_category-consumer-goods work_category-internet-of-things-iot work_category-test-measurement-automation work_category-user-interface-design work_category-web-application-development">
<figure class="wp-block-post-featured-image"><a href="https://static.dmcinfo.com/our-work/aws-cloud-hosted-battery-management-system/" target="_self" ><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-96.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="AWS Cloud Hosted Battery Management System" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-96.png 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-96-300x107.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-96-1024x366.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-96-768x274.png 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></figure>

<h4 class="has-link-color wp-elements-6 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/aws-cloud-hosted-battery-management-system/" target="_self" >AWS Cloud Hosted Battery Management System</a></h4>
</li></ul></div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-14800 our_work type-our_work status-publish has-post-thumbnail hentry work_category-application-development work_category-azure work_category-chemical work_category-digital-workplace-solutions work_category-energy-and-utilities work_category-internet-of-things-iot work_category-manufacturing-automation-and-intelligence work_category-plc-programming work_category-siemens-plc work_category-user-interface-design work_category-web-application-development">
<figure class="wp-block-post-featured-image"><a href="https://static.dmcinfo.com/our-work/iiot-interface-for-agricultural-irrigation-injection-system/" target="_self" ><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-86.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="IIoT Interface for Agricultural Irrigation Injection System" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-86.png 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-86-300x107.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-86-1024x366.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-86-768x274.png 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></figure>

<h4 class="has-link-color wp-elements-7 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/iiot-interface-for-agricultural-irrigation-injection-system/" target="_self" >IIoT Interface for Agricultural Irrigation Injection System</a></h4>
</li></ul></div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-14433 our_work type-our_work status-publish has-post-thumbnail hentry work_category-application-development work_category-automotive work_category-azure work_category-digital-workplace-solutions work_category-energy-and-utilities work_category-infrastructure work_category-internet-of-things-iot work_category-manufacturing-automation-and-intelligence work_category-oil-and-gas-engineering work_category-plc-programming work_category-web-application-development">
<figure class="wp-block-post-featured-image"><a href="https://static.dmcinfo.com/our-work/vehicle-fleet-tracking-and-monitoring-system/" target="_self" ><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-41.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Vehicle Fleet Tracking and Monitoring System" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-41.png 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-41-300x107.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-41-1024x366.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-41-768x274.png 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></figure>

<h4 class="has-link-color wp-elements-8 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/vehicle-fleet-tracking-and-monitoring-system/" target="_self" >Vehicle Fleet Tracking and Monitoring System</a></h4>
</li></ul></div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-43049 our_work type-our_work status-publish has-post-thumbnail hentry work_category-magnemotion work_category-manufacturing-automation-and-intelligence work_category-rockwell-factorytalk work_category-semiconductor">
<figure class="wp-block-post-featured-image"><a href="https://static.dmcinfo.com/our-work/semiconductor-automated-material-handling-system-amhs/" target="_self" ><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2026/04/semiconductor-AMHS-modernization-for-manufacturing.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Semiconductor AMHS for Scalable, High-Throughput Manufacturing Facility" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2026/04/semiconductor-AMHS-modernization-for-manufacturing.jpg 1400w, https://static.dmcinfo.com/wp-content/uploads/2026/04/semiconductor-AMHS-modernization-for-manufacturing-300x107.jpg 300w, https://static.dmcinfo.com/wp-content/uploads/2026/04/semiconductor-AMHS-modernization-for-manufacturing-1024x366.jpg 1024w, https://static.dmcinfo.com/wp-content/uploads/2026/04/semiconductor-AMHS-modernization-for-manufacturing-768x274.jpg 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></figure>

<h4 class="has-link-color wp-elements-9 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/semiconductor-automated-material-handling-system-amhs/" target="_self" >Semiconductor AMHS for Scalable, High-Throughput Manufacturing Facility</a></h4>
</li></ul></div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-14788 our_work type-our_work status-publish has-post-thumbnail hentry work_category-application-development work_category-automotive work_category-internet-of-things-iot work_category-manufacturing-automation-and-intelligence work_category-plc-programming work_category-siemens-plc work_category-user-interface-design work_category-web-application-development">
<figure class="wp-block-post-featured-image"><a href="https://static.dmcinfo.com/our-work/data-collection-through-iot-using-siemens-mqtt-aws-and-react/" target="_self" ><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-84.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Data Collection Through IoT Using Siemens, MQTT, AWS, and REACT" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-84.png 1400w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-84-300x107.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-84-1024x366.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2025/05/unnamed-file-84-768x274.png 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></figure>

<h4 class="has-link-color wp-elements-10 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/data-collection-through-iot-using-siemens-mqtt-aws-and-react/" target="_self" >Data Collection Through IoT Using Siemens, MQTT, AWS, and REACT</a></h4>
</li></ul></div>
</div>



<div class="wp-block-cb-slide-v2 cb-slide swiper-slide">
<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-14525 our_work type-our_work status-publish has-post-thumbnail hentry work_category-application-development work_category-embedded-development-programming work_category-energy-and-utilities work_category-internet-of-things-iot">
<figure class="wp-block-post-featured-image"><a href="https://static.dmcinfo.com/our-work/solar-powered-embedded-iot-solution-for-measuring-liquid-during-transport/" target="_self" ><img decoding="async" width="1400" height="500" src="https://static.dmcinfo.com/wp-content/uploads/2017/01/solar-powered-IoT-solution.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Solar-powered Embedded IoT Solution for Measuring Liquid During Transport" style="border-radius:20px;object-fit:cover;" srcset="https://static.dmcinfo.com/wp-content/uploads/2017/01/solar-powered-IoT-solution.png 1400w, https://static.dmcinfo.com/wp-content/uploads/2017/01/solar-powered-IoT-solution-300x107.png 300w, https://static.dmcinfo.com/wp-content/uploads/2017/01/solar-powered-IoT-solution-1024x366.png 1024w, https://static.dmcinfo.com/wp-content/uploads/2017/01/solar-powered-IoT-solution-768x274.png 768w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></figure>

<h4 class="has-link-color wp-elements-11 wp-block-post-title"><a href="https://static.dmcinfo.com/our-work/solar-powered-embedded-iot-solution-for-measuring-liquid-during-transport/" target="_self" >Solar-powered Embedded IoT Solution for Measuring Liquid During Transport</a></h4>
</li></ul></div>
</div>
</div></div><div class="cb-pagination swiper-pagination"></div><div class="cb-button-prev swiper-button-prev"></div><div class="cb-button-next swiper-button-next"></div></div>
</div>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step"><strong>Transform Data into Actionable Insights</strong> for Your IIoT Initiatives.</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Plan and implement a successful <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/industrial-iot/" id="566">IIoT strategy</a> with support from DMC&#8217;s engineering experts. Connect with us and see how DMC can take your <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/" id="420">Automation</a> project to the next level. </p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/20635/a-complete-guide-to-planning-your-iiot-solution/">A Complete Guide to Planning Your IIoT Solution</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Azure AI: Natural Language Processing Solutions</title>
		<link>https://static.dmcinfo.com/blog/37390/azure-ai-natural-language-processing-solutions/</link>
		
		<dc:creator><![CDATA[Riley Spering]]></dc:creator>
		<pubDate>Wed, 30 Jul 2025 19:43:02 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Azure]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=37390</guid>

					<description><![CDATA[<p>Source: Develop natural language solutions in Azure &#8211; Training &#124; Microsoft Learn Natural Language Processing (NLP) refers to artificial intelligence that can see, hear, speak with, and understand users. Models with NLP can be applied to input such as text, audio, and real-time speech. With Azure AI’s Language service, we can enable applications to understand [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/37390/azure-ai-natural-language-processing-solutions/">Azure AI: Natural Language Processing Solutions</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Source: <a href="https://learn.microsoft.com/en-us/training/paths/develop-language-solutions-azure-ai/" target="_blank" rel="noreferrer noopener">Develop natural language solutions in Azure &#8211; Training | Microsoft Learn</a></p>



<p class="wp-block-paragraph">Natural Language Processing (NLP) refers to artificial intelligence that can see, hear, speak with, and understand users. Models with NLP can be applied to input such as text, audio, and real-time speech. With Azure AI’s Language service, we can enable applications to understand us in dynamic ways.</p>



<p class="wp-block-paragraph">At DMC, we pride ourselves on our vast skill set. AI solutions are just a small part of our <a href="https://static.dmcinfo.com/services/application-development">application development services</a>. From IoT solutions to custom software from scratch, we are more than ready to tackle any project that comes our way. In this post, we’ll explore the fundamentals of Azure AI’s NLP, dive into key features like text analysis, question answering, and conversational language understanding, and showcase how DMC can craft tailored NLP solutions to meet your business needs.</p>



<h2 id="h-what-is-natural-language-processing" class="wp-block-heading">What is Natural Language Processing?</h2>



<p class="wp-block-paragraph">Natural Language Processing empowers computers to understand, interpret, and generate human language in a way that’s both intuitive and contextually accurate. Azure AI’s NLP suite enables businesses to process vast amounts of text, extract actionable insights, and create intelligent applications that enhance customer interactions and streamline operations.</p>



<p class="wp-block-paragraph">Building robust NLP models from scratch is complex, requiring extensive training and computational resources. Azure AI simplifies this process with pre-trained models that deliver high performance out of the box. At DMC, we customize these models to fit your specific requirements, making it easy to integrate NLP into your applications. By provisioning an Azure AI Language resource in your Azure Subscription, you can manage and fine-tune your NLP solution effortlessly through the Azure Portal.</p>



<h2 id="h-what-can-azure-ai-s-language-service-do" class="wp-block-heading">What Can Azure AI&#8217;s Language Service Do?</h2>



<p class="wp-block-paragraph">Azure AI’s Language Service offers a range of powerful capabilities, including:</p>



<ol class="wp-block-list">
<li><strong><a href="#h-1-text-analysis">Text Analysis:</a></strong> Extracting sentiment, key phrases, entities, and language from text.</li>



<li><strong><a href="#h-2-question-answering">Question Answering:</a> </strong>Providing precise answers to user queries based on documents or knowledge bases.</li>



<li><strong><a href="#h-3-conversational-language-understanding">Conversational Language Understanding:</a> </strong>Interpreting user intents and entities for intelligent chatbots.</li>
</ol>



<p class="wp-block-paragraph">Let’s explore these three core NLP capabilities in detail:</p>



<h2 id="h-1-text-analysis" class="wp-block-heading">1. Text Analysis</h2>



<p class="wp-block-paragraph">Text analysis enables systems to extract meaningful insights from unstructured text, such as customer feedback, social media posts, or documents.</p>



<h3 id="h-how-text-analysis-works" class="wp-block-heading">How Text Analysis Works</h3>



<p class="wp-block-paragraph">Azure’s Text Analytics API processes text inputs using advanced machine learning models to perform tasks like:</p>



<ul class="wp-block-list">
<li><strong>Sentiment Analysis: </strong>Determining whether text expresses positive, negative, or neutral sentiment.</li>



<li><strong>Key Phrase Extraction: </strong>Identifying the main ideas or topics in a text.</li>



<li><strong>Entity Recognition: </strong>Detecting people, places, organizations, or other entities.</li>



<li><strong>Language Detection: </strong>Identifying the language of the text, supporting multiple languages.</li>
</ul>



<p class="wp-block-paragraph">The API handles complex scenarios, such as noisy or ambiguous text, and delivers structured JSON outputs for easy integration into applications.</p>



<h3 id="h-use-cases-for-text-analysis" class="wp-block-heading">Use Cases for Text Analysis</h3>



<ul class="wp-block-list">
<li><strong>Customer Insights: </strong>Analyzing reviews to understand customer sentiment and identify product issues.</li>



<li><strong>Content Moderation: </strong>Filtering inappropriate comments on social platforms.</li>



<li><strong>Market Intelligence: </strong>Extracting trends from survey responses to guide business strategy.</li>
</ul>



<p class="wp-block-paragraph">With AI Text Analysis, we can use text analysis to build solutions that transform raw text into actionable insights that help businesses get the most out of their knowledge base.</p>



<h2 id="h-2-question-answering" class="wp-block-heading">2. Question Answering</h2>



<p class="wp-block-paragraph">Question answering allows systems to provide accurate, context-aware responses to user queries based on documents or custom knowledge bases.</p>



<h3 id="h-how-question-answering-works" class="wp-block-heading">How Question Answering Works</h3>



<p class="wp-block-paragraph">Azure’s question answering capabilities involve using deep learning models to comprehend questions and extract answers from structured or unstructured data. Key steps include:</p>



<ul class="wp-block-list">
<li><strong>Context Understanding: </strong>Analyzing the query and source content to identify relevant information.</li>



<li><strong>Answer Retrieval:</strong> Extracting precise answers, often with confidence scores.</li>



<li><strong>Knowledge Base Integration:</strong> Supporting custom datasets, such as company manuals or FAQs.</li>
</ul>



<p class="wp-block-paragraph">In short, a question answering system involves integrating with existing AI models, such as gpt-4o, to create a more “human-like” interface with your knowledge base. Later, we will explore a more in-depth example of a system built by DMC that does this.</p>



<h3 id="h-use-cases-for-question-answering" class="wp-block-heading">Use Cases for Question Answering</h3>



<ul class="wp-block-list">
<li><strong>Customer Support:</strong> Chatbots answer FAQs, reducing support ticket volumes.</li>



<li><strong>Employee Productivity: </strong>Staff can access instant answers from internal documentation.</li>



<li><strong>Education: </strong>E-learning platforms provide students with responses to their questions based on course materials.</li>
</ul>



<p class="wp-block-paragraph">DMC excels at building question-answering solutions that enhance efficiency and user experience, customized to your organization’s unique data and workflows.</p>



<h2 id="h-3-conversational-language-understanding" class="wp-block-heading">3. Conversational Language Understanding</h2>



<p class="wp-block-paragraph">Conversational Language Understanding (CLU) powers intelligent chatbots and virtual assistants by interpreting user intents and extracting entities from natural language inputs.</p>



<h3 id="h-how-conversation-language-understanding-works" class="wp-block-heading">How Conversation Language Understanding Works</h3>



<p class="wp-block-paragraph">Azure’s CLU service analyzes conversational inputs to:</p>



<ul class="wp-block-list">
<li><strong>Intent Classification: </strong>Identify the user’s goal, such as booking a service or requesting information.</li>



<li><strong>Entity Extraction: </strong>Recognize specific details, like dates, locations, or product names.</li>



<li><strong>Multi-Turn Conversations: </strong>Maintain context across multiple exchanges for seamless interactions.</li>
</ul>



<h3 id="h-use-cases-for-conversational-language-understanding" class="wp-block-heading">Use Cases for Conversational Language Understanding</h3>



<ul class="wp-block-list">
<li><strong>Retail:</strong> Chatbots assist with product searches, order tracking, or returns.</li>



<li><strong>Healthcare: </strong>Patients schedule appointments or access medical advice via conversational bots.</li>



<li><strong>Smart Devices: </strong>Voice assistants process commands to control IoT devices.</li>
</ul>



<p class="wp-block-paragraph">DMC’s knowledge of CLU allows us to create conversational AI solutions that feel natural and intuitive, driving more impactful engagement with users in contrast to traditional solutions.</p>



<h2 id="h-real-world-solution-dmc-ai-chatbot" class="wp-block-heading">Real-World Solution: DMC AI Chatbot</h2>



<p class="wp-block-paragraph">To demonstrate the power of Azure AI NLP, let’s walk through an AI Chatbot solution that was implemented in-house here at DMC.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="624" height="274" src="https://static.dmcinfo.com/wp-content/uploads/2025/07/dmc-ai-chatbot.png" alt="dmc ai chatbot" class="wp-image-37393" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/07/dmc-ai-chatbot.png 624w, https://static.dmcinfo.com/wp-content/uploads/2025/07/dmc-ai-chatbot-300x132.png 300w" sizes="(max-width: 624px) 100vw, 624px" /></figure>



<h3 id="h-the-challenge" class="wp-block-heading">The Challenge</h3>



<p class="wp-block-paragraph">DMC has a large and complex knowledge base that has been accumulated over our 20+ years of experience. We face two problems with this:</p>



<ul class="wp-block-list">
<li>Finding answers in this knowledge base can take time for those unfamiliar with its structure.</li>



<li>A common practice is to reach out to large groups in Slack to ask common questions which results in:
<ul class="wp-block-list">
<li>Downtime between the question being asked and it being answered.</li>



<li>Pulling employees from higher priority tasks to answer previously answered questions.</li>
</ul>
</li>
</ul>



<h3 id="h-the-solution" class="wp-block-heading">The Solution</h3>



<p class="wp-block-paragraph">DMC was able to propose and execute a solution that includes:</p>



<ul class="wp-block-list">
<li><strong>Knowledge Base Integration:</strong> Using Azure resources, we were able to take our existing knowledge base and transform it into a structure that is retrievable by our chatbot.</li>



<li><strong>Custom AI Chatbot:</strong> Azure can provide a pre-built AI model that we were able to customize to our exact needs by adjusting prompts, choosing its personality, and providing it with DMC-specific terms for better comprehension. The chatbot is able to take a user’s question, answer it with the existing documentation, and even provide the direct source that it retrieved the information from!</li>



<li><strong>Slack Integration: </strong>Our chatbot is accessible in Slack, our primary workplace communication platform, making it easy to use for our existing employees, with little to no guidance on getting started.</li>
</ul>



<h3 id="h-implementation" class="wp-block-heading">Implementation</h3>



<p class="wp-block-paragraph">To build this solution, we utilized our Azure subscription to provision the necessary resources and integrate them with available APIs to fully integrate them into our workplace. This required us to do the following:</p>



<ul class="wp-block-list">
<li><strong>Instantiate an Azure Search Service:</strong> For our chatbot to become an expert on DMC, we had to provision an Azure Search Service. This service takes our existing knowledge base in Confluence and transforms it into a searchable format by indexing every piece of information available. This required hitting the API to our Confluence instance.</li>



<li><strong>Provide Chatbot with the Knowledge Base: </strong>Hooking up our chatbot to our search service allows it to submit keyword-based queries and choose results that best answer a question asked by a DMC employee.</li>



<li><strong>Customizing the Chatbot: </strong>To limit unpredictable behavior, we needed to clearly define the process for handling unclear questions and multiple questions in one prompt. We also provided the chatbot with definitions for common acronyms and terms used exclusively at DMC to enhance its comprehension skills.</li>



<li><strong>Integrate with Existing Resources: </strong>DMC employees use Slack daily, so it was essential that we integrate our new chatbot with it. This makes the chatbot easily accessible to our employees.</li>



<li><strong>Keep the Chatbot Informed: </strong>Our knowledge and documentation are constantly expanding, which means we must keep our chatbot up to date. This meant that we needed to implement a function that is run once per week to help our chatbot keep up!</li>
</ul>



<h3 id="h-benefits" class="wp-block-heading">Benefits</h3>



<p class="wp-block-paragraph">This solution helped solve the issues shown earlier:</p>



<ul class="wp-block-list">
<li><strong>Quick Knowledge Retrieval:</strong> With the new chatbot, users can ask questions and get instant feedback, without having to search Confluence manually.</li>



<li><strong>Reduced Downtime: </strong>With instant feedback, employees experience less downtime before getting answers.</li>



<li><strong>Manage Employee Priorities: </strong>Employees can spend less time asking and answering previously answered questions, which translates into more time available for higher-priority tasks.</li>
</ul>



<h2 id="h-ethical-considerations" class="wp-block-heading">Ethical Considerations</h2>



<p class="wp-block-paragraph">Deploying NLP solutions requires responsible practices to address privacy, bias, and transparency. At DMC, we ensure ethical AI use by considering the following:</p>



<ul class="wp-block-list">
<li><strong>Bias Mitigation:</strong> Regularly auditing models to prevent unfair treatment across diverse customer groups.</li>



<li><strong>Data Privacy: </strong>Implementing end-to-end encryption and anonymizing data in compliance with GDPR and other regulations.</li>



<li><strong>Transparency: </strong>Clearly informing customers when they interact with AI chatbots.</li>



<li><strong>Human Oversight: </strong>Incorporating human-in-the-loop review for complex queries or sensitive interactions.</li>
</ul>



<p class="wp-block-paragraph">As a Microsoft partner, DMC adheres to Microsoft’s responsible AI guidelines, ensuring our NLP solutions are ethical and trustworthy. More details on Microsoft’s guidelines can be found in their documentation <a href="https://www.microsoft.com/en-us/ai/responsible-ai#:~:text=Responsible%20AI%20is%20a%20set,%2C%20inclusiveness%2C%20transparency%20and%20accountability." target="_blank" rel="noreferrer noopener">here</a>.</p>



<h2 id="h-why-dmc" class="wp-block-heading">Why DMC?</h2>



<p class="wp-block-paragraph">At DMC, we blend our technical expertise with a deep understanding of your business goals. Our experience with Azure AI’s NLP enables us to deliver customized solutions that drive efficiency, enhance customer experiences, and unlock new opportunities. From retail to healthcare, we’re equipped to tackle complex challenges across industries.</p>



<h2 id="h-let-s-recap" class="wp-block-heading">Let&#8217;s Recap</h2>



<p class="wp-block-paragraph">Azure AI’s NLP capabilities—text analysis, question answering, and conversational language understanding—offer endless possibilities for innovation. At DMC, we’re more focused on harnessing these tools to build tailored solutions that solve your unique challenges. </p>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step"><strong>Build Intelligent Applications Powered by Language AI</strong></h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Transform your business with DMC&#8217;s <a href="https://static.dmcinfo.com/services/application-development/" data-type="page" data-id="434">Application Development</a> team, and learn more about our capabilities with <a href="https://static.dmcinfo.com/services/digital-workplace-solutions/microsoft-azure-cloud-solutions-and-services/" data-type="page" data-id="734">Azure AI</a>&#8216;s Natural Language Processing.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/37390/azure-ai-natural-language-processing-solutions/">Azure AI: Natural Language Processing Solutions</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Azure AI: Computer Vision Solutions</title>
		<link>https://static.dmcinfo.com/blog/36209/azure-ai-computer-vision-solutions/</link>
		
		<dc:creator><![CDATA[Riley Spering]]></dc:creator>
		<pubDate>Tue, 22 Jul 2025 20:20:01 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=36209</guid>

					<description><![CDATA[<p>Computer vision refers to artificial intelligence systems that can perceive the world visually. These systems can be applied to camera input, images, or video. There are several problems that can be solved with the help of Azure’s AI Vision Service. With both facial recognition and optical character recognition the possibilities are endless!&#160; At DMC, we [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/36209/azure-ai-computer-vision-solutions/">Azure AI: Computer Vision Solutions</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Computer vision refers to artificial intelligence systems that can perceive the world visually. These systems can be applied to camera input, images, or video. There are several problems that can be solved with the help of Azure’s AI Vision Service. With both facial recognition and optical character recognition the possibilities are endless!&nbsp;</p>



<p class="wp-block-paragraph">At DMC, we pride ourselves on our technical skillset. AI solutions are just a part of our <a href="https://static.dmcinfo.com/services/application-development">application development services</a>. From IoT solutions to custom software from scratch, we are ready to tackle any project that comes our way. In this post, we will introduce the fundamentals of Azure AI Vision, facial recognition, and optical character recognition. We will also talk about what an AI Vision solution might look like from DMC.&nbsp;</p>



<figure class="wp-block-image size-full"><img decoding="async" width="488" height="291" src="https://static.dmcinfo.com/wp-content/uploads/2025/07/azure-ai-vision-diagram.png" alt="Azure AI Vision Diagram" class="wp-image-39172" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/07/azure-ai-vision-diagram.png 488w, https://static.dmcinfo.com/wp-content/uploads/2025/07/azure-ai-vision-diagram-300x179.png 300w" sizes="(max-width: 488px) 100vw, 488px" /></figure>



<h2 id="h-what-is-azure-ai-vision-nbsp" class="wp-block-heading">What is Azure AI Vision?&nbsp;</h2>



<p class="wp-block-paragraph">Creating solutions that can “see” the world and interpret it is a core area of artificial intelligence. Computers don’t exactly have eyes, but they are capable of processing info from videos, images, or live camera feeds.&nbsp;</p>



<p class="wp-block-paragraph">The architecture for computer vision models is complex and requires <strong>significant </strong>amounts of training and resources to perform at a high level, i.e. identify objects correctly with confidence. With Azure AI Vision, we can create complex models much quicker and easier than producing one from scratch. While these existing models can be functional out of the box, we can build on top of them to create <strong>custom models</strong> that fit your exact needs!&nbsp;</p>



<p class="wp-block-paragraph">Using these models can be done with ease by provisioning an Azure AI Vision resource in an Azure Subscription, which allows us to use the Azure Portal to easily manage and modify your AI solution.&nbsp;</p>



<h2 id="h-what-can-azure-ai-vision-do-nbsp" class="wp-block-heading">What Can Azure AI Vision Do?&nbsp;</h2>



<p class="wp-block-paragraph">Azure AI Vision offers several image analysis capabilities which include:&nbsp;</p>



<ul class="wp-block-list">
<li>Extracting text from images using Optical Character Recognition (OCR)&nbsp;</li>



<li>Generating captions and descriptions of images&nbsp;</li>



<li>Common object detection&nbsp;</li>



<li>Tagging visual features&nbsp;</li>



<li>Detecting and recognizing faces&nbsp;</li>
</ul>



<p class="wp-block-paragraph">Let’s dive deeper into these capabilities, starting with the ones that fall under facial recognition.&nbsp;</p>



<figure class="wp-block-image size-full"><img decoding="async" width="494" height="456" src="https://static.dmcinfo.com/wp-content/uploads/2025/07/Azure-AI-facial-recognition-diagram.png" alt="Azure AI facial recognition diagram" class="wp-image-39173" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/07/Azure-AI-facial-recognition-diagram.png 494w, https://static.dmcinfo.com/wp-content/uploads/2025/07/Azure-AI-facial-recognition-diagram-300x277.png 300w" sizes="(max-width: 494px) 100vw, 494px" /></figure>



<h2 id="h-facial-recognition-nbsp" class="wp-block-heading">Facial Recognition&nbsp;</h2>



<p class="wp-block-paragraph">Facial recognition is one of the most powerful capabilities of Azure AI Vision, enabling systems to detect, analyze, and identify human faces in images or video feeds. This technology has a wide range of applications, from enhancing security systems to personalizing user experiences. Azure AI Vision provides robust facial recognition tools that are both accurate and easy to integrate into custom solutions.&nbsp;</p>



<h3 id="h-how-facial-recognition-works-nbsp" class="wp-block-heading">How Facial Recognition Works&nbsp;</h3>



<p class="wp-block-paragraph">Azure’s facial recognition capabilities rely on sophisticated machine learning models that analyze facial features in images or video frames. These models detect faces by identifying key landmarks, such as the eyes, nose, and mouth, and then generate a unique facial signature based on these features. The process involves several key steps that ascend in complexity:&nbsp;</p>



<ul class="wp-block-list">
<li><strong>Face Detection</strong>: Identifies the presence of faces in an image or video and determines their locations within the input</li>



<li><strong>Facial Attribute Analysis</strong>: Extracts attributes like age, gender, facial hair, or even emotional expressions (e.g., happy, sad, neutral)</li>



<li><strong>Face Identification</strong>: Matches detected faces against a database of known faces to identify individuals to a known group</li>



<li><strong>Face Verification</strong>: Confirms whether two faces belong to the same person by comparing their facial signatures</li>
</ul>



<p class="wp-block-paragraph">Azure AI Vision’s facial recognition APIs make it simple to integrate these capabilities into applications. The service also supports real-time analysis, making it ideal for applications like live surveillance or interactive kiosks.&nbsp;</p>



<h3 id="h-use-cases-for-facial-recognition" class="wp-block-heading">Use Cases for Facial Recognition</h3>



<p class="wp-block-paragraph">Facial recognition opens a variety of possibilities for businesses and organizations. Some potential use cases include:&nbsp;</p>



<ul class="wp-block-list">
<li><strong>Security and Access Control</strong>: Implementing facial recognition for secure building access or device unlocking, replacing traditional keycards or passwords</li>



<li><strong>Retail and Marketing</strong>: Analyzing customer demographics and emotions in stores to tailor marketing campaigns or improve customer experience</li>



<li><strong>Event Management</strong>: Streamlining check-in processes at events by identifying attendees through facial recognition</li>
</ul>



<p class="wp-block-paragraph">At DMC, we are confident in our ability to leverage Azure’s facial recognition capabilities to build tailored solutions for clients across industries. Whether it’s enhancing security protocols or creating personalized customer interactions, our team is equipped to fine-tune these models to meet specific requirements while ensuring high accuracy and reliability.&nbsp;</p>



<figure class="wp-block-image size-full"><img decoding="async" width="497" height="193" src="https://static.dmcinfo.com/wp-content/uploads/2025/07/Azure-OCR-diagram.png" alt="Azure OCR diagram" class="wp-image-39174" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/07/Azure-OCR-diagram.png 497w, https://static.dmcinfo.com/wp-content/uploads/2025/07/Azure-OCR-diagram-300x116.png 300w" sizes="(max-width: 497px) 100vw, 497px" /></figure>



<h2 id="h-optical-character-recognition-ocr-nbsp" class="wp-block-heading">Optical Character Recognition (OCR)&nbsp;</h2>



<p class="wp-block-paragraph">Optical Character Recognition (OCR) is another cornerstone of Azure AI Vision, enabling systems to extract text from images, scanned documents, or video feeds. This capability is designed for digitizing physical documents, automating data entry, and making content searchable. Azure’s OCR technology is highly accurate and supports a wide range of languages and formats, making it a versatile tool for our clients.&nbsp;</p>



<h3 id="h-how-ocr-works-nbsp" class="wp-block-heading">How OCR Works&nbsp;</h3>



<p class="wp-block-paragraph">Azure’s OCR functionality, powered by the Read API, processes images or PDFs and converts text within them into machine-readable data. The process involves:&nbsp;</p>



<ul class="wp-block-list">
<li><strong>Text Detection</strong>: Identifying regions in an image that contain text, regardless of orientation or font style</li>



<li><strong>Text Recognition</strong>: Converting detected text into digital characters, preserving formatting where possible</li>



<li><strong>Language Support</strong>: Recognizing text in multiple languages, including handwritten and printed text</li>



<li><strong>Layout Analysis</strong>: Understanding the structure of the document, such as paragraphs, tables, or lists, to maintain context&nbsp;</li>
</ul>



<p class="wp-block-paragraph">The Read API is designed to handle complex scenarios, such as noisy images, low-resolution scans, or text in mixed languages. Developers can easily integrate OCR into applications by calling the API and receiving structured JSON output containing the extracted text and its coordinates.&nbsp;</p>



<h3 id="h-advanced-ocr-features-nbsp" class="wp-block-heading">Advanced OCR Features&nbsp;</h3>



<p class="wp-block-paragraph">Azure AI Vision’s OCR goes beyond basic text extraction. Some advanced features include:&nbsp;</p>



<ul class="wp-block-list">
<li><strong>Handwritten Text Recognition</strong>: Extracting text from handwritten notes or forms, which is particularly useful for industries like healthcare or education</li>



<li><strong>Form Recognition</strong>: Automatically extracting key-value pairs from structured documents like invoices, receipts, or IDs&nbsp;</li>



<li><strong>Multi-Page Document Processing</strong>: Handling large documents, such as contracts or reports, with consistent accuracy across pages</li>



<li><strong>Real-Time OCR</strong>: Processing live camera feeds to extract text instantly, ideal for applications like license plate recognition</li>
</ul>



<h3 id="h-use-cases-for-ocr-nbsp" class="wp-block-heading">Use Cases for OCR&nbsp;</h3>



<p class="wp-block-paragraph">OCR is a game-changer for organizations looking to streamline operations and reduce manual work. Some practical applications include:&nbsp;</p>



<ul class="wp-block-list">
<li><strong>Document Digitization</strong>: Converting paper-based records, such as medical charts or legal contracts, into searchable digital formats</li>



<li><strong>Automated Data Entry</strong>: Extracting information from invoices, receipts, or forms to populate databases without human intervention</li>



<li><strong>Accessibility</strong>: Enabling text-to-speech systems to read printed text aloud for visually impaired users</li>



<li><strong>Logistics and Transportation</strong>: Reading shipping labels or license plates in real time to improve supply chain efficiency</li>
</ul>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="990" height="502" src="https://static.dmcinfo.com/wp-content/uploads/2025/07/azure-computer-vision.png" alt="azure computer vision" class="wp-image-39177" style="width:544px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/07/azure-computer-vision.png 990w, https://static.dmcinfo.com/wp-content/uploads/2025/07/azure-computer-vision-300x152.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/07/azure-computer-vision-768x389.png 768w" sizes="(max-width: 990px) 100vw, 990px" /></figure>



<h2 id="h-real-world-solution-enhancing-security-with-azure-ai-vision" class="wp-block-heading">Real-World Solution: Enhancing Security with Azure AI Vision</h2>



<p class="wp-block-paragraph">To illustrate the power of Azure AI Vision, let’s explore a high-level example of how DMC could leverage this technology to solve a security problem for a client.&nbsp;</p>



<h3 id="h-the-challenge" class="wp-block-heading">The Challenge</h3>



<p class="wp-block-paragraph">A large corporate campus with multiple buildings wants to enhance its security measures and streamline access control. The client faces two key issues:&nbsp;</p>



<ol class="wp-block-list">
<li><strong>Unauthorized Access</strong>: The current keycard-based system is vulnerable to lost or stolen cards, allowing potential unauthorized entry to sensitive areas.&nbsp;</li>



<li><strong>Incident Reporting</strong>: Manual logging of security incidents, such as identifying individuals in surveillance footage, is time-consuming and prone to errors.&nbsp;</li>
</ol>



<h3 id="h-the-solution" class="wp-block-heading">The Solution</h3>



<p class="wp-block-paragraph">DMC proposes a comprehensive Azure AI Vision solution that combines facial recognition, OCR, and object detection to address these security challenges. The solution includes:&nbsp;</p>



<p class="wp-block-paragraph"><strong>Secure Access Control</strong>: Using Azure’s Face API, the system verifies employee identities at entry points by matching their faces against a secure database of authorized personnel. The system operates in real time, granting or denying access within seconds.&nbsp;</p>



<p class="wp-block-paragraph"><strong>Automated Incident Logging</strong>: Azure’s OCR capabilities are integrated into a security management platform that processes surveillance footage and incident reports. The system extracts text from identification documents or name badges captured in footage, cross-referencing with employee records to log incidents accurately. Object detection identifies potential security threats, such as unrecognized items in restricted areas.&nbsp;</p>



<p class="wp-block-paragraph"><strong>Security Analytics Dashboard</strong>: A centralized dashboard provides real-time insights into access logs and incident reports, powered by Azure’s facial recognition and OCR data. Security teams can monitor entry patterns, flag suspicious activities, and generate reports for compliance audits.&nbsp;</p>



<h3 id="h-implementation" class="wp-block-heading">Implementation</h3>



<p class="wp-block-paragraph">To build this solution, DMC provisions an Azure AI Vision resource within the client’s Azure Subscription. The development process includes:&nbsp;</p>



<ul class="wp-block-list">
<li><strong>Custom Model Training</strong>: Fine-tuning Azure’s facial recognition models with a dataset of employee images (with consent) to ensure high accuracy in identification under various lighting and angle conditions</li>



<li><strong>OCR Integration</strong>: Configuring the Read API to extract text from identification documents, badges, or signage in surveillance footage, supporting multiple formats and orientations</li>



<li><strong>Object Detection</strong>: Training a custom object detection model to recognize specific items (e.g., bags, devices) that may pose security risks</li>



<li><strong>Security Platform Development</strong>: Building a web or desktop platform that integrates the Face API, Read API, and object detection models, with a user-friendly interface for security personnel</li>



<li><strong>Security and Compliance</strong>: Implementing end-to-end encryption for all data, including facial signatures and extracted text, and ensuring compliance with privacy regulations according to state and federal guidelines. Human-in-the-loop oversight is incorporated, allowing security staff to review and intervene in real-time decisions.</li>
</ul>



<h3 id="h-benefits-nbsp" class="wp-block-heading">Benefits&nbsp;</h3>



<p class="wp-block-paragraph">The solution delivers measurable results for the corporate client:&nbsp;</p>



<ul class="wp-block-list">
<li><strong>Enhanced Security</strong>: Facial recognition ensures only authorized personnel access restricted areas, minimizing risks from lost or stolen keycards.&nbsp;</li>



<li><strong>Operational Efficiency</strong>: Automated incident logging reduces manual work and improves the accuracy of security reports.&nbsp;</li>



<li><strong>Proactive Monitoring</strong>: Real-time analytics enable security teams to detect and respond to potential threats quickly.&nbsp;</li>



<li><strong>Scalability</strong>: The Azure-based solution can be expanded to additional campus locations or integrated with other security systems.&nbsp;</li>
</ul>



<h2 id="h-ethical-considerations-nbsp" class="wp-block-heading">Ethical Considerations&nbsp;</h2>



<p class="wp-block-paragraph">While facial recognition and image analysis is a powerful tool, it’s important to address ethical considerations. Privacy, consent, and data security are critical when deploying these solutions. Azure AI Vision adheres to strict compliance standards, and at DMC, we prioritize responsible AI practices, ensuring that facial recognition systems are implemented transparently and with user consent. As a registered partner with Microsoft, we are committed to responsible AI practices in deploying both facial recognition and OCR solutions in accordance with their general guidelines.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">We ensure responsible use and integration of visual AI solutions by:&nbsp;</p>



<ul class="wp-block-list">
<li>Thoroughly assessing Azure AI Vision’s capabilities to ensure they align with client needs, while performing sufficient testing to understand its capabilities and limitations</li>



<li>Respecting individuals’ privacy by collecting data only with explicit consent and using it solely for authorized purposes</li>



<li>Incorporating human-in-the-loop oversight to enable real-time intervention, maintaining human decision-making to prevent harm</li>



<li>Prioritizing security through robust controls to protect data integrity and prevent unauthorized access</li>
</ul>



<p class="wp-block-paragraph">More information on <a href="https://learn.microsoft.com/en-us/azure/foundry/responsible-ai/computer-vision/image-analysis-guidance-for-integration" type="link" id="https://learn.microsoft.com/en-us/azure/foundry/responsible-ai/computer-vision/image-analysis-guidance-for-integration" target="_blank" rel="noreferrer noopener">Microsoft’s guidelines on responsible used of AI Image Analysis</a> can be found in their documentation provided.&nbsp;</p>



<h2 id="h-why-dmc" class="wp-block-heading">Why DMC?</h2>



<p class="wp-block-paragraph">At DMC, we combine technical expertise with a deep understanding of our clients’ business needs. Our experience with Azure AI Vision allows us to deliver tailored solutions that drive real value. Whether it’s enhancing customer experiences, automating processes, or unlocking new insights, we’re ready to help our clients succeed.&nbsp;</p>



<h2 id="h-let-s-recap" class="wp-block-heading">Let’s Recap</h2>



<p class="wp-block-paragraph">Azure AI Vision is a transformative technology that empowers businesses to “see” and understand the world in new ways. With capabilities like facial recognition and OCR, it opens endless possibilities for innovation. At DMC, we’re passionate about harnessing these tools to solve complex challenges and deliver measurable results. From automation to agriculture, our team is equipped to build custom AI solutions across industries that meet your unique needs. </p>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step">Unlock the Power of Azure AI Vision and Transform Your Data.</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">DMC&#8217;s <a href="https://static.dmcinfo.com/services/application-development/" data-type="page" data-id="434">Application Development</a> experts can leverage Azure AI Vision, computer vision, and general <a href="https://static.dmcinfo.com/services/manufacturing-automation-and-intelligence/ai-and-data-analytics/" data-type="page" data-id="698">AI capabilities</a> to automate processes and uncover actionable insights.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/36209/azure-ai-computer-vision-solutions/">Azure AI: Computer Vision Solutions</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Azure AI: Knowledge Mining Solutions</title>
		<link>https://static.dmcinfo.com/blog/36190/azure-ai-knowledge-mining-solutions/</link>
		
		<dc:creator><![CDATA[Riley Spering]]></dc:creator>
		<pubDate>Thu, 03 Jul 2025 08:00:00 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/?p=36190</guid>

					<description><![CDATA[<p>Knowledge mining is a field of artificial intelligence that pertains to extracting key insights from unorganized data. Like data mining, which finds patterns and correlations, knowledge mining takes things to the next level by also contextualizing knowledge across a wide range of data formats. Azure AI Search allows us to do this on existing knowledge [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/36190/azure-ai-knowledge-mining-solutions/">Azure AI: Knowledge Mining Solutions</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Knowledge mining is a field of artificial intelligence that pertains to extracting key insights from unorganized data. Like data mining, which finds patterns and correlations, knowledge mining takes things to the next level by also contextualizing knowledge across a wide range of data formats. Azure AI Search allows us to do this on existing knowledge bases to help organize and enhance your business.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">At DMC, we pride ourselves on our vast technology skillset. AI solutions are just a part of our <a href="https://static.dmcinfo.com/services/application-development">application development services</a>. From IoT solutions to custom software from scratch, we are ready to tackle any project that comes our way. In this post, we will introduce the fundamentals of Azure AI Search, AI Enrichment, and Multimodal Search. We will also talk about what an AI Search solution might look like from DMC.&nbsp;</p>



<figure class="wp-block-image size-full"><img decoding="async" width="715" height="512" src="https://static.dmcinfo.com/wp-content/uploads/2025/07/Knowledge-Mining-Microsoft-Azure.png" alt="knowledge mining illustration" class="wp-image-39164" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/07/Knowledge-Mining-Microsoft-Azure.png 715w, https://static.dmcinfo.com/wp-content/uploads/2025/07/Knowledge-Mining-Microsoft-Azure-300x215.png 300w" sizes="(max-width: 715px) 100vw, 715px" /></figure>



<h2 id="h-what-is-azure-ai-search-nbsp" class="wp-block-heading">What is Azure AI Search?&nbsp;</h2>



<p class="wp-block-paragraph">Azure AI Search is a Microsoft-owned and managed, cloud-based service that enables applications to have enterprise-grade information retrieval. The service has the traditional characteristics of a search service, such as indexing, keyword search, and knowledge stores. However, Azure AI search can enhance your search capabilities using AI Enrichment, Multimodal Search, and more! All these features live in the Azure ecosystem, making it easy to scale and apply a secure solution that fits your needs.&nbsp;</p>



<h2 id="h-what-can-azure-ai-search-do-nbsp" class="wp-block-heading">What Can Azure AI Search Do?&nbsp;</h2>



<p class="wp-block-paragraph">Azure AI offers several standard features of a search service, with the addition of AI capabilities. In this article, we will take a deeper look at AI Enrichment and Multimodal Search. Other features exist such as:&nbsp;</p>



<ul class="wp-block-list">
<li>Indexing&nbsp;</li>



<li>Vector and hybrid search&nbsp;</li>



<li>Full-text search&nbsp;</li>



<li>Full Lucene query syntax search&nbsp;</li>



<li>Relevance scoring&nbsp;</li>



<li>Semantic ranking&nbsp;</li>



<li>Knowledge stores&nbsp;</li>
</ul>



<h2 id="h-ai-enrichment" class="wp-block-heading">AI Enrichment</h2>



<p class="wp-block-paragraph">AI Enrichment in the Azure AI Search service takes raw, unstructured data and transforms it into structured, searchable content using other Azure AI Services such as Computer Vision and Language Processing. What this means is that we can take inputs, such as PDFs and text files, and extract meaningful information from them so they can be accurately retrieved in response to a search query.&nbsp;</p>



<h3 id="h-how-ai-enrichment-works" class="wp-block-heading">How AI Enrichment Works</h3>



<figure class="wp-block-image size-full"><img decoding="async" width="625" height="222" src="https://static.dmcinfo.com/wp-content/uploads/2025/07/ai-enrichment-png-webp-628A_226-10-15-2025_12_14_PM-1.png" alt="Diagram of how AI enrichment works" class="wp-image-39167" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/07/ai-enrichment-png-webp-628A_226-10-15-2025_12_14_PM-1.png 625w, https://static.dmcinfo.com/wp-content/uploads/2025/07/ai-enrichment-png-webp-628A_226-10-15-2025_12_14_PM-1-300x107.png 300w" sizes="(max-width: 625px) 100vw, 625px" /></figure>



<p class="wp-block-paragraph">The process for AI Enrichment can be broken down into three phases:&nbsp;</p>



<ol class="wp-block-list">
<li>Date Importing&nbsp;</li>



<li>Enrichment and Indexing&nbsp;</li>



<li>Output Exploration</li>
</ol>



<p class="wp-block-paragraph"><strong>Data Importing </strong>is the step where an indexer connects a data source with unstructured documents and pulls them into the search service.&nbsp;</p>



<p class="wp-block-paragraph"><strong>Enrichment and Indexing </strong>is the largest and most complex step of the process. Enrichment starts with the indexer opening files and extracting key data from them, such as dates, keywords, or any other customizable entities. During this process, an “enriched” version of the document is created. This enriched document can either be temporary or stored for future reuse. The indexer then applies field mappings, which are paths between the source data and search index. We also create a path between the enriched data and search index.&nbsp;</p>



<p class="wp-block-paragraph">In the final step, <strong>Output Exploration</strong>, we start to see the end goal of setting up this service, which is to be able to navigate a previously unsearchable data source. This can appear in the form of a simple search bar or passed onto a chatbot that can dynamically retrieve the enriched data and present it in a user-friendly, conversational format.&nbsp;&nbsp;</p>



<h3 id="h-use-cases-for-ai-enrichment" class="wp-block-heading">Use Cases for AI Enrichment</h3>



<ul class="wp-block-list">
<li><strong>Knowledge Management</strong>: Extract entities and key phrases from internal documents to support advanced search</li>



<li><strong>Customer Support</strong>: Enrich support tickets with metadata to improve query routing</li>



<li><strong>Research Analysis</strong>: Process academic papers or reports to extract insights for searchable archives</li>
</ul>



<h2 id="h-multimodal-search" class="wp-block-heading">Multimodal Search</h2>



<p class="wp-block-paragraph">Multimodal search is the ability to ingest, understand, and retrieve information across multiple content types, including text, images, video, and audio. This enables us to search using more diverse methods such as similarity search and hybrid queries, which we will talk about more in this section.&nbsp;&nbsp;</p>



<h3 id="h-how-multimodal-search-works" class="wp-block-heading">How Multimodal Search Works</h3>



<p class="wp-block-paragraph">Multimodal Search uses AI to vectorize and index non-text content, enabling similarity search and hybrid queries. The process involves the following steps:&nbsp;</p>



<ol class="wp-block-list">
<li>Content Ingestion&nbsp;</li>



<li>Vectorization&nbsp;</li>



<li>Index Storage&nbsp;</li>



<li>Query Processing&nbsp;</li>
</ol>



<p class="wp-block-paragraph"><strong>Content Ingestion </strong>is where we extract data from text, images, PDFs, and more via indexers.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph"><strong>Vectorization </strong>uses AI models to convert unstructured content into vectors. Vectors are used to capture semantic or visual features of data. They are essential in getting accurate return results when querying for non-text elements, such as visual features.&nbsp;</p>



<p class="wp-block-paragraph">The process of storing the vectors and their associated metadata for fast retrieval is the <strong>Index Storage </strong>step.&nbsp;</p>



<p class="wp-block-paragraph">Finally, <strong>Query Processing </strong>is where a user’s search input is matched against relevant vectors so that semantically similar results can be returned.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">So, what is the end goal of multimodal search? While the overall goal is to expand your organization’s knowledge sharing and storage capabilities, the two primary added features are similarity searches and hybrid queries.</p>



<h4 id="h-similarity-search" class="wp-block-heading">Similarity Search</h4>



<p class="wp-block-paragraph">This technique leverages vector embeddings to find content that is conceptually or visually like a query, rather than relying solely on exact keyword matches. For example, a user uploading an image of a red dress can retrieve similar dresses based on visual features like color and style, even if the textual descriptions differ. Similarity search enables semantic and visual matching across diverse data types.&nbsp;</p>



<h4 id="h-hybrid-queries" class="wp-block-heading">Hybrid Queries</h4>



<p class="wp-block-paragraph">Multimodal Search supports hybrid queries that combine similarity search with traditional keyword search for more comprehensive results. By merging results using <a href="https://learn.microsoft.com/en-us/azure/search/hybrid-search-ranking" target="_blank" rel="noreferrer noopener">Reciprocal Rank Fusion</a>, Azure AI Search ensures that both semantic relevance and exact matches are considered. For instance, a query like “blue sneakers” can retrieve results based on both the text description and vectorized images of sneakers, providing a balanced and highly relevant output.&nbsp;</p>



<p class="wp-block-paragraph">With these two query processing features, an application can answer questions like &#8220;What is the process to approve a purchase order?&#8221; even when the only description of the process lives inside an embedded diagram in a PDF file.&nbsp;</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="804" height="516" src="https://static.dmcinfo.com/wp-content/uploads/2025/07/query-processing.png" alt="diagram of query processing" class="wp-image-36215" style="width:500px;height:auto" srcset="https://static.dmcinfo.com/wp-content/uploads/2025/07/query-processing.png 804w, https://static.dmcinfo.com/wp-content/uploads/2025/07/query-processing-300x193.png 300w, https://static.dmcinfo.com/wp-content/uploads/2025/07/query-processing-768x493.png 768w" sizes="(max-width: 804px) 100vw, 804px" /></figure>



<h3 id="h-use-cases-for-multimodal-search-nbsp" class="wp-block-heading">Use Cases for Multimodal Search&nbsp;</h3>



<ul class="wp-block-list">
<li><strong>Conversational AI</strong>: Enable chatbots to answer queries using text, images, or PDFs from a knowledge base&nbsp;</li>



<li><strong>E-Commerce</strong>: Allow users to upload product images to retrieve descriptions or reviews</li>



<li><strong>Healthcare</strong>: Query medical images and patient records for diagnostics</li>



<li><strong>Media Analysis</strong>: Search video or audio archives alongside text for comprehensive insights</li>
</ul>



<h2 id="h-real-world-solution-enhancing-a-knowledge-base-using-azure-ai-search" class="wp-block-heading">Real-World Solution: Enhancing a Knowledge Base using Azure AI Search</h2>



<p class="wp-block-paragraph">To demonstrate the power of Azure AI Search, let’s explore a high-level example of how DMC could leverage this technology to solve a knowledge organization problem for a client.&nbsp;</p>



<h3 id="h-the-challenge" class="wp-block-heading">The Challenge</h3>



<p class="wp-block-paragraph">A multinational consulting firm needs a search solution to help consultants quickly access industry trends, regulations, and internal best practices. Their knowledge base includes thousands of PDFs, images, and internal reports across multiple languages, but traditional search tools deliver irrelevant results and struggle with non-text data. This leads to countless hours spent manually searching documents, impacting productivity and client response times.&nbsp;</p>



<h3 id="h-the-solution" class="wp-block-heading">The Solution</h3>



<p class="wp-block-paragraph">DMC proposes that the firm implement Azure AI Search with AI Enrichment and Multimodal Search to create an intelligent search platform. By enriching and vectorizing their knowledge base, this enables consultants to retrieve accurate, contextually relevant content using text or image queries, streamlining research and improving client outcomes. This solution would include:&nbsp;</p>



<p class="wp-block-paragraph"><strong>Complete Knowledge Base Ingestion: </strong>Using Azure’s pre-built indexers vectorize and index a pre-existing knowledge base to make it easier to navigate.&nbsp;</p>



<p class="wp-block-paragraph"><strong>Enhanced Data Retrieval: </strong>With AI Enrichment and Multimodal Search, the search service can quickly and accurately retrieve information based off a query.&nbsp;</p>



<h3 id="h-implementation" class="wp-block-heading">Implementation</h3>



<p class="wp-block-paragraph">To build this solution, DMC provisions an Azure AI Search resource within the client’s Azure subscription. The development process includes:&nbsp;</p>



<ul class="wp-block-list">
<li><strong>Data Ingestion</strong>&nbsp;
<ul class="wp-block-list">
<li>Store PDFs, images, and reports in Azure Blob Storage, ingested via Azure AI Search indexers</li>
</ul>
</li>



<li><strong>AI Enrichment Pipeline</strong>&nbsp;
<ul class="wp-block-list">
<li>Apply Optical Character Recognition (OCR) to extract text from scanned PDFs and images (e.g., charts, infographics)&nbsp;</li>



<li>Use entity recognition to tag regulations, companies, and dates in documents</li>



<li>Employee translation skills to index multilingual content for global teams</li>
</ul>
</li>



<li><strong>Multimodal Search Setup</strong>&nbsp;
<ul class="wp-block-list">
<li>Vectorized images and text using Azure OpenAI and Computer Vision models</li>



<li>Configured hybrid search to combine keyword and vector queries for comprehensive retrieval</li>
</ul>
</li>



<li><strong>Deployment</strong>&nbsp;
<ul class="wp-block-list">
<li>Integrate the search solution into the firm’s internal portal using Azure SDKs, supporting text and image-based queries</li>
</ul>
</li>
</ul>



<h3 id="h-benefits" class="wp-block-heading">Benefits</h3>



<ul class="wp-block-list">
<li><strong>Improved Relevance</strong>: Semantic ranking and vector search increases result accuracy</li>



<li><strong>Time Savings</strong>: Reduced research time by accessing insights via intuitive searches&nbsp;</li>



<li><strong>Multimodal Flexibility</strong>: Image-based queries (e.g., uploading a chart) can now retrieve related documents, enhancing usability</li>



<li><strong>Global Accessibility</strong>: Multilingual indexing supports seamless search for international teams</li>



<li><strong>Scalability</strong>: Using Azure as the foundation, the service can scale easily with the firm’s needs and goals</li>
</ul>



<h2 id="h-responsible-ai" class="wp-block-heading">Responsible AI</h2>



<p class="wp-block-paragraph">AI Enrichment and Multimodal Search rely on Azure AI models (e.g., Computer Vision, Language Service, Azure OpenAI) that may process personal or sensitive information.&nbsp;&nbsp;</p>



<p class="wp-block-paragraph">To uphold privacy and fairness, it is essential to consider the following:&nbsp;</p>



<ul class="wp-block-list">
<li>Ensure input data complies with applicable privacy laws and regulations. Avoid processing sensitive personal data without explicit consent or legal basis.&nbsp;</li>



<li>AI models may inadvertently reflect biases in training data, potentially affecting entity recognition or image analysis. Regularly evaluate outputs for fairness and adjust configurations (e.g., custom skills or filters) to minimize biased results.&nbsp;</li>



<li>Clearly communicate to users when AI-generated outputs, such as extracted entities or vectorized content, are used in search results, ensuring they understand the role of AI.&nbsp;</li>
</ul>



<p class="wp-block-paragraph">See the information on Microsoft’s guidelines on <a href="https://learn.microsoft.com/en-us/legal/search/transparency-note?context=%2Fazure%2Fsearch%2Fcontext%2Fcontext&amp;tabs=enrichment" type="link" id="https://learn.microsoft.com/en-us/legal/search/transparency-note?context=%2Fazure%2Fsearch%2Fcontext%2Fcontext&amp;tabs=enrichment" target="_blank" rel="noreferrer noopener">responsible use of AI Search</a>.&nbsp;</p>



<h2 id="h-why-dmc-nbsp" class="wp-block-heading">Why DMC?&nbsp;</h2>



<p class="wp-block-paragraph">At DMC, we blend our years of expertise with the Azure ecosystem with a client-centric approach to deliver transformative cloud-based solutions. Our deep knowledge base enables us to craft tailored platforms that unlock actionable insights and streamline operations. As a <a href="https://static.dmcinfo.com/about/partners/microsoft-solutions-partner/">Microsoft Solutions Partner</a>, we are committed to responsible AI practices. We ensure ethical, secure, and scalable solutions that align with your business goals, empowering you to stay ahead and succeed.&nbsp;</p>



<h2 id="h-let-s-recap" class="wp-block-heading">Let’s Recap</h2>



<p class="wp-block-paragraph">Azure AI Search is a powerful platform for intelligent search that uses AI Enrichment and Multimodal Search. AI Enrichment processes unstructured data into searchable, structured content, enabling applications like knowledge management and multilingual search. Multimodal Search extends this to images and audio, supporting cross-modal retrieval with similarity search and hybrid queries. Responsible AI practices ensure ethical use by addressing privacy, bias, and accuracy concerns. In our real-world example, a consulting firm could leverage these features to build an efficient search solution, boosting productivity and client satisfaction. For organizations seeking to unify diverse data and enhance discovery, Azure AI Search delivers expert results.&nbsp;</p>



<p class="wp-block-paragraph">At DMC, we’re passionate about harnessing these tools to solve complex challenges and deliver measurable results.</p>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step"><strong>Unlock Answers Faster with AI-Powered Search.</strong></h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">From document enrichment to multimodal search experiences, DMC&#8217;s <a href="https://static.dmcinfo.com/services/application-development/" data-type="page" data-id="434">Application Development</a> expert creates solutions that improve productivity. Learn more about our <a href="https://static.dmcinfo.com/services/digital-workplace-solutions/microsoft-azure-cloud-solutions-and-services/" data-type="page" data-id="734">Azure</a> capabilities.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>
<p>The post <a href="https://static.dmcinfo.com/blog/36190/azure-ai-knowledge-mining-solutions/">Azure AI: Knowledge Mining Solutions</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Avalonia UI: Noteworthy Differences from WPF</title>
		<link>https://static.dmcinfo.com/blog/15571/avalonia-ui-noteworthy-differences-from-wpf/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Fri, 28 Mar 2025 14:26:11 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/15571/avalonia-ui-noteworthy-differences-from-wpf/</guid>

					<description><![CDATA[<p>Overview Avalonia UI is a cross-platform UI framework that is considered a “spiritual successor” to WPF. If you are brand new to Avalonia UI, you should check out this blog, Avalonia UI: Introduction and Initial Impression, to learn the basics of what Avalonia UI is.&#160;This blog builds on that foundation and will help you to [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/15571/avalonia-ui-noteworthy-differences-from-wpf/">Avalonia UI: Noteworthy Differences from WPF</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><meta name="uuid" content="uuideCSYLjidWyLF"></p>



<h2 id="h-overview" class="wp-block-heading">Overview</h2>



<p class="wp-block-paragraph">Avalonia UI is a cross-platform UI framework that is considered a “spiritual successor” to WPF. If you are brand new to Avalonia UI, you should check out this blog, <a href="https://static.dmcinfo.com/latest-thinking/blog/id/13705/avalonia-ui-introduction-and-initial-impression" target="_blank">Avalonia UI: Introduction and Initial Impression</a>, to learn the basics of what Avalonia UI is.&nbsp;This blog builds on that foundation and will help you to better understand the noteworthy differences between developing with Avalonia and WPF.</p>



<h2 id="h-styling" class="wp-block-heading">Styling</h2>



<p class="wp-block-paragraph">In Avalonia, a Style is more similar to a CSS style than a WPF style. The Avalonia equivalent of a WPF Style is a Control Theme.</p>



<p class="wp-block-paragraph">A Style should be used to style a control based on its content or purpose within the application whereas a Control Theme should be used for shared theming between all controls of that type. For example, a <code>TextBlock</code> might have a Control Theme to set a shared font type and font color, but a <code>TextBlock</code> Style would alter the font weight and font size. Examples of both can be seen below:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">XAML</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;controltheme targettype="{x:Type TextBlock}" x:key="DefaultTextBlockStyle">
    &lt;setter property="FontFamily" value="Sans Serif">
    &lt;setter property="FontSize" value="12">
    &lt;setter property="Foreground" value="Black">
&lt;/setter>&lt;/setter>&lt;/setter>&lt;/controltheme>&lt;style selector="TextBlock.h1" type="text/css">&lt;Setter Property="FontSize" Value="24" />
    &lt;Setter Property="FontWeight" Value="Bold" />&lt;/style>&lt;style selector="TextBlock.h2" type="text/css">&lt;Setter Property="FontSize" Value="20" />
    &lt;Setter Property="FontWeight" Value="Bold" />&lt;/style></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">controltheme</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">targettype</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;{x:Type TextBlock}&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">x:key</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;DefaultTextBlockStyle&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">setter</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">property</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;FontFamily&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Sans Serif&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">setter</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">property</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;FontSize&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;12&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">setter</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">property</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Foreground&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Black&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">setter</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">setter</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">setter</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">controltheme</span><span style="color: #808080">&gt;&lt;</span><span style="color: #569CD6">style</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">selector</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;TextBlock.h1&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text/css&quot;</span><span style="color: #808080">&gt;&lt;</span><span style="color: #569CD6">Setter</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Property</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;FontSize&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;24&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">Setter</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Property</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;FontWeight&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Bold&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;&lt;/</span><span style="color: #569CD6">style</span><span style="color: #808080">&gt;&lt;</span><span style="color: #569CD6">style</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">selector</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;TextBlock.h2&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text/css&quot;</span><span style="color: #808080">&gt;&lt;</span><span style="color: #569CD6">Setter</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Property</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;FontSize&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;20&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">Setter</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Property</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;FontWeight&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Bold&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;&lt;/</span><span style="color: #569CD6">style</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">Having a more layered styling approach in Avalonia is beneficial since it allows you to use Styles to substitute a control’s property values without needing to override the entire theme. Conversely, in WPF, you can get stuck needing to override an entire theme if there is a theme applied to a control without an <code>x:Key</code> defined. If there is an&nbsp;<code>x:Key</code> defined in WPF, you can take advantage of the <code>BasedOn</code> property to build upon a pre-defined theme.</p>



<p class="wp-block-paragraph">Avalonia Styles are placed in the <code>Styles</code> collection of a control and Control Themes are placed in the Resources collection of a control. Comparatively, in WPF, the Styles are all placed in the <code>Resources</code><strong> </strong>collection.</p>



<h2 id="h-styles-conditional-classes" class="wp-block-heading">Styles: Conditional Classes</h2>



<p class="wp-block-paragraph">A feature that stood out to me significantly is conditional classes for Avalonia Styles. This allows you to alter Style of a control based on a bound condition. In WPF, doing something similar is overly verbose and complicated and requires the use of a <code>DataTrigger</code>. In Avalonia, there is a lot less markup code that is needed.</p>



<p class="wp-block-paragraph">The examples below demonstrate conditionally changing the<strong> </strong><code>TextBlock</code><span style="font-family:verdana;"> </span>foreground based on a bound property.</p>



<p class="wp-block-paragraph">In Avalonia, the following code will use the Error Style based on the bound property. Since you can conditionally pass in the property, both the <code>DeviceState</code> text and the <code>SystemState </code>text can share the Style with little code.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">XAML</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;grid.styles>&lt;style selector="TextBlock.Error" type="text/css">&lt;Setter Property="Foreground" Value="{StaticResource ErrorForeground}" />&lt;/style>
&lt;/grid.styles>
&lt;textblock classes.error="{Binding IsDeviceInError}" text="{Binding DeviceState}">
&lt;textblock classes.error="{Binding IsSystemInError}" text="{Binding SystemState}">
&lt;/textblock>&lt;/textblock></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">grid.styles</span><span style="color: #808080">&gt;&lt;</span><span style="color: #569CD6">style</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">selector</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;TextBlock.Error&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text/css&quot;</span><span style="color: #808080">&gt;&lt;</span><span style="color: #569CD6">Setter</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Property</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Foreground&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;{StaticResource ErrorForeground}&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;&lt;/</span><span style="color: #569CD6">style</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">grid.styles</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">textblock</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">classes.error</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;{Binding IsDeviceInError}&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">text</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;{Binding DeviceState}&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">textblock</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">classes.error</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;{Binding IsSystemInError}&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">text</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;{Binding SystemState}&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">textblock</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">textblock</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">In WPF, you must rely on a<strong> </strong><code>DataTrigger</code> to change the Foreground value. Since the <code>SystemState</code> text and the <code>DeviceState</code> text rely on different bound properties as their condition, they cannot share the Style which leads to less code reuse.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">XAML</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;textblock text="{Binding DeviceState}">
    &lt;textblock.style>&lt;style basedon="{StaticResource DefaultTextBlockStyle}" targettype="{x:Type TextBlock}" type="text/css">&lt;Setter Property="Foreground" Value="Black" />
            &lt;Style.Triggers>
                &lt;DataTrigger Binding="{Binding IsDeviceInError}" Value="True">
                    &lt;Setter Property="Foreground" Value="Red" />
                &lt;/DataTrigger>
            &lt;/Style.Triggers>&lt;/style>
    &lt;/textblock.style>
&lt;/textblock>
&lt;textblock text="{Binding SystemState}">
    &lt;textblock.style>&lt;style basedon="{StaticResource DefaultTextBlockStyle}" targettype="{x:Type TextBlock}" type="text/css">&lt;Setter Property="Foreground" Value="Black" />
            &lt;Style.Triggers>
                &lt;DataTrigger Binding="{Binding IsSystemInError}" Value="True">
                    &lt;Setter Property="Foreground" Value="Red" />
                &lt;/DataTrigger>
            &lt;/Style.Triggers>&lt;/style>
    &lt;/textblock.style>
&lt;/textblock></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">textblock</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">text</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;{Binding DeviceState}&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">textblock.style</span><span style="color: #808080">&gt;&lt;</span><span style="color: #569CD6">style</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">basedon</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;{StaticResource DefaultTextBlockStyle}&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">targettype</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;{x:Type TextBlock}&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text/css&quot;</span><span style="color: #808080">&gt;&lt;</span><span style="color: #569CD6">Setter</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Property</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Foreground&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Black&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">Style.Triggers</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">DataTrigger</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Binding</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;{Binding IsDeviceInError}&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;True&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">Setter</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Property</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Foreground&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Red&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">DataTrigger</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">Style.Triggers</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">style</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">textblock.style</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">textblock</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">textblock</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">text</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;{Binding SystemState}&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">textblock.style</span><span style="color: #808080">&gt;&lt;</span><span style="color: #569CD6">style</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">basedon</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;{StaticResource DefaultTextBlockStyle}&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">targettype</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;{x:Type TextBlock}&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text/css&quot;</span><span style="color: #808080">&gt;&lt;</span><span style="color: #569CD6">Setter</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Property</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Foreground&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Black&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">Style.Triggers</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">DataTrigger</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Binding</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;{Binding IsSystemInError}&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;True&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">Setter</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Property</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Foreground&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Red&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">DataTrigger</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">Style.Triggers</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">style</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">textblock.style</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">textblock</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<h2 id="h-controls" class="wp-block-heading">Controls</h2>



<p class="wp-block-paragraph">Controls in Avalonia are very similar to WPF, but there are a few tweaks that make the framework quicker to work with but potentially less feature-rich.</p>



<h3 id="h-visualization-and-animations" class="wp-block-heading">Visualization and Animations</h3>



<p class="wp-block-paragraph">Avalonia does not support the <code>VisualStateManager</code>, and it instead relies on styles and pseudoclasses such as&nbsp;<code>:hover</code>, <code>:focus</code>, and&nbsp;<code>:checked</code>. Additionally, Avalonia does not use Storyboards, but rather it has simpler animations that use <code>Transitions</code> and <code>Animation</code>.</p>



<h3 id="h-grid-row-and-column-definitions" class="wp-block-heading">Grid Row and Column Definitions</h3>



<p class="wp-block-paragraph">A low-hanging fruit that Avalonia improved was how to define rows and columns for the Grid control. Instead of using multiple lines to do it, Avalonia has allowed you to do it within one line. The following examples show how to define the same grid layout in Avalonia and WPF.</p>



<p class="wp-block-paragraph">In Avalonia,</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">XAML</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;grid columndefinitions="*, *, *, *" rowdefinitions="Auto, Auto, Auto, Auto">
&lt;/grid></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">columndefinitions</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;*, *, *, *&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">rowdefinitions</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Auto, Auto, Auto, Auto&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">grid</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">In WPF,</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">XAML</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;Grid> 
    &lt;Grid.RowDefinitions> 
        &lt;RowDefinition Height="Auto" /> 
        &lt;RowDefinition Height="Auto" /> 
        &lt;RowDefinition Height="Auto" /> 
        &lt;RowDefinition Height="Auto" /> 
    &lt;/Grid.RowDefinitions> 
    &lt;Grid.ColumnDefinitions> 
        &lt;ColumnDefinition Width="*" /> 
        &lt;ColumnDefinition Width="*" /> 
        &lt;ColumnDefinition Width="*" /> 
        &lt;ColumnDefinition Width="*" /> 
    &lt;/Grid.ColumnDefinitions> 
&lt;/Grid> </textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">Grid</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">Grid.RowDefinitions</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">RowDefinition</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Height</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Auto&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">RowDefinition</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Height</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Auto&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">RowDefinition</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Height</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Auto&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">RowDefinition</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Height</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Auto&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">Grid.RowDefinitions</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">Grid.ColumnDefinitions</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">ColumnDefinition</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Width</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;*&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">ColumnDefinition</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Width</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;*&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">ColumnDefinition</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Width</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;*&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">ColumnDefinition</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Width</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;*&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">Grid.ColumnDefinitions</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">Grid</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> </span></span></code></pre></div>



<h2 id="h-compiled-bindings" class="wp-block-heading">Compiled Bindings</h2>



<p class="wp-block-paragraph">Another nice feature in Avalonia is the choice to use compiled bindings. This can be very helpful since it allows the developer to catch binding errors faster since they are caught at compile time instead of runtime.</p>



<p class="wp-block-paragraph">There are some limitations with compiled bindings though. For instance, they require a static <code>DataContext</code> and a defined data context type using <code>x:DataType</code>. However, for most use cases, they will be helpful in debugging and development!</p>



<h2 id="h-takeaways" class="wp-block-heading">Takeaways</h2>



<p class="wp-block-paragraph">When comparing Avalonia and WPF, the running theme is that Avalonia prioritizes flexibility to support multiple platforms and succinct code. This makes Avalonia lighter weight and a great option for cross-platform development. For complex, feature-rich Windows development, WPF has the edge over Avalonia.</p>



<p class="wp-block-paragraph">At DMC, we are always looking towards the future and learning new technologies to better support the wide variety of needs our customers have. We are excited to continue exploring Avalonia UI to provide expert solutions for cross-platform, desktop development.</p>



<div class="wp-block-group alignwide has-custom-light-blue-background-color has-background is-layout-flow wp-container-core-group-is-layout-dbd34961 wp-block-group-is-layout-flow" style="border-radius:20px;margin-top:var(--wp--preset--spacing--50);margin-bottom:var(--wp--preset--spacing--50);padding-top:var(--wp--preset--spacing--50);padding-right:0;padding-bottom:var(--wp--preset--spacing--50);padding-left:0">
<div class="wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-43efaee5 wp-block-columns-is-layout-flex" style="padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)">
<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:85%">
<h3 class="wp-block-heading has-text-align-left" id="h-have-an-upcoming-project-dmc-can-help-you-take-the-next-step"><strong>Plan Your Next Move to a Cross-Platform Framework</strong>.</h3>



<p class="has-text-align-left wp-block-paragraph" id="h-need-help-turning-ideas-into-outcomes-automation-project-to-the-next-level-contact-us-today-to-learn-more-about-our-solutions-and-how-we-can-help-you-achieve-your-goals">Learn more about how DMC&#8217;s <a href="https://static.dmcinfo.com/services/application-development/" data-type="page" data-id="434">Application Development</a> experts can help you move to a cross-platform network, and look into our <a href="https://static.dmcinfo.com/services/application-development/desktop-application-development/" data-type="page" data-id="680">Avalonia capabilities</a>.</p>
</div>



<div class="wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:15%">
<div class="wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2236275c wp-block-buttons-is-layout-flex">
<div class="wp-block-button is-style-fill"><a class="wp-block-button__link has-base-contrast-color has-text-color has-link-color wp-element-button" href="https://static.dmcinfo.com/contact/">Contact Us</a></div>
</div>
</div>
</div>
</div>


<style selector="TextBlock.h1" type="text/css"><Setter Property="FontSize" Value="24" /><br />
    <Setter Property="FontWeight" Value="Bold" /><br />
</style>
<style selector="TextBlock.h2" type="text/css"><Setter Property="FontSize" Value="20" /><br />
    <Setter Property="FontWeight" Value="Bold" /><br />
</style><p>The post <a href="https://static.dmcinfo.com/blog/15571/avalonia-ui-noteworthy-differences-from-wpf/">Avalonia UI: Noteworthy Differences from WPF</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
