Agent skill

Foundatio

by FoundatioFx in FoundatioFx/Foundatio

A skill your agent uses when working with Foundatio infrastructure abstractions for .NET -- caching, queuing, messaging, file storage, distributed locking, or background jobs.

Apache-2.0Auto-check passedBackend & APIs

Install Foundatio

skills CLI
$ npx skills add FoundatioFx/Foundatio --skill foundatio -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install FoundatioFx/Foundatio foundatio --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/FoundatioFx/Foundatio.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/foundatio .claude/skills/foundatio && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
foundatio
GitHub stars
2.1k
Token cost
~3.9k tokens
SKILL.md length
842 words
Files
1
Skills in repo
1
Repo updated
First seen
Licence
Apache-2.0

At a glance

A skill your agent uses when working with Foundatio infrastructure abstractions for .NET -- caching, queuing, messaging, file storage, distributed locking, or background jobs.

  • Working with Foundatio infrastructure abstractions for .NET -- caching
  • SKILL.md covers Documentation via context7, Core Interfaces, DI Registration and Usage Patterns, plus 4 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md
  • Distributed locking

What it does

Foundatio is an agent skill from FoundatioFx/Foundatio. Use when working with Foundatio infrastructure abstractions for .NET -- caching, queuing, messaging, file storage, distributed locking, or background jobs. Apply when using ICacheClient, IQueue, IMessageBus, IFileStorage, ILockProvider, IJob, or resilience patterns like retry and circuit breakers. Covers in-memory and production implementations (Redis, Azure, AWS, Kafka, RabbitMQ). Use context7 MCP to fetch current API docs and examples.

Its SKILL.md is about 3.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Backend & APIs, covering Event-driven systems, File uploads and storage and Background jobs. It works with Redis, Microsoft Azure, Amazon Web Services and Apache Kafka. The repository describes itself as: Pluggable foundation blocks for building distributed apps. The licence is Apache-2.0.

When your agent uses it

  • Working with Foundatio infrastructure abstractions for .NET -- caching
  • Distributed locking
  • Background jobs

Example prompts

  • “/foundatio”

What it can do on your machine

Read from SKILL.md and the folder at commit 0910a5a. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are csharp).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • foundatio.readthedocs.io

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Foundatio loads about 3.9k tokens when it runs. Until then it costs about 113 tokens; SKILL.md has 842 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~113
When it runs · the whole SKILL.md, loaded when a task matches
~3.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from FoundatioFx/Foundatio at commit 0910a5a, republished under its Apache-2.0 licence (© FoundatioFx). 842 words, ~3,881 tokens.

Download SKILL.mdSave it as .claude/skills/foundatio/SKILL.md (or your agent's skills folder).
name
foundatio
description
Use when working with Foundatio infrastructure abstractions for .NET -- caching, queuing, messaging, file storage, distributed locking, or background jobs. Apply when using ICacheClient, IQueue, IMessageBus, IFileStorage, ILockProvider, IJob, or resilience patterns like retry and circuit breakers. Covers in-memory and production implementations (Redis, Azure, AWS, Kafka, RabbitMQ). Use context7 MCP to fetch current API docs and examples.

Foundatio

Pluggable infrastructure abstractions for distributed .NET apps. Interface-first, testable, swappable between in-memory (dev/test) and production providers (Redis, Azure, AWS) with zero application code changes.

Documentation via context7

Use context7 MCP for complete, up-to-date API docs and examples. The main library ID covers all abstractions and implementations:

text
query-docs(libraryId="/foundatiofx/foundatio", query="How to configure queue retry policies and dead letter handling")

Query with specific questions, not single keywords. All provider docs (Redis, Azure, AWS, Kafka, etc.) are included in the main library.

Core Interfaces

InterfacePurposeIn-MemoryProduction
ICacheClientKey-value caching with TTLInMemoryCacheClientRedis, Hybrid
IQueue<T>FIFO message queuingInMemoryQueue<T>Redis, SQS, Azure
IMessageBusPub/sub messagingInMemoryMessageBusRedis, Kafka, RabbitMQ, Azure
IFileStorageFile storage abstractionInMemoryFileStorageS3, Azure Blob, Minio
ILockProviderDistributed lockingCacheLockProviderRedis-backed
IJobBackground job processingN/AHosted services
ISerializer / ITextSerializerBinary and text serializationSystemTextJsonSerializerMessagePack, JsonNet
IResiliencePolicyRetry, circuit breaker, timeoutResiliencePolicyBuilderN/A

DI Registration

All services are singletons (maintain internal state/connections). Jobs are scoped.

csharp
var builder = WebApplication.CreateBuilder(args);

// Quick start -- all in-memory defaults
builder.Services.AddFoundatio();

// Or register individually with options
builder.Services.AddSingleton<ICacheClient>(sp =>
    new InMemoryCacheClient(o => o.MaxItems(1000)
        .LoggerFactory(sp.GetRequiredService<ILoggerFactory>())));
builder.Services.AddSingleton<IMessageBus, InMemoryMessageBus>();
builder.Services.AddSingleton<IFileStorage, InMemoryFileStorage>();
builder.Services.AddSingleton<IQueue<OrderWorkItem>>(sp =>
    new InMemoryQueue<OrderWorkItem>());

// Lock provider (message bus optional but enables faster lock release via pub/sub)
builder.Services.AddSingleton<ILockProvider>(sp =>
    new CacheLockProvider(
        sp.GetRequiredService<ICacheClient>(),
        sp.GetService<IMessageBus>(),
        sp.GetService<TimeProvider>(),
        sp.GetService<ILoggerFactory>()));

Swap to production by changing only DI registration:

csharp
// DI owns and disposes the shared multiplexer during host shutdown.
builder.Services.AddSingleton<IConnectionMultiplexer>(sp =>
    ConnectionMultiplexer.Connect("localhost:6379"));

builder.Services.AddSingleton<ICacheClient>(sp =>
    new RedisCacheClient(o =>
    {
        o.ConnectionMultiplexer = sp.GetRequiredService<IConnectionMultiplexer>();
        o.LoggerFactory = sp.GetRequiredService<ILoggerFactory>();
    }));
builder.Services.AddSingleton<IMessageBus>(sp =>
    new RedisMessageBus(o =>
    {
        o.Subscriber = sp.GetRequiredService<IConnectionMultiplexer>().GetSubscriber();
        o.LoggerFactory = sp.GetRequiredService<ILoggerFactory>();
    }));
builder.Services.AddSingleton<IQueue<OrderWorkItem>>(sp =>
    new RedisQueue<OrderWorkItem>(o =>
    {
        o.ConnectionMultiplexer = sp.GetRequiredService<IConnectionMultiplexer>();
        o.LoggerFactory = sp.GetRequiredService<ILoggerFactory>();
    }));

Usage Patterns

Caching
csharp
await _cache.SetAsync("user:123", user, TimeSpan.FromHours(1));

var result = await _cache.GetAsync<User>("user:123");
if (result.HasValue)
    return result.Value;

await _cache.IncrementAsync("requests:today", 1);
await _cache.RemoveByPrefixAsync("user:");
Queues
csharp
await _queue.EnqueueAsync(new OrderWorkItem { OrderId = orderId });

var entry = await _queue.DequeueAsync(TimeSpan.FromSeconds(5));
if (entry is not null)
{
    await ProcessAsync(entry.Value);
    await entry.CompleteAsync();   // success
    // or: await entry.AbandonAsync();  // retry later
}
Messaging (Pub/Sub)
csharp
await _messageBus.SubscribeAsync<OrderCreated>(async (msg, ct) =>
{
    await HandleOrderCreatedAsync(msg, ct);
});

await _messageBus.PublishAsync(new OrderCreated { OrderId = orderId });
File Storage
csharp
await _storage.SaveFileAsync("reports/monthly.pdf", pdfStream);

using var stream = await _storage.GetFileStreamAsync("reports/monthly.pdf", StreamMode.Read);
var exists = await _storage.ExistsAsync("reports/monthly.pdf");
await _storage.DeleteFilesAsync("reports/old-*");
Distributed Locks
csharp
await using var lck = await _locker.AcquireAsync(
    "resource:order-123",
    timeUntilExpires: TimeSpan.FromMinutes(1));

if (lck is not null)
{
    await DoExclusiveWorkAsync();
}
// lock auto-released via IAsyncDisposable
Resilience
csharp
var policy = new ResiliencePolicyBuilder()
    .WithMaxAttempts(5)
    .WithExponentialDelay(TimeSpan.FromSeconds(1))
    .WithJitter()
    .Build();

await policy.ExecuteAsync(async ct =>
{
    await unreliableService.CallAsync(ct);
});

Jobs

Standard Job
csharp
public class CleanupJob : JobBase
{
    public CleanupJob(
        TimeProvider timeProvider,
        IResiliencePolicyProvider resiliencePolicyProvider,
        ILoggerFactory loggerFactory = null)
        : base(timeProvider, resiliencePolicyProvider, loggerFactory) { }

    protected override async Task<JobResult> RunInternalAsync(JobContext context)
    {
        await CleanupOldRecordsAsync(context.CancellationToken);
        return JobResult.Success;
    }
}
Job with Lock (Singleton / Leader Election)

JobWithLockBase acquires a distributed lock before each run. If the lock isn't available the run is cancelled. Implements IJobWithOptions.

csharp
[Job(Description = "Singleton maintenance", Interval = "5s")]
public class MaintenanceJob : JobWithLockBase
{
    private readonly ILockProvider _lockProvider;

    public MaintenanceJob(
        ICacheClient cache, IMessageBus messageBus,
        TimeProvider timeProvider, IResiliencePolicyProvider resiliencePolicyProvider,
        ILoggerFactory loggerFactory) : base(timeProvider, resiliencePolicyProvider, loggerFactory)
    {
        _lockProvider = new CacheLockProvider(cache, messageBus, loggerFactory);
    }

    // new CancellationToken(true) = try once, skip if lock is held
    protected override Task<ILock?> GetLockAsync(CancellationToken cancellationToken) =>
        _lockProvider.AcquireAsync(nameof(MaintenanceJob), TimeSpan.FromMinutes(15),
            cancellationToken: new CancellationToken(true));

    protected override async Task<JobResult> RunInternalAsync(JobContext context)
    {
        await DoMaintenanceAsync(context.CancellationToken);
        return JobResult.Success;
    }
}
Queue Processor Job
csharp
public class OrderProcessorJob : QueueJobBase<OrderWorkItem>
{
    public OrderProcessorJob(
        IQueue<OrderWorkItem> queue,
        TimeProvider timeProvider,
        IResiliencePolicyProvider resiliencePolicyProvider,
        ILoggerFactory loggerFactory = null)
        : base(queue, timeProvider, resiliencePolicyProvider, loggerFactory) { }

    protected override async Task<JobResult> ProcessQueueEntryAsync(
        QueueEntryContext<OrderWorkItem> context)
    {
        var item = context.QueueEntry.Value;
        await ProcessOrderAsync(item.OrderId, context.CancellationToken);
        return JobResult.Success;
    }
}
Hosting Integration

Requires Foundatio.Extensions.Hosting package:

csharp
builder.Services.AddJob<CleanupJob>(o => o.WaitForStartupActions());
builder.Services.AddCronJob<CleanupJob>("0 */6 * * *");
builder.Services.AddDistributedCronJob<CleanupJob>("0 */6 * * *");

Testing

Use Foundatio.Xunit.v3 for test logging and DI integration. Two base classes:

  • TestWithLoggingBase -- lightweight, no DI container. _logger (ILogger) for logging; Log (ILoggerFactory) for passing to Foundatio services.
  • TestLoggerBase -- full DI via TestLoggerFixture. Override ConfigureServices to register services. Log (ILogger) for logging; TestLogger (ILoggerFactory) for passing to Foundatio services.
csharp
using Foundatio.Caching;
using Foundatio.Xunit;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Xunit;

public class OrderServiceTests : TestLoggerBase
{
    public OrderServiceTests(ITestOutputHelper output, TestLoggerFixture fixture)
        : base(output, fixture) { }

    protected override void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<ICacheClient>(sp =>
            new InMemoryCacheClient(o => o.LoggerFactory(TestLogger)));
        services.AddSingleton<OrderService>();
    }

    [Fact]
    public async Task GetStatusAsync_WithCachedOrder_ReturnsCachedStatus()
    {
        // Arrange
        var cache = Services.GetRequiredService<ICacheClient>();
        await cache.SetAsync("order:123", "shipped");
        Log.LogInformation("Seeded cache with order status");

        // Act
        var status = await Services.GetRequiredService<OrderService>()
            .GetStatusAsync("123");

        // Assert
        Assert.Equal("shipped", status);
    }
}

Gotchas

  • Lock returns null: TryAcquireAsync returns null when the lock cannot be acquired -- always guard with is not null before doing work. AcquireAsync throws LockAcquisitionTimeoutException instead of returning null.
  • Dispose streams and locks: ILock is IAsyncDisposable -- use await using. Streams from GetFileStreamAsync are IDisposable -- use using var.
  • Cache TTL floor: Expiration values below 5ms are treated as already-expired and the key is silently removed. If you compute TTL dynamically (e.g., expiresAt - now), guard against near-zero values.
  • Cache GetAsync returns CacheValue<T>: Check result.HasValue before accessing result.Value. A missing key returns HasValue = false, not an exception.
  • Cache stampede (thundering herd): The cache-aside pattern (Get -> miss -> load -> Set) is vulnerable to stampedes when a popular key expires and many callers regenerate simultaneously. Use CacheLockProvider to serialize regeneration: acquire a lock keyed on the cache key, double-check the cache after acquiring, and only then call the backing store. See the Cache Stampede Protection docs for the full pattern.
  • Queue auto-complete: QueueJobBase<T> auto-completes entries based on JobResult by default. Set AutoComplete = false only when you need manual CompleteAsync()/AbandonAsync() control. Manual DequeueAsync does NOT auto-complete.
  • GetQueueEntryLockAsync error handling: If GetQueueEntryLockAsync returns null, the queue entry is abandoned. If it throws, the entry is also abandoned and a JobResult.FromException is returned. Use TryAcquireAsync (not AcquireAsync) in your override since the return type is Task<ILock?>.
  • Failure semantics depend on job type: JobResult only has IsSuccess -- there is no separate "failed but don't retry" status. For queue-processed jobs (QueueJobBase<T>.ProcessQueueEntryAsync, or setting context.Result in a WorkItemJob handler), a non-success result triggers AbandonAsync, which re-queues the entry and eventually dead-letters it after Retries is exhausted -- reserve FailedWithMessage/FromException for transient errors you want retried, and log + return JobResult.Success/SuccessWithMessage(...) for permanent errors to avoid a pointless retry loop. For standalone/manual jobs (JobBase, a one-off RunAsync()/RunInConsoleAsync() run, or scheduled/cron jobs via Foundatio.Extensions.Hosting), there is no built-in retry or dead letter queue -- a failed result just produces an error-level log, a non-zero exit code from RunInConsoleAsync, or a failed entry in the job run history. Returning FailedWithMessage/FromException there is correct even for permanent errors, since nothing inside Foundatio will retry it.
  • JobWithLockBase vs manual locking: Use JobWithLockBase when the entire run must be single-instance (leader election). Use manual ILockProvider.AcquireAsync inside JobBase for finer-grained locking within a job.
  • JobContext.RenewLockAsync: Call in long-running jobs (both JobBase and QueueJobBase) to prevent lock expiration mid-processing.
  • Register as singletons: All infrastructure services (ICacheClient, IMessageBus, IQueue<T>, IFileStorage, ILockProvider) maintain internal state and connections -- always register as singletons.
  • CacheLockProvider + IMessageBus: IMessageBus is optional but recommended. Without it, lock release falls back to polling. With it, locks are released instantly via pub/sub notification.
  • In-memory for tests: All in-memory implementations are functionally equivalent to production providers. Swap via DI for fast, isolated unit tests with no external dependencies.
Show full SKILL.md (137 more words)Show less

NuGet Packages

Core
PackageProvides
FoundatioCore interfaces, in-memory implementations, resilience, SystemTextJsonSerializer
Foundatio.Extensions.HostingAddJob, AddCronJob, AddDistributedCronJob, startup actions, hosted services
Serializers

ITextSerializer extends ISerializer for human-readable formats (JSON). ISerializer covers binary formats. Default is SystemTextJsonSerializer (included in core).

PackageProvides
Foundatio.JsonNetJsonNetSerializer : ITextSerializer (Newtonsoft.Json)
Foundatio.MessagePackMessagePackSerializer : ISerializer (binary, high-throughput)
Foundatio.Utf8JsonUtf8JsonSerializer : ITextSerializer (fast JSON)
Providers
PackageProvides
Foundatio.RedisRedis cache, queue, messaging, locks, storage
Foundatio.AzureStorageAzure Blob storage, Azure Storage queues
Foundatio.AzureServiceBusAzure Service Bus queues + messaging
Foundatio.AWSSQS queues, SQS messaging, S3 storage
Foundatio.KafkaKafka messaging
Foundatio.RabbitMQRabbitMQ messaging
Foundatio.MinioMinIO S3-compatible storage
Foundatio.AliyunAliyun OSS storage
Foundatio.Storage.SshNetSFTP storage
Testing & Other
PackageProvides
Foundatio.TestHarnessShared test base classes for validating custom implementations
Foundatio.XunitxUnit v2 test logging, retry attributes
Foundatio.Xunit.v3xUnit v3 test logging, retry attributes
Foundatio.DataProtectionASP.NET Core Data Protection key storage via IFileStorage

© FoundatioFx, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/foundatio of FoundatioFx/Foundatio.

Open the folder on GitHubat commit 0910a5a

Compare with similar skills

Foundatio next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Foundatio compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Foundatio this skillFoundatioFx/Foundatio2.1k—~3.9kAutomated safety check: PassApache-2.0
Azure Resource Manager Redis Dotnetmicrosoft/skills3.1k5 repos~3kAutomated safety check: PassMIT
Stripe Projectsfossasia/eventyay1.7k5 repos~2kAutomated safety check: NotesApache-2.0
Create Environmentgodatadriven/whirl205—~1.9kAutomated safety check: PassApache-2.0
Mongodb Atlas Stream Processingmongodb/agent-skills1901 repos~4.9kAutomated safety check: PassApache-2.0
Using Message Queuesancoleman/ai-design-components526—~2.9kAutomated safety check: PassMIT

Similar skills

  • Official

    Azure Resource Manager SDK for Redis in .NET. An agent skill from microsoft/skills.

    3.1k GitHub starsUsed in 5 repos~3k tokens
    DatabasesAuto-check passed
  • Stripe Projects

    fossasia/eventyay

    A skill your agent uses when the user wants to provision infrastructure or third-party services using Stripe Projects.

    1.7k GitHub starsUsed in 5 repos~2k tokens
    Backend & APIsAuto-check: notes
  • Create Environment

    godatadriven/whirl

    Create a new Whirl environment in the envs/ directory. An agent skill from godatadriven/whirl.

    205 GitHub stars~1.9k tokensUpdated 6 days ago
    Backend & APIsAuto-check passed
  • Official

    Manages MongoDB Atlas Stream Processing (ASP) workflows. An agent skill from mongodb/agent-skills.

    190 GitHub starsUsed in 1 repo~4.9k tokens
    Backend & APIsAuto-check passed
  • Using Message Queues

    ancoleman/ai-design-components

    Async communication patterns using message brokers and task queues.

    526 GitHub stars~2.9k tokensUpdated 10 mo ago
    Backend & APIsAuto-check passed
  • Managing Amazon Msk

    aws/agent-toolkit-for-aws

    Official

    Operates Amazon MSK Provisioned clusters (Standard and Express brokers).

    2.8k GitHub stars~2.6k tokensUpdated today
    Backend & APIsAuto-check passed

Categories

Questions about Foundatio

What does Foundatio do?

A skill your agent uses when working with Foundatio infrastructure abstractions for .NET -- caching, queuing, messaging, file storage, distributed locking, or background jobs. Foundatio is an agent skill from FoundatioFx/Foundatio.NET -- caching, queuing, messaging, file storage, distributed locking, or background jobs.

When should I use Foundatio?

Foundatio fits situations like: working with Foundatio infrastructure abstractions for .NET -- caching; distributed locking; background jobs.

How do I install Foundatio in Claude Code?

Run `npx skills add FoundatioFx/Foundatio --skill foundatio -a claude-code`. Or copy the skill folder (.agents/skills/foundatio in FoundatioFx/Foundatio) into .claude/skills/foundatio in your project. Claude Code loads it when a task matches its description.

How do I install Foundatio in Codex?

Run `npx skills add FoundatioFx/Foundatio --skill foundatio -a codex`. Or copy the skill folder (.agents/skills/foundatio in FoundatioFx/Foundatio) into .agents/skills/foundatio in your project. Codex loads it when a task matches its description.

Can I use Foundatio in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add FoundatioFx/Foundatio --skill foundatio -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/foundatio, .gemini/skills/foundatio, .github/skills/foundatio and .opencode/skills/foundatio in your project.

What does Foundatio need to run?

SKILL.md names no scripts, command-line tools or credentials: Foundatio is instructions for the agent only.

Does Foundatio access the network?

SKILL.md names 1 domain. As links in the text: foundatio.readthedocs.io. This is read from the text; nothing was executed.

Is Foundatio safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Foundatio use?

Foundatio is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Foundatio use?

About 3.9k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Foundatio?

Skills that share tags, products or a category with Foundatio: Azure Resource Manager Redis Dotnet (microsoft/skills, 3.1k stars), Stripe Projects (fossasia/eventyay, 1.7k stars), Create Environment (godatadriven/whirl, 205 stars) and Mongodb Atlas Stream Processing (mongodb/agent-skills, 190 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Foundatio?

FoundatioFx (a GitHub organization) maintains it in FoundatioFx/Foundatio, which has 2,100 GitHub stars. The repository was last updated on October 7, 2026.

Source: FoundatioFx/Foundatio on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.