diff --git a/src/frontend/config/sidebar/integrations.topics.ts b/src/frontend/config/sidebar/integrations.topics.ts
index 9003ee9e4..ddf243963 100644
--- a/src/frontend/config/sidebar/integrations.topics.ts
+++ b/src/frontend/config/sidebar/integrations.topics.ts
@@ -868,6 +868,7 @@ export const integrationTopics: StarlightSidebarTopicsUserConfig = {
},
items: [
{ label: 'Docker', slug: 'integrations/compute/docker' },
+ { label: 'Floci', slug: 'integrations/compute/floci' },
{ label: 'Kubernetes', slug: 'integrations/compute/kubernetes' },
],
},
diff --git a/src/frontend/src/assets/icons/floci-icon-light.svg b/src/frontend/src/assets/icons/floci-icon-light.svg
new file mode 100644
index 000000000..70762bd95
--- /dev/null
+++ b/src/frontend/src/assets/icons/floci-icon-light.svg
@@ -0,0 +1,41 @@
+
+
diff --git a/src/frontend/src/assets/icons/floci-icon.svg b/src/frontend/src/assets/icons/floci-icon.svg
new file mode 100644
index 000000000..6d26ba35b
--- /dev/null
+++ b/src/frontend/src/assets/icons/floci-icon.svg
@@ -0,0 +1,41 @@
+
+
\ No newline at end of file
diff --git a/src/frontend/src/components/IntegrationGrid.astro b/src/frontend/src/components/IntegrationGrid.astro
index aaa94bd64..ed1094ede 100644
--- a/src/frontend/src/components/IntegrationGrid.astro
+++ b/src/frontend/src/components/IntegrationGrid.astro
@@ -42,6 +42,8 @@ import denoLightIcon from '@assets/icons/deno-light-icon.png';
import devTunnelsIcon from '@assets/icons/dev-tunnels-icon.svg';
import dockerIcon from '@assets/icons/docker.svg';
import elasticIcon from '@assets/icons/elastic-icon.png';
+import flociIcon from '@assets/icons/floci-icon.svg';
+import flociLightIcon from '@assets/icons/floci-icon-light.svg';
import flagDIcon from '@assets/icons/flagd-icon.svg';
import flagDLightIcon from '@assets/icons/flagd-light-icon.svg';
import garnetIcon from '@assets/icons/garnet-icon.png';
@@ -181,6 +183,7 @@ const icons = [
{ meta: devTunnelsIcon, alt: 'Dev Tunnels', search: 'devtunnels' },
{ meta: dockerIcon, alt: 'Docker', search: 'docker' },
{ meta: elasticIcon, alt: 'Elasticsearch', search: 'elasticsearch' },
+ { meta: flociIcon, alt: 'Floci', search: 'floci aws', light: flociLightIcon },
{ meta: flagDIcon, alt: 'flagd', search: 'flagd', light: flagDLightIcon },
{ meta: garnetIcon, alt: 'Garnet', search: 'garnet' },
{ meta: goIcon, alt: 'Go', search: 'golang gofeature', light: goLightIcon },
diff --git a/src/frontend/src/content/docs/integrations/compute/floci.mdx b/src/frontend/src/content/docs/integrations/compute/floci.mdx
new file mode 100644
index 000000000..27a260285
--- /dev/null
+++ b/src/frontend/src/content/docs/integrations/compute/floci.mdx
@@ -0,0 +1,450 @@
+---
+title: Floci integration
+seoTitle: Aspire Floci integration for AWS emulation
+description: Learn how to use the Aspire Floci hosting integration to emulate AWS services locally in your development environment.
+---
+
+import { Image } from 'astro:assets';
+import { Aside, Badge, Tabs, TabItem } from '@astrojs/starlight/components';
+import flociIcon from '@assets/icons/floci-icon-light.svg';
+
+
+
+
+
+
+
+
+The Aspire Floci hosting integration enables you to model Floci as a container resource in your Aspire application. Floci is a high-performance AWS emulator that runs as a container and supports 65+ AWS services. This integration simplifies local AWS service development and testing without requiring actual cloud resources. It supports:
+
+- Running Floci as a containerized AWS emulator in your Aspire application
+- Automatic environment variable injection for dependent services to connect to AWS services
+- Customizable port, region, and AWS account ID configuration
+- Data persistence with volume mounting
+- Advanced features like TLS encryption and custom configuration files
+- Health checks for container readiness
+
+## Installation
+
+To start building an Aspire app that uses Floci, install the [📦 CommunityToolkit.Aspire.Hosting.Floci](https://www.nuget.org/packages/CommunityToolkit.Aspire.Hosting.Floci) NuGet package:
+
+
+
+
+```bash title="Terminal"
+aspire add floci
+```
+
+Or, choose a manual installation approach:
+
+```csharp title="AppHost.cs"
+#:package CommunityToolkit.Aspire.Hosting.Floci@*
+```
+
+```xml title="AppHost.csproj"
+
+```
+
+
+
+
+```bash title="Terminal"
+aspire add floci
+```
+
+This updates your `aspire.config.json` with the Floci hosting integration package:
+
+```json title="aspire.config.json" ins={3}
+{
+ "packages": {
+ "CommunityToolkit.Aspire.Hosting.Floci": "*"
+ }
+}
+```
+
+
+
+
+### Add Floci resource
+
+The following example demonstrates how to add a Floci resource to your app model:
+
+
+
+```csharp title="AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var floci = builder.AddFloci("floci");
+
+var api = builder.AddProject("api")
+ .WithReference(floci)
+ .WaitFor(floci);
+
+builder.Build().Run();
+```
+
+
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const floci = await builder.addFloci('floci');
+
+const apiService = await builder.addProject('api', '../Api/Api.csproj')
+ .withReference(floci)
+ .waitFor(floci);
+
+await builder.build().run();
+```
+
+
+
+The preceding code:
+
+- Creates a Floci container resource named `floci`
+- Adds an API service project that references the Floci service
+- Uses `WaitFor` to ensure Floci is ready before starting the API service
+- Automatically configures AWS environment variables in the API service
+
+### Configure Floci resource properties
+
+You can customize the Floci container with various configuration options:
+
+
+
+```csharp title="AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var floci = builder.AddFloci("floci", options =>
+{
+ options.Port = 14566;
+ options.DefaultRegion = "eu-west-1";
+ options.DefaultAccountId = "123456789012";
+});
+
+var api = builder.AddProject("api")
+ .WithReference(floci);
+
+builder.Build().Run();
+```
+
+
+```typescript title="apphost.mts"
+import { createBuilder } from './.aspire/modules/aspire.mjs';
+
+const builder = await createBuilder();
+
+const floci = await builder.addFloci('floci', {
+ port: 14566,
+ defaultRegion: 'eu-west-1',
+ defaultAccountId: '123456789012',
+});
+
+const api = await builder.addProject('api', '../Api/Api.csproj')
+ .withReference(floci);
+
+await builder.build().run();
+```
+
+
+
+Key configuration options:
+
+- **Port**: The port on which Floci listens (default: 4566)
+- **Default Region**: AWS region for the emulator (default: `us-east-1`)
+- **Default Account ID**: AWS account ID for the emulator (default: `000000000000`)
+
+### Add data persistence to Floci
+
+Floci supports two approaches for data persistence: named volumes (recommended) and bind mounts.
+
+#### Named volume (recommended)
+
+Named volumes automatically switch Floci from in-memory to persistent mode:
+
+
+
+```csharp title="AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var floci = builder.AddFloci("floci")
+ .WithDataVolume("floci-data");
+
+builder.Build().Run();
+```
+
+
+```typescript title="apphost.mts"
+const floci = await builder.addFloci('floci');
+await floci.withDataVolume('floci-data');
+```
+
+
+
+#### Bind mount
+
+Alternatively, use a bind mount for directory-based storage:
+
+
+
+```csharp title="AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var floci = builder.AddFloci("floci")
+ .WithBindMount("./floci-data", "/tmp/floci-data");
+
+builder.Build().Run();
+```
+
+
+```typescript title="apphost.mts"
+const floci = await builder.addFloci('floci');
+await floci.withDataBindMount('/tmp/floci-data');
+```
+
+
+
+This configuration:
+
+- Persists AWS resource state across container restarts
+- Allows local inspection of stored state in the volume or mounted directory
+
+### Use AWS SDK to interact with Floci
+
+Once Floci is running and referenced by your service, you can use the AWS SDK to interact with emulated services. The `WithReference` method automatically injects the necessary AWS environment variables:
+
+
+
+```csharp title="Service.cs"
+using Amazon.S3;
+using Amazon.S3.Model;
+
+public class StorageService
+{
+ private readonly IAmazonS3 _s3Client;
+
+ public StorageService(IAmazonS3 s3Client)
+ {
+ _s3Client = s3Client;
+ }
+
+ public async Task CreateBucketAsync(string bucketName)
+ {
+ await _s3Client.PutBucketAsync(new PutBucketRequest
+ {
+ BucketName = bucketName
+ });
+ }
+
+ public async Task UploadObjectAsync(string bucketName, string key, Stream stream)
+ {
+ await _s3Client.PutObjectAsync(new PutObjectRequest
+ {
+ BucketName = bucketName,
+ Key = key,
+ InputStream = stream
+ });
+ }
+}
+```
+
+
+
+### Enable Lambda and container-backed services
+
+Floci requires access to the Docker socket to launch sibling containers for Lambda and other container-backed services:
+
+
+
+```csharp title="AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var floci = builder.AddFloci("floci")
+ .WithDockerSocket();
+
+var api = builder.AddProject("api")
+ .WithReference(floci);
+
+builder.Build().Run();
+```
+
+
+```typescript title="apphost.mts"
+const floci = await builder.addFloci('floci');
+await floci.withDockerSocket();
+
+const api = await builder.addProject('api', '../Api/Api.csproj')
+ .withReference(floci);
+
+await builder.build().run();
+```
+
+
+
+On non-standard Docker installations (e.g., Podman, Rancher Desktop), pass the socket path explicitly:
+
+
+
+```csharp title="AppHost.cs"
+var builder = DistributedApplication.CreateBuilder(args);
+
+var floci = builder.AddFloci("floci")
+ .WithDockerSocket("/run/user/1000/podman/podman.sock");
+
+var api = builder.AddProject("api")
+ .WithReference(floci);
+
+builder.Build().Run();
+```
+
+
+```typescript title="apphost.mts"
+const floci = await builder.addFloci('floci');
+await floci.withDockerSocket({
+ socketPath: '/run/user/1000/podman/podman.sock'
+});
+
+const api = await builder.addProject('api', '../Api/Api.csproj')
+ .withReference(floci);
+
+await builder.build().run();
+```
+
+
+
+### Quarkus configuration
+
+Mount a custom `application.yml` to tune any Floci setting that doesn't have a dedicated extension method. The file is injected read-only at `/deployments/config/application.yml`:
+
+
+
+```csharp title="AppHost.cs"
+var floci = builder.AddFloci("floci")
+ .WithConfigFile("./floci.yml");
+```
+
+
+```typescript title="apphost.mts"
+const floci = await builder.addFloci('floci');
+await floci.withConfigFile('./floci.yml');
+```
+
+
+
+Example `floci.yml`:
+
+```yaml title="floci.yml"
+floci:
+ auth:
+ validate-signatures: false
+quarkus:
+ log:
+ level: DEBUG
+```
+
+### TLS/HTTPS support
+
+Use the standard Aspire `WithHttpsDeveloperCertificate()` API to enable TLS. The integration automatically configures `FLOCI_TLS_ENABLED`, `FLOCI_TLS_CERT_PATH`, and `FLOCI_TLS_KEY_PATH`:
+
+
+
+```csharp title="AppHost.cs"
+var floci = builder.AddFloci("floci")
+ .WithHttpsDeveloperCertificate();
+```
+
+
+```typescript title="apphost.mts"
+const floci = await builder.addFloci('floci');
+await floci.withHttpsDeveloperCertificate();
+```
+
+
+
+When TLS is enabled, the `AWS_ENDPOINT_URL` automatically switches to the `https://` scheme. Run `aspire certs trust` once to add the Aspire development certificate to your system trust store.
+
+You can also bring your own PEM certificate:
+
+
+
+```csharp title="AppHost.cs"
+var cert = X509Certificate2.CreateFromPemFile("/certs/floci.crt", "/certs/floci.key");
+
+var floci = builder.AddFloci("floci")
+ .WithHttpsCertificate(cert);
+```
+
+
+
+## Environment variables
+
+When a service references a Floci resource using `WithReference`, the following environment variables are automatically injected:
+
+| Variable | Value |
+|----------|-------|
+| `ConnectionStrings__floci` | `http://localhost:{port}` (standard Aspire connection string) |
+| `AWS_ENDPOINT_URL` | `http://localhost:{port}` (host processes) / `http://host.docker.internal:{port}` (containers) |
+| `AWS_DEFAULT_REGION` | Region passed to `AddFloci` (default: `us-east-1`) |
+| `AWS_ACCESS_KEY_ID` | `test` |
+| `AWS_SECRET_ACCESS_KEY` | `test` |
+
+You can override any of these settings via standard Aspire environment variable configuration. All Floci-specific settings can also be set via `FLOCI_`-prefixed environment variables.
+
+## Integration testing
+
+Floci is ideal for integration testing AWS-dependent code without requiring cloud credentials or incurring costs. Since Floci is managed as an Aspire resource, you can use it in integration tests the same way you use other Aspire resources.
+
+## Supported AWS services
+
+Floci supports 65+ AWS services including:
+
+- **Storage**: S3, DynamoDB, EBS
+- **Compute**: Lambda, EC2
+- **Messaging**: SQS, SNS, Kinesis
+- **Databases**: RDS, DynamoDB
+- **Other services**: CloudFormation, CloudWatch, IAM, and many more
+
+For a complete list of supported services, visit the [Floci documentation](https://floci.io).
+
+## Troubleshooting
+
+### Container fails to start
+
+- Ensure Docker is running and has sufficient resources
+- Check that the specified port isn't already in use
+- Verify the Floci container image is available locally or can be pulled from Docker Hub
+
+### Connection refused errors
+
+- Verify the Floci container is running: `docker ps | grep floci`
+- Check that the endpoint URL matches the configured port
+- Ensure the service has the correct `WithReference` to the Floci resource
+
+### Data persistence issues
+
+- Verify the bind mount directory has the correct permissions
+- Check that the host path exists before starting the container
+- Use absolute paths for bind mounts to avoid path resolution issues
+
+## See also
+
+- [Floci documentation](https://floci.io)
+- [Floci GitHub repository](https://github.com/floci-io/floci)
+- [AWS SDK for .NET](https://docs.aws.amazon.com/sdk-for-net/)
+- [Aspire Hosting documentation](/architecture/overview/)
+- [CommunityToolkit.Aspire.Hosting.Floci GitHub](https://github.com/CommunityToolkit/Aspire)
+- [CommunityToolkit.Aspire.Hosting.Floci NuGet package](https://www.nuget.org/packages/CommunityToolkit.Aspire.Hosting.Floci)
diff --git a/src/frontend/src/data/aspire-integrations.json b/src/frontend/src/data/aspire-integrations.json
index 4340b7579..60d703389 100644
--- a/src/frontend/src/data/aspire-integrations.json
+++ b/src/frontend/src/data/aspire-integrations.json
@@ -2107,6 +2107,24 @@
"downloads": 16156,
"version": "13.4.0"
},
+ {
+ "title": "CommunityToolkit.Aspire.Hosting.Floci",
+ "description": "An Aspire integration for Floci, a high-performance AWS emulator supporting 65+ AWS services.",
+ "icon": "https://api.nuget.org/v3-flatcontainer/communitytoolkit.aspire.hosting.floci/13.4.0-preview.1.260717/icon",
+ "href": "https://www.nuget.org/packages/CommunityToolkit.Aspire.Hosting.Floci",
+ "tags": [
+ "aspire",
+ "integration",
+ "communitytoolkit",
+ "dotnetcommunitytoolkit",
+ "hosting",
+ "floci",
+ "aws",
+ "emulator"
+ ],
+ "downloads": 0,
+ "version": "13.4.0-preview.1.260717"
+ },
{
"title": "CommunityToolkit.Aspire.Hosting.Flyway",
"description": "An Aspire integration for Flyway database migration tool.",
@@ -2860,4 +2878,4 @@
"downloads": 18433,
"version": "13.4.0"
}
-]
\ No newline at end of file
+]
diff --git a/src/frontend/src/data/integration-docs.json b/src/frontend/src/data/integration-docs.json
index e7c67f277..4bd67f202 100644
--- a/src/frontend/src/data/integration-docs.json
+++ b/src/frontend/src/data/integration-docs.json
@@ -403,6 +403,10 @@
"match": "CommunityToolkit.Aspire.Hosting.Flagd",
"href": "/integrations/devtools/flagd/flagd-get-started/"
},
+ {
+ "match": "CommunityToolkit.Aspire.Hosting.Floci",
+ "href": "/integrations/compute/floci/"
+ },
{
"match": "CommunityToolkit.Aspire.Hosting.GoFeatureFlag",
"href": "/integrations/devtools/goff/goff-get-started/"