{"id":19453299,"url":"https://github.com/usercode/dragonfly","last_synced_at":"2025-10-24T09:29:39.903Z","repository":{"id":56757291,"uuid":"339107316","full_name":"usercode/DragonFly","owner":"usercode","description":"Open Source ASP.NET Core CMS + Blazor","archived":false,"fork":false,"pushed_at":"2025-03-30T21:02:06.000Z","size":12554,"stargazers_count":48,"open_issues_count":0,"forks_count":8,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-04-04T22:02:45.263Z","etag":null,"topics":["asp-net-core","blazor","cms","cms-framework","content-management-system","csharp","headless-cms"],"latest_commit_sha":null,"homepage":"https://dragonfly-cms.net","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/usercode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2021-02-15T14:42:24.000Z","updated_at":"2025-04-03T06:57:19.000Z","dependencies_parsed_at":"2023-02-18T01:32:03.939Z","dependency_job_id":"9de9a7fd-12cd-40c9-ad9a-dcb847fc9aeb","html_url":"https://github.com/usercode/DragonFly","commit_stats":{"total_commits":251,"total_committers":1,"mean_commits":251.0,"dds":0.0,"last_synced_commit":"8b8247c0aa343098927f3664e495bdaeb4921984"},"previous_names":[],"tags_count":83,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/usercode%2FDragonFly","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/usercode%2FDragonFly/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/usercode%2FDragonFly/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/usercode%2FDragonFly/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/usercode","download_url":"https://codeload.github.com/usercode/DragonFly/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247256104,"owners_count":20909240,"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":["asp-net-core","blazor","cms","cms-framework","content-management-system","csharp","headless-cms"],"created_at":"2024-11-10T17:03:36.368Z","updated_at":"2025-10-24T09:29:39.895Z","avatar_url":"https://github.com/usercode.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n![DragonFly](logo/logo_text.png)\n\n# DragonFly » Headless ASP.NET Core CMS + Blazor\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n| Package                     | Release | \n|-----------------------------|-----------------|\n| DragonFly.Core              | [![NuGet](https://img.shields.io/nuget/vpre/DragonFly.Core.svg)](https://www.nuget.org/packages/DragonFly.Core/) |\n| DragonFly.AspNetCore        | [![NuGet](https://img.shields.io/nuget/vpre/DragonFly.AspNetCore.svg)](https://www.nuget.org/packages/DragonFly.AspNetCore/) |\n| DragonFly.API               | [![NuGet](https://img.shields.io/nuget/vpre/DragonFly.API.svg)](https://www.nuget.org/packages/DragonFly.API/) |\n| DragonFly.Client            | [![NuGet](https://img.shields.io/nuget/vpre/DragonFly.Client.svg)](https://www.nuget.org/packages/DragonFly.Client/) |\n| DragonFly.Generator             | [![NuGet](https://img.shields.io/nuget/vpre/DragonFly.Generator.svg)](https://www.nuget.org/packages/DragonFly.Generator/) |\n| DragonFly.ImageWizard       | [![NuGet](https://img.shields.io/nuget/vpre/DragonFly.ImageWizard.svg)](https://www.nuget.org/packages/DragonFly.ImageWizard/) |\n| DragonFly.MongoDB           | [![NuGet](https://img.shields.io/nuget/vpre/DragonFly.MongoDB.svg)](https://www.nuget.org/packages/DragonFly.MongoDB/) |\n| DragonFly.Identity       | [![NuGet](https://img.shields.io/nuget/vpre/DragonFly.Identity.svg)](https://www.nuget.org/packages/DragonFly.Identity/) |\n| DragonFly.ApiKeys       | [![NuGet](https://img.shields.io/nuget/vpre/DragonFly.ApiKeys.svg)](https://www.nuget.org/packages/DragonFly.ApiKeys/) |\n\n## Features\n\n![grafik](https://github.com/user-attachments/assets/76668e7f-877b-4b67-9eb5-eb7259e4d0d9)\n\n\n* Define schema with custom fields\n* Create, update, delete and publish/unpublish content items based on schema\n  * Create new Fields with FieldGenerator\n* Create typed content items with ModelGenerator\n* BlockField for structured page content\n  * TextBlock, HtmlBlock, ColumnBlock, GridBlock, AssetBlock, YouTubeBlock, CodeBlock,..\n* Asset management\n  * Folder tree\n  * Asset metadata like ImageMetadata and PdfMetadata\n    * Use IAssetProcessing after asset upload\n  * Create thumbnails for image and pdf files with ImageWizard\n* REST API\n* Permissions for content, schema, asset, asset folder, webhooks\n  * Dynamic permissions for every schema\n* Background tasks\n* WebHooks\n* MongoDB storage\n  * Create proxies with ProxyGenerator\n* Admin interface with Blazor\n\n## Getting started\n### Prerequisites\n\n* [.NET 9.0 SDK](https://dotnet.microsoft.com/download/dotnet/9.0)\n* Visual Studio 2022\n* MongoDB instance\n\n### Create a new project from template\n\nTo use the project template you need first to download and install it from NuGet. \n\n~~~ bash\ndotnet new install DragonFly.Templates\n~~~\n\nAfter this you can create the project with:\n\n~~~ bash\ndotnet new DragonFly\n~~~\n\nIf you have a remote MongoDB instance, you need to add some appsettings:\n\n~~~ json\n\"MongoDB\": {\n    \"Hostname\": \"localhost\",\n    \"Database\": \"DragonFly_App\",\n    \"Port\": 27017,\n    \"Username\": \"\",\n    \"Password\": \"\"\n  },\n~~~\n\n### Use source generators to avoid reflection\n- FieldGenerator\n- ModelGenerator\n- ProxyGenerator\n\n### Supported fields\n- StringField\n- FloatField\n- BoolField\n- AssetField\n- ReferenceField\n- ComponentField\n- ArrayField\n- DateField\n- IntegerField\n- ColorField\n- GeolocationField\n- SlugField\n- XmlField\n- HtmlField\n- BlockField (HeadingBlock, TextBlock, HtmlBlock, CodeBlock, ContainerBlock, ColumnBlock, AssetBlock, ReferenceBlock, GridBlock,..)\n\n### How to create new content schema and content item\n```csharp\nIContentStorage contentStorage = ...;//use MongoStorage or ClientContentService (http client)\n\n//create brand schema\nContentSchema schemaBrand = new ContentSchema(\"Brand\")\n                                    .AddString(\"Name\")\n                                    .AddSlug(\"Slug\")\n                                    .AddTextArea(\"Description\");\n\n//Define schema for product\nContentSchema schemaProduct = new ContentSchema(\"Product\")\n                                    .AddReference(\"Brand\")\n                                    .AddString(\"Name\", options =\u003e options.IsRequired = true)\n                                    .AddSlug(\"Slug\")\n                                    .AddBool(\"IsAvailable\", options =\u003e options.DefaultValue = true)\n                                    .AddFloat(\"Price\")\n                                    .AddTextArea(\"Description\", options =\u003e options.MaxLength = 255)\n                                    .AddArray(\"Attributes\", options =\u003e options\n                                                                        .AddString(\"Name\")\n                                                                        .AddString(\"Value\"));\n\nawait contentStorage.CreateAsync(schemaProduct);\n\n//create product by schema\nContentItem contentProduct = schemaProduct\n                            .CreateContent()\n                            .SetReference(\"Brand\", new ContentItem(Guid.Parse(\"\"), schemaBrand))\n                            .SetString(\"Name\", \"ProductA\")\n                            .SetBool(\"IsAvailable\", true)\n                            .SetFloat(\"Price\", 9.99)\n                            .SetTextArea(\"Description\", \"...\")\n                            .AddArrayItem(\"Attributes\", schemaProduct, item =\u003e item\n                                                                    .SetString(\"Name\", \"Size\")\n                                                                    .SetString(\"Value\", \"M\"));\n\nawait contentStorage.CreateAsync(contentProduct);\n\n```\n\n### Create typed content\n\nDragonFly.Generator\n\n```csharp\n[ContentItem]\npublic partial class BlogPost\n{\n    [DateField(Required = true)]\n    public partial DateTime? Date { get; set; }\n\n    [StringField(Required = true, Searchable = true, ListField = true, MinLength = 8, MaxLength = 512)]\n    public partial string? Title { get; set; }\n\n    [TextField]\n    public partial string? Description { get; set; }\n\n    [SlugField(Required = true, Index = true)]\n    public partial string? Slug { get; set; }\n\n    [AssetField(ListField = true, ShowPreview = true)]\n    public partial AssetField Image { get; set; }\n\n    [BlockField]\n    public partial BlockField MainContent { get; set; }\n}\n```\n#### Register typed content\n\n```csharp\nbuilder.Services.AddDragonFly()\n                    .AddModels(x =\u003e x.Add\u003cBlogPost\u003e());                    \n```\n\n#### Use queries for typed content\n```csharp\n//get all items\nvar result = await ContentStorage.QueryAsync\u003cBlogPostModel\u003e(x =\u003e x\n                                    .Published(true)\n                                    .Top(10)\n                                    .Slug(x =\u003e x.Slug, \"my-product\")\n                                    .Integer(x =\u003e x.Quantity, 10, NumberQueryType.Equal)\n                                    .String(x =\u003e x.Title, \"Test\", StringQueryType.Equal)\n);\n```\n\n### BackgroundTask\n\nFor long running jobs you can use the BackgroundTaskManager.\n\n```csharp\nIBackgroundTaskManager taskManager = app.Services.GetRequiredService\u003cIBackgroundTaskManager\u003e();\ntaskManager.Start(\"Test\", async ctx =\u003e await Task.Delay(TimeSpan.FromSeconds(60), ctx.CancellationToken));\n```\n\n### DragonFly.AspNetCore\t\n\n```csharp\nbuilder.Services.Configure\u003cDragonFlyOptions\u003e(Configuration.GetSection(\"General\"));\nbuilder.Services.Configure\u003cMongoDbOptions\u003e(Configuration.GetSection(\"MongoDB\"));\n\n//add DragonFly services\nbuilder.Services.AddDragonFly(x =\u003e x\n                      .AddImageWizard(requireAuthorization: false)\n                      .AddRestApi()\n                      .AddMongoDbStorage()\n                      .AddMongoDbIdentity()\n                      .AddApiKeys());\n\nvar app = builder.Build();\n\n//init DragonFly\nawait app.InitDragonFlyAsync();\n\nif (env.IsDevelopment())\n{\n  app.UseDeveloperExceptionPage();\n  app.UseWebAssemblyDebugging();\n}\n\napp.UseDragonFly();\napp.UseDragonFlyManager();\napp.UseRouting();\napp.Run();\n```\n\n### DragonFly.Client (Blazor)\n\n```csharp\nvar builder = WebAssemblyHostBuilder.CreateDefault(args);\nbuilder.RootComponents.Add\u003cDragonFly.App.Client.App\u003e(\"app\");\n\n//Register DragonFly components\nbuilder.AddDragonFlyClient(x =\u003e x\n                        .AddRestClient()\n                        .AddIdentity()\n                        .AddApiKeys());\n\nWebAssemblyHost host = builder.Build();\n\nawait host.InitDragonFlyAsync();\nawait host.RunAsync();\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fusercode%2Fdragonfly","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fusercode%2Fdragonfly","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fusercode%2Fdragonfly/lists"}