{"id":29799122,"url":"https://github.com/thiagomvas/fflow","last_synced_at":"2025-07-28T08:08:43.196Z","repository":{"id":297868902,"uuid":"998145966","full_name":"thiagomvas/FFlow","owner":"thiagomvas","description":"FFlow is a lightweight, extensible workflow automation library for .NET with fluent, code-first syntax. Built for CI/CD, DevOps, and backend orchestration, it supports dependency injection, branching logic, and step decorators—no XML or DSL required.","archived":false,"fork":false,"pushed_at":"2025-07-21T13:13:18.000Z","size":497,"stargazers_count":1,"open_issues_count":2,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-07-21T13:32:21.297Z","etag":null,"topics":["automation","cicd","contributions-welcome","cqrs","csharp","developer-tools","dotnet","fluent-api","open-source","pipeline","workflow","workflow-engine"],"latest_commit_sha":null,"homepage":"https://fflow.thiagomvas.dev","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/thiagomvas.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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,"zenodo":null}},"created_at":"2025-06-08T00:45:03.000Z","updated_at":"2025-07-21T13:07:01.000Z","dependencies_parsed_at":"2025-06-24T23:27:29.251Z","dependency_job_id":"ae3f3abb-3acf-44b2-a9a2-6989635a0af1","html_url":"https://github.com/thiagomvas/FFlow","commit_stats":null,"previous_names":["thiagomvas/fflow"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/thiagomvas/FFlow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thiagomvas%2FFFlow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thiagomvas%2FFFlow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thiagomvas%2FFFlow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thiagomvas%2FFFlow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thiagomvas","download_url":"https://codeload.github.com/thiagomvas/FFlow/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thiagomvas%2FFFlow/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267482004,"owners_count":24094508,"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","status":"online","status_checked_at":"2025-07-28T02:00:09.689Z","response_time":68,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["automation","cicd","contributions-welcome","cqrs","csharp","developer-tools","dotnet","fluent-api","open-source","pipeline","workflow","workflow-engine"],"created_at":"2025-07-28T08:08:42.497Z","updated_at":"2025-07-28T08:08:43.188Z","avatar_url":"https://github.com/thiagomvas.png","language":"C#","readme":"\u003ch1 align=\"center\"\u003e\n  FFlow - Code first automations built fluently\n  \u003cbr\u003e\n  \u003ca href=\"https://github.com/thiagomvas/FFlow/actions/workflows/ci-tests.yml\"\u003e\n    \u003cimg src=\"https://github.com/thiagomvas/FFlow/actions/workflows/ci-tests.yml/badge.svg\"\u003e\n  \u003c/a\u003e\n\n  \u003ca href=\"https://github.com/thiagomvas/FFlow/actions/workflows/cicd.yml\"\u003e\n    \u003cimg src=\"https://github.com/thiagomvas/FFlow/actions/workflows/cicd.yml/badge.svg\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://fflow.thiagomvas.dev/\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Docs-Available-limegreen?style=flat\u0026logo=github\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/thiagomvas/fflow/labels/good%20first%20issue\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/issues/thiagomvas/fflow/good%20first%20issue?style=flat\u0026color=%24EC820\u0026label=good%20first%20issue\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/thiagomvas/fflow/labels/help%20wanted\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/issues/thiagomvas/fflow/help%20wanted?style=flat\u0026color=%24EC820\u0026label=help%20wanted\"\u003e\n  \u003c/a\u003e\n\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eFFlow\u003c/b\u003e is a fluent, code-first workflow automation library for .NET. It enables developers to orchestrate automation logic, business rules, and CI/CD pipelines in a \u003cb\u003efully testable\u003c/b\u003e and \u003cb\u003eextensible\u003c/b\u003e way.\n\u003c/p\u003e\n\n## Table of Contents\n- [Table of Contents](#table-of-contents)\n- [Installation](#installation)\n- [Quickstart](#quickstart)\n- [Features at a glance](#features-at-a-glance)\n- [Why it exists](#why-it-exists)\n- [Using with Dependency Injection](#using-with-dependency-injection)\n- [Testing](#testing)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Installation\nYou can install FFlow via the Nuget Package Manager or by using the .NET CLI\n```bash\ndotnet add package FFlow\n```\n\n## Quickstart\nGetting started with FFlow is easy. Here's an example of how to create a custom step that says 'Hello, FFlow!'. This example includes building a workflow with the builder, configuring it and executing it with an input.\n```csharp\n public class HelloStep : FlowStep\n {\n     protected override Task ExecuteAsync(IFlowContext context, CancellationToken cancellationToken = default)\n     {\n         var input = context.GetInput\u003cstring\u003e();\n         Console.WriteLine($\"Hello, {input}!\");\n         return Task.CompletedTask;\n     }\n }\n\nvar workflow = new FFlowBuilder()\n    .StartWith\u003cHelloStep\u003e()\n    .Build();\n\nawait workflow.RunAsync(\"FFlow\");\n```\n\n## Features at a glance\n- **Fluent syntax for flow control:** `StartWith()`, `Then()`, `Finally()`, `If()`, `Fork()`, and more\n- **Dependency Injection support:** Inject services into steps via constructor injection\n- **Validation utilities:** Write step context validation attributes or steps with the help of `FFlow.Validation`\n- **Branching and parallelism:** Run parts of the workflow concurrently with different dispatch strategies\n- **Context-aware:** Pass and retrieve dynamic data throughout the workflow\n- **Reusable definitions:** Encapsulate workflows into a `IWorkflowDefinition` for factory-like behaviours\n- **Lifecycle hooks:** Plug into events like step start, step failure or workflow completion.\n\n## Why it exists\nWriting and testing CI/CD pipelines has always been frustrating. It usually went from \"waiting to compile\" to \"waiting for CI/CD\", just to realize you missed something, fix it, and rerun the whole thing again. And again.\n\nThe feedback loop was too long. Small mistakes led to wasted time, and workflows often lived outside the codebase in YAML files or GUI editors that were hard to test, debug, or reuse.\n\nFFlow was born out of this frustration. **It came from the idea that automation should feel like regular code.** Something you can write fluently, test locally, and plug into your existing services just like anything else in your app.\n\nTools like `Cake` or `Nuke` solve part of the problem, but I wanted something more structured and flexible. Less about running scripts. More about building flows.\n\n## Using with Dependency Injection\nFFlow integrates cleanly with Microsoft.Extensions.DependencyInjection. To enable DI:\n```csharp\nvar services = new ServiceCollection();\nservices.AddFlow(); // Registers IFlowSteps and IWorkflowDefinitions\nservices.AddSingleton\u003cIMyService, MyService\u003e();\n\nvar provider = services.BuildServiceProvider();\n\nvar workflow = new FFlowBuilder(provider)\n    .StartWith\u003cStepThatUsesIMyService\u003e()\n    .Build();\n```\nSteps can receive services through construction injection:\n```csharp\npublic class StepThatUsesIMyService : FlowStep\n{\n    private readonly IMyService _service;\n\n    public StepThatUsesIMyService(IMyService service)\n    {\n        _service = service;\n    }\n\n    protected override Task ExecuteAsync(IFlowContext context, CancellationToken ct)\n    {\n        var result = _service.DoSomething();\n        return Task.CompletedTask;\n    }\n}\n```\n\n## Testing\nFFlow includes unit tests covering key features such as step execution, context flow, branching, validation, and DI integration. All you need to do is run\n```\ndotnet test\n```\n\n## Contributing\n\nContributions to FFlow are welcome and appreciated. Whether it’s fixing a bug, suggesting an improvement, writing documentation, or proposing a new feature.\n\nIf you’ve worked with automation, DevOps, or pipeline tools and thought “this could be easier in code”, you’re in the right place. FFlow is still growing, and there’s a lot of room to help shape what it becomes.\n\nYou don’t need to understand the entire codebase to contribute. Most improvements are isolated and straightforward. It's designs allow you to add new steps, small helpers, validation logic, or workflow patterns without knowing everything about the project.\n\nIf you have an idea or just want to help, feel free to open an issue, start a discussion, or jump into the code.\n\n## License\n\nFFlow is **free software** and **always will be**, released under the MIT License.  \nSee the [LICENSE](./LICENSE) file for more details.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthiagomvas%2Ffflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthiagomvas%2Ffflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthiagomvas%2Ffflow/lists"}