# Architecture
Source: https://docs.shipsec.ai/architecture
System design and module responsibilities for ShipSec Studio
## What is ShipSec Studio?
ShipSec Studio is an open-source, no-code security workflow orchestration platform. Build, execute, and monitor security automation workflows through a visual interface — focus on security, not infrastructure.
***
## System Overview
```
┌────────────────────────────────────────────────────────────────────────┐
│ FRONTEND │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Visual │ │ Terminal │ │ Timeline │ │ Config │ │
│ │ Builder │ │ Viewer │ │ Replay │ │ Panel │ │
│ │ (ReactFlow) │ │ (xterm.js) │ │ (Zustand) │ │ (Forms) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
└───────────────────────────────────┬────────────────────────────────────┘
│ REST API + Unified SSE
┌───────────────────────────────────▼─────────────────────────────────────┐
│ BACKEND │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │Workflows │ │ Secrets │ │ Storage │ │ Trace │ │ Auth │ │
│ │ + DSL │ │(AES-256) │ │ (MinIO) │ │ Events │ │ (Clerk) │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Webhooks │ │Schedules │ │ Agents │ │Human │ │Integr- │ │
│ │ │ │ (CRON) │ │ │ │Inputs │ │ations │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└───────────────────────────────────┬─────────────────────────────────────┘
│ Temporal Client
┌───────────────────────────────────▼─────────────────────────────────────┐
│ TEMPORAL │
│ Workflow Orchestration • Retry Logic • Durability │
└───────────────────────────────────┬─────────────────────────────────────┘
│ Activity Execution
┌───────────────────────────────────▼─────────────────────────────────────┐
│ WORKER │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ COMPONENT REGISTRY │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ Tools │ │ AI │ │ Human │ │ Core │ │ │
│ │ │(Security)│ │ Agents │ │ in Loop │ │ Utils │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ SERVICE ADAPTERS │ │
│ │ Secrets │ Storage │ Artifacts │ Trace │ Terminal │ Logs │ │
│ └─────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
│
┌───────────────────────────────────▼─────────────────────────────────────┐
│ INFRASTRUCTURE │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │PostgreSQL│ │ MinIO │ │ Redis │ │Redpanda │ │ Loki │ │
│ │ (Data) │ │ (Files) │ │(Terminal)│ │ (Kafka) │ │ (Logs) │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
```
***
## Technology Stack
| Layer | Stack |
| ------------------ | ------------------------------------------------------------------------------- |
| **Frontend** | React 19, TypeScript, Vite, TailwindCSS, Radix UI, ReactFlow, xterm.js, Zustand |
| **Backend** | NestJS, TypeScript, Bun, Drizzle ORM, Clerk Auth |
| **Worker** | Node.js, TypeScript, Temporal SDK, Docker |
| **Infrastructure** | PostgreSQL 16, Temporal, MinIO, Redis, Redpanda (Kafka), Loki |
***
## Core Deep-Dives
To keep this guide concise, complicated subsystems are documented in their own dedicated files:
* **[Workflow Compilation (DSL)](/architecture/workflow-compilation)**: How visual graphs are transformed into executable instructions.
* **[Temporal Orchestration](/architecture/temporal-orchestration)**: How we use Temporal for durability and worker scaling.
* **[Streaming Pipelines](/architecture/streaming-pipelines)**: How terminal, logs, and events are delivered in real-time.
* **[Human-in-the-Loop](/architecture/human-in-the-loop)**: How we pause workflows for manual approvals and forms.
***
## Component Categories
Components are the building blocks of workflows:
| Category | Description | Examples |
| ----------------- | --------------------------------------- | ------------------------------------------------------- |
| **security** | Security scanning and enumeration tools | Subfinder, DNSX, Nuclei, Naabu, HTTPx, TruffleHog |
| **ai** | AI/ML and agent components | LLM Generate, AI Agent, MCP Providers |
| **core** | Utility and data processing | HTTP Request, File Loader, Logic Script, JSON Transform |
| **notification** | Alerts and messaging | Slack, Email |
| **manual-action** | Human-in-the-loop | Approvals, Forms, Selection |
| **github** | GitHub integrations | Remove Org Membership |
***
## Security Architecture
### Authentication & Multi-tenancy
* **Clerk Integration** — Production-ready authentication for hosted environments.
* **Local Auth** — Default for local setup using `ADMIN_USERNAME` / `ADMIN_PASSWORD`.
* **Organization Isolation** — All data scoped by `organization_id`.
### Secrets Management
* **AES-256-GCM** encryption at rest.
* **Versioned secrets** with active/inactive tracking.
* **Master key** via `SECRET_STORE_MASTER_KEY` environment variable.
### Container Isolation
* **IsolatedContainerVolume** — Per-tenant, per-run Docker volumes. See **[Isolated Volumes](/development/isolated-volumes)**.
* **Network isolation** — Components run with `network: none` or `bridge`.
* **Automatic cleanup** — Volumes destroyed after execution.
***
## Development URLs
All application services are accessible through nginx on port 80:
| Service | URL |
| ---------------- | ---------------------------------------------------------- |
| Frontend | [http://localhost/](http://localhost/) |
| Backend API | [http://localhost/api/](http://localhost/api/) |
| Analytics | [http://localhost/analytics/](http://localhost/analytics/) |
| Temporal UI | [http://localhost:8081](http://localhost:8081) |
| MinIO Console | [http://localhost:9001](http://localhost:9001) |
| Redpanda Console | [http://localhost:8082](http://localhost:8082) |
| Loki | [http://localhost:3100](http://localhost:3100) |
Individual service ports (5173, 3211, 5601) are available for debugging but should not be used in normal development. All traffic flows through nginx on port 80.
***
## Learn More
* **Component Development**: `/development/component-development`
* **Getting Started**: `/getting-started`
# Command Reference
Source: https://docs.shipsec.ai/command-reference
Complete reference for just commands and development utilities
ShipSec Studio uses [just](https://github.com/casey/just) as its command runner. Run `just` or `just help` to see all available commands.
***
## Getting Started
### Initialize Project
```bash theme={null}
just init
```
Sets up the development environment:
* Installs dependencies with Bun
* Creates environment files from examples (`backend/.env`, `worker/.env`, `frontend/.env`)
***
## Development Commands
### Start Development Environment
```bash theme={null}
just dev
```
Starts the full development environment with hot-reload:
* Checks for environment files
* Starts Docker infrastructure (Postgres, Temporal, MinIO, Loki)
* Waits for services to be ready
* Runs database migrations
* Starts backend, worker, and frontend via PM2
**Access points (all via nginx on port 80):**
| Service | URL |
| ----------- | ---------------------------------------------------------- |
| Frontend | [http://localhost/](http://localhost/) |
| Backend API | [http://localhost/api/](http://localhost/api/) |
| Analytics | [http://localhost/analytics/](http://localhost/analytics/) |
| Temporal UI | [http://localhost:8081](http://localhost:8081) |
### Stop Development
```bash theme={null}
just dev stop
```
Stops all PM2 processes and Docker infrastructure.
### View Logs
```bash theme={null}
just dev logs
```
Streams logs from all application processes via PM2.
### Check Status
```bash theme={null}
just dev status
```
Shows status of PM2 processes and Docker containers.
***
## Production Commands
### Start Production
```bash theme={null}
just prod
```
Starts the production environment using Docker Compose with pre-built images.
**Access points (all via nginx on port 80):**
| Service | URL |
| ----------- | ---------------------------------------------------------- |
| Frontend | [http://localhost/](http://localhost/) |
| Backend API | [http://localhost/api/](http://localhost/api/) |
| Analytics | [http://localhost/analytics/](http://localhost/analytics/) |
| Temporal UI | [http://localhost:8081](http://localhost:8081) |
### Build and Start
```bash theme={null}
just prod build
```
Builds Docker images and starts the production environment.
### Stop Production
```bash theme={null}
just prod stop
```
Stops all production containers.
### View Production Logs
```bash theme={null}
just prod logs
```
Streams logs from all production containers.
### Check Production Status
```bash theme={null}
just prod status
```
Shows status of production containers.
### Clean Production
This deletes all data.
```bash theme={null}
just prod clean
```
Stops containers, removes volumes, and prunes Docker system.
***
## Infrastructure Commands
### Start Infrastructure
```bash theme={null}
just infra up
```
Starts only the infrastructure containers:
* PostgreSQL
* Temporal
* MinIO
* Redis
* Loki
### Stop Infrastructure
```bash theme={null}
just infra down
```
Stops all infrastructure containers.
### View Infrastructure Logs
```bash theme={null}
just infra logs
```
Streams logs from infrastructure containers.
### Clean Infrastructure
```bash theme={null}
just infra clean
```
Stops infrastructure and removes all volumes.
This deletes all data.
***
## Utility Commands
### Show All Status
```bash theme={null}
just status
```
Comprehensive status check showing:
* PM2 services
* Infrastructure containers
* Production containers
### Reset Database
```bash theme={null}
just db-reset
```
Drops and recreates the database, then runs migrations. **This deletes all data.**
This command requires PostgreSQL to be running (`just dev` or `just infra up`).
### Build Images Only
```bash theme={null}
just build
```
Builds production Docker images without starting containers.
***
## Quick Reference
| Command | Description |
| ------------------ | -------------------------- |
| `just init` | Initialize environment |
| `just dev` | Start development |
| `just dev stop` | Stop development |
| `just dev logs` | View dev logs |
| `just dev status` | Check dev status |
| `just prod` | Start production |
| `just prod build` | Build and start production |
| `just prod stop` | Stop production |
| `just prod logs` | View production logs |
| `just prod clean` | Clean production data |
| `just infra up` | Start infrastructure |
| `just infra down` | Stop infrastructure |
| `just infra logs` | View infrastructure logs |
| `just infra clean` | Clean infrastructure data |
| `just status` | Show all status |
| `just db-reset` | Reset database |
| `just build` | Build images |
| `just help` | Show help |
***
## Environment Files
The `just init` command creates these environment files:
| File | Purpose |
| --------------- | ------------------------- |
| `backend/.env` | Backend API configuration |
| `worker/.env` | Worker configuration |
| `frontend/.env` | Frontend configuration |
Each file is created from its corresponding `.env.example` template.
# AI Components
Source: https://docs.shipsec.ai/components/ai
LLM integrations for intelligent workflow automation
AI components in ShipSec Studio follow a **Provider-Consumer** architecture.
1. **Providers**: Handle credentials, model selection, and API configuration (OpenAI, Gemini, OpenRouter).
2. **Consumers**: Execute specific tasks (Text Generation or Autonomous Agents) using the configuration emitted by a Provider.
***
## Providers
Provider nodes normalize credentials and model settings into a reusable **LLM Provider Config**.
### OpenAI Provider
Configures access to OpenAI or OpenAI-compatible endpoints.
| Input | Type | Description |
| -------- | ------ | ----------------------------------------------- |
| `apiKey` | Secret | OpenAI API key (typically from a Secret Loader) |
| Parameter | Type | Description |
| ------------ | ------ | ------------------------------------------- |
| `model` | Select | `gpt-5.2`, `gpt-5.1`, `gpt-5`, `gpt-5-mini` |
| `apiBaseUrl` | Text | Optional override for the API base URL |
### Gemini Provider
Configures access to Google's Gemini models.
| Input | Type | Description |
| -------- | ------ | ----------------- |
| `apiKey` | Secret | Google AI API key |
| Parameter | Type | Description |
| ------------ | ------ | ------------------------------------------------------------------ |
| `model` | Select | `gemini-3-pro-preview`, `gemini-3-flash-preview`, `gemini-2.5-pro` |
| `apiBaseUrl` | Text | Optional override for the API base URL |
| `projectId` | Text | Optional Google Cloud project identifier |
### OpenRouter Provider
Configures access to multiple LLM providers through OpenRouter's unified API.
| Input | Type | Description |
| -------- | ------ | ------------------ |
| `apiKey` | Secret | OpenRouter API key |
| Parameter | Type | Description |
| ------------- | ---- | ------------------------------------------------------------------- |
| `model` | Text | Model slug (e.g., `openrouter/auto`, `anthropic/claude-3.5-sonnet`) |
| `apiBaseUrl` | Text | Optional override for the API base URL |
| `httpReferer` | Text | Application URL for OpenRouter ranking |
| `appTitle` | Text | Application title for OpenRouter ranking |
***
## Consumers
Consumer nodes perform the actual AI work. They require a **Provider Config** output from one of the providers above.
### AI Generate Text
Performs a one-shot chat completion.
| Input | Type | Description |
| ------------- | ---------- | ------------------------------------------------------- |
| `userPrompt` | Text | The primary request or data to process |
| `chatModel` | Credential | **Required.** Connect a Provider output here |
| `modelApiKey` | Secret | Optional. supersedes the API key in the Provider Config |
| Parameter | Type | Description |
| -------------- | -------- | -------------------------------------------- |
| `systemPrompt` | Textarea | Instructions that guide the model's behavior |
| `temperature` | Number | Creativity vs. determinism (0.0 to 2.0) |
| `maxTokens` | Number | Maximum tokens to generate |
| Output | Type | Description |
| -------------- | ---- | ------------------------------- |
| `responseText` | Text | The assistant's response |
| `usage` | JSON | Token consumption metadata |
| `rawResponse` | JSON | Full API response for debugging |
***
### AI SDK Agent
An autonomous agent that uses reasoning steps and tool-calling to solve complex tasks.
| Input | Type | Description |
| ------------------- | ---------- | ------------------------------------------------- |
| `userInput` | Text | The task or question for the agent |
| `chatModel` | Credential | **Required.** Connect a Provider output here |
| `conversationState` | JSON | Optional. Connect from a previous turn for memory |
| `mcpTools` | List | Optional. Connect tools from MCP Providers |
| Parameter | Type | Description |
| ------------------------- | -------- | ------------------------------------------------------------------------- |
| `systemPrompt` | Textarea | Core identity and constraints for the agent |
| `temperature` | Number | Reasoning creativity (default 0.7) |
| `stepLimit` | Number | Max "Think -> Act -> Observe" loops (1-12) |
| `memorySize` | Number | Number of previous turns to retain in context |
| `structuredOutputEnabled` | Toggle | Enable to enforce a specific JSON output structure |
| `schemaType` | Select | How to define the schema: `json-example` or `json-schema` |
| `jsonExample` | JSON | Example JSON object for schema inference (all properties become required) |
| `jsonSchema` | JSON | Full JSON Schema definition for precise validation |
| `autoFixFormat` | Toggle | Attempt to extract valid JSON from malformed responses |
| Output | Type | Description |
| ------------------- | ---- | -------------------------------------------------- |
| `responseText` | Text | Final answer after reasoning is complete |
| `structuredOutput` | JSON | Parsed structured output (when enabled) |
| `conversationState` | JSON | Updated state to pass to the next agent node |
| `reasoningTrace` | JSON | Detailed step-by-step logs of the agent's thoughts |
| `agentRunId` | Text | Unique session ID for tracking and streaming |
***
## MCP Tools (Model Context Protocol)
ShipSec Studio supports the **Model Context Protocol (MCP)**, allowing AI agents to interact with external tools over HTTP.
### MCP HTTP Tools
Exposes a set of tools from a remote HTTP server that implements the MCP contract.
| Input | Type | Description |
| ------------- | ---- | --------------------------------------------------- |
| `endpoint` | Text | The HTTP URL where the MCP server is hosted |
| `headersJson` | Text | Optional JSON of headers (e.g., Auth tokens) |
| `tools` | JSON | List of tool definitions available on that endpoint |
| Parameter | Type | Description |
| ---------- | ---- | -------------------------------------------------- |
| `endpoint` | Text | Destination URL for tool execution |
| `tools` | JSON | Array of tools with `id`, `title`, and `arguments` |
| Output | Type | Description |
| ------- | ---- | ------------------------------------------------ |
| `tools` | List | Normalized MCP tool definitions for the AI Agent |
### MCP Tool Merge
Combines multiple MCP tool lists into a single consolidated list.
| Input | Type | Description |
| ------------------ | ---- | ---------------------------------- |
| `toolsA`, `toolsB` | List | Multiple upstream MCP tool outputs |
| Parameter | Type | Description |
| --------- | ---- | -------------------------------------------- |
| `slots` | JSON | Configure additional input ports for merging |
| Output | Type | Description |
| ------- | ---- | ---------------------------------------------- |
| `tools` | List | De-duplicated list of tools ready for an agent |
***
## Use Cases
### Automated Alert Triage
**Flow:** `Provider` → `AI Generate Text`
Analyze incoming security alerts to filter out false positives.
**Prompt:** "Given this alert payload: , determine if it's a real threat or noise."
### Investigative Agent
**Flow:** `Provider` + `MCP Tool` → `AI Agent`
An agent that searches through logs and performs lookups to investigate a specific IP address.
**Task:** "Investigate the IP using the available Splunk and VirusTotal tools."
### Structured Output for Data Extraction
**Flow:** `Provider` → `AI Agent` (with Structured Output enabled)
Extract structured data from unstructured security reports. Enable **Structured Output** and provide a JSON example:
```json theme={null}
{
"severity": "high",
"affected_systems": ["web-server-01"],
"remediation_steps": ["Patch CVE-2024-1234", "Restart service"]
}
```
The agent will always return validated JSON matching this schema, ready for downstream processing.
***
## Best Practices
**The Provider Concept**: Always place a Provider node (OpenAI/Gemini/OpenRouter) at the start of your AI chain. This allows you to swap models or providers for the entire workflow by changing just one node.
### Prompt Engineering
1. **Use Structured Output**: When you need consistent JSON for downstream nodes, enable **Structured Output** instead of relying on prompt instructions. This guarantees schema compliance and eliminates parsing errors.
2. **Use System Prompts**: Set high-level rules (e.g., "You are a senior security researcher") in the System Prompt parameter instead of the User Input.
3. **Variable Injection**: Use `{{variableName}}` syntax to inject data from upstream nodes into your prompts.
### Memory & State
For multi-turn conversations, always loop the `conversationState` output of the AI Agent back into the `conversationState` input of the next agent invocation (or store it in a persistent variable).
# Core Components
Source: https://docs.shipsec.ai/components/core
Essential building blocks for workflow inputs, outputs, and data transformation
Core components handle workflow triggers, file operations, data transformation, and output destinations.
***
## Triggers
### Manual Trigger
Starts a workflow manually. Configure runtime inputs to collect data (files, text, etc.) when triggered.
| Parameter | Type | Description |
| --------------- | ---- | ----------------------------------- |
| `runtimeInputs` | JSON | Define inputs to collect at runtime |
**Supported input types:** `file`, `text`, `number`, `json`, `array`
**Example use cases:**
* Collect uploaded scope files before running security scans
* Prompt operators for target domains or API keys
***
### Webhook
Sends JSON payloads to external HTTP endpoints with retries and timeouts.
| Parameter | Type | Description |
| ----------- | ------ | -------------------------------- |
| `url` | URL | Destination endpoint |
| `method` | Select | POST, PUT, or PATCH |
| `payload` | JSON | Request body |
| `headers` | JSON | HTTP headers |
| `timeoutMs` | Number | Request timeout (default: 30000) |
| `retries` | Number | Retry attempts (default: 3) |
**Example use cases:**
* Send scan results to Slack or Teams
* POST assets to a custom API
***
## File Operations
### File Loader
Loads file content from storage for use in workflows.
| Input | Type | Description |
| -------- | ---- | -------------------------- |
| `fileId` | UUID | File ID from uploaded file |
| Output | Type | Description |
| ------------- | ------ | ------------------------------ |
| `file` | Object | File metadata + base64 content |
| `textContent` | String | Decoded UTF-8 text |
***
### Text Splitter
Splits text into an array of strings by separator.
| Parameter | Type | Description |
| ----------- | ----------- | ------------------------------- |
| `text` | String/File | Text content to split |
| `separator` | String | Split character (default: `\n`) |
| Output | Type | Description |
| ------- | ------ | --------------- |
| `items` | Array | Split strings |
| `count` | Number | Number of items |
**Example:** Split newline-delimited subdomains before passing to scanners.
***
### Text Joiner
Joins array elements into a single string.
| Parameter | Type | Description |
| ----------- | ------ | ------------------------------ |
| `items` | Array | Array of strings to join |
| `separator` | String | Join character (default: `\n`) |
| Output | Type | Description |
| ------ | ------ | ------------- |
| `text` | String | Joined string |
***
## Secrets
### Secret Loader
Fetches secrets from the ShipSec-managed secret store.
| Parameter | Type | Description |
| -------------- | ------ | -------------------- |
| `secretName` | Secret | Secret name or UUID |
| `version` | Number | Optional version pin |
| `outputFormat` | Select | `raw` or `json` |
| Output | Type | Description |
| ---------- | ------ | -------------------------------------- |
| `secret` | Any | Resolved secret value (masked in logs) |
| `metadata` | Object | Secret version info |
Secret values are automatically masked in all logs and terminal output.
***
## Data Transformation
### Array Pick
Extracts specific items from an array by index.
| Parameter | Type | Description |
| --------- | ----- | --------------- |
| `array` | Array | Source array |
| `indices` | Array | Indices to pick |
| Output | Type | Description |
| -------- | ----- | -------------- |
| `picked` | Array | Selected items |
### Array Pack
Combines multiple values into a single array.
| Parameter | Type | Description |
| --------- | ------ | -------------- |
| `values` | Any\[] | Values to pack |
| Output | Type | Description |
| ------- | ----- | ------------ |
| `array` | Array | Packed array |
### Console Log
Outputs data to workflow logs for debugging.
| Parameter | Type | Description |
| --------- | ------ | -------------- |
| `data` | Any | Data to log |
| `label` | String | Optional label |
***
## Storage Destinations
### Artifact Writer
Writes workflow artifacts to ShipSec storage.
| Parameter | Type | Description |
| ---------- | ------ | ----------------- |
| `content` | Any | Content to store |
| `filename` | String | Artifact filename |
| `mimeType` | String | Content type |
| Output | Type | Description |
| ------------ | ------ | ------------------ |
| `artifactId` | UUID | Stored artifact ID |
| `url` | String | Download URL |
### File Writer
Writes content to a file in workflow storage.
| Parameter | Type | Description |
| --------- | ------ | ------------ |
| `content` | String | File content |
| `path` | String | File path |
### Destination S3
Uploads files to an S3-compatible bucket.
| Parameter | Type | Description |
| ------------- | ------ | --------------- |
| `bucket` | String | S3 bucket name |
| `key` | String | Object key |
| `content` | Buffer | File content |
| `credentials` | Object | AWS credentials |
### AWS Credentials
Provides AWS credentials for S3 operations.
| Parameter | Type | Description |
| ----------------- | ------ | --------------------- |
| `accessKeyId` | Secret | AWS Access Key ID |
| `secretAccessKey` | Secret | AWS Secret Access Key |
| `region` | String | AWS region |
| Output | Type | Description |
| ------------- | ------ | ----------------------------------- |
| `credentials` | Object | Credential object for S3 components |
***
## Analytics
### Analytics Sink
Indexes workflow output data into OpenSearch for analytics dashboards, queries, and alerts. Connect the `results` port from upstream security scanners.
| Input | Type | Description |
| ------ | ---- | ------------------------------------------------------------------------- |
| `data` | Any | Data to index. Works best with `list` from scanner `results` ports. |
| Output | Type | Description |
| --------------- | ------- | ------------------------------------- |
| `indexed` | Boolean | Whether data was successfully indexed |
| `documentCount` | Number | Number of documents indexed |
| `indexName` | String | Name of the OpenSearch index used |
| Parameter | Type | Description |
| --------------------- | ------- | -------------------------------------------------------------------------------------------------------------------- |
| `indexSuffix` | String | Custom suffix for the index name. Defaults to slugified workflow name. |
| `assetKeyField` | Select | Field to use as asset identifier. Options: auto, asset\_key, host, domain, subdomain, url, ip, asset, target, custom |
| `customAssetKeyField` | String | Custom field name when assetKeyField is "custom" |
| `failOnError` | Boolean | When enabled, workflow stops if indexing fails. Default: false (fire-and-forget) |
**How it works:**
1. Each item in the input array becomes a separate document
2. Workflow context is added under `shipsec.*` namespace
3. Nested objects are serialized to JSON strings (prevents field explosion)
4. All documents get the same `@timestamp`
**Example use cases:**
* Index Nuclei scan results for trend analysis
* Store TruffleHog secrets for tracking over time
* Aggregate vulnerability data across workflows
See [Workflow Analytics](/development/workflow-analytics) for detailed setup and querying guide.
# Components Overview
Source: https://docs.shipsec.ai/components/overview
Drag-and-drop building blocks for security automation workflows
Components are the building blocks of ShipSec Studio workflows. Each component performs a specific task and can be connected together to create powerful automation pipelines.
## Component Categories
Triggers, file handling, data transformation, and outputs
Subdomain discovery, port scanning, DNS resolution, secret detection
Provider configurations and autonomous agents
## How Components Work
Each component has:
* **Inputs** – Data ports that accept connections from other components
* **Outputs** – Data ports that can be connected to downstream components
* **Parameters** – Configurable settings in the sidebar
Components run inside Docker containers for isolation and reliability. Workflows are orchestrated by [Temporal](https://temporal.io/) with automatic retries and resumability.
## Component Structure
```typescript theme={null}
interface ComponentDefinition {
id: string; // Unique identifier
label: string; // Display name
category: string; // Category for grouping
runner: RunnerConfig; // Execution configuration
inputSchema: ZodSchema;
outputSchema: ZodSchema