<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kwame Owusu Ohemeng</title>
    <description>The latest articles on DEV Community by Kwame Owusu Ohemeng (@kwamzdev).</description>
    <link>https://dev.to/kwamzdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3425286%2Fd2ac44a8-c1de-4d04-aa2b-9f3c5ce053d0.jpeg</url>
      <title>DEV Community: Kwame Owusu Ohemeng</title>
      <link>https://dev.to/kwamzdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kwamzdev"/>
    <language>en</language>
    <item>
      <title>Building a Real-Time System Health Dashboard with Powershell, HTML &amp; CSS</title>
      <dc:creator>Kwame Owusu Ohemeng</dc:creator>
      <pubDate>Sun, 10 Aug 2025 16:03:42 +0000</pubDate>
      <link>https://dev.to/kwamzdev/building-a-real-time-system-health-dashboard-with-powershell-html-css-j1l</link>
      <guid>https://dev.to/kwamzdev/building-a-real-time-system-health-dashboard-with-powershell-html-css-j1l</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In today’s fast-paced IT world, system reliability is crucial. Monitoring key system metrics helps prevent downtime and costly errors. In this post, I’ll walk you through a project I built: a real-time system health dashboard that runs on a Windows VM using PowerShell, HTML, and CSS. It provides live insights on CPU, memory, disk health, uptime, network, and more — all wrapped in a sleek dark blue futuristic interface.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I Built This&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Downtime and unnoticed errors can cause serious business losses. Existing monitoring tools can be complex or expensive. I wanted a simple, automated solution that provides clear, real-time data for system admins and IT pros.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;br&gt;
    • Real-time monitoring of CPU usage, memory utilisation, disk health, uptime, network status, and critical event logs&lt;br&gt;
    • Interactive HTML dashboard with modern dark blue theme&lt;br&gt;
    • Automation via Windows Task Scheduler for continuous updates&lt;br&gt;
    • Built entirely with PowerShell scripting and web technologies (HTML/CSS)&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step-by-Step implementation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Planning the Dashboard&lt;/strong&gt;&lt;br&gt;
Planning the dashboard took a bit of time and heavy reasoning. There are many system health metrics, but my goal was to provide the key ones - CPU, memory, disk, uptime, network, and event logs. My focus was on real-time accuracy and easy readability. I gave the dashboard a futuristic dark blue theme to make the data visually appealing. I separated the PowerShell script, HTML and CSS into different files to make the project maintainable. Lastly, I automated the script via Task Scheduler to ensure regular updates without manual intervention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gathering System Data with PowerShell&lt;/strong&gt;&lt;br&gt;
In PowerShell, I was able to derive all the system metrics - these include the following:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HostName:&lt;/strong&gt; shows the name that identifies your computer in a local network&lt;br&gt;
&lt;code&gt;$env: COMPUTERNAME&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OSName:&lt;/strong&gt; shows what Operating System you are using&lt;br&gt;
&lt;code&gt;$OSInformation = Get-CimInstance - ClassName Win32_OperatingSystem&lt;br&gt;
$OSname = $OSInformation.Caption.Trim()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OSVersion:&lt;/strong&gt; shows the version of the OS you are using&lt;br&gt;
&lt;code&gt;(Get-CimInstance -ClassName Win32_OperatingSystem).Version&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OSBuild number:&lt;/strong&gt; a specific identifier for the version of your OS&lt;br&gt;
&lt;code&gt;(Get-CimInstance -ClassName Win32_OperatingSystem).BuildNumber&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CPU Load Percentage:&lt;/strong&gt; shows you how much the CPU is currently in use&lt;br&gt;
`(Get-CimInstance Win32_Processor).LoadPercentage&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CPU Name(Model):&lt;/strong&gt; Identifies the exact CPU chip&lt;br&gt;
&lt;code&gt;(Get-CimInstance Win32_Processor).Name&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Number of Cores:&lt;/strong&gt; Finds the physical processing power of the computer&lt;br&gt;
&lt;code&gt;(Get-CimInstance Win32_Processor).NumberOfCores&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Number of Logical Processors:&lt;/strong&gt; Finds the multitasking capacity of the CPU&lt;br&gt;
&lt;code&gt;(Get-CimInstance Win32_Processor).NumberOfLogicalProcessors&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total Physical Memory:&lt;/strong&gt; The total installed RAM on your system&lt;br&gt;
&lt;code&gt;$totalMemory = (Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory/1GB&lt;/code&gt;&lt;br&gt;
I round this figure to give a concise result&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Available Memory:&lt;/strong&gt; Determines how much RAM is currently available (free space)&lt;br&gt;
&lt;code&gt;$freeMemory = (Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory/1MB&lt;br&gt;
&lt;/code&gt;I round this figure to give a concise result&lt;br&gt;
To dive deeper - check the source code.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Exporting Data to HTML&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In HTML, I created placeholders to accept the values from PowerShell. I made sure to get the content of the HTML file in PowerShell by using this syntax:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$html = Get-Content "C:\Users\Mikel\Desktop\index.html" -Raw&lt;br&gt;
Get-Content: gets the data from the HTML file&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-Raw:&lt;/strong&gt; Make sure to get the content in the exact form, unedited, and unmodified.&lt;/p&gt;

&lt;p&gt;After getting the contents in HTML (the placeholders), I assigned the various system metrics data to each placeholder. After replacing the values. I exported the HTML file to the output file.&lt;/p&gt;

&lt;p&gt;Syntax:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$html | Out-File "reportFile" -Encoding utf8&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;reportFile:&lt;/strong&gt; is the output file that renders the script in a web browser.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Styling with CSS&lt;/strong&gt;&lt;br&gt;
I created a separate CSS file and linked it to the HTML file using this syntax:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;link rel="stylesheet" href="style.css"&lt;/code&gt;&lt;br&gt;
In the CSS file, I styled the page to my preference. I animated the background and gave it a dark-blue futuristic theme.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Automation with Task Scheduler&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In my task scheduler, under the actions section in the top right panel. I chose “Create Basic Task”&lt;/p&gt;

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

&lt;p&gt;In the “Create Basic Task” menu, I gave the script I want to automate a name.&lt;/p&gt;

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

&lt;p&gt;Now in the “Trigger” menu, I was asked when I want to start the automation. I chose daily to always get real-time and updated data. Since I chose daily, I set the time to when the automation should start.&lt;/p&gt;

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

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

&lt;p&gt;The “Action” menu is what you want the task to do, I chose to “start a program” since we are dealing with a script here.&lt;/p&gt;

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

&lt;p&gt;In the “Start a Program” menu, I entered PowerShell as the script I want to run. In the “Add arguments” text bar, I wrote a script to bypass or ignore every restriction to be able to run the script successfully.&lt;br&gt;
Syntax:&lt;/p&gt;

&lt;p&gt;`-ExcecutionPolicy Bypass -File "path to HTML file"&lt;/p&gt;

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

&lt;p&gt;The final part is the summary menu which shows you want you have done so far. I was okay with it and clicked on “Finish”&lt;/p&gt;

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

&lt;p&gt;In my task creation, I wasn't given an option to set a time interval for the task to be repeated. So I after creating the task, I located the file and navigated to the Trigger section on the top panel. In the Trigger menu, I clicked on Edit. It opened a menu as shown in the image below:&lt;/p&gt;

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

&lt;p&gt;I checked “Repeat task every” and set it to 15 minutes. This means my script will run every 15 mins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now to see if the task I created was working successfully, I had to manually run the task.&lt;/p&gt;

&lt;p&gt;I located my file and clicked “Run” in the actions panel on the right side.&lt;/p&gt;

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

&lt;p&gt;My script ran successfully as expected!!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FINAL RESULT&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;What I learnt&lt;/strong&gt;&lt;br&gt;
Through this project, I have strengthened my skills in PowerShell scripting, automation, and web design, while gaining practical experience in system monitoring and creating a user-friendly dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
This project demonstrates how combining scripting and web technologies can create effective, real-time system monitoring tools. I welcome your feedback and encourage you to explore the repo!&lt;/p&gt;

&lt;p&gt;Check out the full project on GitHub: &lt;a href="https://github.com/KwamzCodes/System-Dashboard-PS.git" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;br&gt;
⸻&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
