Umbrella Architecture

Applications

93 OTP umbrella applications forming the Prismatic Platform -- from core infrastructure and storage adapters through intelligence modules and autonomous evolution systems to production web interfaces. Each application is a self-contained OTP application with its own supervision tree, configuration, and test suite, communicating through well-defined public APIs following the 3NL architectural framework.

Abstract

The Prismatic Platform's application architecture follows the Elixir/OTP umbrella pattern, organizing 93 distinct OTP applications into a cohesive, fault-tolerant ecosystem. Each application owns its supervision tree, isolates its failure domain, and exposes functionality exclusively through a public facade module. This document catalogs the complete application landscape, explains the architectural rationale behind the umbrella structure, and provides guidance for understanding how applications compose into the platform's capabilities.

The umbrella approach delivers three critical properties that monolithic architectures cannot: independent deployability (applications can be compiled and tested in isolation), fault isolation (a crash in one application's supervision tree does not propagate to others), and clear dependency graphs (inter-application dependencies are explicit in mix.exs and enforced at compile time).

Introduction

The Umbrella Architecture Decision

The decision to structure Prismatic as an umbrella project rather than a monolith or microservice mesh reflects a deliberate architectural trade-off. Elixir umbrella projects provide the modularity benefits of microservices -- clear boundaries, independent testing, explicit dependencies -- without the operational complexity of distributed deployment, service discovery, and network-based inter-service communication.

Within a single BEAM VM, all 93 applications share the same Erlang distribution node. They communicate via direct function calls, message passing between named processes, and PubSub events -- all happening in-process with microsecond latency rather than the millisecond-scale overhead of HTTP or gRPC between separate services.

Architectural Principles

Every application in the umbrella adheres to these design constraints:

  1. Single Responsibility: Each app owns exactly one domain. prismatic_auth handles authentication; prismatic_audit handles audit logging. No overlap.
  2. Facade Pattern: External consumers access functionality through a single top-level module (e.g., PrismaticAuth, PrismaticPerimeter). Internal modules are implementation details.
  3. OTP Compliance: Stateful applications define a supervision tree rooted in Application.start/2. Stateless libraries skip the application callback.
  4. Explicit Dependencies: Every inter-app dependency is declared in mix.exs. Circular dependencies are forbidden and caught at compile time.
  5. Independent Testability: mix test apps/prismatic_auth runs the auth test suite in isolation. No test should require another app's runtime state.

Scale Context

The 93 applications collectively comprise:

MetricCount
OTP Applications93
Elixir Source Files (.ex)6,652
Elixir Test Files (.exs)5,864
Total Elixir Files13,223
Documentation Files11,308
Total Lines of Code~2.8 million
Total Repository Files37,486

Application Taxonomy

Applications are organized into eight functional categories, each serving a distinct role in the platform's architecture.

Core Infrastructure

The foundation layer providing shared capabilities that all other applications depend on:

ApplicationPurposeKey Capability
prismatic_coreCentral coordination and shared typesDomain types, shared behaviours, core protocols
prismatic_kernelLow-level runtime servicesProcess registry, system configuration, boot sequence
prismatic_3nlThree Nested Levels frameworkArchitectural enforcement, level routing, abstraction boundaries
prismatic_authAuthentication and authorizationJWT tokens, API keys, RBAC, session management
prismatic_auditAudit logging and compliance trailsImmutable audit records, compliance reporting, event sourcing
prismatic_cacheDistributed caching layerETS-backed caching, TTL management, cache invalidation
prismatic_compressionData compression servicesAdaptive compression, streaming compression, format negotiation

Core infrastructure applications have zero external dependencies beyond the Elixir standard library and are loaded first during the boot sequence.

Storage Layer

The storage subsystem implements a pluggable adapter architecture through the PrismaticStorage.Adapter behaviour, allowing transparent switching between storage backends:

ApplicationBackendUse Case
prismatic_storage_coreProtocol definitionsTraits, protocols, behaviours for all adapters
prismatic_storage_etsETSHigh-speed in-memory storage, session data, caches
prismatic_storage_ectoPostgreSQL via EctoPersistent relational data, transactions, migrations
prismatic_storage_meilisearchMeilisearchFull-text search, faceted filtering, typo-tolerant queries
prismatic_storage_kuzudbKuzuDBGraph database, relationship queries, network analysis
prismatic_storage_redisRedisDistributed caching, pub/sub, rate limiting counters
# Storage adapter contract -- all backends implement this
defmodule PrismaticStorage.Adapter do
  @callback store(key :: binary(), value :: term(), opts :: keyword()) ::
              {:ok, term()} | {:error, term()}
  @callback fetch(key :: binary(), opts :: keyword()) ::
              {:ok, term()} | {:error, :not_found}
  @callback delete(key :: binary(), opts :: keyword()) ::
              :ok | {:error, term()}
  @callback list(prefix :: binary(), opts :: keyword()) ::
              {:ok, [term()]} | {:error, term()}
end

Intelligence & OSINT

Applications providing intelligence gathering, analysis, and synthesis capabilities:

ApplicationDomainKey Capability
prismatic_osint_coreOSINT frameworkAdapter layer for 250+ intelligence sources
prismatic_osint_sourcesSource integrationsProvider implementations, rate limiting, credential management
prismatic_hawkeyeVisitor intelligenceBrowser fingerprinting, session analysis, threat detection
prismatic_ddDue diligenceEntity-centric investigation, multi-source verification
prismatic_czech_autocrawlerCzech registry crawlerARES, Justice.cz, trade registry automated data extraction
prismatic_czech_courtsCourt recordsCzech court decision analysis, legal entity monitoring
prismatic_influenceInfluence mappingSocial graph analysis, influence scoring, network visualization

Security & Compliance

Applications enforcing security policies, running adversarial simulations, and ensuring regulatory compliance:

ApplicationDomainKey Capability
prismatic_perimeterEASMSecurity ratings (A-F), asset discovery, NIS2/ZKB compliance
prismatic_complianceRegulatory complianceGDPR, SOC2, ISO 27001 compliance automation
prismatic_darkSecurity simulation sandboxIsolated environment for Red/Black team operations
prismatic_cerCER complianceCzech entity register verification, employee screening
prismatic_detection_engineThreat detectionAnomaly detection, pattern matching, alert generation
prismatic_suppressionData suppressionPII removal, data retention enforcement, right-to-erasure

AI & Agent Systems

Applications powering the platform's 434+ autonomous AI agents:

ApplicationDomainKey Capability
prismatic_agentsAgent runtime370+ AIAD agent execution, coordination, lifecycle management
prismatic_claudeClaude integrationSession management, stack conversation, context preservation
prismatic_ollamaLocal AI inferenceOllama model management, inference routing, fallback logic
prismatic_deductionLogical deductionFormal reasoning, proof generation, hypothesis testing
prismatic_lean4Formal verificationLean4 proof integration, theorem verification, NABLA proofs
prismatic_logic_prologProlog reasoningLogic programming, rule evaluation, knowledge base queries
prismatic_bifurcationDecision branchingScenario analysis, bifurcation detection, path evaluation

Web Interfaces

Phoenix-based web applications providing dashboards, APIs, and user interfaces:

ApplicationPortInterface
prismatic_web4000Main LiveView dashboard, DD cases, graph visualization
prismatic_api4004Auto-introspecting REST API, OpenAPI 3.0, SwaggerUI
prismatic_hawkeye_web4001Visitor intelligence dashboard
prismatic_perimeter_web4002EASM dashboard, security ratings, compliance views
ai_drift_web4003AI drift monitoring, alert dashboard
prismatic_ir_pvm_web--Interactive PVM visualization

Quality & Evolution

Applications driving the platform's autonomous quality enforcement and evolution:

ApplicationDomainKey Capability
prismatic_safetyQuality floor guardianAutonomous quality monitoring, regression prevention
prismatic_credoCode quality analysisCredo integration, custom checks, quality scoring
prismatic_transcendenceEvolutionary systemsSelf-healing, autonomous improvement, fitness tracking
prismatic_annihilationTechnical debt eliminationQDP scanning, automated debt removal, quality enforcement

Specialized Domains

Applications serving specific business or technical domains:

ApplicationDomainKey Capability
prismatic_audioAudio processingSpeech analysis, audio fingerprinting
prismatic_browserBrowser automationHeadless browser control, page rendering, screenshot capture
prismatic_crawler / prismatic_crawler_coreWeb crawlingURL discovery, content extraction, crawl scheduling
prismatic_blackboardShared knowledgeBlackboard architecture for multi-agent knowledge sharing
ai_driftAI decision monitoringDrift detection, baseline management, statistical testing
prismatic_labsExperimental featuresPrototype development, feature flags, A/B testing
prismatic_tidewaveEvent streamingReal-time event processing, stream aggregation

Inter-Application Communication

Applications communicate through four primary mechanisms, each suited to different interaction patterns:

1. Direct Function Calls (Synchronous)

The simplest and most common pattern. One application calls another's facade module:

# prismatic_web calling prismatic_perimeter
{:ok, rating} = PrismaticPerimeter.security_rating("example.com")

2. GenServer Calls/Casts (Process-Based)

For stateful interactions where the target application manages state through a GenServer:

# Requesting a cached result from the cache application
{:ok, result} = PrismaticCache.fetch("session:#{session_id}")

3. PubSub Events (Asynchronous)

For event-driven communication where multiple applications may react to the same event:

# Publishing an event from prismatic_audit
Phoenix.PubSub.broadcast(Prismatic.PubSub, "audit:events", {:audit_entry, entry})

# Subscribing in prismatic_compliance
Phoenix.PubSub.subscribe(Prismatic.PubSub, "audit:events")

4. Oban Jobs (Deferred)

For background processing and scheduled tasks using the Oban job processing library:

# Scheduling a crawl job from prismatic_crawler
%{url: "https://example.com", depth: 3}
|> PrismaticCrawler.Workers.CrawlWorker.new(schedule_in: 60)
|> Oban.insert()

Dependency Architecture

The dependency graph follows a strict layered architecture preventing circular dependencies:

Layer 4 (Web)        prismatic_web, prismatic_api, *_web apps
    ↓ depends on
Layer 3 (Domain)     prismatic_perimeter, prismatic_dd, prismatic_hawkeye, ai_drift
    ↓ depends on
Layer 2 (Services)   prismatic_agents, prismatic_osint_core, prismatic_auth
    ↓ depends on
Layer 1 (Core)       prismatic_core, prismatic_storage_core, prismatic_kernel
    ↓ depends on
Layer 0 (Runtime)    Elixir stdlib, OTP, BEAM VM

Enforcement: Circular dependencies are caught at compile time by mix compile. The platform's CI pipeline additionally verifies the dependency graph topology on every push.

Supervision Tree Architecture

Each OTP application defines a supervision tree that determines how its processes start, restart, and recover from failures:

# Typical application supervision tree
defmodule PrismaticPerimeter.Application do
  use Application

  @impl true
  def start(_type, _args) do
    children = [
      # Core services
      PrismaticPerimeter.Config,
      PrismaticPerimeter.RatingCache,
      # Worker pools
      {Task.Supervisor, name: PrismaticPerimeter.TaskSupervisor},
      # Scheduled jobs
      PrismaticPerimeter.Scheduler
    ]

    opts = [strategy: :one_for_one, name: PrismaticPerimeter.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

Restart Strategies Used Across the Platform:

StrategyApplications UsingRationale
:one_for_one67 appsIndependent processes, failure in one doesn't affect others
:one_for_all12 appsTightly coupled processes that must restart together
:rest_for_one14 appsSequential dependency chains (e.g., config → cache → workers)

Performance Characteristics

Build Performance

OperationTimeContext
Full compilation (mix compile)~45sAll 93 apps from scratch
Incremental compilation~2-5sSingle file change
Full test suite (mix test)~90s5,864 test files
Single app tests~3-8sIsolated app test suite
Dialyzer analysis~120sFull type analysis

Runtime Performance

MetricValueMeasurement
Boot time~8sApplication start to ready
Memory baseline~350 MBAll apps loaded, idle
Process count~2,500Running processes at idle
ETS tables~180Active ETS table count
Schedulers10BEAM scheduler threads (matches CPU cores)

Development Workflow

Creating a New Application

# Generate new umbrella application
cd apps/
mix new prismatic_new_app --sup

# Add to umbrella deps in root mix.exs
# Add inter-app dependencies in apps/prismatic_new_app/mix.exs

Testing in Isolation

# Test single application
mix test apps/prismatic_perimeter

# Test with coverage
mix test apps/prismatic_perimeter --cover

# Run specific test file
mix test apps/prismatic_perimeter/test/prismatic/perimeter/security_rating_test.exs

Exploring the Application Landscape

# List all applications with file counts
mix git_trees apps

# Find files in specific application
mix git_trees list apps/prismatic_perimeter

# Application statistics
mix git_trees --type=ex | grep prismatic_perimeter

Security Considerations

Application Isolation

Each application runs within its own supervision tree, providing natural process-level isolation. The BEAM VM's process model ensures that:

  • Memory isolation: Processes do not share heap memory; data is copied on message passing
  • Failure isolation: A crashing process takes down only its supervisor subtree
  • Scheduling fairness: The BEAM scheduler prevents any single application from starving others

Sensitive Applications

Applications handling sensitive data implement additional security measures:

  • prismatic_auth: Credential storage uses Argon2 hashing; tokens have configurable TTL
  • prismatic_dark: Operates in a sandboxed environment with no network access
  • prismatic_suppression: Implements cryptographic erasure for GDPR right-to-erasure compliance
  • prismatic_compliance: Maintains immutable audit trails with tamper detection

Dependency Security

All Hex dependencies are pinned to exact versions in mix.lock. The CI pipeline runs mix deps.audit to check for known vulnerabilities in the dependency tree.

Conclusion

Architectural Achievement

The 93-application umbrella architecture demonstrates that Elixir/OTP's process model scales to large, complex platforms without sacrificing modularity or fault tolerance. Each application maintains clear boundaries, independent testability, and explicit dependencies while benefiting from the shared BEAM runtime's efficiency.

Evolution Path

The application count has grown from the original 12 core applications to 93, guided by the principle that new domains deserve their own application when they introduce distinct state, failure modes, or deployment requirements. This organic growth, constrained by architectural rules, produces a system that is simultaneously large-scale and comprehensible.

Future Expansion

Planned application additions follow the platform's strategic roadmap:

  • Quantum-safe cryptography application for post-quantum security
  • Multi-region coordination for distributed deployment scenarios
  • Advanced vision analysis for image and video intelligence capabilities

References

Internal Documentation

External Resources


This document catalogs the complete application landscape of the Prismatic Platform as of 2026-02-06. Application counts and metrics are updated to reflect the current state of the platform.


Connect & Contribute

Created by Tomas Korcak (korczis) | Open Source under GHL

0
Total Apps
0
Total Files
0
Categories
0
Showing
Showing of apps
App Name
Action

No apps match your search criteria.

Page of