{"id":22807963,"url":"https://github.com/michielpost/dynamicdatacms","last_synced_at":"2026-04-02T02:19:49.013Z","repository":{"id":45321660,"uuid":"196356307","full_name":"michielpost/DynamicDataCMS","owner":"michielpost","description":"Open source Q42 CMS","archived":false,"fork":false,"pushed_at":"2025-03-06T22:29:32.000Z","size":652,"stargazers_count":8,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-20T04:46:19.793Z","etag":null,"topics":["asp-net-core","blob-storage","cms","cosmosdb","csharp","headless-cms","jsonschema","sia-skynet"],"latest_commit_sha":null,"homepage":null,"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/michielpost.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":"2019-07-11T08:49:15.000Z","updated_at":"2025-03-06T22:29:36.000Z","dependencies_parsed_at":"2023-11-15T11:29:27.564Z","dependency_job_id":"54bcc74d-c1df-4f24-a2ba-3db4b7e1ad99","html_url":"https://github.com/michielpost/DynamicDataCMS","commit_stats":null,"previous_names":["q42/qms4","q42/dynamicdatacms"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michielpost%2FDynamicDataCMS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michielpost%2FDynamicDataCMS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michielpost%2FDynamicDataCMS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michielpost%2FDynamicDataCMS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/michielpost","download_url":"https://codeload.github.com/michielpost/DynamicDataCMS/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250242853,"owners_count":21398210,"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","blob-storage","cms","cosmosdb","csharp","headless-cms","jsonschema","sia-skynet"],"created_at":"2024-12-12T11:07:21.356Z","updated_at":"2026-04-02T02:19:48.958Z","avatar_url":"https://github.com/michielpost.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![ASP.NET Core CI](https://github.com/michielpost/DynamicDataCMS/actions/workflows/aspnetcore.yml/badge.svg)](https://github.com/michielpost/DynamicDataCMS/actions/workflows/aspnetcore.yml)\n# DynamicDataCMS\nOpen source Dynamic Data CMS  \nDeveloper friendly, headless and modular CMS based on JsonSchema standard  \nRuns on ASP.Net on .NET 8.0\n\n## Features\n- Headless CMS\n- Support for multiple datastore plugins (MS SQL, CosmosDB, Azure Storage (Blob / Tables))\n- JsonSchema used to describe entities\n- View and edit entities\n- Create (multiple) page tree's\n- Paging and ordering in list view\n- Search\n- Support for entities in multiple languages\n- Upload images and other assets\n- Optional user login and admin module\n- Optional Azure AD authentication module\n- Generate JsonSchema from C# Models\n- Easy installation using NuGet packages\n\n## Installation Instructions\nInstall `DynamicDataCMS.Core` and one of the storage providers from NuGet:\n- `DynamicDataCMS.Storage.CosmosDB`\n- `DynamicDataCMS.Storage.AzureStorage` \n- `DynamicDataCMS.Storage.EntityFramework`\n\nEdit `Startup.cs` and add the following lines to `ConfigureServices`   \n\n```cs\nservices.UseDynamicDataCMS(Configuration)\n  .UseJsonEditor()\n  .ConfigureAzureStorage(() =\u003e new StorageConfiguration() {  ReadCmsItems = true, ReadFiles = true });\n```\n## Modules\nDynamicDataCMS is a modular CMS and different modules are available:\n\n### CosmosDB Data Storage\nThe CosmosDB module stores CmsItems to Azure CosmosDB. This module does not support storing file data. You can use the Azure Storage module for file data.\n```cs\nservices.UseDynamicDataCMS(Configuration)\n  .UseJsonEditor()\n  .ConfigureCosmosDB(() =\u003e new StorageConfiguration() { ReadCmsItems = true })\n  .ConfigureAzureStorage(() =\u003e new StorageConfiguration() {  ReadFiles = true }); //Optional if you need file storage.\n```\n\nConfiguration:\n```json\n\"CosmosConfig\": {\n  \"Endpoint\": \"https://localhost:8081\",\n  \"Key\": \"CosmosDB-key\"\n}\n```\n\n### Azure Blob and Table Data Storage\nStores data in Azure Tables and file data to Azure Blob Storage.\n\n```cs\nservices.UseDynamicDataCMS(Configuration)\n  .UseJsonEditor()\n  .ConfigureAzureStorage(() =\u003e new StorageConfiguration() {  ReadCmsItems = true, ReadFiles = true });\n```\n\nConfiguration:\n```json\n\"AzureStorageConfig\": {\n  \"SharedAccessSignature\": \"SAS Token generated in Azure Portal\", //null to use development storage\n  \"ContainerName\": \"cms\",\n  \"AssetContainerName\": \"cms\",\n  \"StorageLocation\" : \"Tables\" //Tables / Blob / Both\n}\n```\n\n### MS SQL using Entity Framework\nStores data in MS SQL. Make sure you already have your own working EntityFramework DataContext.\n\n```cs\nservices.UseDynamicDataCMS(Configuration)\n  .UseJsonEditor()\n  .ConfigureEntityFramework\u003cMyCustomDataContext, MyModel\u003e()\n```\n\nThe CMS can now read and write the type `MyModel` from `MyCustomDataContext`. It only knows how to save this model. Make sure to name your cmsType `MyModel` in `CmsConfiguration.json`\n\n\n### Authentication\nAdds user login and user list to the CMS\n\nAdd a reference to `DynamicDataCMS.Core.Auth` nuget package.\n```cs\nservices.UseDynamicDataCMS(Configuration)\n  .UseJsonEditor()\n  .ConfigureDynamicDataCMSAuthBasic()\n```\n\nIn the Configure method in Startup.cs add:\n```cs\napp.UseAuthentication();\napp.UseMiddleware\u003cDynamicDataCMSAuthenticatationMiddleware\u003e();\n```\n\nSee the example project to add a default first user to the user list.\n\nIt's also possible to use Microsft Azure AD:  \n[Azure AD documentation](src/DynamicDataCMS.Module.Auth.AzureAD)\n\n### Sia Skynet\nStores data on Sia Skynet, a free decentralized CDN and file sharing platform\nhttps://siasky.net\n\nOnly files:\n```cs\nservices.UseDynamicDataCMS(Configuration)\n  .UseJsonEditor()\n  .ConfigureSiaSkynet(() =\u003e  new StorageConfiguration { WriteCmsItems = false , ReadFiles = true})\n```\n\nIt's also possible to store all data on Sia Skynet using SkyDB:\n```cs\n.ConfigureSiaSkynet(() =\u003e new StorageConfiguration() { ReadFiles = true, ReadCmsItems = true, WriteFiles = true, WriteCmsItems = true });\n```\n\nAdd a secret to your config, the secret is used to generate a private key for SkyDB:\n```json\n\"SkynetConfig\": {\n  \"Secret\": \"cms example secret\",\n  \"ExcludedTypes\": [ \"student\", \"book\" ]\n}\n```\n\n### IPFS\nStores data on IPFS (InterPlanetary File System), hosted on the distributed web\nhttps://ipfs.io\n\n```cs\nservices.UseDynamicDataCMS(Configuration)\n  .ConfigureIpfs();\n```\nHost can be set in config, uses localhost as default.\n\n### Micrio\n[Micrio Module documentation](src/DynamicDataCMS.Module.Micrio)\n\n## Interceptors\nAllows you to modify the data before it's saved.\n```cs\nservices.UseDynamicDataCMS(Configuration)\n   .UseJsonEditor()\n   .AddInterceptor\u003cExampleInterceptor\u003e()\n```\n\nInterceptors need to implement the interface `IWriteCmsItemInterceptor`\n\n## Installation Instructions for Development\n- Install CosmosDB emulator for Windows https://aka.ms/cosmosdb-emulator\n- Install Azure Storage Emulator https://docs.microsoft.com/en-us/azure/storage/common/storage-use-emulator\n- Optional (not needed when using emulators): Edit appsettings.json with Cosmos Endpoint and Key\n- Run DynamicDataCMS\n- Navigate to https://localhost:44341/cms\n\n## Dependencies\nJSON Schema Editor\nhttps://github.com/json-editor/json-editor\n\nAzure Cosmos DB\nhttps://github.com/Azure/azure-cosmos-dotnet-v3\n\nNJsonSchema\nhttps://github.com/RicoSuter/NJsonSchema\n\nJavaScript Notifications\nhttps://ned.im/noty/\n\n\n## Roadmap\n- Website SDK / Website usage example\n\n- Searching in list view\n\n- Multiple versions of items (with start and end time)\n\n- Audit Trail (CosmosDB Change Feed / Blob Storage file)\n\n## Ideas\n\n- Configure the CMS from within the CMS\n\n- Build a JsonSchema editor in Blazor?\n\n- Build in JsonSchema Designer, some ideas:  \nhttps://bjdash.github.io/JSON-Schema-Builder/  \nhttps://jsondraft.com/4c/#tree  \nhttps://mozilla-services.github.io/react-jsonschema-form/  \nhttps://jsoneditoronline.org/  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichielpost%2Fdynamicdatacms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmichielpost%2Fdynamicdatacms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichielpost%2Fdynamicdatacms/lists"}