devto 2026-06-25 원문 보기 ↗
It is clear that Vyshyvanka is more than just code — it is an ecosystem. The true power of an open-source workflow engine lies in its community. Today, we want to talk about how you can get involved, whether you are interested in pushing the boundaries of the core engine or building specialized solutions with custom plugins.
A common question we get is: 'Should I contribute a PR to the core engine, or should I build a separate plugin?' The answer depends entirely on the scope of your contribution.
The core engine (Vyshyvanka.Core, Vyshyvanka.Engine, Vyshyvanka.Api, Vyshyvanka.Designer) should be reserved for changes that benefit every user of the platform. Good candidates for core contributions:
These changes require careful review and testing because they impact every installation. We encourage PRs here, but we also ask that you open an issue first so we can discuss the architectural impact.
Plugins (./plugins/) are the best way to extend functionality without increasing the maintenance burden of the core. Good candidates for plugins:
Plugins are independent, versionable, and can be maintained outside the core release cycle. They empower you to solve your specific problems immediately without waiting for a core release.
Understanding where things live is key to contributing effectively:
Vyshyvanka/
├── src/
│ ├── Vyshyvanka.Core/ # Domain layer (zero dependencies)
│ ├── Vyshyvanka.Engine/ # Execution engine, persistence, plugins
│ ├── Vyshyvanka.Api/ # REST API
│ ├── Vyshyvanka.Designer/ # Blazor WASM UI
│ ├── Vyshyvanka.AppHost/ # .NET Aspire orchestration
│ └── Vyshyvanka.ServiceDefaults/
├── plugins/
│ ├── Vyshyvanka.Plugin.AdvancedHttp/
│ ├── Vyshyvanka.Plugin.GitLab/
│ ├── Vyshyvanka.Plugin.Jira/
│ └── Vyshyvanka.Plugin.Tmplt/ # Starter template!
├── tests/
│ └── Vyshyvanka.Tests/
└── docs/
Dependencies flow strictly downward. Core has zero dependencies. Engine depends on Core. Api depends on Core and Engine. Plugins depend only on Core.
The fastest way to start is with the template plugin:
plugins/Vyshyvanka.Plugin.Tmplt/ and rename it.PluginInfo.cs: Set your plugin ID, name, version, and author.BasePluginNode, add [NodeDefinition] and [ConfigurationProperty] attributes.Here is the minimal structure:
// PluginInfo.cs
[assembly: Plugin(
"com.yourorg.myplugin",
Name = "My Plugin",
Version = "1.0.0",
Description = "Does something useful",
Author = "Your Name")]
// Nodes/MyCustomNode.cs
[NodeDefinition(
Name = "My Custom Action",
Description = "Does the thing",
Icon = "fa-solid fa-star")]
[ConfigurationProperty("apiUrl", "string", Description = "API endpoint", IsRequired = true)]
public class MyCustomNode : BasePluginNode
{
public override string Type => "my-custom-action";
public override NodeCategory Category => NodeCategory.Action;
public override async Task<NodeOutput> ExecuteAsync(NodeInput input, IExecutionContext context)
{
var apiUrl = GetRequiredConfigValue<string>(input, "apiUrl");
// Your logic here...
return SuccessOutput(JsonSerializer.SerializeToElement(new { result = "done" }));
}
}
If you want to contribute to the core:
CancellationToken in every async method, AwesomeAssertions in tests.# Build everything
dotnet build
# Run all tests
dotnet test
# Start the full application (API + Designer)
dotnet run --project src/Vyshyvanka.AppHost
# Start just the API
dotnet run --project src/Vyshyvanka.Api
Every plugin you build and every bug you fix makes Vyshyvanka more valuable for everyone else. Whether you are an enterprise developer building mission-critical workflows or a hobbyist automating your home server, your contribution helps shape the future of open-source workflow automation.
We are excited to see what you build.
In the final part of this series, we will discuss Part 15: Workflow Patterns and Recipes - Data Transformation. Stay tuned!
Check out the project source code here: https://github.com/homolibere/Vyshyvanka