> ## Documentation Index
> Fetch the complete documentation index at: https://docs.condense.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Deploy a Custom Transform

### Overview

A **Custom Transform** in Condense is a fully code-based processing component that you build in the built-in IDE, version-control through Git, and deploy into a workspace pipeline. Unlike prebuilt transforms, custom transforms let you implement domain-specific logic, advanced event processing, and cross-event correlation in any programming language supported by the Condense IDE.

Once built and published, a custom transform appears alongside prebuilt transforms in the pipeline editor and is ready to deploy.

> Custom transforms are created through **Applications** in Condense — the built-in development environment where you write, build, and publish your logic before it becomes deployable.

***

### What You Can Do with a Custom Transform

* Implement domain-specific rules, enrichment, or routing not covered by prebuilt options.
* Write logic in any programming language supported in the Condense IDE.
* Perform advanced processing, cross-event correlation, or domain-specific analytics.
* Version-control all logic through Git, with immutable published versions.
* Roll back to earlier versions at any time from the pipeline editor.

***

### Custom Transform Lifecycle

Every custom transform follows this lifecycle:

**Create → Develop → Build → Publish → Deploy → Update/Rollback → Delete**

***

### Step 1 - Create an Application

<Info>
  **Who can create:** Workspace Admins, Maintainers, Developers
</Info>

1. Go to **Applications** in your workspace → click **Create Application**.

<Frame caption="Create Application screen">
  <img src="https://mintcdn.com/zeliot/UuyQavzmmy0IizKY/images/deployacustom1.png?fit=max&auto=format&n=UuyQavzmmy0IizKY&q=85&s=45d19a1de69144df563e328980568283" alt="Deployacustom1" width="2304" height="1366" data-path="images/deployacustom1.png" />
</Frame>

2. **Version Control**: Connect a Git provider (GitHub / GitLab / Bitbucket), then select your **Repository** and **Branch**.
3. **Application Info**: Fill in the following fields:

| **Field**           | **Description**                                                            | **Required** |
| ------------------- | -------------------------------------------------------------------------- | ------------ |
| Application Name    | Unique name within the workspace (3–63 characters, lowercase letters only) | Yes          |
| Publish as a custom | Select **Transform** (not Input/Output Connector)                          | Yes          |
| Version             | Human-readable version label e.g. `v1`, `v1.1.0`                           | Yes          |
| Expiry              | Draft retention period — drafts are auto-cleaned after this                | Yes          |
| About               | Optional description shown in details and summaries                        | No           |

<Frame caption="Application Info Fields">
  <img src="https://mintcdn.com/zeliot/UuyQavzmmy0IizKY/images/deployacustom2.png?fit=max&auto=format&n=UuyQavzmmy0IizKY&q=85&s=c875e0ebf18b02478bd4dec99957bc2b" className="dark:hidden" width="2304" height="1304" data-path="images/deployacustom2.png" />

  <img src="https://mintcdn.com/zeliot/UuyQavzmmy0IizKY/images/deployacustom2-1.png?fit=max&auto=format&n=UuyQavzmmy0IizKY&q=85&s=378b683d33aa6122f910f2efc3b119a0" className="hidden dark:block" width="2304" height="1304" data-path="images/deployacustom2-1.png" />
</Frame>

4. Click **Develop Application** to open the IDE.

***

### Step 2 - Develop in the IDE

<Info>
  **Who can edit drafts:** Admins, Maintainers, Developers
</Info>

The IDE has the following structure:

| Element              | Description                                              |
| -------------------- | -------------------------------------------------------- |
| File Explorer (left) | Navigate and manage your project files                   |
| Code Editor (center) | Write code with inline linting and error highlighting    |
| ENVs panel (side)    | Set runtime configuration — secrets are masked           |
| Publish tester       | Send a test message to a workspace topic                 |
| Subscribe tester     | Fetch messages from a workspace topic to validate output |
| Build Application    | Opens the image name and tag dialog                      |

**In the IDE, you can:**

* Navigate and edit code via File Explorer and Code Editor.
* Configure ENVs (environment variables) for build/runtime.
* Optionally enable **Expose HTTP(s) Server** or **Expose TCP Server** for local testing.
* Validate topic flow with **Publish** and **Subscribe** testers.
* Commit and push to the connected Git repository.

<Frame caption="IDE screen">
  <img src="https://mintcdn.com/zeliot/UuyQavzmmy0IizKY/images/deployacustom3.png?fit=max&auto=format&n=UuyQavzmmy0IizKY&q=85&s=930646ede55f4672289901d800b41dd9" className="dark:hidden" width="2304" height="1373" data-path="images/deployacustom3.png" />

  <img src="https://mintcdn.com/zeliot/UuyQavzmmy0IizKY/images/deployacustom3-1.png?fit=max&auto=format&n=UuyQavzmmy0IizKY&q=85&s=24f80304b68a02e04ad90a129e945b13" className="hidden dark:block" width="2304" height="1373" data-path="images/deployacustom3-1.png" />
</Frame>

**Best practice:** Use Publish/Subscribe testers before building to catch schema or mapping issues early.

***

### Step 3 - Build the Application

**Who can build:** Admins, Maintainers, Developers

1. Click **Build Application**.
2. Enter the **Docker Image Name** (registry path, e.g. `registry/acme/my-transform`) and **Tag** (e.g. `v1.0.0`).
3. Click **Start Build** and monitor the **Build Logs** in real time.
4. If the build fails, review the error output, fix code/ENVs/Dockerfile, and rebuild.

<Frame caption="Build Application Dialog Box">
  <img src="https://mintcdn.com/zeliot/UuyQavzmmy0IizKY/images/deployacustom4.png?fit=max&auto=format&n=UuyQavzmmy0IizKY&q=85&s=5064fd61a77c0d1b516827930feaf827" className="dark:hidden" width="2304" height="1315" data-path="images/deployacustom4.png" />

  <img src="https://mintcdn.com/zeliot/UuyQavzmmy0IizKY/images/deployacustom4-1.png?fit=max&auto=format&n=UuyQavzmmy0IizKY&q=85&s=87211c004b7eb87357a0692a6621f7da" className="hidden dark:block" width="2304" height="1315" data-path="images/deployacustom4-1.png" />
</Frame>

<Frame caption="Build Logs Screen">
  <img src="https://mintcdn.com/zeliot/VG5Na1pI_q3FWZV0/images/deployacustom5.png?fit=max&auto=format&n=VG5Na1pI_q3FWZV0&q=85&s=e68b0d221bb2c31ad6b9684c0bce4d8b" className="dark:hidden" width="2304" height="1291" data-path="images/deployacustom5.png" />

  <img src="https://mintcdn.com/zeliot/VG5Na1pI_q3FWZV0/images/deployacustom5-1.png?fit=max&auto=format&n=VG5Na1pI_q3FWZV0&q=85&s=50b719863c0a890794308c4108da3caa" className="hidden dark:block" width="2304" height="1291" data-path="images/deployacustom5-1.png" />
</Frame>

<Info>
  **Build tips:**

  * Use a fully qualified image name for external registries.
  * Some registries enforce lowercase tags - prefer lowercase alphanumerics, dots, and dashes.
  * Pass secrets via ENVs; do not bake them into the image.
</Info>

***

### Step 4 - Publish the Application

<Info>
  **Who can publish:** Admins, Maintainers
</Info>

1. Click **Publish Application**.
2. Confirm **Publish as a custom**: select **Transform**.
3. Confirm the **Version** and add optional release notes.
4. Click **Publish**.

<Frame caption="Publish Application Screen">
  <img src="https://mintcdn.com/zeliot/VG5Na1pI_q3FWZV0/images/deployacustom6.png?fit=max&auto=format&n=VG5Na1pI_q3FWZV0&q=85&s=3cab67e64a7871db8313cfc89fad7d78" className="dark:hidden" width="2048" height="1214" data-path="images/deployacustom6.png" />

  <img src="https://mintcdn.com/zeliot/VG5Na1pI_q3FWZV0/images/deployacustom6-1.png?fit=max&auto=format&n=VG5Na1pI_q3FWZV0&q=85&s=edf0bad559cf5aafcef389de300fbe40" className="hidden dark:block" width="2048" height="1214" data-path="images/deployacustom6-1.png" />
</Frame>

Once published, the custom transform appears in the **Transforms → Custom** section of the pipeline editor and is ready to deploy.

<Warning>
  Published versions are **immutable**. To change logic, you must edit the code, rebuild, and publish a new version.
</Warning>

***

### Step 5 - Deploy to the Pipeline

<Info>
  **Who can deploy:** Workspace Admins, Maintainers
</Info>

1. Go to the **workspace pipeline editor**.

<Frame caption="Pipeline Editor">
  <img src="https://mintcdn.com/zeliot/O3L1urh73rgWajmx/images/deployacustom7.png?fit=max&auto=format&n=O3L1urh73rgWajmx&q=85&s=4b6bf138de5bd8747c49f8db7fc9b8bd" className="dark:hidden" width="2304" height="1302" data-path="images/deployacustom7.png" />

  <img src="https://mintcdn.com/zeliot/O3L1urh73rgWajmx/images/deployacustom7-1.png?fit=max&auto=format&n=O3L1urh73rgWajmx&q=85&s=c05cfc3e82f519fb54f6b081b3548e2a" className="hidden dark:block" width="2304" height="1302" data-path="images/deployacustom7-1.png" />
</Frame>

2. Click **Add Transform**.
3. Select **Custom** category → choose your published application and version.
4. Configure ENVs and parameters.

<Frame caption="Configure Transform">
  <img src="https://mintcdn.com/zeliot/O3L1urh73rgWajmx/images/deployacustom8.png?fit=max&auto=format&n=O3L1urh73rgWajmx&q=85&s=04bb2dadbe47ac4f7698b6282782dd29" className="dark:hidden" width="2304" height="1298" data-path="images/deployacustom8.png" />

  <img src="https://mintcdn.com/zeliot/sUGduUMS1INd2aG1/images/gitbook/image.png?fit=max&auto=format&n=sUGduUMS1INd2aG1&q=85&s=23c3693fcf10d2cc28f776abe0cdb444" className="hidden dark:block" width="768" height="458" data-path="images/gitbook/image.png" />
</Frame>

5. Click **Save and Deploy**.

<Frame caption="Deployed Transform">
  <img src="https://mintcdn.com/zeliot/O3L1urh73rgWajmx/images/deployacustom9.png?fit=max&auto=format&n=O3L1urh73rgWajmx&q=85&s=9b68591362bdd94d99863f73d9a5c280" className="dark:hidden" width="2304" height="1297" data-path="images/deployacustom9.png" />

  <img src="https://mintcdn.com/zeliot/O3L1urh73rgWajmx/images/deployacustom9-1.png?fit=max&auto=format&n=O3L1urh73rgWajmx&q=85&s=b8295a47b2a9f440ec9ee3775db5762c" className="hidden dark:block" width="2304" height="1297" data-path="images/deployacustom9-1.png" />
</Frame>

***

### Step 6 - Update or Roll Back a Version

To update the logic of a deployed custom transform:

1. Go to **Applications** in the workspace.
2. Edit the application code in the IDE.
3. Rebuild and publish a **new version**.
4. In the pipeline editor, select the deployed transform block → click **Edit** → switch the **Version** to the new release.

<Frame caption="Edit Deployed Transform">
  <img src="https://mintcdn.com/zeliot/8s_0vTdRVusnek1w/images/deployacustom10.png?fit=max&auto=format&n=8s_0vTdRVusnek1w&q=85&s=0fa63f9432dbadc7de5602216de29640" className="dark:hidden" width="2304" height="1303" data-path="images/deployacustom10.png" />

  <img src="https://mintcdn.com/zeliot/8s_0vTdRVusnek1w/images/deployacustom10-1.png?fit=max&auto=format&n=8s_0vTdRVusnek1w&q=85&s=ef02711a45574f66a3000170593dcbf4" className="hidden dark:block" width="2304" height="1303" data-path="images/deployacustom10-1.png" />
</Frame>

To **roll back**, simply select an older published version from the Version dropdown - no rebuild is needed.

<Frame caption="Adding a New Version">
  <img src="https://mintcdn.com/zeliot/8s_0vTdRVusnek1w/images/deployacustom11.png?fit=max&auto=format&n=8s_0vTdRVusnek1w&q=85&s=0e53260f992c57b429de7c351cf5af3b" className="dark:hidden" width="2304" height="1302" data-path="images/deployacustom11.png" />

  <img src="https://mintcdn.com/zeliot/8s_0vTdRVusnek1w/images/deployacustom11-1.png?fit=max&auto=format&n=8s_0vTdRVusnek1w&q=85&s=cdac00980b3ab248a7b42f06f3674586" className="hidden dark:block" width="2304" height="1302" data-path="images/deployacustom11-1.png" />
</Frame>

***

### Roles and Permissions

| **Operation**                  | Admin | Maintainer | Developer | Viewer |
| ------------------------------ | :---: | :--------: | :-------: | :----: |
| Create Application             | **✓** |    **✓**   |   **✓**   |  **✕** |
| Edit code / ENVs               | **✓** |    **✓**   |   **✓**   |  **✕** |
| Build application              | **✓** |    **✓**   |   **✓**   |  **✕** |
| Publish application            | **✓** |    **✓**   |   **✕**   |  **✕** |
| Deploy transform to pipeline   | **✓** |    **✓**   |   **✕**   |  **✕** |
| Edit deployed transform config | **✓** |    **✓**   |   **✓**   |  **✕** |
| Delete transform / application | **✓** |    **✓**   |   **✕**   |  **✕** |
| View transform list / config   | **✓** |    **✓**   |   **✓**   |  **✓** |
| Access transform logs          | **✓** |    **✓**   |   **✓**   |  **✓** |

***

### Monitoring and Audit

In the pipeline view, click on a deployed transform block to open its detail page. Here you can view:

* **Status** (active, error)
* **Execution metrics** (throughput, processing latency, error rate)
* **Resource utilization** metrics
* **Version history** for each transform
* **Activity logs** for creation, modification, and deletion events
* **Runtime logs** (stdout/stderr) via the Logger/observability stack

<Frame>
  <img src="https://mintcdn.com/zeliot/8s_0vTdRVusnek1w/images/deployacustom12.png?fit=max&auto=format&n=8s_0vTdRVusnek1w&q=85&s=d89a9fe10b76a4b84c546f660348f7ab" alt="Deployacustom12" width="2304" height="1304" data-path="images/deployacustom12.png" />
</Frame>

***

### Best Practices

* Keep each application focused on a **single responsibility** for simpler testing and review.
* Use **ENVs** over hardcoding - configure ports, credentials, and endpoints via environment variables.
* Map Git branches to deployment stages: `dev`, `staging`, `main`.
* Align Version labels, image tags, and Git tags/commits for full traceability.
* Always **test using Publish/Subscribe** testers before building.
* Keep custom transform logic **modular and version-controlled** in Git.
* Regularly review **transform performance metrics** to detect bottlenecks early.

***

### Common Pitfalls

| **Problem**                                  | Cause                                            | How to Avoid                                                                |
| -------------------------------------------- | ------------------------------------------------ | --------------------------------------------------------------------------- |
| Published transform not visible in pipeline  | Wrong publication type selected                  | Always confirm **Transform** (not Input/Output Connector) before publishing |
| Unreachable HTTP/TCP during testing          | Server not exposed or wrong port binding         | Enable the correct toggle and match the port ENV in code                    |
| "No messages yet" in Subscribe               | Topic/partition/offset mismatch                  | Use First/Last/Size presets and verify topic and partition                  |
| Build failures due to missing dependencies   | Dependencies not in project config               | Add to dependency file (e.g. `requirements.txt`) and rebuild                |
| Runtime errors after deleting an application | Active pipeline still references the application | Update or remove dependent pipeline deployments first                       |

***
