# Applications

## Overview&#x20;

An Application in Condense is a custom, code‑based unit developed in the built‑in IDE and version‑controlled through Git. Once built and published, an application becomes deployable as a Custom Transform or a Custom Connector (Input or Output) within a workspace pipeline.&#x20;

Applications help:&#x20;

* Implement domain‑specific processing or integrations when prebuilt options are insufficient.&#x20;
* Keep logic close to the data path and governed by workspace roles.&#x20;
* Maintain traceability through Git commits, image tags, and published versions.&#x20;
* Standardize development‑to‑deployment through a single, auditable workflow.&#x20;

## What You Can Do in Applications&#x20;

### Create, Develop, and Test&#x20;

* Create an Application from a connected Git repository or start from a template.&#x20;
* Edit code in the IDE (file explorer + code editor) and commit to Git.&#x20;
* Configure ENVs (environment variables) for build/runtime.&#x20;
* Optionally expose HTTP(s)/TCP servers for service testing.&#x20;
* Use Publish/Subscribe testers to validate I/O against workspace topics.&#x20;

### Build and Publish&#x20;

* Build the Application into a container image (image name + tag) with live build logs.&#x20;
* Publish the Application as:&#x20;
* Custom Transform (processing component in pipeline), or&#x20;
* Custom Connector: Input or Output (integration component listed with connectors).&#x20;

### Operate and Maintain&#x20;

* View versions (draft and published) with immutable release history.&#x20;
* Roll back by selecting an earlier published version at deployment time.&#x20;
* Delete drafts or published Applications (role‑gated; irreversible in Condense).&#x20;

## Applications Lifecycle&#x20;

Every Application follows a clear lifecycle, from creation and development to build, publish, deployment, iteration, and eventual deletion. This section outlines each stage and who can perform it.&#x20;

### 1) Creating an Application&#x20;

{% hint style="info" %}
**Who can create**: Workspace Admins, Maintainers, Developers&#x20;
{% endhint %}

Steps to follow while creating an application:&#x20;

1. Go to Applications → Create Application.&#x20;

<figure><img src="/files/DJaZJwmVf6BZXxFnfdhw" alt=""><figcaption></figcaption></figure>

2. Version Control: Connect a provider (GitHub/GitLab/Bitbucket), then select Repository and Branch.&#x20;
3. Application Info:&#x20;
4. Icon (optional)&#x20;
5. Application Name (unique within workspace)&#x20;
6. Publish as a custom: Transform, Input Connector, or Output Connector&#x20;

<figure><img src="/files/HlKSw6hS3ELt7v4fqJSE" alt=""><figcaption></figcaption></figure>

7. Expiry (draft retention period)&#x20;
8. Version (e.g., v1, v1.1.0)&#x20;
9. About (optional description)&#x20;
10. Click Develop Application to open the IDE.&#x20;

For field‑by‑field info: see Configuration Parameters → A. Creation (Step 1).&#x20;

### 2) Develop in the IDE&#x20;

{% hint style="info" %}
**Who can edit (drafts)**: Admins, Maintainers, Developers&#x20;
{% endhint %}

* Navigate/edit code via File Explorer and Code Editor.&#x20;
* Configure ENVs (build/runtime).&#x20;
* (Optional) Enable Expose HTTP(s) Server / Expose TCP Server for local testing.&#x20;
* Validate topic flow with Publish and Subscribe testers.&#x20;
* Commit and push to the connected repository.&#x20;

<figure><img src="/files/zA5TkM3qvgbkG6Ol5a9Y" alt=""><figcaption></figcaption></figure>

Capabilities and limits: see Editing an Application and IDE Structure.&#x20;

### 3) Build the Application&#x20;

{% hint style="info" %}
**Who can build:** Admins, Maintainers, Developers&#x20;
{% endhint %}

Steps to build an application:&#x20;

1. Click Build Application.&#x20;
2. Enter Docker Image Name (registry path) and Tag.&#x20;
3. Start building and monitor Build Logs; fix errors and rebuild if needed.&#x20;

<figure><img src="/files/t2pQFhqOL0rwDCNNUoAc" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/RyEE2WiUfht39EtA0xA0" alt=""><figcaption></figcaption></figure>

Guidance on naming/registries: Read [Building an Application. ](#building-an-application)

### 4) Publish the Application&#x20;

Who can publish: Admins, Maintainers&#x20;

Publish targets:&#x20;

* Custom Transform → appears in Transforms → Custom.&#x20;
* Custom Connector (Input/Output) → appears in Connectors → Custom under the respective role.&#x20;

Steps to publish the application:&#x20;

1. Click Publish Application.&#x20;
2. Confirm Publish as a custom type (Transform / Input Connector / Output Connector).&#x20;
3. Confirm Version and optional release notes.&#x20;
4. Click Publish.&#x20;

<figure><img src="/files/GWvwnSlxW68Da34Jf6TI" alt=""><figcaption></figcaption></figure>

Versioning is immutable: see [Publishing an Application. ](#publishing-an-application)

### 5) Deploy the Published Artefact (reference)&#x20;

Deployment happens outside Applications:&#x20;

* **Transforms**: pipeline editor → Add Transform → Custom → choose app/version → configure ENVs/parameters → Deploy.&#x20;
* **Connectors**: Connectors → Custom → choose app → select role (Input/Output) → configure ENVs/parameters → Deploy.&#x20;

Deployment behaviour is covered in the Transforms and Connectors docs.&#x20;

### 6) Update / Roll Back a Version&#x20;

To change logic, update code in Applications, rebuild, and publish a new version. In the deployed transform/connector, switch the Version to the new release (or choose an older one to roll back).&#x20;

Editing deployed parameters happens in the pipeline/connector UI. Editing logic requires a new publish from Applications.&#x20;

#### Edit application

<figure><img src="/files/LEwGjY9OfzN6XiTjXs4X" alt=""><figcaption></figcaption></figure>

#### Adding the new version

<figure><img src="/files/wIfCVY5K4z7sPj1htgNo" alt=""><figcaption></figcaption></figure>

Starting the development of an application involves completing all required steps to build and publish it. After publication, the application appears in the **Transforms** or **Connectors** section, and when deploying a transform or connector in a pipeline, you will be prompted to select the desired version to deploy.

<figure><img src="/files/U5JE2t4nBjRk1h8naRti" alt=""><figcaption></figcaption></figure>

### 7) Deleting an Application&#x20;

Who can delete: Admins (and Maintainers if policy allows) \
Warning: Deletion is irreversible. If a published Application is referenced by a transform/connector in a pipeline, update or remove that deployment first to avoid runtime errors.&#x20;

### Naming Rules&#x20;

* Allowed: only letters in lowercase
* Length: 3–63 characters.&#x20;
* Must be unique within the workspace.&#x20;

### Editing an Application&#x20;

Who can edit: Admins, Maintainers, Developers&#x20;

Editable (drafts):&#x20;

* Source code in the IDE&#x20;
* ENVs (environment variables)&#x20;
* Expose HTTP(s)/TCP server toggles&#x20;
* Description, icon, and version (for drafts)&#x20;
* Repository/branch (until the first build against a commit)&#x20;

Non‑editable:&#x20;

* Application ID&#x20;
* Creation timestamp&#x20;

Note: After publishing, logic changes require a new version (edit → build → publish). Deployed components can switch versions without a rebuild.&#x20;

## IDE Structure&#x20;

* File Explorer (left): navigate and manage files&#x20;
* Code Editor (center): code, linting, errors&#x20;
* ENVs panel (side): runtime configuration, secrets masked&#x20;
* Test Your Application: Publish and Subscribe testers&#x20;
* Build Application: opens image name/tag dialogue&#x20;

## Building an Application&#x20;

Who can build: Admins, Maintainers, Developers&#x20;

Steps to build an application:&#x20;

1. Build Application → enter Docker Image Name and Tag.&#x20;
2. Monitor Build Logs; on failure, review errors, fix code/ENVs/Dockerfile, and rebuild.&#x20;

{% hint style="info" %}
Notes&#x20;

* Use a fully qualified image name for external registries.&#x20;
* Some registries enforce lowercase tags; prefer lowercase alphanumerics, dots, and dashes.&#x20;
* Pass secrets via ENVs; do not bake them into the image.&#x20;
  {% endhint %}

<figure><img src="/files/feZKr0qTQxE5HrXukzWQ" alt=""><figcaption></figcaption></figure>

## Publishing an Application&#x20;

Who can publish: Admins, Maintainers&#x20;

Publish Targets&#x20;

* Custom Transform: listed under Transforms → Custom for pipeline use.&#x20;
* Custom Connector (Input/Output): listed under Connectors → Custom according to your implementation.&#x20;

Post‑publish&#x20;

* Published versions are immutable.&#x20;
* To change logic, edit → build → publish a new version.&#x20;
* Deployed components can be switched to a new version from their configuration.&#x20;

<figure><img src="/files/Movb4iBYrYcESwdRAI6X" alt=""><figcaption></figcaption></figure>

## Deleting an Application&#x20;

Who can delete: Admins (Maintainers if your policy allows)&#x20;

Warning&#x20;

* Irreversible in Condense.&#x20;
* If referenced by any deployment, update/remove those deployments first.&#x20;

<figure><img src="/files/xzpeVXE5Fj9V8ahoL636" alt=""><figcaption></figcaption></figure>

## Configuration Parameters&#x20;

A. Creation&#x20;

<table data-header-hidden><thead><tr><th width="137.2265625" align="center"></th><th width="162.7109375" align="center"></th><th width="92.6875" align="center"></th><th align="center"></th></tr></thead><tbody><tr><td align="center"><strong>Field</strong> </td><td align="center"><strong>Description</strong> </td><td align="center"><strong>Required</strong> </td><td align="center"><strong>Notes</strong> </td></tr><tr><td align="center">Application Name </td><td align="center">Unique identifier in workspace </td><td align="center">Yes </td><td align="center">3–63 chars; letters, numbers, -, _ </td></tr><tr><td align="center">Publish as a custom </td><td align="center">Publish target at release </td><td align="center">Yes </td><td align="center">Transform / Input Connector / Output Connector </td></tr><tr><td align="center">Version </td><td align="center">Human‑readable version label </td><td align="center">Yes </td><td align="center">e.g., v1, v1.1.2 </td></tr><tr><td align="center">Expiry </td><td align="center">Draft retention period </td><td align="center">Yes </td><td align="center">Draft artifacts auto‑cleaned after expiry </td></tr><tr><td align="center">About </td><td align="center">Description for operators </td><td align="center">No </td><td align="center">Shown in details and summaries </td></tr><tr><td align="center">Git Provider </td><td align="center">Authenticated provider </td><td align="center">Yes </td><td align="center">GitHub / GitLab / Bitbucket </td></tr><tr><td align="center">Repository </td><td align="center">Repository path </td><td align="center">Yes </td><td align="center">Selected from provider after auth </td></tr><tr><td align="center">Branch </td><td align="center">Source branch </td><td align="center">Yes </td><td align="center">Changeable until first build </td></tr></tbody></table>

<figure><img src="/files/CRAMwasyVNcA4ufgw4WT" alt=""><figcaption></figcaption></figure>

## B. Development (Step 2: IDE)&#x20;

<table data-header-hidden><thead><tr><th align="center" valign="middle"></th><th align="center"></th><th align="center"></th></tr></thead><tbody><tr><td align="center" valign="middle"><strong>Element</strong> </td><td align="center"><strong>Description</strong> </td><td align="center"><strong>Notes</strong> </td></tr><tr><td align="center" valign="middle">File Explorer </td><td align="center">Navigate/edit files </td><td align="center">Supports multi‑file edits </td></tr><tr><td align="center" valign="middle">Code Editor </td><td align="center">Inline linting &#x26; errors </td><td align="center">Commit to Git with message </td></tr><tr><td align="center" valign="middle">ENVs </td><td align="center">Runtime configuration </td><td align="center">Secrets supported; values masked </td></tr><tr><td align="center" valign="middle">Expose HTTP(s) </td><td align="center">Enable HTTPS endpoint </td><td align="center">App must bind to configured port </td></tr><tr><td align="center" valign="middle">Expose TCP </td><td align="center">Enable TCP endpoint </td><td align="center">For stream/socket prototyping </td></tr><tr><td align="center" valign="middle">Publish </td><td align="center">Send a test message </td><td align="center">Topic, key/value, format, partition </td></tr><tr><td align="center" valign="middle">Subscribe </td><td align="center">Fetch messages </td><td align="center">Topic, partition, offset/size presets </td></tr><tr><td align="center" valign="middle">Build Application </td><td align="center">Image name &#x26; tag </td><td align="center">Opens build modal </td></tr></tbody></table>

<figure><img src="/files/DaIm61rZxMK9Wn0fqAXZ" alt=""><figcaption></figcaption></figure>

## C. Build (Step 3)&#x20;

|     **Field**     |   **Description**   | **Required** |              **Notes**              |
| :---------------: | :-----------------: | :----------: | :---------------------------------: |
| Docker Image Name |  Registry/repo path |      Yes     |   e.g., registry/acme/vehicle-app   |
|        Tag        |      Image tag      |      Yes     |  Align with Version (e.g., v1.0.0)  |
|        Logs       | Build output stream |       —      | Downloadable; success/failure pills |

Summary Pane (left): provider, repo, branch; detected language/runtime; app name/type (Transform/Connector); version; About; configured ENVs (masked); flags for exposed servers.&#x20;

<figure><img src="/files/A4QXGqlpJvdw2llifQ2h" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/puAJID9fZrvdIzHhQV8f" alt=""><figcaption></figcaption></figure>

## D. Publish&#x20;

|      **Field**      |       **Description**      | **Required** |            **Notes**           |
| :-----------------: | :------------------------: | :----------: | :----------------------------: |
| Publish as a custom | Transform / Connector type |      Yes     | Determines catalog destination |
|       Version       |       Release version      |      Yes     |     Immutable after publish    |
|        Notes        |        Release notes       |      No      |     For operators/reviewers    |

<figure><img src="/files/NVUuEVSasU3OEDa6tnYT" alt=""><figcaption></figcaption></figure>

## Roles and Permissions (Applications)&#x20;

|       **Operation**      | **Admin** | **Maintainer** | **Developer** | **Viewer** |
| :----------------------: | :-------: | :------------: | :-----------: | :--------: |
|    Create application    |     ✅     |        ✅       |       ✅       |      ❌     |
|     Edit code / ENVs     |     ✅     |        ✅       |       ✅       |      ❌     |
|   Use Publish/Subscribe  |     ✅     |        ✅       |       ✅       |      ❌     |
|     Build application    |     ✅     |        ✅       |       ✅       |      ❌     |
|    Publish application   |     ✅     |        ✅       |       ❌       |      ❌     |
|    Delete application    |     ✅     |       ✅\*      |       ❌       |      ❌     |
|  View applications list  |     ✅     |        ✅       |       ✅       |      ✅     |
| View application details |     ✅     |        ✅       |       ✅       |      ✅     |

\* Maintainer deletion depends on your organization’s policy.&#x20;

### Role descriptions&#x20;

* Admin: Full lifecycle control and governance.&#x20;
* Maintainer: Operates lifecycle (develop/build/publish) but not workspace settings.&#x20;
* Developer: Develops and builds; cannot publish or delete.&#x20;
* Viewer: Read‑only.&#x20;

## Monitoring and Audit&#x20;

* Build Logs: full build output with success/failure indicators.&#x20;
* Runtime Logs (when deployed): stdout/stderr available via Logger/observability stack.&#x20;
* Version History: immutable publish records (version, author, timestamp).&#x20;
* Activity Log: who created, edited, built, published, or deleted the Application.&#x20;

## Best Practices&#x20;

* Single responsibility: keep each Application focused for simpler testing and review.&#x20;
* ENVs over hardcoding: configure ports, credentials, and endpoints via environment variables.&#x20;
* Stable branches: map branches to stages (dev, staging, main).&#x20;
* Tag discipline: align Version, image tag, and Git tag/commit for traceability.&#x20;
* Test early: use Publish/Subscribe testers before builds to catch schema/mapping issues.&#x20;
* Minimize image size: prefer slim base images for faster builds and deploys.&#x20;

## Common Pitfalls and How to Avoid Them&#x20;

* Published artefact not visible for deployment \
  **Cause**: Wrong publication as a custom choice. \
  **Avoidance**: Confirm the Transform vs Input/Output Connector before publishing.&#x20;
* Unreachable HTTP/TCP during testing \
  **Cause**: Server not exposed or wrong port binding. \
  **Avoidance**: Enable the correct toggle and match the port ENV in code.&#x20;
* “No messages yet” in Subscribe \
  **Cause**: Topic/partition/offset mismatch or too small a fetch window. \
  **Avoidance**: Use First/Last/Size presets and verify topic + partition.&#x20;
* Build failures due to missing dependencies \
  **Cause**: Dependencies not in project config. \
  **Avoidance**: Add to dependency file (e.g., requirements.txt) and rebuild.&#x20;
* Deleting an Application still referenced by deployments \
  **Cause**: Active transform/connector points to this Application. \
  **Avoidance**: Update or remove dependent deployments first.&#x20;

## Related Links&#x20;

* [Workspaces](/condense/condense-app-getting-started/workspaces.md)&#x20;
* [Transforms](/condense/condense-app-getting-started/transforms.md)&#x20;
* [Connectors](/condense/condense-app-getting-started/connectors.md)&#x20;
* [RBAC](/condense/condense-app-getting-started/role-based-access-control-rbac.md)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.zeliot.in/condense/condense-app-getting-started/applications.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
