floci-ui: The Universal Translator for Local Cloud Consoles

A schema-driven TypeScript monorepo that normalizes AWS, Azure, and GCP into one local control surface, then lets the backend teach the frontend how to render the UI.

8 min read • View on GitHub • More from floci-io

A wide editorial scene shows three distinct cloud inputs feeding into one central translator box, which emits a single clean console screen. The image explains how floci-ui turns provider-specific cloud APIs into one normalized control surface.
Three cloud dialects go in. One local console comes out.
Key Takeaways

Why a Local Cloud Console Exists

Cloud development is still too often a scavenger hunt. One browser tab for AWS, another for Azure, another for GCP, plus local emulators that feel like approximations instead of tools. floci-ui answers that by making the local console feel like a single operational surface, not a pile of vendor tabs.

That is the real pitch: a developer should be able to work against cloud-shaped systems without constantly translating between three different mental models. The project does this by normalizing resources into a shared TypeScript contract and then letting the backend describe how the frontend should behave.

The Big Idea: One Interface, Three Clouds

The backend does not just fetch cloud resources. It translates them into a shared resource model and a renderable schema that the frontend can consume.

The core abstraction is an SPI, a Service Provider Interface. In practice, that means a CloudServiceAdapter contract, a registry that resolves provider-specific implementations, and a normalized resource shape that hides the provider differences until the last possible moment.

type CloudProvider = 'aws' | 'azure' | 'gcp';

type FieldSchema = {
  name: string;
  label: string;
  type: 'text' | 'select' | 'number';
  required?: boolean;
  validation?: {
    pattern?: string;
    minLength?: number;
    maxLength?: number;
  };
};

type CloudResource = {
  id: string;
  type: 'storage' | 'compute' | 'network';
  cloud: CloudProvider;
  name: string;
  metadata: Record<string, unknown>;
};

interface CloudServiceAdapter<TCreate = unknown> {
  list(): Promise<CloudResource[]>;
  create(input: TCreate): Promise<CloudResource>;
  delete(id: string): Promise<void>;
  schema(): Promise<FieldSchema[]>;
}

That last method matters. If the backend can return the field schema, then the frontend does not need a hardcoded form for every cloud and every service. The UI becomes thinner because the adapter layer is opinionated enough to teach it what to render and how to validate it.

The Cleverest Trick: Making Object Storage Feel Like a Folder Tree

A close-up file explorer scene shows a flat object store on one side and a neatly nested folder tree on the other. A small marker object acts like a hinge that turns prefixes into directories, explaining how floci-ui makes object storage feel familiar.
The folder illusion is a small implementation detail with a big UX payoff.

The storage browser is where the project stops being abstract and starts being obvious. Object storage is flat, but people think in folders. The repo bridges that gap with a virtual directory marker, so the interface reads like a file explorer instead of an engineering artifact.

That detail is more than cosmetic. It is a product choice that reduces cognitive load, especially for developers who are used to local filesystems and cloud consoles that mimic them. The project is saying that emulation should preserve the user’s mental model, not force a new one.

Why the Frontend Is Feature-First, Not Provider-First

LayerRoleWhat it optimizes for
cloud-consoleGeneric shell for browsing and common operationsReuse across providers
ec2 / eks / rdsSpecialized workflows for harder AWS servicesDepth where the generic model breaks
telemetryEvent and scheduler supportLocal observability and responsiveness
adapter layerSchema and resource normalizationProvider translation

The codebase leans into a split that feels practical rather than ideological. Generic cloud surfaces live in the shared console layer. The hard cases, like VPC and other provider-specific workflows, get their own feature modules. That keeps the common path thin without pretending every cloud service can be flattened perfectly.

This is the kind of architecture that scales only if the boundaries stay honest. The generic layer handles the 80 percent case. The specialized features catch the rest instead of forcing the adapter contract to become a junk drawer.

Where It Fits Among Cloud and Flow Tools

ToolPrimary jobMental modelWhat floci-ui does differently
floci-uiLocal cloud normalizationA single console for multiple cloud dialectsUses schemas and adapters to teach the UI how to render
KialiService mesh visibilityTopology and traffic mapsFocuses on Istio operations, not local cloud emulation
Apache NiFiData flow compositionDrag-and-drop pipeline designTargets data logistics, not provider translation
Argo Workflows UIWorkflow orchestrationKubernetes job graphsOptimizes for execution pipelines, not cloud console parity
Vendor consolesProvider-native operationsOne cloud, one worldviewfloci-ui tries to unify the experience across clouds

The comparison is useful because it clarifies ambition. floci-ui is not trying to be the biggest control plane or the richest workflow engine. It is trying to make local cloud development feel unified, fast, and operational in a way that provider consoles rarely are.

That makes it adjacent to observability and orchestration tools, but not the same thing. Its moat is translation, not topology or job scheduling.

What to Watch Next

The repository looks strongest where the storage abstraction is already mature and where AWS is deeper than the other providers. That suggests the architecture is ready for extension, but also that breadth will be the real test. Every new service increases the pressure on the adapter contract.

If the model holds, the payoff is substantial. Add more services without bloating the frontend, and the console stays coherent. Lose that discipline, and the translator becomes just another wrapper around cloud chaos.