{"id":13825042,"url":"https://github.com/guryanovev/CrystalQuartz","last_synced_at":"2025-07-08T21:31:05.322Z","repository":{"id":6927923,"uuid":"8179066","full_name":"guryanovev/CrystalQuartz","owner":"guryanovev","description":"pluggable UI for Quartz.NET","archived":false,"fork":false,"pushed_at":"2025-06-30T14:33:44.000Z","size":17354,"stargazers_count":1047,"open_issues_count":33,"forks_count":315,"subscribers_count":92,"default_branch":"master","last_synced_at":"2025-06-30T15:39:04.525Z","etag":null,"topics":["dotnet","quartz-scheduler","ui"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/guryanovev.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2013-02-13T12:54:57.000Z","updated_at":"2025-06-24T22:33:57.000Z","dependencies_parsed_at":"2024-06-21T02:13:22.612Z","dependency_job_id":"9a0099dc-974f-4b73-8aca-c96ca1196bc4","html_url":"https://github.com/guryanovev/CrystalQuartz","commit_stats":{"total_commits":392,"total_committers":10,"mean_commits":39.2,"dds":"0.16836734693877553","last_synced_commit":"f3a0ab34467b63c340fc9ae503c677cdac40453a"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/guryanovev/CrystalQuartz","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guryanovev%2FCrystalQuartz","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guryanovev%2FCrystalQuartz/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guryanovev%2FCrystalQuartz/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guryanovev%2FCrystalQuartz/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/guryanovev","download_url":"https://codeload.github.com/guryanovev/CrystalQuartz/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guryanovev%2FCrystalQuartz/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264352636,"owners_count":23594937,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dotnet","quartz-scheduler","ui"],"created_at":"2024-08-04T09:01:13.935Z","updated_at":"2025-07-08T21:31:03.549Z","avatar_url":"https://github.com/guryanovev.png","language":"C#","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"﻿![](http://guryanovev.github.io/CrystalQuartz/demo_v6.png)\n\nCrystal Quartz Panel is a lightweight, completely pluggable module for displaying Quartz.NET scheduler jobs information.\n\n[![CI Build](https://github.com/guryanovev/CrystalQuartz/actions/workflows/build.yaml/badge.svg)](https://github.com/guryanovev/CrystalQuartz/actions/workflows/build.yaml)\n[![Join the chat at https://gitter.im/guryanovev/CrystalQuartz](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/guryanovev/CrystalQuartz?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\n## [View Demo](http://guryanovev.github.io/CrystalQuartz/demo/?v=6.9.0\u0026utm_source=readme) (serverless, Quartz.NET scheduler is emulated in the browser) ##\n\n# Features #\n\n  * simple and lightweight, could be embedded into existing application:\n    * supports OWIN-based web or standalone applications;\n    * supports non-OWIN web applications;\n    * native support for ASP.NET Core (without OWIN).\n  * displays basic scheduler information:\n    * scheduler state and properties;\n    * triggers by jobs and groups;\n    * job properties (`JobDataMap`);\n  * ability to perform basic scheduler actions:\n    * pause/resume/delete triggers, jobs or groups;\n    * start/shutdown/standby/resume a scheduler;\n    * execute a job on demand (\"Trigger Now\");\n    * add a trigger for jobs;\n  * easy integration with a *remote scheduler* (see [examples](https://github.com/guryanovev/CrystalQuartz/tree/master/examples));\n  * works with Quartz.NET v2 or v3.\n\n# Pre Requirements #\n\n1. Quartz.NET v2 or v3 installed to project you want to use as a CrystalQuartz panel host. \n    \u003cdetails\u003e\n      \u003cp\u003eCrystalQuartz detects Quartz.dll version at runtime and does not explicitly depend on Quartz \n      \u003ca href=\"https://www.nuget.org/packages/Quartz/\"\u003eNuGet\u003c/a\u003e package. So you need to make sure\n      you have Quartz pre-installed.\u003c/p\u003e\n      \u003cp\u003eFor Quartz 3:\u003c/p\u003e\n      \u003cpre\u003eInstall-Package Quartz -Version 3.6.2\u003c/pre\u003e\n      \u003cp\u003eFor Quartz 2:\u003c/p\u003e\n      \u003cpre\u003eInstall-Package Quartz -Version 2.6.2\u003c/pre\u003e\n    \u003c/details\u003e\n  \n2. Make sure you have appropriate target framework version\n    \u003cdetails\u003e\n      \u003ch3\u003eMinimum Supported .NET versions (vary by packages)\u003c/h3\u003e\n      \u003ctable\u003e\n        \u003cthead\u003e\n            \u003ctr\u003e\n                \u003cth\u003eQuartz.NET Version\u003c/th\u003e\n                \u003cth\u003eCrystalQuartz Package\u003c/th\u003e\n                \u003cth\u003e.NET Framework 4.0\u003c/th\u003e\n                \u003cth\u003e.NET Framework 4.5\u003c/th\u003e\n                \u003cth\u003e.NET Framework 4.5.2\u003c/th\u003e\n                \u003cth\u003e.NET Standard 2.0\u003c/th\u003e\n                \u003cth\u003e.NET Core 2.0\u003c/th\u003e\n                \u003cth\u003e.NET 5\u003c/th\u003e\n            \u003c/tr\u003e\n        \u003c/thead\u003e\n        \u003ctbody\u003e\n            \u003ctr\u003e\n                \u003ctd\u003ev3\u003c/td\u003e\n                \u003ctd\u003eCrystalQuartz.AspNetCore\u003c/td\u003e\n                \u003ctd\u003e\u003c/td\u003e\n                \u003ctd\u003e\u003c/td\u003e\n                \u003ctd\u003e\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n            \u003c/tr\u003e\n            \u003ctr\u003e\n                \u003ctd\u003ev3\u003c/td\u003e\n                \u003ctd\u003eCrystalQuartz.Owin\u003c/td\u003e\n                \u003ctd\u003e\u003c/td\u003e\n                \u003ctd\u003e\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n            \u003c/tr\u003e\n            \u003ctr\u003e\n                \u003ctd\u003ev3\u003c/td\u003e\n                \u003ctd\u003eCrystalQuartz.Owin\u003c/td\u003e\n                \u003ctd\u003e\u003c/td\u003e\n                \u003ctd\u003e\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n            \u003c/tr\u003e\n            \u003ctr\u003e\n                \u003ctd\u003ev3\u003c/td\u003e\n                \u003ctd\u003eCrystalQuartz.Simple\u003c/td\u003e\n                \u003ctd\u003e\u003c/td\u003e\n                \u003ctd\u003e\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n            \u003c/tr\u003e\n            \u003ctr\u003e\n                \u003ctd\u003ev3\u003c/td\u003e\n                \u003ctd\u003eCrystalQuartz.Remote\u003c/td\u003e\n                \u003ctd\u003e\u003c/td\u003e\n                \u003ctd\u003e\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n            \u003c/tr\u003e\n            \u003ctr\u003e\n                \u003ctd\u003ev2\u003c/td\u003e\n                \u003ctd\u003eCrystalQuartz.Owin\u003c/td\u003e\n                \u003ctd\u003e\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n            \u003c/tr\u003e\n            \u003ctr\u003e\n                \u003ctd\u003ev2\u003c/td\u003e\n                \u003ctd\u003eCrystalQuartz.Simple\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n            \u003c/tr\u003e\n            \u003ctr\u003e\n                \u003ctd\u003ev2\u003c/td\u003e\n                \u003ctd\u003eCrystalQuartz.Remote\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n                \u003ctd\u003e✔️\u003c/td\u003e\n            \u003c/tr\u003e\n        \u003c/tbody\u003e\n      \u003c/table\u003e\n    \u003c/details\u003e\n\n# Getting started #\n\nCrystalQuartzPanel is an embeddable module that can be plugged into an existing application. Getting started strategy depends on a type of environment you use.\n\n## Option 1: ASP.NET Core (recommended for modern .NET environments) ##\n\nThis option should work for any modern .NET 5/6/7 and .NET Core 2/3 applications as long as they\nuse ASP.NET Core hosting environment.\n\n1. Install NuGet package\n\n    ```Install-Package CrystalQuartz.AspNetCore -IncludePrerelease```\n\n2. Once you have an ASP.NET Core-supported application (no matter if it's web or self hosted) you can activate CrystalQuartz panel:\n\n    ```C#\n    using CrystalQuartz.AspNetCore;\n    // ...\n    /*\n     * app is IApplicationBuilder\n     * scheduler is your IScheduler (local or remote) or Task\u003cIScheduler\u003e\n     */\n    app.UseCrystalQuartz(() =\u003e scheduler);\n    ```\n\n3. Run your app and navigate to \n\n    ```localhost:YOUR_PORT/quartz```\n\nPlease check [Getting Started with ASP.NET Core](https://guryanovev.github.io/CrystalQuartz/getting-started/getting-started-with-asp-dot-net-core/) for more details.\n\n**Examples**\n- [ASP.NET Core Web App](//github.com/guryanovev/CrystalQuartz/tree/master/examples/09_Quartz3_AspNetCore_Web)\n\n## Option 2: OWIN (legacy environments) ##\n\n1. Install NuGet package\n\n    ```Install-Package CrystalQuartz.Owin -IncludePrerelease```\n\n2. Once you have an OWIN-supporting application (no matter if it's web or self hosted) you can activate CrystalQuartz panel:\n\n    ```C#\n    using CrystalQuartz.Owin;\n    // ...\n    /*\n     * app is IAppBuilder\n     * scheduler is your IScheduler (local or remote)\n     */\n    app.UseCrystalQuartz(() =\u003e scheduler);\n    ```\n\n3. Run your app and navigate to \n\n    ```localhost:YOUR_PORT/quartz```\n\nPlease check [Getting Started with OWIN](https://guryanovev.github.io/CrystalQuartz/getting-started/getting-started-with-owin/) for more details.\n  \n**Examples**\n- [OWIN Self-hosted console app example](//github.com/guryanovev/CrystalQuartz/tree/master/examples/01_Owin_SelfHosted)\n- [OWIN Simple site](//github.com/guryanovev/CrystalQuartz/tree/master/examples/02_Owin_Web_Simple)\n- [OWIN Web site + remote](//github.com/guryanovev/CrystalQuartz/tree/master/examples/03_Owin_Web_Remote)\n                                         \n## Option 3: Non-OWIN (ancient legacy) ##\n\nNon-owin CrystalQuartzPanel implemented as an http module. It can work in web-applications only and requires some configuration to be added to the `web.config` file. There are two NuGet packages aimed to help in case of non-owin application, the choice depends on the type of scheduler you use.\n\n**Option 2.1: If Quartz Scheduler works in the app domain of your web application:**\n\n1. Install [CrystalQuartz.Simple](http://nuget.org/List/Packages/CrystalQuartz.Simple) NuGet package.\n\n    ```Install-Package CrystalQuartz.Simple -IncludePrerelease```\n\n2. Customize `SimpleSchedulerProvider` class that has been added by NuGet package\n  \n    ```C#\n    public class SimpleSchedulerProvider : ISchedulerProvider\n    {\n        public object CreateScheduler(ISchedulerEngine engine)\n        {\n            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();\n            var scheduler = GetScheduler(schedulerFactory.GetScheduler());\n\n            /* ADD JOBS HERE */\n      \n            return scheduler;\n        }\n        //...\n    }\n    ```\n3. Run you application and go to `YOUR_APP_URL/CrystalQuartzPanel.axd`\n \n**Option 2.2: If Quartz Scheduler works in a separate application (remote scheduler):**\n\n1. Install [CrystalQuartz.Remote](http://nuget.org/List/Packages/CrystalQuartz.Remote) NuGet package.\n  \n    ```Install-Package CrystalQuartz.Remote -IncludePrerelease```\n \n2. Customize url of the remote scheduler in web config file:\n \n    ```XML\n    \u003ccrystalQuartz\u003e\n        \u003cprovider\u003e\n            \u003cadd property=\"Type\" \n                 value=\"CrystalQuartz.Core.SchedulerProviders.RemoteSchedulerProvider, CrystalQuartz.Core\" /\u003e\n            \u003cadd property=\"SchedulerHost\" \n                 value=\"tcp://localhost:555/QuartzScheduler\" /\u003e \u003c!-- Customize URL here --\u003e\n        \u003c/provider\u003e\n    \u003c/crystalQuartz\u003e\n    ```\n\n3. Run you application and go to `YOUR_APP_URL/CrystalQuartzPanel.axd`\n\n**Examples**\n- [Simple Scheduler Example](https://github.com/guryanovev/CrystalQuartz/tree/master/examples/04_SystemWeb_Simple)\n- [Remote Scheduler Example](https://github.com/guryanovev/CrystalQuartz/tree/master/examples/05_SystemWeb_Remote)\n\n# Advanced Configuration #\n\nCrystalQuartz supports some configuration options that could be passed to the panel at startup time to customize it's behavior.\n\nFor CrystalQuartz.Owin package pass options to `UseCrystalQuartz` method:\n\n```C#\nusing CrystalQuartz.Application;\n\n//...\n\napp.UseCrystalQuartz(\n    () =\u003e scheduler,\n    new CrystalQuartzOptions\n    {\n        /* SET OPTIONS HERE */\n    });\n```\n\nFor CrystalQuartz.Simple and CrystalQuartz.Remote use the web.config:\n\n```XML\n\u003csectionGroup name=\"crystalQuartz\" type=\"CrystalQuartz.Web.Configuration.CrystalQuartzConfigurationGroup\"\u003e\n  \u003csection \n      name=\"provider\" \n      type=\"CrystalQuartz.Web.Configuration.ProviderSectionHandler\" \n      requirePermission=\"false\" \n      allowDefinition=\"Everywhere\" /\u003e\n  \u003c!-- options section is required --\u003e\n  \u003csection \n      name=\"options\" \n      type=\"CrystalQuartz.Web.Configuration.CrystalQuartzOptionsSection\" \n      requirePermission=\"false\" \n      allowDefinition=\"Everywhere\" /\u003e\n\u003c/sectionGroup\u003e\n\n\u003c!-- ... --\u003e\n\u003ccrystalQuartz\u003e\n  \u003c!-- ... --\u003e\n  \u003c!-- PLACE OPTIONS HERE --\u003e\n  \u003coptions\n      customCssUrl=\"CUSTOM_CSS_URL\"\u003e\n  \u003c/options\u003e\n\u003c/crystalQuartz\u003e\n```\n\nAdvanced configuration topics:\n\n- [Detecting failed Quartz.NET runs](https://guryanovev.github.io/CrystalQuartz/advanced-config/detecting-failed-runs/)\n- [Configuring Allowed Job Types](https://guryanovev.github.io/CrystalQuartz/advanced-config/configuring-allowed-job-types/)\n\nList of available options:\n\n| Property Name  | XML Attribute | Default |  |\n| -------------- | ------------- |----------- |---|\n| `Path`         | not supported | `'quartz'` | Url part for the panel. |\n| `CustomCssUrl` | `customCssUrl`| `null`     | Valid absolute or relative url for custom CSS styles for the panel. See [custom styles example](//github.com/guryanovev/CrystalQuartz/tree/master/examples/06_CustomStyles) for details. |\n| `LazyInit`     | not supported | `false`    | A flag indicating whether CrystalQuartz Panel should be initialized immediately after application start (`false`) or after first call of panel services (`true`). |\n| `TimelineSpan` | not supported | 1 hour     | Span of timeline events displayed by the panel. |\n\n*Please note:* The options list here is not complete, please check the [options class\nsource code](https://github.com/guryanovev/CrystalQuartz/blob/master/src/CrystalQuartz.Application/CrystalQuartzOptions.cs) for details.\n\n# Building from source #\n\nPlease use `Build.bat` script to build the project locally. **Rebuilding directly from Visual Studio would not work correctly** because some client-side assets should be regenerated. `Build.bat` is a bootstrapper for [Rosalia build tool](https://github.com/rosaliafx/Rosalia). Prerquirements:\n\n* NodeJs and npm should be installed on your machine and globally available.\n\nOnce the build completes successfully, you can Run the VS project as usually.\n\n# Collaboration #\n\nPlease use [gitter](https://gitter.im/guryanovev/CrystalQuartz?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge) to ask questions. Fill free to report issues and open pull requests.\n\n# Changelog #\n\n**Latest update:**\n\n* timeline tooltip cosmetic fixes\n* introduced trigger fire details dialog (opens on timeline item click)\n   \n\u003cimg src=\"http://guryanovev.github.io/CrystalQuartz/fire_details_dialog.png\" title=\"Fire details dialog\"\u003e\n\n[See full changelog](//github.com/guryanovev/CrystalQuartz/wiki/Changelog)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguryanovev%2FCrystalQuartz","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguryanovev%2FCrystalQuartz","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguryanovev%2FCrystalQuartz/lists"}