A real-time audience-participatory performance engine where collective audience input shapes live art through weighted consensus algorithms — while performers retain expressive override authority.
Live performance has always been a negotiation between performers and audiences. Applause, silence, laughter, restlessness — these are the audience’s instruments, and performers have always read them, consciously or not. But these feedback channels are coarse. An audience member cannot communicate “I want the texture to thin out while the harmonic tension increases.” They can only clap or not clap. The performer receives a blurred aggregate of approval or discomfort, filtered through the performer’s own interpretive biases.
Omni-Dromenon Engine makes this negotiation explicit and fine-grained. Audience members control continuous performance parameters — mood, tempo, intensity, density, texture, harmony, rhythm, spatial positioning — through their phones. Their inputs are aggregated in real time through a three-axis weighted consensus algorithm that accounts for spatial proximity (closer to the stage = higher weight), temporal recency (recent inputs outweigh stale ones), and cluster agreement (inputs that align with emerging consensus carry more weight). The result is a continuously updated set of values that shape the performance: what key the music is in, how fast the dancer moves, which branch of a theatrical narrative unfolds next.
The critical design decision — the one that separates this from polling or voting apps — is performer override. The performer is never subordinate to the crowd. Three override modes (absolute, blend, and lock) give the performer graduated control: they can fully override a parameter, blend their intent with the audience’s at any ratio, or lock a parameter against audience input entirely. This produces a creative dynamic that does not exist in conventional performance: the audience is genuinely shaping the art, but the performer retains the authority to resist, redirect, or amplify what the audience wants. The resulting performances are neither dictated by the crowd nor indifferent to it. They are negotiated in real time, at sub-second latency, across every parameter the performer exposes.
This system exists because the tools for live interactive performance are either too simple (binary voting, applause meters) or too complex (custom Max/MSP patches that take months to build for each new piece). Omni-Dromenon provides a general-purpose engine that works across genres — electronic music, ballet, opera, installation art, interactive theatre — while remaining configurable enough that each genre can tune the weighting algorithm to match its aesthetic priorities.
Most interactive performance systems treat the audience as a data source: inputs go in, decisions come out, the system is transparent. Omni-Dromenon treats the audience as a co-performer operating a collective instrument. Each audience member’s phone becomes a control surface, but no single person controls the output. The consensus algorithm produces emergent group behavior — tendencies, swells, sudden convergences, gradual drifts — that no individual intended but that the group collectively authored.
This design is rooted in a specific philosophical position about authorship in live art: that the most interesting creative outcomes emerge from constrained negotiation, not from unilateral control or pure democracy. The performer’s override authority is not a safety valve — it is a compositional tool. A performer who senses the audience pulling toward intensity can resist, creating tension that the audience then pushes harder against, which the performer eventually releases. This dynamic is impossible in systems where either party has absolute control.
Not all inputs are equal, and the system explicitly acknowledges this through its weighting model. Spatial weighting uses exponential decay from the stage position: an audience member standing two meters from a dancer has more influence than one at the back of a 500-seat theatre. This is not an arbitrary hierarchy — it reflects the physical reality that proximity to a performance creates a qualitatively different relationship to it. The person in the front row is in the performer’s peripheral vision, breathing the same air, sharing the same acoustic space. Their inputs should carry more weight because they are in a more intimate dialogue with the performer.
Temporal weighting ensures that the system responds to the audience’s current state, not its historical average. Inputs decay exponentially within a configurable window (default: 5 seconds). An audience member who was enthusiastic three minutes ago but has since disengaged does not continue to push the consensus. The system forgets, in the same way that a performer reading a room forgets that the audience was energetic during the opening number — what matters is how they feel right now.
Consensus weighting detects clusters: when multiple audience members converge on similar values, their agreement amplifies their collective weight. This creates a natural feedback loop where emerging consensus becomes self-reinforcing, producing decisive group movements rather than a perpetual average.
The three weighting axes (spatialAlpha, temporalBeta, consensusGamma) must sum to approximately 1.0, and their relative values encode aesthetic priorities. The system ships with five genre presets, defined in packages/core-engine/src/types/consensus.ts:
| Genre | Spatial (alpha) | Temporal (beta) | Consensus (gamma) | Aesthetic Rationale |
|---|---|---|---|---|
| Electronic Music | 0.3 | 0.5 | 0.2 | Temporal responsiveness drives rhythmic immediacy |
| Ballet | 0.5 | 0.2 | 0.3 | Spatial proximity to the dancer is the primary relationship |
| Opera | 0.2 | 0.3 | 0.5 | Collective agreement produces dramatic coherence |
| Installation | 0.7 | 0.1 | 0.2 | Location within the installation space is almost everything |
| Theatre | 0.4 | 0.3 | 0.3 | Balanced — narrative responsiveness requires all three axes |
These are not arbitrary numbers. Each encodes a claim about what matters most in that genre’s audience-performer relationship. A ballet audience’s spatial position relative to the dancer is the primary determinant of their aesthetic experience; an electronic music audience’s moment-to-moment energy matters more than where they are standing. The presets are starting points — every deployment can tune them for a specific piece.
┌─────────────────────────────────────────────────────────────────┐
│ NGINX REVERSE PROXY │
│ (infra/nginx/nginx.conf) │
├──────────────────────┬──────────────────────────────────────────┤
│ │ │
│ ┌───────────────────▼──────────────────┐ │
│ │ CORE ENGINE (Port 3000) │ │
│ │ packages/core-engine/ │ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────────────┐ │ ┌───────────────┐ │
│ │ │ Express │ │ Socket.io │ │ │ Redis 7 │ │
│ │ │ REST API │ │ /audience ns │ │◄──│ Session State │ │
│ │ │ │ │ /performer ns │ │ │ (Port 6379) │ │
│ │ └────┬─────┘ └──────┬───────────┘ │ └───────────────┘ │
│ │ │ │ │ │
│ │ ┌────▼───────────────▼───────────┐ │ ┌───────────────┐ │
│ │ │ PARAMETER BUS │ │ │ ChromaDB │ │
│ │ │ Event-driven pub/sub │ │ │ Vector Store │ │
│ │ │ (src/bus/parameter-bus.ts) │ │◄──│ Long-term │ │
│ │ └────────────┬───────────────────┘ │ │ Memory │ │
│ │ │ │ │ (Port 8000) │ │
│ │ ┌────────────▼───────────────────┐ │ └───────────────┘ │
│ │ │ CONSENSUS AGGREGATOR │ │ │
│ │ │ Weighted voting + smoothing │ │ │
│ │ │ Cluster analysis + outliers │ │ │
│ │ │ (src/consensus/*.ts) │ │ │
│ │ └────────────┬───────────────────┘ │ │
│ │ │ │ │
│ │ ┌────────────▼───────────────────┐ │ │
│ │ │ OSC BRIDGE │ │ │
│ │ │ SuperCollider / Max/MSP │ │ │
│ │ │ (src/osc/osc-bridge.ts) │ │ │
│ │ └────────────────────────────────┘ │ │
│ └───────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────┐ │
│ │ PERFORMANCE SDK (Port 3001) │ │
│ │ packages/performance-sdk/ │ │
│ │ │ │
│ │ React 18 + Vite + Socket.io-client │ │
│ │ ┌──────────────┐ ┌────────────────┐ │ │
│ │ │ Audience UI │ │ Performer │ │ │
│ │ │ Sliders, │ │ Dashboard, │ │ │
│ │ │ Voting Panel │ │ Override Panel │ │ │
│ │ └──────────────┘ └────────────────┘ │ │
│ └───────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────┐ │
│ │ AUDIO SYNTHESIS BRIDGE │ │
│ │ packages/audio-synthesis-bridge/ │ │
│ │ │ │
│ │ OSC Server + WebAudio Engine │ │
│ │ Parameter Mapping + Synthesis │ │
│ └───────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
Phone Input → WebSocket /audience → Parameter Bus → Batch Aggregation
│
Consensus Engine
(spatial × temporal × cluster weights)
│
Outlier Rejection → Smoothing
│
Performer Override Check
(absolute | blend | lock)
│
┌───────────┼───────────┐
▼ ▼ ▼
Audience UI Performer OSC Output
(live values) Dashboard (SuperCollider)
All audience inputs are batched, never processed individually. The consensus loop runs on a configurable interval (default: 50ms), computing weighted averages across the batch window, applying outlier rejection via z-score filtering (threshold: 2.5 standard deviations), exponential smoothing (factor: 0.3), and performer override resolution before broadcasting to all connected clients and OSC endpoints simultaneously.
The server maintains two strictly separated Socket.io namespaces:
/audience — Many concurrent clients (target: 1,000+). Receives parameter sliders and location updates; emits consensus values and session state./performer — Few authenticated clients. Full session control: start/pause/resume/end. Override any parameter. Receives real-time snapshots with participant counts and bus statistics.Authentication is namespace-scoped: audience connections are anonymous (identified by clientId), while performer connections require a shared secret via the auth event before gaining override privileges.
The live repository surface is intentionally small:
packages/ contains the versioned workspace packages that define the active backplane.examples/ contains the maintained reference applications that exercise that backplane.infra/ contains the current deployment assets.docs/ contains the current documentation tree.The following top-level items are not canonical runtime or dependency sources:
docs/reference/omnidramanon-cold-storage/ and should not be used to infer current deployment shape or package boundaries.seed.yaml consumes entries are the source of truth for downstream dependency mapping; preserved snapshots such as docs/reference/omnidramanon-cold-storage/metadata/dependencies.json and docs/reference/omnidramanon-cold-storage/metadata/ecosystem.yaml are historical only.This is a pnpm monorepo (pnpm@9.15.0) with five packages and four example applications:
@omni-dromenon/core-engineThe real-time WebSocket server. Express 4 + Socket.io 4 + Redis 4. Implements the consensus algorithm, parameter bus, OSC bridge, and session lifecycle.
| Component | Path | Purpose |
|---|---|---|
| Server entry | src/server.ts |
Express + Socket.io initialization, namespace routing |
| Parameter Bus | src/bus/parameter-bus.ts |
Typed event emitter with 16 event types |
| Audience Inputs | src/bus/audience-inputs.ts |
Input validation, rate limiting, batch collection |
| Performer Subs | src/bus/performer-subscriptions.ts |
Auth, override management, session commands |
| Weighted Voting | src/consensus/weighted-voting.ts |
Three-axis weighting, cluster analysis, smoothing |
| Aggregation | src/consensus/parameter-aggregation.ts |
Per-parameter state, snapshot creation |
| OSC Bridge | src/osc/osc-bridge.ts |
SuperCollider/Max integration via osc library |
| Type System | src/types/consensus.ts, performance.ts |
Zod-validated schemas, genre presets |
| Middleware | src/middleware/auth.ts, rate-limit.ts, validation.ts |
Request pipeline |
| Benchmarks | benchmarks/latency-test.ts |
P95 latency validation |
Dependencies: Express, Socket.io, Redis, osc, Zod. Dev: TypeScript 5.3, tsx, Vitest.
@omni-dromenon/performance-sdkReact 18 component library for performer and audience interfaces. Built with Vite.
| Component | Path | Purpose |
|---|---|---|
| Audience Sliders | src/audience-interface/components/ParameterSlider.tsx |
Touch-optimized parameter controls |
| Voting Panel | src/audience-interface/components/VotingPanel.tsx |
Discrete voting interface |
| Connection Hook | src/audience-interface/hooks/useConnection.ts |
WebSocket lifecycle management |
| Voting Hook | src/audience-interface/hooks/useVoting.ts |
Input debouncing and submission |
| Live Parameters | src/performer-dashboard/components/LiveParameters.tsx |
Real-time consensus visualization |
| Override Panel | src/performer-dashboard/components/OverridePanel.tsx |
Three-mode override controls |
| Performer Status | src/performer-dashboard/components/PerformerStatus.tsx |
Session state and bus statistics |
| Bus Subscription | src/performer-dashboard/hooks/useBusSubscription.ts |
Server-push event binding |
| Override Hook | src/performer-dashboard/hooks/useOverride.ts |
Override request/clear lifecycle |
| Wallet Login | src/auth/WalletLogin.tsx |
Solana wallet adapter integration |
Peer deps: React 18, React DOM 18. Dependencies: Socket.io-client, React Router 6, Solana wallet adapter stack (@solana/wallet-adapter-*, @solana/web3.js).
@omni-dromenon/audio-synthesis-bridgeTranslates consensus parameter values into audio control signals. Dual output: OSC messages (for SuperCollider, Max/MSP, Ableton) and WebAudio API (for browser-native synthesis).
| Component | Path | Purpose |
|---|---|---|
| Bridge Entry | src/bridge/index.ts |
Initialization, routing |
| Parameter Mapper | src/bridge/parameter-mapper.ts |
Consensus values to synthesis params |
| OSC Server | src/osc/osc-server.ts |
UDP message dispatch |
| Message Parser | src/osc/message-parser.ts |
Incoming OSC parsing |
| Audio Context | src/webaudio/audio-context.ts |
Browser AudioContext management |
| Synthesis Engine | src/webaudio/synthesis-engine.ts |
Web Audio synthesis |
@omni-dromenon/client-sdkLightweight WebSocket client for embedding audience participation into any web page. Intended for third-party integrations where the full Performance SDK is unnecessary.
packages/orchestrateA Python-based multi-AI orchestration CLI. Dispatches prompts to multiple LLM providers (ChatGPT, Gemini, Copilot, Grok, Perplexity) through a gated pipeline with five phases: research, specification, messaging, implementation, vulnerability analysis. Each gate validates outputs before advancing.
| Component | Path | Purpose |
|---|---|---|
| Orchestrator | src/orchestrator.py |
Pipeline execution engine |
| Gate Validator | src/utils/gate_validator.py |
Phase gate validation logic |
| Prompt Templates | src/utils/prompt_templates.py |
Phase-specific prompt construction |
| Result Aggregator | src/utils/result_aggregator.py |
Multi-provider response synthesis |
| Service Handlers | src/services/*.py |
Provider-specific API adapters |
orchestrate package only)# Clone the repository
git clone https://github.com/organvm-ii-poiesis/metasystem-master.git
cd metasystem-master
# Install all dependencies (pnpm workspaces)
pnpm install
# Build all TypeScript packages
pnpm build
# Run all tests
pnpm test
# Start all services: core-engine, performance-sdk, Redis, ChromaDB, Nginx
docker compose up
# Services will be available at:
# Core Engine: http://localhost:3000
# Performance SDK: http://localhost:3001
# ChromaDB: http://localhost:8000
# Redis: localhost:6379
# Nginx (proxy): http://localhost:80
docker compose up core-engine redis
cd packages/orchestrate
pip install -r requirements.txt
python src/orchestrator.py
cd packages/core-engine
pnpm dev
The server starts on port 3000 with two WebSocket namespaces:
╔═══════════════════════════════════════════════════════╗
║ OMNI-DROMENON-ENGINE CORE SERVER ║
╠═══════════════════════════════════════════════════════╣
║ WebSocket (Audience): ws://localhost:3000/audience ║
║ WebSocket (Performer): ws://localhost:3000/performer ║
║ REST Health: GET /health ║
║ REST Session: GET /session ║
║ REST Values: GET /values ║
╚═══════════════════════════════════════════════════════╝
cd packages/performance-sdk
pnpm dev
Opens the React dashboard on port 3001. Navigate to /performer for the override panel or /audience for the input interface.
import { io } from "socket.io-client";
const socket = io("ws://localhost:3000/audience", {
query: { clientId: "audience-001" }
});
socket.on("session:state", (state) => {
console.log("Parameters:", state.parameters);
console.log("Current values:", state.values);
});
// Send a parameter input (normalized 0-1)
socket.emit("input", { parameter: "mood", value: 0.8 });
// Update spatial location (for proximity weighting)
socket.emit("location", { x: 25, y: 10, zone: "front" });
// Receive live consensus values
socket.on("values", (values) => {
console.log("Consensus:", values);
});
const performer = io("ws://localhost:3000/performer", {
query: { performerId: "performer-001", displayName: "Conductor" }
});
// Authenticate
performer.emit("auth", { secret: process.env.PERFORMER_SECRET });
performer.on("auth:success", () => {
// Start the session
performer.emit("session:start");
// Override mood to maximum intensity
performer.emit("override", {
parameter: "mood",
value: 1.0,
mode: "absolute"
});
// Blend with audience — 70% performer, 30% audience
performer.emit("override", {
parameter: "tempo",
value: 0.9,
mode: "blend",
blendFactor: 0.7
});
// Lock density so audience cannot change it
performer.emit("override", {
parameter: "density",
value: 0.4,
mode: "lock"
});
// Clear an override, returning control to audience
performer.emit("override:clear", { parameter: "mood" });
});
// Receive real-time snapshots
performer.on("snapshot", (snap) => {
console.log(`${snap.participants} participants, values:`, snap.values);
});
# Health check
curl http://localhost:3000/health
# Current session state
curl http://localhost:3000/session
# Live consensus values
curl http://localhost:3000/values
The examples/ directory contains four genre-specific reference implementations, each a self-contained pnpm package:
cd examples/generative-music
pnpm install && pnpm dev
Audience members control pitch, rhythm, and intensity. The server computes consensus and forwards values to SuperCollider via OSC. Includes a custom osc-bridge.js that maps consensus parameters to synthesis control signals, a performer HTML dashboard, and an integration test suite.
Files: src/server/consensus.js (simplified weighting), src/server/osc-bridge.js (SuperCollider output), src/public/client.js (audience UI), src/public/performer.html (override panel).
cd examples/generative-visual
pnpm install && pnpm dev
Audience controls drive WebGL shaders in real time. Custom vertex and fragment shaders (src/shaders/vertex.glsl, src/shaders/fragment.glsl) receive consensus parameters as uniforms. Color palette, distortion intensity, and animation speed respond to collective audience input.
cd examples/choreographic-interface
pnpm install && pnpm dev
Integrates pose detection (src/motion/pose-detector.js) with consensus-weighted movement mapping (src/motion/movement-mapper.js). Designed for dance performances where a camera tracks the performer’s body and audience input modulates the movement interpretation — how literally or abstractly the body’s motion is translated to visual/sonic output.
cd examples/theatre-dialogue
pnpm install && pnpm dev
A branching narrative engine where audience consensus selects dialogue paths. The src/dialogue/script-engine.js loads a tree-structured script and the src/dialogue/branch-selector.js maps consensus values to branch decisions. Performers can lock branches to prevent audience from derailing critical narrative beats.
| Method | Path | Description |
|---|---|---|
GET |
/health |
Server health, session ID, participant counts, uptime |
GET |
/session |
Full session state: parameters, venue geometry, current values, bus stats |
GET |
/values |
Current consensus values for all parameters |
/audience)| Direction | Event | Payload | Description |
|---|---|---|---|
| Server → Client | session:state |
{ sessionId, status, parameters, values } |
Sent on connection |
| Client → Server | input |
{ parameter: string, value: number } |
Parameter input (0-1) |
| Client → Server | location |
{ x: number, y: number, zone?: string } |
Spatial position update |
| Server → Client | values |
Record<string, number> |
Consensus broadcast (50ms interval) |
| Server → Client | input:rejected |
{ reason: string } |
Rate limit or validation failure |
| Server → Client | error |
{ code: string, message: string } |
Session not active, etc. |
/performer)| Direction | Event | Payload | Description |
|---|---|---|---|
| Client → Server | auth |
{ secret: string } |
Authentication handshake |
| Server → Client | auth:success |
{ performerId } |
Grants override privileges |
| Server → Client | auth:failed |
{ reason } |
Invalid credentials |
| Client → Server | override |
{ parameter, value, mode, blendFactor?, durationMs? } |
Apply override |
| Server → Client | override:success |
{ override } |
Override accepted |
| Client → Server | override:clear |
{ parameter } |
Remove override |
| Client → Server | session:start |
— | Begin performance session |
| Client → Server | session:pause |
— | Pause (requires canPause permission) |
| Client → Server | session:resume |
— | Resume paused session |
| Client → Server | session:end |
— | End (requires canEnd permission) |
| Server → Client | values |
Record<string, number> |
Consensus broadcast |
| Server → Client | snapshot |
{ timestamp, participants, values } |
Real-time analytics |
The ParameterBus class (src/bus/parameter-bus.ts) is a typed EventEmitter with 16 event types:
enum BusEvent {
AUDIENCE_INPUT = 'audience:input',
AUDIENCE_INPUT_BATCH = 'audience:input:batch',
CONSENSUS_UPDATE = 'consensus:update',
CONSENSUS_SNAPSHOT = 'consensus:snapshot',
PERFORMER_OVERRIDE = 'performer:override',
PERFORMER_OVERRIDE_CLEAR = 'performer:override:clear',
PERFORMER_COMMAND = 'performer:command',
SESSION_START = 'session:start',
SESSION_PAUSE = 'session:pause',
SESSION_RESUME = 'session:resume',
SESSION_END = 'session:end',
PARTICIPANT_JOIN = 'participant:join',
PARTICIPANT_LEAVE = 'participant:leave',
PARTICIPANT_UPDATE = 'participant:update',
ERROR = 'error',
WARNING = 'warning',
STATS = 'stats',
}
All payloads are strongly typed via BusEventPayloads interface map. The bus collects throughput statistics (inputs/sec, consensus updates/sec, active subscribers, latency) and emits them every second on the STATS event.
| Variable | Default | Description |
|---|---|---|
PORT |
3000 |
Core engine HTTP/WebSocket port |
REDIS_URL |
redis://localhost:6379 |
Redis connection for session state |
OSC_OUT_PORT |
57121 |
UDP port for OSC output to SuperCollider |
CONSENSUS_WINDOW_MS |
1000 |
Input aggregation window |
GCP_PROJECT_ID |
omni-dromenon |
Google Cloud project (for Firestore) |
GEMINI_API_KEY |
— | For AI-driven orchestration features |
CHROMA_URL |
http://chroma:8000 |
ChromaDB vector store endpoint |
LOG_LEVEL |
debug |
Logging verbosity |
The WeightingConfig interface controls all aspects of the consensus algorithm:
interface WeightingConfig {
spatialAlpha: number; // Weight of spatial proximity (0-1)
spatialDecayRate: number; // Exponential decay rate for distance
temporalBeta: number; // Weight of input recency (0-1)
temporalWindowMs: number; // Time window for input relevance (ms)
temporalDecayRate: number; // Exponential decay rate for time
consensusGamma: number; // Weight of cluster agreement (0-1)
clusterThreshold: number; // Max value difference for cluster membership
smoothingFactor: number; // Exponential smoothing (0 = no change, 1 = instant)
outlierThreshold: number; // Z-score threshold for outlier rejection
}
Defaults: spatialAlpha: 0.3, temporalBeta: 0.5, consensusGamma: 0.2, temporalWindowMs: 5000, smoothingFactor: 0.3, outlierThreshold: 2.5.
Performance spaces are modeled as 2D coordinate systems with named zones:
const DEFAULT_VENUE: VenueGeometry = {
width: 100, height: 100,
stagePosition: { x: 50, y: 0 },
zones: [
{ id: 'front', bounds: { xMin: 0, xMax: 100, yMin: 0, yMax: 30 }, spatialWeight: 1.0 },
{ id: 'middle', bounds: { xMin: 0, xMax: 100, yMin: 30, yMax: 70 }, spatialWeight: 0.8 },
{ id: 'back', bounds: { xMin: 0, xMax: 100, yMin: 70, yMax: 100 }, spatialWeight: 0.6 },
],
maxCapacity: 500,
};
Zone-based spatial weights are base multipliers applied before the distance-decay calculation. A front-section audience member receives the full spatial weight; a back-section member starts at 0.6x before distance decay further reduces it.
const DEFAULT_SESSION_CONFIG: SessionConfig = {
allowAudienceInput: true,
allowPerformerOverride: true,
recordingEnabled: true,
maxParticipants: 1000,
inputRateLimitMs: 100, // Max 10 inputs/second per client
consensusIntervalMs: 50, // 20 consensus computations/second
oscEnabled: true,
oscHost: '127.0.0.1',
oscPort: 57120,
};
Four parameters ship out of the box; additional parameters can be added via the ParameterDefinition interface:
| Parameter | Category | Default | OSC Address | Description |
|---|---|---|---|---|
mood |
MOOD | 0.5 | /performance/mood |
Emotional color (dark to bright) |
tempo |
TEMPO | 0.5 | /performance/tempo |
Speed/pace of performance |
intensity |
INTENSITY | 0.3 | /performance/intensity |
Energy level (calm to intense) |
density |
DENSITY | 0.4 | /performance/density |
Textural complexity (sparse to dense) |
Each parameter supports optional MIDI CC mapping (midiCC field) and can be individually configured for audience control, performer control, and smoothing behavior.
Omni-Dromenon does not exist in a vacuum. It implements specific theoretical frameworks developed in ORGAN-I (Theory) and the broader organvm system.
recursive-engine (ORGAN-I)The consensus algorithm’s self-reinforcing cluster weighting implements a recursive feedback loop: audience agreement amplifies agreement, producing emergent macro-behavior from micro-inputs. This is a direct application of the recursive systems theory formalized in organvm-i-theoria/recursive-engine — specifically the principle that system identity emerges from iterated self-reference under constraint. In Omni-Dromenon, the constraint is the performer’s override authority; the self-reference is the consensus algorithm’s sensitivity to its own prior state (via smoothing); and the emergent identity is the performance itself, which is authored by neither audience nor performer alone but by their iterated negotiation.
organon-noumenon--ontogenetic-morphe (ORGAN-I)The spatial weighting model — where proximity to the stage creates qualitatively different influence — operationalizes the distinction between phenomenal and noumenal experience explored in organvm-i-theoria/organon-noumenon--ontogenetic-morphe. The audience member in the front row has a phenomenally richer experience (visual detail, acoustic proximity, shared breath) than the one in the back. The weighting system translates this phenomenal difference into computational influence, asserting that richer experience should carry more authority in shaping the art. This is a philosophical claim embedded in code.
Two theoretical documents within this repository articulate the conceptual foundations:
The docs/flow-patterns/ directory contains YAML specifications for harmonic progressions, gate definitions, flow notation, and organ-flow manifests that formalize the relationship between consensus parameters and artistic output trajectories. These are not ornamental — they define the vocabulary of possible performance arcs and are consumed by the orchestration system during pre-performance configuration.
This system is designed for live deployment. Target contexts include:
docs/business/GRANT_MATERIALS/ars-electronica-narrative-DRAFT.mdThe system’s infrastructure accommodates:
installation genre preset with 0.7 spatial alpha — position in the space is almost everythingdocs/guides/IPHONE_QUICK_START.md) covers PWA-style audience participation via mobile SafariThe docs/community/ directory provides production-ready templates:
festival-rider.md — technical requirements for venue production managersindie-venue-setup.md — stripped-down deployment for small spacesbudget-checklist.md — line-item template for grant budgetsproposal-template.md — narrative scaffold for funding applicationscollaboration-agreement.md — legal template for artist collaborationsartist-bio-template.md and cv-template.md — formatted materials for submission packetsOmni-Dromenon is the ORGAN-II flagship within the organvm eight-organ creative-institutional system. It connects to:
orchestrate CLI is a domain-specific analogue; agentic-titan operates at the cross-organ level.Contributions span four domains. The project follows a phase-based development model — check docs/plans/ for current priorities.
# Fork and clone
git clone https://github.com/<your-fork>/metasystem-master.git
cd metasystem-master
pnpm install
# Create a feature branch
git checkout -b feature/your-feature-name
# Make changes, run tests
pnpm test
pnpm build
# Type-check all packages
pnpm run typecheck
# Commit (conventional commits)
git commit -m "feat(consensus): add adaptive smoothing factor"
# Push and open a PR against master
git push origin feature/your-feature-name
Commit types: feat, fix, docs, style, refactor, test, chore. Scope should reference the affected package (e.g., consensus, performance-sdk, audio-bridge, orchestrate).
Open an issue using the Artistic Collaboration template. Describe the genre, medium, and how Omni-Dromenon would be integrated. The project actively seeks collaborations with:
Open an issue using the Research Contribution template. Areas of active interest:
The docs/ directory contains 200+ files across academic templates, deployment guides, architectural specifications, theory manifestos, and community resources. Documentation contributions — particularly performer guides, genre-specific customization guides, and venue setup playbooks — are especially welcome. The documentation uses MkDocs (docs/mkdocs.yml) for structured site generation.
| Metric | Target | Measurement |
|---|---|---|
| WebSocket latency (P95) | < 2ms | Core engine benchmarks |
| Consensus computation | < 1ms for 100 concurrent users | packages/core-engine/benchmarks/ |
| Memory per service | < 500MB at 1,000 connections | Docker stats |
| Audience capacity | 1,000+ simultaneous clients | Load testing |
| Input rate limit | 10 inputs/second per client | Server-side enforcement |
| Consensus broadcast | 20 updates/second (50ms interval) | Configurable |
| Layer | Technology | Version |
|---|---|---|
| Runtime | Node.js | >= 18.0.0 |
| Package Manager | pnpm | 9.15.0 |
| Language | TypeScript | 5.3 (strict mode, ES2022 target) |
| Server | Express | 4.18 |
| WebSocket | Socket.io | 4.7 |
| Validation | Zod | 3.22 |
| UI Framework | React | 18.2 |
| Build Tool | Vite | 5.0 |
| Testing | Vitest | 1.1 |
| Audio Protocol | OSC (via osc npm) |
2.4 |
| Session State | Redis | 7 (Alpine) |
| Vector Store | ChromaDB | Latest |
| Blockchain | Solana Web3.js | 1.91 |
| Infrastructure | Docker Compose | — |
| Cloud | GCP (Terraform, Cloud Run) | — |
| Python (Orchestrator) | Python | 3.11+ |
License: MIT
Author: Anthony Padavano (@4444J99)
Organization: organvm-ii-poiesis (ORGAN-II: Poiesis)
System: meta-organvm — the eight-organ creative-institutional system coordinating ~79 repositories across theory, art, commerce, orchestration, public process, community, and marketing.
This README is a Silver Sprint portfolio document for the organvm system. It is written for grant reviewers, hiring managers, and collaborators who want to understand what Omni-Dromenon does, why it exists, and how it fits within a larger creative-institutional architecture. For developer-focused quick reference, see docs/guides/QUICK_REFERENCE.md. For the full documentation site, see docs/mkdocs.yml.
Case Study · Portfolio · System Directory · ORGAN II · Poiesis · Part of the ORGANVM eight-organ system