# Vision This product vision builds on the [organization manifesto](https://git.flowmade.one/flowmade-one/architecture/src/branch/main/manifesto.md). ## Who This Product Serves ### Flowmade Developers The team building Flowmade's platform. They need reliable, auditable infrastructure for distributed systems without reinventing clustering and event sourcing. *Extends: Agencies & Consultancies (from manifesto) - we are our own first customer.* ### Go Teams Building Event-Sourced Systems Teams implementing event sourcing and CQRS patterns who want clear primitives that compose well, not a heavyweight framework. *Extends: Organizations (from manifesto) - they need maintainable, evolvable infrastructure.* ## What They're Trying to Achieve These trace back to organization-level jobs: | Product Job | Enables Org Job | |-------------|-----------------| | "Build distributed systems without reinventing clustering" | "Delivering solutions faster with maintained quality" | | "Store events as source of truth with full history" | "Adapting solutions as needs evolve" (replay, rebuild, audit) | | "Scale horizontally without complexity" | "Reducing developer dependency" (infrastructure handles it) | | "Isolate concerns with namespaces" | "Software aligned with actual workflows" (logical boundaries) | ## The Problem Building distributed, event-sourced systems in Go requires assembling many pieces: event storage, pub/sub, clustering, leader election. Existing solutions are either: - **Too heavy** - Full frameworks with opinions about your domain - **Too light** - Just pub/sub, you build everything else - **Not NATS-native** - Bolted-on integrations that don't leverage JetStream properly ## The Solution Aether provides clear primitives that compose well: - **Event sourcing primitives** - Event, EventStore interface, snapshots - **Event stores** - In-memory (testing) and JetStream (production) - **Event bus** - Local and NATS-backed pub/sub with namespace isolation - **Cluster management** - Node discovery, leader election, shard distribution - **Namespace isolation** - Logical boundaries for multi-scope deployments Built for JetStream from the ground up, not bolted on. ## Product Principles These extend the organization's guiding principles: ### Primitives Over Frameworks Provide composable building blocks, not an opinionated framework. Let users build what they need. *Extends: "Design amplification for individual capability"* ### NATS-Native Built for JetStream from the start. Leverage NATS capabilities fully rather than abstracting them away. *Extends: "Sensible defaults with available alternatives"* ### Resource Conscious Efficient on modest hardware. NATS is lightweight; Aether should be too. ARM64 friendly. *Extends: "Software performs adequately on standard-capability hardware" and "ARM64 optimization"* ### Events as Complete History Events are the source of truth. State is derived. This directly implements the manifesto belief that "systems should maintain comprehensive activity records, not merely current snapshots." *Extends: "Systematize information rather than merely documenting it"* ## Non-Goals These extend the organization's non-goals: - **Opinionated multi-tenancy.** Product layer concern - Aether provides namespace primitives, not tenant management. - **Domain-specific abstractions.** Use the primitives to build your domain model. - **GraphQL/REST API generation.** Build on top of Aether, not inside it. - **UI components.** See iris for UI concerns. - **Replacing human judgment.** Aether automates infrastructure, not decisions. ## Architecture This project follows organization architecture patterns. ### Alignment - **Event Sourcing**: Core to this library - events as source of truth - **Auditability**: Full event history, immutable records, replayable state - **Loose Coupling**: Event bus for communication, namespaces for isolation - **Domain Language**: Event types reflect business concepts ### Intentional Divergences | Area | Standard Pattern | What We Do Instead | Why | |------|------------------|-------------------|-----| | Domain modeling | DDD aggregates | Generic Actor abstraction | Library provides primitives, not domain opinions |