Modulus is a modern, cross-platform, plugin-based application framework designed to help developers quickly build extensible, maintainable, and AI-ready tools.
- UI-Agnostic Core: Business logic independent of any UI framework
- Pluggable Hosts: Supports Avalonia (desktop) and Blazor Hybrid (MAUI)
- Shared Core Logic: Same Domain/Application code runs across all hosts
- VS Extension Compatible: Uses
extension.vsixmanifest(XML) format - Hot-Reloadable: AssemblyLoadContext-based isolation for dynamic load/unload
- Explicit Installation: Extensions installed via CLI or UI, not auto-discovered
- Type-Safe Entry Points:
ModulusPackagebase class similar to VS VsPackage
- Extension SDK with declarative attributes
- AI Agent plugin support (LLM integration)
- Signature verification and version control
- Cross-platform: Windows / macOS / Linux
src/
βββ Modulus.Core/ # Runtime, module loader, DI
βββ Modulus.Sdk/ # SDK: ModulusPackage, attributes
βββ Modulus.UI.Abstractions/ # UI contracts (IMenuRegistry, INavigationService)
βββ Hosts/
β βββ Modulus.Host.Avalonia/ # Avalonia desktop (ID: Modulus.Host.Avalonia)
β βββ Modulus.Host.Blazor/ # Blazor Hybrid (ID: Modulus.Host.Blazor)
βββ Modules/
βββ EchoPlugin/ # Example: Echo plugin
βββ SimpleNotes/ # Example: Notes module
βββ ComponentsDemo/ # Example: UI components demo
MyExtension/
βββ extension.vsixmanifest # XML manifest (VS Extension format)
βββ MyExtension.Core.dll # Core logic (host-agnostic)
βββ MyExtension.UI.Avalonia.dll
βββ MyExtension.UI.Blazor.dll
# Install the Modulus CLI
dotnet tool install -g Agibuild.Modulus.Cli
# Install project templates
dotnet new install Agibuild.Modulus.Templates# Create a new module
modulus new -n MyModule
# Or use dotnet new
dotnet new modulus-avalonia -n MyModule
# Navigate to module directory
cd MyModule
# Build the module
modulus build
# Package for distribution
modulus pack
# Install to test
modulus install ./output/MyModule-1.0.0.modpkg# Run Avalonia Host
dotnet run --project src/Hosts/Modulus.Host.Avalonia
# Run Blazor Host (Windows only)
dotnet run --project src/Hosts/Modulus.Host.BlazorModulus provides a comprehensive command-line tool for module development and management.
| Command | Description |
|---|---|
modulus new |
Create a new module project |
modulus build |
Build the module in current directory |
modulus pack |
Build and package as .modpkg |
modulus install <source> |
Install a module |
modulus uninstall <name> |
Uninstall a module |
modulus list |
List installed modules |
# Avalonia desktop host app
modulus new avaloniaapp -n MyApp
# Blazor Hybrid (MAUI) host app
modulus new blazorapp -n MyAppNotes:
blazorappis a MAUI host template and typically requires Windows to build.
modulus new [<template>] -n MyModule [options]
Options:
-n, --name <name> Module name (PascalCase)
-o, --output <dir> Output directory
--force Overwrite existing# Build the module
modulus build
# Package for distribution
modulus pack
# Package options
modulus pack -o ./dist --verbose# Install from .modpkg file
modulus install ./MyModule-1.0.0.modpkg
# Install from directory (development)
modulus install ./artifacts/bin/Modules/MyModule/
# Force overwrite existing installation
modulus install ./MyModule-1.0.0.modpkg --force
# Uninstall
modulus uninstall MyModule
# List installed modules
modulus list --verbosemodulus new -n MyExtensionThis creates:
MyExtension/
βββ MyExtension.sln
βββ extension.vsixmanifest
βββ MyExtension.Core/
β βββ MyExtensionModule.cs
β βββ ViewModels/MainViewModel.cs
βββ MyExtension.UI.Avalonia/
βββ MyExtensionAvaloniaModule.cs
βββ MainView.axaml
// MyExtension.Core/MyExtensionModule.cs
public class MyExtensionModule : ModulusPackage
{
public override void ConfigureServices(IModuleLifecycleContext context)
{
context.Services.AddSingleton<IMyService, MyService>();
context.Services.AddTransient<MainViewModel>();
}
}The manifest is auto-generated by templates. Key sections:
<!-- extension.vsixmanifest -->
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0"
xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011">
<Metadata>
<Identity Id="your-guid" Version="1.0.0" Publisher="You" />
<DisplayName>My Extension</DisplayName>
<Description>My awesome extension</Description>
</Metadata>
<Installation>
<InstallationTarget Id="Modulus.Host.Avalonia" Version="[1.0,)" />
<InstallationTarget Id="Modulus.Host.Blazor" Version="[1.0,)" />
</Installation>
<Assets>
<Asset Type="Modulus.Package" Path="MyExtension.Core.dll" />
<Asset Type="Modulus.Package" Path="MyExtension.UI.Avalonia.dll"
TargetHost="Modulus.Host.Avalonia" />
<!-- Menus are NOT declared in the manifest.
Declare menus via [AvaloniaMenu]/[BlazorMenu] on the host-specific module entry type
and project them to the database at install/update time (metadata-only). -->
</Assets>
</PackageManifest>cd MyExtension
modulus build
modulus pack
modulus install ./output/MyExtension-1.0.0.modpkg- Getting Started Guide
- CLI Reference
- Module Development Guide
- Host App Development Guide
- OpenSpec Specifications
- Contributing Guide
The project uses Nuke for build automation:
# Build all
nuke compile
# Run tests
nuke test
# Package modules
nuke pack-module
# Package CLI templates
nuke pack-templates
# Publish NuGet packages
nuke publish-libs- Phase: Active Development
- Test Coverage: 30+ tests passing
- Platforms: Windows, macOS, Linux
| Package | Description |
|---|---|
Agibuild.Modulus.Sdk |
SDK for module development |
Agibuild.Modulus.UI.Abstractions |
UI contracts and abstractions |
Agibuild.Modulus.UI.Avalonia |
Avalonia UI components |
Agibuild.Modulus.UI.Blazor |
Blazor UI components |
Agibuild.Modulus.Cli |
CLI tool |
Agibuild.Modulus.Templates |
Project templates |
Note:
modulus newgenerates aDirectory.Build.propswithModulusCliLibDirso newly generated modules can compile against the same Modulus assemblies shipped with the CLI.
Pull requests and issues are welcome! See CONTRIBUTING.md for guidelines.

