<?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: Mahesh K</title>
    <description>The latest articles on DEV Community by Mahesh K (@mkokkerametla).</description>
    <link>https://dev.to/mkokkerametla</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4216232%2F939b9377-9d24-4077-96d5-89a380a61509.png</url>
      <title>DEV Community: Mahesh K</title>
      <link>https://dev.to/mkokkerametla</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mkokkerametla"/>
    <language>en</language>
    <item>
      <title>Cronlight: a dashboard for Quartz.NET that drops into your existing ASP.NET Core app (open source, MIT)</title>
      <dc:creator>Mahesh K</dc:creator>
      <pubDate>Fri, 30 Oct 2026 01:30:36 +0000</pubDate>
      <link>https://dev.to/mkokkerametla/cronlight-a-dashboard-for-quartznet-that-drops-into-your-existing-aspnet-core-app-open-source-3b9f</link>
      <guid>https://dev.to/mkokkerametla/cronlight-a-dashboard-for-quartznet-that-drops-into-your-existing-aspnet-core-app-open-source-3b9f</guid>
      <description>&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjtvjrzpyfiktrqt1ebi5.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjtvjrzpyfiktrqt1ebi5.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F808x7f5gt45qbw5skq3e.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F808x7f5gt45qbw5skq3e.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh0l4qyhvu55ka9yky9y9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh0l4qyhvu55ka9yky9y9.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;I've run Quartz.NET jobs for years, and for most of that time I waited for someone to ship a proper dashboard. Eventually I stopped waiting and built the one I wanted. By the time I got serious, the official dashboard had already shipped - but it's Blazor, and Blazor and I never got along. So I kept going, and it became Cronlight: a plain web UI served as static files, with no Blazor or per-user server connection.&lt;/p&gt;

&lt;p&gt;Full disclosure: a lot of this was built with AI tools. I drove the design, reviewed the code, argued with the model plenty, and it has unit and end-to-end tests running in CI. I'm not going to pretend I typed it all myself.&lt;/p&gt;

&lt;p&gt;It drops into the ASP.NET Core app that already runs your scheduler - your scheduler, no connection string or schema of its own, never a second scheduler behind your back.&lt;/p&gt;

&lt;p&gt;What it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browse, create, and edit jobs (cron, one-time, interval) with the schedule in plain words and next fire times as you type, in any time zone. Pause or resume a job, a group, or everything; run now, run once with different data, cancel a run in flight.&lt;/li&gt;
&lt;li&gt;Typed forms for your job types via attributes, with required and secret parameters - secrets stay out of the database as configuration references.&lt;/li&gt;
&lt;li&gt;Execution history (optional package): every run's outcome, error, and log, including a running job's log so far, plus misfires, late starts, success rates, and P95 durations, stored in the Quartz database on SQL Server, PostgreSQL, MySQL, or SQLite.&lt;/li&gt;
&lt;li&gt;Retries, alerts (Slack, Teams, webhook, email), JSON/YAML export and import with a preview of what will change, audit log, OpenTelemetry metrics, health check, OpenAPI, and several schedulers in one app with per-scheduler permissions.&lt;/li&gt;
&lt;li&gt;An MCP server, plus an "AI mode" where you ask "which jobs failed overnight, and why?" in the dashboard, answered by your app's own model with read-only tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it in your browser, no sign-up: &lt;a href="https://cronlight.pages.dev/demo/" rel="noopener noreferrer"&gt;https://cronlight.pages.dev/demo/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Needs .NET 10 and Quartz.NET 3.13.1+ (any job store). It's pre-1.0, so a minor version can still change options and endpoints.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://cronlight.pages.dev/docs/" rel="noopener noreferrer"&gt;https://cronlight.pages.dev/docs/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tell me what's missing for your setup - clustered schedulers, auth setups, job stores I haven't tested, or UI friction.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>quartznet</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
