<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.2.2">Jekyll</generator><link href="https://che.eclipseprojects.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://che.eclipseprojects.io/" rel="alternate" type="text/html" /><updated>2026-07-22T13:21:04+00:00</updated><id>https://che.eclipseprojects.io/feed.xml</id><title type="html">Eclipse Che Blog</title><subtitle>Eclipse Che runs IDEs in Kubernetes.</subtitle><entry><title type="html">Beyond Human IDEs: Running Agentic Cloud Development Environments in Eclipse Che</title><link href="https://che.eclipseprojects.io/2026/07/22/@rohan.kumar-beyond-human-ides-running-agentic-workspaces.html" rel="alternate" type="text/html" title="Beyond Human IDEs: Running Agentic Cloud Development Environments in Eclipse Che" /><published>2026-07-22T00:00:00+00:00</published><updated>2026-07-22T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2026/07/22/@rohan.kumar/beyond-human-ides-running-agentic-workspaces</id><content type="html" xml:base="https://che.eclipseprojects.io/2026/07/22/@rohan.kumar-beyond-human-ides-running-agentic-workspaces.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>AI coding agents have shifted from autocomplete helpers to autonomous teammates that can edit code, run tests, and open pull requests. Today, they often run in the same environments developers already use every day: a local machine or a full IDE cloud workspace.</p>
</div>
<div class="paragraph">
<p>What if, for routine, well-defined tasks, those agents could run in their own lightweight, isolated environments instead, so you could stay focused on creative problem-solving and review what the agents produce?</p>
</div>
<div class="paragraph">
<p>One way to do that is with Agentic Workspaces on Eclipse Che. Che&#8217;s Cloud Development Environments (CDEs) let you spin up terminal-centric workspaces dedicated to autonomous agents: safer agentic automation in isolated sandboxes, with the human in the review loop, either inspecting a diff in the workspace or reviewing a pull request the agent creates.</p>
</div>
<div class="paragraph">
<p>Here is the end result this post walks through: Claude Code and OpenCode running side by side in an Eclipse Che workspace with the Herdr editor definition.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/beyond-human-ides-running-agentic-workspaces/herdr-agents-running.png" alt="Herdr workspace showing Claude Code idle as generator and OpenCode working as reviewer on a GitHub Actions workflow inside Eclipse Che.">
</div>
<div class="title">Figure 1. End result: Claude Code (generator) and OpenCode (reviewer) agents running in an Eclipse Che workspace with the Herdr editor definition.</div>
</div>
<div class="paragraph">
<p>&nbsp;</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_traditional-cdes-vs-agentic-cdes">Traditional CDEs vs Agentic CDEs</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Traditional CDEs are built around a full IDE experience for humans. In this post, we use <strong>Agentic CDE</strong> to describe a terminal-centric Che workspace built for terminal-based coding agents rather than human IDE use. Agentic CDEs keep the same isolation and lifecycle model, but slim the workspace down to the minimal tooling an agent needs. One does not replace the other; each is built for different use cases.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 40%;">
<col style="width: 40%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Capability</th>
<th class="tableblock halign-left valign-top">Traditional CDEs</th>
<th class="tableblock halign-left valign-top">Agentic CDEs</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Primary user</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Human developers working interactively in an IDE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Autonomous agents executing tasks, with humans in the review loop</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Workspace shape</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Full IDE (for example, VS Code) plus extensions, UI, and layouts</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Slim terminal-centric runtime with terminal-based coding agents and a web terminal such as <code>ttyd</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Resource footprint</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Higher CPU and memory to host a browser IDE and rich UI</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Lower overhead; more workspaces can fit on the same cluster</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Day-to-day interaction</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Developer lives in the editor: coding, debugging, and exploring</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Developer assigns work, monitors progress, and reviews diffs or pull requests</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Best suited for</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Interactive development, pairing, and complex local-style workflows in the cloud</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Routine or parallel agent tasks that do not need a full graphical IDE</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Strengths</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Familiar IDE UX, rich debugging, and strong human productivity tooling</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">High density, lower cost per workspace, and a tighter sandbox for unattended agent runs</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Trade-offs</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Heavier and often more than an agent needs for CLI-driven work</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Less convenient for deep interactive editing; humans review rather than live in the workspace</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="sect1">
<h2 id="_the-human-in-the-review-loop-workflow">The Human-in-the-Review-Loop Workflow</h2>
<div class="sectionbody">
<div class="paragraph">
<p>An agentic workspace flips the usual CDE interaction model. The developer is no longer living inside the IDE day to day; they are the orchestrator and reviewer.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>Assign a task:</strong> the human starts a Che workspace and points an agent at a bug, feature, or specification.</p>
</li>
<li>
<p><strong>Let the agent work:</strong> the agent edits code, runs tests, and iterates inside the isolated workspace, observed through <code>ttyd</code> if needed.</p>
</li>
<li>
<p><strong>Review the outcome:</strong> when the agent finishes, the human either inspects the diff in that workspace or, more commonly for team workflows, reviews a pull request the agent created.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>That last step is the control point. The agent does the execution; the human decides what merges.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/beyond-human-ides-running-agentic-workspaces/review-loop.png" alt="Review-loop flow showing a human assigning tasks to an agentic workspace in Eclipse Che on Kubernetes, producing a diff or PR for human review, with API calls to on-prem or cloud-hosted models.">
</div>
<div class="title">Figure 2. Review-loop flow: the human assigns a task, the agent works inside an Eclipse Che workspace, and the human reviews a diff or pull request. The agent can call on-prem or cloud-hosted models.</div>
</div>
<div class="paragraph">
<p>&nbsp;</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_the-stack-eclipse-che-and-ttyd">The Stack: Eclipse Che and ttyd</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In this post, we show one practical stack: Eclipse Che for the workspace lifecycle, plus <code>ttyd</code> for a lightweight browser terminal. The idea is to strip away the traditional desktop IDE layer and keep a minimal, terminal-centric environment.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 66.6667%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Component</th>
<th class="tableblock halign-left valign-top">Role in the Agentic Workspace</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://eclipse.dev/che/">Eclipse Che</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The Kubernetes-native control plane. It handles workspace lifecycle, secure container isolation, RBAC, and compute resource allocation.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://github.com/tsl0922/ttyd">ttyd</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A simple, fast utility that shares a Linux terminal over the web, allowing users to monitor their agents in real-time through any browser.</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Together, they create a secure sandbox where AI agents can run without overloading a developer&#8217;s local machine or cluttering their primary workspace. You get a browser-accessible shell backed by Kubernetes isolation, with no full IDE required.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_step-by-step-running-an-agentic-cde-in-eclipse-che">Step-by-Step: Running an Agentic CDE in Eclipse Che</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Here is a simple way to start an agentic workspace from the Eclipse Che dashboard.</p>
</div>
<div class="paragraph">
<p><strong>Prerequisites:</strong></p>
</div>
<div class="ulist">
<ul>
<li>
<p>Access to an Eclipse Che instance (for example, a local or team deployment)</p>
</li>
<li>
<p>Credentials for an LLM provider your coding agent can use (on-prem or cloud-hosted)</p>
</li>
<li>
<p>A Git repository URL to import in the <strong>Import from Git</strong> section</p>
</li>
<li>
<p>Optional: Git credentials configured in Eclipse Che so the agent can push branches and open pull requests on your Git provider automatically</p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="_1-go-to-the-eclipse-che-dashboard">1. Go to the Eclipse Che Dashboard</h3>
<div class="paragraph">
<p>Open your Che dashboard in the browser and begin creating a new workspace.</p>
</div>
</div>
<div class="sect2">
<h3 id="_2-choose-an-editor-definition">2. Choose an Editor Definition</h3>
<div class="paragraph">
<p>Open the <strong>Choose an Editor</strong> tree and select a lightweight, terminal-centric editor definition instead of a full IDE. For an agentic CDE, pick either:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://github.com/tsl0922/ttyd">Web Terminal</a>: a minimal <code>ttyd</code>-based shell in the browser</p>
</li>
<li>
<p><a href="https://herdr.dev/">Herdr</a>: an agent-aware terminal multiplexer on top of the same web-terminal model</p>
</li>
</ul>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/beyond-human-ides-running-agentic-workspaces/editor-selector.png" alt="Eclipse Che Editor Selector with red circles around Herdr and Web Terminal editor definitions.">
</div>
<div class="title">Figure 3. Eclipse Che Editor Selector, with Herdr and Web Terminal highlighted as lightweight, terminal-centric editor definitions alongside full IDEs.</div>
</div>
<div class="paragraph">
<p>&nbsp;</p>
</div>
</div>
<div class="sect2">
<h3 id="_3-provide-a-git-repository-url-and-create-the-workspace">3. Provide a Git Repository URL and Create the Workspace</h3>
<div class="paragraph">
<p>In the <strong>Import from Git</strong> section, paste the Git repository URL for the project you want the agent to work on. Then select <strong>Create &amp; Open</strong> to start the workspace.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/beyond-human-ides-running-agentic-workspaces/import-from-git.png" alt="Eclipse Che Import from Git section with the Create and Open button highlighted.">
</div>
<div class="title">Figure 4. Import from Git: enter a repository URL, then select Create &amp; Open.</div>
</div>
<div class="paragraph">
<p>&nbsp;</p>
</div>
</div>
<div class="sect2">
<h3 id="_4-wait-for-the-workspace-to-become-ready-then-launch-a-coding-agent">4. Wait for the Workspace to Become Ready, Then Launch a Coding Agent</h3>
<div class="paragraph">
<p>Wait for the workspace to become ready. Once it is ready, Che opens the <code>ttyd</code>-based terminal in the browser. From there, launch your preferred terminal-based coding agent (for example, <code>claude-code</code> or <code>opencode</code>), point it at a task or specification, and let it work inside the isolated workspace.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="paragraph">
<p>Terminal-based coding agents (such as Claude Code or OpenCode) must already be present in the DevWorkspace container image, or installed or otherwise injected into the workspace before you use them. One simple option is a Devfile <code>exec</code> command. See <a href="https://github.com/eclipse-che/che-server/blob/main/devfile.yaml#L93-L97">che-server Devfile</a> as an example that installs the Claude Code CLI.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
Coding agents also need authentication configured for the models they call. That step varies by tool and model provider (for example API keys, login flows, or on-prem endpoint settings).
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>When the agent finishes, stay in the review loop: inspect the diff in the workspace, or let the agent open a pull request and review that through your normal Git workflow.</p>
</div>
<div class="paragraph">
<p>Here is an example of Claude Code and OpenCode running in a workspace with the Herdr editor definition. Herdr shows each agent in the sidebar (idle or working) while the active pane streams the agent&#8217;s tools and output.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/beyond-human-ides-running-agentic-workspaces/herdr-agents-running.png" alt="Herdr workspace showing Claude Code idle and OpenCode working on Dockerfile tests inside Eclipse Che.">
</div>
<div class="title">Figure 5. Claude Code and OpenCode agents running in an Eclipse Che workspace with the Herdr editor definition.</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
If you chose Herdr, you can split panes and run multiple agents in parallel, while Herdr tracks whether each one is idle, working, or blocked. The platform underneath matters more: with Che, each agent still gets its own sandboxed, Kubernetes-native workspace.
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_how-agentic-cdes-help-teams">How Agentic CDEs help Teams</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Agentic CDEs keep each coding agent in its own Kubernetes-isolated workspace, instead of sharing a developer laptop or a long-lived VM. Using Che for ttyd-driven agent workspaces can build on that foundation in a few practical ways:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Contained sandbox execution:</strong> Giving autonomous tools raw access to a local machine is a significant security and operational risk. With Eclipse Che, you can confine the agent to a secure, RBAC-bounded Kubernetes namespace. If an agent misbehaves or runs a destructive script, the blast radius stays contained within that workspace.</p>
</li>
<li>
<p><strong>Higher workspace density:</strong> Without the overhead of complex browser-based IDE UIs, terminal-centric workspaces typically require less CPU and memory, so teams can run more agent workspaces on the same cluster.</p>
</li>
<li>
<p><strong>Parallel asynchronous scaling:</strong> A developer can spin up multiple independent agent workspaces simultaneously from their browser, each tackling a different task or bug report, without consuming local compute.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_try-it-yourself">Try It Yourself</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If you do not have a Che instance handy, you can try this workflow on <a href="https://eclipse.dev/che/docs/stable/hosted-che/hosted-che/">Eclipse Che hosted by Red Hat</a> through the <a href="https://developers.redhat.com/developer-sandbox">Developer Sandbox</a>. Open <a href="https://workspaces.openshift.com/">workspaces.openshift.com</a>, choose a terminal-centric editor definition, and import a Git repository as described above.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Software engineering is evolving, and so are CDEs along with it. They are no longer only digital desktops for human developers; they can also host safer agentic automation in isolated workspaces.</p>
</div>
<div class="paragraph">
<p>With Eclipse Che&#8217;s Kubernetes-native orchestration and lightweight tools like <code>ttyd</code>, you can try this pattern today: spin up a terminal-centric workspace, run a coding agent inside it, and keep humans in the review loop through diffs or pull requests.</p>
</div>
</div>
</div>]]></content><author><name>Rohan Kumar</name></author><summary type="html"><![CDATA[How to run safer agentic automation in isolated workspaces with Eclipse Che: lightweight, ttyd-based Agentic Workspaces on Kubernetes.]]></summary></entry><entry><title type="html">Using Keycloak as an External Identity Provider for Eclipse Che on OpenShift</title><link href="https://che.eclipseprojects.io/2026/04/20/@tolusha-openshift-external-idp.html" rel="alternate" type="text/html" title="Using Keycloak as an External Identity Provider for Eclipse Che on OpenShift" /><published>2026-04-20T00:00:00+00:00</published><updated>2026-04-20T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2026/04/20/@tolusha/openshift-external-idp</id><content type="html" xml:base="https://che.eclipseprojects.io/2026/04/20/@tolusha-openshift-external-idp.html"><![CDATA[<div class="paragraph">
<p>Starting with OpenShift 4.20, administrators can configure
<a href="https://docs.redhat.com/en/documentation/openshift_container_platform/4.20/html/authentication_and_authorization/external-auth">external OIDC identity providers</a>
for direct authentication to bypass the built-in OAuth server and use the
external identity provider directly.
This enables direct integration with an external OIDC provider,
allowing you to use its advanced capabilities beyond the built-in OAuth server.</p>
</div>
<div class="paragraph">
<p>Eclipse Che now fully supports this setup: you can deploy Che on an OpenShift cluster
that authenticates users through an external Keycloak instance, for example.
In this post, we walk through the end-to-end configuration.</p>
</div>
<div class="sect1">
<h2 id="_step-by-step-configuration">Step-by-Step Configuration</h2>
<div class="sectionbody">
<div class="ulist">
<div class="title">Prerequisites:</div>
<ul>
<li>
<p>Keycloak is deployed and configured as an external identity provider for OpenShift.</p>
</li>
<li>
<p>You have cluster administrator access.</p>
</li>
<li>
<p>You have <code>oc</code> CLI installed and authenticated.</p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="_1-create-the-eclipse-che-client-in-keycloak">1. Create the Eclipse Che Client in Keycloak</h3>
<div class="paragraph">
<p>In the Keycloak Admin Console, create a new client for Eclipse Che:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Navigate to your OpenShift realm and select <strong>Clients</strong>.</p>
</li>
<li>
<p>Click <strong>Create client</strong>.</p>
</li>
<li>
<p>Set the <strong>Client ID</strong> to <code>eclipse-che</code>.</p>
</li>
<li>
<p>On the <strong>Capability config</strong> page, toggle <strong>Client authentication</strong> to <strong>On</strong>.</p>
</li>
<li>
<p>Save the client and copy the <strong>Client secret</strong> from the <strong>Credentials</strong> tab.</p>
</li>
</ol>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
You configure the redirect URI after deploying Eclipse Che (Step 7).
</td>
</tr>
</table>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openshift-external-idp/eclipse-che-client.png" alt="Creating the eclipse-che client in Keycloak Admin Console">
</div>
</div>
</div>
<div class="sect2">
<h3 id="_2-register-the-client-as-an-audience">2. Register the Client as an Audience</h3>
<div class="paragraph">
<p>Add the <code>eclipse-che</code> client to the audiences list in the OpenShift authentication configuration:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="shell">oc patch authentication.config/cluster <span style="color: #ae81ff">\</span>
  <span style="color: #f92672">--type</span><span style="color: #f92672;font-weight: bold">=</span><span style="color: #e6db74">'json'</span> <span style="color: #ae81ff">\</span>
  <span style="color: #f92672">-p</span><span style="color: #f92672;font-weight: bold">=</span><span style="color: #e6db74">'[
    {
      "op": "add",
      "path": "/spec/oidcProviders/0/issuer/audiences/-",
      "value": "eclipse-che"
    }
  ]'</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Then wait for the <code>kube-apiserver</code> to roll out the changes:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="shell">watch oc get co kube-apiserver</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_3-create-the-eclipse-che-namespace">3. Create the <code>eclipse-che</code> Namespace</h3>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="shell">oc create namespace eclipse-che</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_4-create-the-oauth-secret">4. Create the OAuth Secret</h3>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="yaml"><span style="color: #e6db74">oc apply -f - &lt;&lt;EOF</span>
<span style="color: #a6e22e">apiVersion</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">v1</span>
<span style="color: #a6e22e">kind</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">Secret</span>
<span style="color: #a6e22e">metadata</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">oauth-secret</span>
  <span style="color: #a6e22e">namespace</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">eclipse-che</span>
  <span style="color: #a6e22e">labels</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
    <span style="color: #a6e22e">app.kubernetes.io/part-of</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">che.eclipse.org</span>
<span style="color: #a6e22e">stringData</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">oAuthSecret</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74"><em>&lt;CLIENT_SECRET&gt;</em></span>
<span style="color: #e6db74">EOF</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Replace &lt;CLIENT_SECRET&gt; with the value copied from the Keycloak Credentials tab.</p>
</div>
</div>
<div class="sect2">
<h3 id="_5-import-the-keycloak-ca-certificate">5. Import the Keycloak CA Certificate</h3>
<div class="paragraph">
<p>Create a ConfigMap containing the Keycloak server&#8217;s CA certificate,
so that Eclipse Che can trust the Keycloak endpoint.</p>
</div>
<div class="paragraph">
<p>Extract the CA certificate from the Keycloak server:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="shell">openssl s_client <span style="color: #ae81ff">\</span>
  <span style="color: #f92672">-connect</span> <span style="color: #e6db74">"</span><span style="color: #e6db74">$(</span><span style="color: #f8f8f2">echo</span> <span style="color: #e6db74">"</span><span style="color: #f8f8f2">$KEYCLOAK_URL</span><span style="color: #e6db74">"</span> | <span style="color: #f8f8f2">sed</span> <span style="color: #e6db74">'s|https://||'</span><span style="color: #e6db74">)</span><span style="color: #e6db74">:443"</span> <span style="color: #ae81ff">\</span>
  <span style="color: #f92672">-showcerts</span> &lt; /dev/null <span style="color: #ae81ff">\</span>
  | <span style="color: #f8f8f2">sed</span> <span style="color: #f92672">-n</span> <span style="color: #e6db74">'/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p'</span> <span style="color: #ae81ff">\</span>
  <span style="color: #f92672;font-weight: bold">&gt;</span> keycloak-ca.crt</code></pre>
</div>
</div>
<div class="paragraph">
<p>Create a ConfigMap from the extracted certificate:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="shell">oc create configmap keycloak-certs <span style="color: #ae81ff">\</span>
  <span style="color: #f92672">--from-file</span><span style="color: #f92672;font-weight: bold">=</span>keycloak-ca.crt<span style="color: #f92672;font-weight: bold">=</span>keycloak-ca.crt <span style="color: #ae81ff">\</span>
  <span style="color: #f92672">-n</span> eclipse-che</code></pre>
</div>
</div>
<div class="paragraph">
<p>Label the ConfigMap so that Eclipse Che recognizes it as a trusted CA bundle:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="shell">oc label configmap keycloak-certs <span style="color: #ae81ff">\</span>
  app.kubernetes.io/part-of<span style="color: #f92672;font-weight: bold">=</span>che.eclipse.org <span style="color: #ae81ff">\</span>
  app.kubernetes.io/component<span style="color: #f92672;font-weight: bold">=</span>ca-bundle <span style="color: #ae81ff">\</span>
  <span style="color: #f92672">-n</span> eclipse-che</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_6-prepare-the-checluster-configuration">6. Prepare the CheCluster Configuration</h3>
<div class="paragraph">
<p>Create a patch file that configures Che to use Keycloak for authentication.
Replace <code>&lt;KEYCLOAK_URL&gt;</code> with the actual Keycloak URL,
<code>&lt;OPENSHIFT_REALM&gt;</code> with the Keycloak realm configured for OpenShift authentication,
and the claim and prefix values with those configured in the <code>authentication.config/cluster</code> resource:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="shell"><span style="color: #f8f8f2">cat</span> <span style="color: #f92672;font-weight: bold">&gt;</span> che-patch.yaml <span style="color: #f92672;font-weight: bold">&lt;&lt;</span> <span style="color: #66d9ef">EOF</span><span style="color: #e6db74">
kind: CheCluster
apiVersion: org.eclipse.che/v2
spec:
  networking:
    auth:
      oAuthClientName: eclipse-che
      oAuthSecret: oauth-secret
      identityProviderURL: "<em>&lt;KEYCLOAK_URL&gt;</em>/realms/&lt;OPENSHIFT_REALM&gt;"
      gateway:
        oAuthProxy:
          cookieExpireSeconds: 300
        deployment:
          containers:
            - name: oauth-proxy
              env:
                - name: OAUTH2_PROXY_CODE_CHALLENGE_METHOD
                  value: S256
                - name: OAUTH2_PROXY_BACKEND_LOGOUT_URL
                  value: "<em>&lt;KEYCLOAK_URL&gt;</em>/realms/<em>&lt;OPENSHIFT_REALM&gt;</em>/protocol/openid-connect/logout?id_token_hint={id_token}"
  components:
    cheServer:
      extraProperties:
        CHE_OIDC_GROUPS__CLAIM: '<em>&lt;GROUPS_CLAIM&gt;</em>'
        CHE_OIDC_GROUPS__PREFIX: '<em>&lt;GROUPS_PREFIX&gt;</em>'
        CHE_OIDC_USERNAME__CLAIM: '<em>&lt;USERNAME_CLAIM&gt;</em>'
        CHE_OIDC_USERNAME__PREFIX: '<em>&lt;USERNAME_PREFIX&gt;</em>'
EOF</span></code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_7-deploy-eclipse-che">7. Deploy Eclipse Che</h3>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="shell">chectl server:deploy <span style="color: #f92672">--platform</span> openshift <span style="color: #f92672">--che-operator-cr-patch-yaml</span> che-patch.yaml</code></pre>
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openshift-external-idp/eclipse-che-deployed.png" alt="Eclipse Che deployed">
</div>
</div>
</div>
<div class="sect2">
<h3 id="_8-configure-the-callback-url-in-keycloak">8. Configure the Callback URL in Keycloak</h3>
<div class="paragraph">
<p>After deployment, update the <code>eclipse-che</code> client in Keycloak with the redirect URI and web origin:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Get the Eclipse Che URL:</p>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="shell">oc get checluster eclipse-che <span style="color: #f92672">-n</span> eclipse-che <span style="color: #ae81ff">\</span>
  <span style="color: #f92672">-o</span> <span style="color: #f8f8f2">jsonpath</span><span style="color: #f92672;font-weight: bold">=</span><span style="color: #e6db74">'{.status.cheURL}'</span></code></pre>
</div>
</div>
</li>
<li>
<p>In the Keycloak Admin Console, open the <code>eclipse-che</code> client.</p>
</li>
<li>
<p>Paste the URL with <code>/oauth/callback</code> appended into <strong>Valid redirect URIs</strong>.</p>
</li>
<li>
<p>Paste the URL into <strong>Web origins</strong>.</p>
</li>
<li>
<p>Save.</p>
</li>
</ol>
</div>
</div>
<div class="sect2">
<h3 id="_9-start-a-workspace">9. Start a Workspace</h3>
<div class="paragraph">
<p>Once everything is configured, open the dashboard and start a workspace:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="shell">chectl dashboard:open</code></pre>
</div>
</div>
<div class="paragraph">
<p>You should be redirected to the Keycloak login page.
After authenticating, the Eclipse Che dashboard opens.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openshift-external-idp/dashboard.png" alt="Eclipse Che dashboard after successful authentication">
</div>
</div>
<div class="paragraph">
<p>For the full reference documentation,
see <a href="https://eclipse.dev/che/docs/next/administration-guide/installing-che-on-openshift-with-keycloak-as-oidc/">Installing Che on OpenShift with Keycloak as external identity provider</a>.</p>
</div>
</div>
</div>
</div>]]></content><author><name>Anatolii Bazko</name></author><summary type="html"><![CDATA[Install Eclipse Che on OpenShift with Keycloak as an external OIDC identity provider.]]></summary></entry><entry><title type="html">Running Open VSX On-Premises</title><link href="https://che.eclipseprojects.io/2025/09/09/@svor-running-open-vsx-on-premises.html" rel="alternate" type="text/html" title="Running Open VSX On-Premises" /><published>2025-09-09T00:00:00+00:00</published><updated>2025-09-09T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2025/09/09/@svor/running-open-vsx-on-premises</id><content type="html" xml:base="https://che.eclipseprojects.io/2025/09/09/@svor-running-open-vsx-on-premises.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Developers love extensions — they customize editors, add new languages, and streamline workflows.
But in enterprise environments, relying on the public <a href="https://open-vsx.org"><strong>Open VSX registry</strong></a> can introduce challenges:
air-gapped environments, compliance rules, or simply the need for a curated list of approved tools.</p>
</div>
<div class="paragraph">
<p>That’s where running <strong>Open VSX On-Premises</strong> comes in.
In this post, we’ll explore how Eclipse&#160;Che makes it easy to deploy and configure your own extension registry, using nothing more than an Eclipse&#160;Che Cloud Development Environment running on the OpenShift cluster.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_step-by-step-preparing-eclipse-open-vsx-with-eclipseche">Step-by-Step: Preparing Eclipse Open VSX with Eclipse&#160;Che</h2>
<div class="sectionbody">
<div class="paragraph">
<p>All the following steps can be executed inside an <strong>Eclipse&#160;Che workspace</strong> provisioned from <a href="https://github.com/eclipse/openvsx/blob/master/.devfile.yaml">the Open VSX repository&#8217;s devfile</a>.
This Devfile automates most of the work — so instead of manually stitching pieces together, you simply run tasks in sequence.</p>
</div>
<div class="sect2">
<h3 id="_prerequisites">Prerequisites:</h3>
<div class="ulist">
<ul>
<li>
<p>You must be running Eclipse&#160;Che on an OpenShift cluster.</p>
</li>
<li>
<p>You must be logged in as a cluster administrator.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_step-1-start-the-open-vsx-workspace">Step 1: Start the Open VSX Workspace</h3>
<div class="paragraph">
<p>Create a workspace using <a href="https://github.com/eclipse/openvsx/tree/master">the Open VSX repository</a>.
This initializes an environment with all required components and tasks.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/dashboard.png" alt="User Dashboard">
</div>
</div>
<div class="paragraph">
<p>Figure 1: User Dashboard</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-2-create-an-openshift-project-for-open-vsx">Step 2: Create an OpenShift project for Open VSX</h3>
<div class="paragraph">
<p>Run the Devfile task:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Terminal → Run Task… → devfile → 2.1. Create Namespace for OpenVSX</code></pre>
</div>
</div>
<div class="paragraph">
<p>This creates a new OpenShift project named openvsx.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/create-namespace.png" alt="Create Open VSX Project">
</div>
</div>
<div class="paragraph">
<p>Figure 2: Open VSX namespace creation</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-3-build-and-publish-the-open-vsx-server-image">Step 3: Build and Publish the Open VSX Server Image</h3>
<div class="paragraph">
<p>Run the task:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Terminal → Run Task… → devfile → 2.2. Build and Publish Open VSX Image</code></pre>
</div>
</div>
<div class="paragraph">
<p>You’ll be prompted for the Open VSX version (defaults to v0.27.0 if left blank). The image is built and pushed to the OpenShift internal registry.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/server-image-build.png" alt="Build Open VSX Server Image">
</div>
</div>
<div class="paragraph">
<p>Figure 3: Open VSX server image build</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-4-build-and-publish-the-open-vsx-cli-ovsx-image">Step 4: Build and Publish the Open VSX CLI (ovsx) Image</h3>
<div class="paragraph">
<p>Run the task:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Terminal → Run Task… → devfile → 2.3. Build and Publish OpenVSX CLI Image</code></pre>
</div>
</div>
<div class="paragraph">
<p>This prepares the ovsx CLI image and uploads it to the cluster registry.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/cli-image-build.png" alt="Build Open VSX CLI Image">
</div>
</div>
<div class="paragraph">
<p>Figure 4: Open VSX CLI image build</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-5-deploy-open-vsx-components">Step 5: Deploy Open VSX Components</h3>
<div class="paragraph">
<p>Run the task:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Terminal → Run Task… → devfile → 2.4. Deploy OpenVSX</code></pre>
</div>
</div>
<div class="paragraph">
<p>This command deploys the Open VSX components to an OpenShift project by processing a template file (<a href="https://github.com/eclipse/openvsx/blob/master/deploy/openshift/openvsx-deployment.yml">openvsx-deployment.yml</a>). It creates all required resources defined in the template, which includes:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Deployments (PostgreSQL, Elasticsearch, Open VSX server, Open VSX CLI).</p>
</li>
<li>
<p>Services and Routes for accessing components.</p>
</li>
<li>
<p>Secrets for GitHub OAuth credentials and Open VSX personal access token.</p>
</li>
</ul>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/openvsx-pods.png" alt="Open VSX Pods">
</div>
</div>
<div class="paragraph">
<p>Figure 5: Open VSX pods running in OpenShift console</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-6-add-a-user-with-personal-access-token-pat">Step 6: Add a User with Personal Access Token (PAT)</h3>
<div class="paragraph">
<p>Run the task :</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Terminal → Run Task… → devfile → 2.5. Add OpenVSX user with PAT to the DB</code></pre>
</div>
</div>
<div class="paragraph">
<p>The command will ask for the Open VSX username and user PAT and insert them into the PostgreSQL database. You can just click enter to use the default values.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
❗ The user PAT must match the decoded value of OVSX_PAT_BASE64 specified in the deployment file. If OVSX_PAT_BASE64 has been updated, use the new token’s decoded value as the user PAT.
</td>
</tr>
</table>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/openvsx-user-pat.png" alt="Adding User and PAT">
</div>
</div>
<div class="paragraph">
<p>Figure 6: Terminal output after adding a user with a PAT</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-7-configure-eclipseche-to-use-your-internal-registry">Step 7: Configure Eclipse&#160;Che to Use Your Internal Registry</h3>
<div class="paragraph">
<p>Run the task:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Terminal → Run Task… → devfile → 2.6. Configure Che to use the internal OpenVSX registry</code></pre>
</div>
</div>
<div class="paragraph">
<p>This patches the CheCluster CR, updating the <code>pluginRegistry.openVSXURL</code> to point to your internal Open VSX endpoint.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/patched-che-cluster.png" alt="CheCluster CR">
</div>
</div>
<div class="paragraph">
<p>Figure 7: CheCluster custom resource after patching</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-8-publish-extensions-via-vsix-file">Step 8: Publish Extensions via VSIX File</h3>
<div class="paragraph">
<p>At the beginning, the Open VSX registry does not provide any extensions. Once the openvsx-server pod is running and in the Ready state, extensions can be published to the registry. The <code>2.8. Publish a Visual Studio Code Extension from a VSIX file</code> command publishes an extension to the local Open VSX registry directly from a <code>.vsix</code> file. It prompts you to provide the extension’s namespace name and the path to the <code>.vsix</code> file.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/publish-extension.png" alt="Publish Extension from VSIX">
</div>
</div>
<div class="paragraph">
<p>Figure 8: Publish GitLens extension from the local vsix file</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-9-batch-publish-extensions-from-a-list">Step 9: Batch Publish Extensions from a List</h3>
<div class="paragraph">
<p>For multiple extensions, run:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>Terminal → Run Task… → devfile → 2.9. Publish list of Visual Studio Code Extensions</code></pre>
</div>
</div>
<div class="paragraph">
<p>This task reads URLs from <a href="https://github.com/eclipse/openvsx/blob/master/deploy/openshift/extensions.txt">deploy/openshift/extensions.txt</a> and publishes them automatically.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/publish-list-extensions.png" alt="Publish List of Extensions">
</div>
</div>
<div class="paragraph">
<p>Figure 9: Batch publishing from extensions.txt</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-10-verify-integration">Step 10: Verify Integration</h3>
<div class="paragraph">
<p>Start a new Che workspace and open the Extensions view. Confirm that extensions are served from your internal registry.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/extensions-view.png" alt="Extensions View">
</div>
</div>
<div class="paragraph">
<p>Figure 10: Extensions view</p>
</div>
<div class="paragraph">
<p>Or browse directly to your registry’s route, opening the internal route in the OpenVSX OpenShift project.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/openvsx-on-premises/extensions-registry.png" alt="Open VSX Extensions Registry">
</div>
</div>
<div class="paragraph">
<p>Figure 11: Custom Extensions registry</p>
</div>
</div>
<div class="sect2">
<h3 id="_optional-restrict-open-vsx-registry-to-internal-only-access">Optional: Restrict Open VSX Registry to Internal-Only Access</h3>
<div class="paragraph">
<p>To prevent external exposure:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Delete the public route with name <code>internal</code> from <code>openvsx</code> OpenShift project:</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>oc delete route internal -n openvsx</code></pre>
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>Patch Che to use the in-cluster service DNS:</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code>oc patch checluster &lt;name&gt; -n &lt;namespace&gt; \
  --type=merge \
  --patch '{"spec":{"components":{"pluginRegistry":{"openVSXURL":"http://openvsx-server.openvsx.svc:8080"}}}}'</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Setting up Open VSX on-premises with Eclipse&#160;Che may sound complex at first, but the Devfile-driven flow makes it straightforward:
You spin up a workspace, run a sequence of tasks, and end up with a fully functional, internal extension registry.</p>
</div>
<hr>
</div>
</div>
<div class="sect1">
<h2 id="_further-reading">Further Reading</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p>📘 <a href="https://eclipse.dev/che/docs/stable/administration-guide/running-the-open-vsx-on-premises">Running the Open VSX On-Premises — Eclipse Che documentation</a></p>
</li>
<li>
<p>💻 <a href="https://github.com/eclipse/openvsx">Eclipse Open VSX source code on GitHub</a></p>
</li>
<li>
<p>📚 <a href="https://github.com/eclipse/openvsx/wiki">Eclipse Open VSX Wiki</a></p>
</li>
</ul>
</div>
</div>
</div>]]></content><author><name>Valerii Svydenko</name></author><summary type="html"><![CDATA[Take Control of Your Extensions: Running Open VSX on-Premises with Eclipse Che]]></summary></entry><entry><title type="html">Spec-Driven Development in Action</title><link href="https://che.eclipseprojects.io/2025/08/18/@oleksii.kurinnyi-spec-driven-development-in-action.html" rel="alternate" type="text/html" title="Spec-Driven Development in Action" /><published>2025-08-18T00:00:00+00:00</published><updated>2025-08-18T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2025/08/18/@oleksii.kurinnyi/spec-driven-development-in-action</id><content type="html" xml:base="https://che.eclipseprojects.io/2025/08/18/@oleksii.kurinnyi-spec-driven-development-in-action.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>What if the most important skill for a developer was no longer writing code, but writing specifications? The traditional development cycle is a grind of boilerplate, configuration, and repetitive tasks. We spend more time on the "how" than perfecting the "what". But a new paradigm, powered by AI, is shifting that dynamic, and you can try it yourself right now.</p>
</div>
<div class="paragraph">
<p>I&#8217;m talking about <strong>specification-driven development</strong>, a workflow where the developer&#8217;s primary role is to create a detailed, machine-readable blueprint of an application. To prove it, I built a full-stack URL shortener. The vast majority of my time was spent crafting a perfect specification file; then an AI did the rest with a single command.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_the-tools-and-the-paradigm">The Tools and the Paradigm</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This experiment relies on a powerful combination of modern tools working in synergy:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://eclipse.dev/che/"><strong>Eclipse Che</strong></a>: A platform for providing Kubernetes-based Cloud Development Environments.</p>
</li>
<li>
<p><a href="https://github.com/ai-christianson/RA.Aid"><strong>RA.Aid</strong></a> &amp; <a href="https://github.com/Aider-AI/aider"><strong>Aider</strong></a>: A pair of open-source AI assistants, both licensed under the <code>Apache 2.0</code>. <strong>RA.Aid</strong> is the master planner, taking a high-level spec and breaking it down into an implementation plan. <strong>Aider</strong> is the hands-on coder, executing the plan and modifying the code.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Together, they enable a shift where you, the developer, transition from a coder to an architect. Your focus is on high-level decisions, defining robust data models, crafting clean API contracts, and designing intuitive user interactions. The specification file becomes the single source of truth that drives the entire development process.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_how-to-replicate-this-from-repo-to-running-app">How to Replicate This: From Repo to Running App</h2>
<div class="sectionbody">
<div class="paragraph">
<p>You can follow these exact steps to see the process for yourself.</p>
</div>
<div class="sect2">
<h3 id="_step-1-the-blueprint-repo">Step 1: The Blueprint Repo</h3>
<div class="paragraph">
<p>Everything you need to start is in this GitHub repository: <a href="https://github.com/che-incubator/demo-spec-driven-development-with-ai">che-incubator/demo-spec-driven-development-with-ai</a></p>
</div>
<div class="paragraph">
<p>This repo contains the blueprint for our entire project. It includes two crucial files: the <code>spec.md</code>, which provides the detailed instructions for the AI, and the <code>devfile.yaml</code>, which defines the Eclipse Che workspace.</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-2-launch-the-workspace-with-a-devfile">Step 2: Launch the Workspace with a Devfile</h3>
<div class="paragraph">
<p>The <code>devfile.yaml</code> is the key to a one-click setup. It tells Eclipse Che to create a workspace using a pre-configured container image (<code>quay.io/che-incubator/cli-ai-tools:latest</code>) that already includes <strong>RA.Aid</strong> and <strong>Aider</strong>. This means your development environment comes ready with all the specialized AI tools installed.</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-3-secure-your-ais-access">Step 3: Secure Your AI&#8217;s Access</h3>
<div class="paragraph">
<p>To work, the AI assistants need access to a Large Language Model (LLM). <strong>RA.Aid</strong> and <strong>Aider</strong> are flexible and support many different providers, including Gemini, OpenAI, Anthropic, Groq, and more. For this demo, we&#8217;ll use the Gemini API.</p>
</div>
<div class="paragraph">
<p>The recommended way to provide credentials is by creating a Kubernetes <code>Secret</code>. Eclipse Che will then automatically mount this secret as an environment variable inside your workspace. For the Gemini API, the required environment variable is <code>GEMINI_API_KEY</code>.</p>
</div>
<div class="paragraph">
<p>You can create the secret for Gemini with the following command:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="sh">oc apply <span style="color: #f92672">-f</span> - <span style="color: #f92672;font-weight: bold">&lt;&lt;</span><span style="color: #66d9ef">EOF</span><span style="color: #e6db74">
kind: Secret
apiVersion: v1
metadata:
  name: gemini-api-key
  labels:
    controller.devfile.io/mount-to-devworkspace: 'true'
    controller.devfile.io/watch-secret: 'true'
  annotations:
    controller.devfile.io/mount-as: env
data:
  GEMINI_API_KEY: [base64 encoded Gemini API key]
type: Opaque
EOF</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>If you prefer to use a different provider, simply consult the <strong>RA.Aid</strong> or <strong>Aider</strong> documentation for the correct environment variable name (e.g., <code>OPENAI_API_KEY</code>) and adapt the secret accordingly.</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-4-unleash-the-ai">Step 4: Unleash the AI</h3>
<div class="paragraph">
<p>Once you have crafted the <code>spec.md</code> for the application of your dreams, all it takes is this one command in the terminal to set the AI to work:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="sh">ra-aid <span style="color: #f92672">--use-aider</span> <span style="color: #f92672">--cowboy-mode</span> <span style="color: #f92672">--show-cost</span> <span style="color: #f92672">--track-cost</span> <span style="color: #f92672">--msg-file</span> spec.md</code></pre>
</div>
</div>
<div class="paragraph">
<p>This command tells <strong>RA.Aid</strong> to use your <code>spec.md</code> file as its guide, leverage <strong>Aider</strong> for code modifications, and run autonomously without needing interactive approval (<code>--cowboy-mode</code>).</p>
</div>
<div class="paragraph">
<p>Instantly, the agent will parse the specification and begin building the application right inside your Eclipse Che workspace, just as it did for my URL shortener. See the whole process unfold in the video below.</p>
</div>
<iframe width="560" height="315" src="https://www.youtube.com/embed/L_a1ig1VrxY?si=DGC5q405MhLMnmrY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<div class="paragraph">
<p>As the agent works, you can follow its progress directly in the terminal. The output shows its step-by-step thinking process as it interprets the specification, plans its actions, and executes them.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/spec-driven-development-in-action/1-ra-aid-command-running.png" alt="RA.Aid command running in the terminal" width="showing the AI planning and executing steps for the URL shortener.">
</div>
<div class="title">Figure 1. RA.Aid command running in the terminal, showing the AI planning and executing steps for the URL shortener.</div>
</div>
<div class="paragraph">
<p>&nbsp;</p>
</div>
<div class="paragraph">
<p>It will generate the backend, the frontend, and any necessary scripts. You can see the complete, well-structured project created by the AI in the file explorer.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/spec-driven-development-in-action/2-generated-project-file-structure.png" alt="Generated project file structure for the URL shortener in the Eclipse Che IDE.">
</div>
<div class="title">Figure 2. Generated project file structure for the URL shortener in the Eclipse Che IDE.</div>
</div>
<div class="paragraph">
<p>&nbsp;</p>
</div>
</div>
<div class="sect2">
<h3 id="_step-5-working-application">Step 5: Working Application</h3>
<div class="paragraph">
<p>Writing a detailed specification requires deep thought, but that upfront investment pays off massively by automating the hours of coding and debugging. After the agent finishes, you have a fully working application.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
While the demo environment&#8217;s hostname makes the full URL long, the AI correctly built the core feature: generating a short, clean, and predictable path for any link you provide.
</td>
</tr>
</table>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/spec-driven-development-in-action/3-url-shortener-running.png" alt="Final URL shortener application is running in a browser tab within Eclipse Che.">
</div>
<div class="title">Figure 3. The final URL shortener application is running in a browser tab within Eclipse Che.</div>
</div>
<div class="paragraph">
<p>&nbsp;</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This demonstration is more than just a new way to build a URL shortener; it&#8217;s a glimpse into the future of our profession. The rise of capable AI assistants marks a fundamental shift in the developer&#8217;s workflow, moving us away from the manual, line-by-line construction of applications and toward a new paradigm where we act as architects. Our primary role is evolving to be the designers of robust systems, the authors of clear specifications, and the strategic thinkers who guide AI tools to execute a vision.</p>
</div>
<div class="paragraph">
<p>Spec-driven development is likely just one step on a path of rapid transformation. The world of AI in software engineering is changing fast, and the tools we use tomorrow will be even more powerful.</p>
</div>
<div class="paragraph">
<p>The best way to understand this shift is to experience it firsthand. I encourage you to run the demo yourself and reflect on how this technology could change your own work. The conversation is no longer about whether AI will write code, but about how we will guide it to build better software.</p>
</div>
</div>
</div>]]></content><author><name>Oleksii Kurinnyi</name></author><summary type="html"><![CDATA[Spec-Driven Development in Action: Building a URL Shortener with One Command]]></summary></entry><entry><title type="html">Vibe Coding with Eclipse Che</title><link href="https://che.eclipseprojects.io/2025/07/23/@ilya.buziuk-vibe-coding.html" rel="alternate" type="text/html" title="Vibe Coding with Eclipse Che" /><published>2025-07-23T00:00:00+00:00</published><updated>2025-07-23T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2025/07/23/@ilya.buziuk/vibe-coding</id><content type="html" xml:base="https://che.eclipseprojects.io/2025/07/23/@ilya.buziuk-vibe-coding.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Imagine a world where coding isn&#8217;t about meticulous syntax or endless debugging, but about conversation and pure flow. Welcome to "vibe coding" – a revolutionary approach to software development where Large Language Models (LLMs) become your ultimate co-pilot, transforming complex tasks into effortless interactions.</p>
</div>
<div class="paragraph">
<p>This paradigm shift gained significant traction in early February 2025, sparked by Andrej Karpathy&#8217;s insightful <a href="https://x.com/karpathy/status/1886192184808149383">post</a> on X, who actually coined the term:</p>
</div>
<div class="quoteblock">
<blockquote>
There&#8217;s a new kind of coding I call "vibe coding", where you fully give in to the vibes, embrace exponentials, and forget that the code even exists. It&#8217;s possible because the LLMs (e.g. Cursor Composer w Sonnet) are getting too good. Also I just talk to Composer with SuperWhisper so I barely even touch the keyboard. I ask for the dumbest things like "decrease the padding on the sidebar by half" because I&#8217;m too lazy to find it. I "Accept All" always, I don&#8217;t read the diffs anymore. When I get error messages I just copy paste them in with no comment, usually that fixes it. The code grows beyond my usual comprehension, I&#8217;d have to really read through it for a while. Sometimes the LLMs can&#8217;t fix a bug so I just work around it or ask for random changes until it goes away. It&#8217;s not too bad for throwaway weekend projects, but still quite amusing. I&#8217;m building a project or webapp, but it&#8217;s not really coding - I just see stuff, say stuff, run stuff, and copy paste stuff, and it mostly works.
</blockquote>
</div>
<div class="paragraph">
<p>This "AI-First Coding" is rapidly being embraced by <a href="https://www.youtube.com/watch?v=w-Dk7sTba2I">Big Tech</a> and is quickly becoming the new norm:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/vibe-coding/big-tech-embraces-vibe-coding.png" alt="Big Tech embraces Vibe Coding">
</div>
</div>
<div class="paragraph">
<p>Figure 1: Big Tech embraces Vibe Coding (the screenshot was taken from the <a href="https://www.youtube.com/@CNBCtelevision">CNBC Television YouTube Channel</a>)</p>
</div>
<div class="paragraph">
<p>In this article, we will delve into the innovative solutions and tools that are transforming vibe coding from a concept to a powerful new reality for developers everywhere. We will also explore why Cloud Development Environments (CDEs) are the ideal playground for the "AI-First Coding" unlike the local IDEs.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_open-source-tools-for-the-vibe-coder">Open-Source Tools for the Vibe Coder</h2>
<div class="sectionbody">
<div class="paragraph">
<p>To truly embrace Vibe Coding, you need the right tools. While many closed-source assistants exist—such as <a href="https://cursor.sh/">Cursor</a>, <a href="https://www.windsurf.ai/">Windsurf</a>, and <a href="https://kiro.dev/">Kiro</a> (all effectively forks of the <a href="https://github.com/microsoft/vscode">Visual Studio Code - Open Source ("Code - OSS")</a>), the open-source community offers powerful alternatives that provide greater control and transparency.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
A significant drawback of local-first AI tools is their potential to disrupt your local development environment if the AI assistant misbehaves. Cloud Development Environments (CDEs), however, offer a crucial advantage for AI assistants: they provide isolated, repeatable, and on-demand workspaces. This means developers don’t have to worry about misbehaving AI tools, MCP agents, or other integrations breaking their local setup, as any issues remain contained within a pod/namespace itself (assuming proper RBAC setup for the developer persona on the Kubernetes cluster).
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Let&#8217;s explore a few awesome open-source extensions available on <a href="https://open-vsx.org/">Open VSX</a> that make vibe coding a reality today.</p>
</div>
<div class="sect2">
<h3 id="_continue">Continue</h3>
<div class="paragraph">
<p><a href="https://continue.dev/">Continue</a> is an open-source autopilot for software development, available under the Apache 2.0 license. Continue enables developers to create, share, and use custom AI code assistants with open-source VS Code and JetBrains extensions, as well as a hub of models, rules, prompts, documentation, and other building blocks. The <a href="https://open-vsx.org/extension/Continue/continue">extension</a> allows you to connect to any LLM, local or hosted, to receive coding assistance directly within the IDE.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Learn more about integrating a private AI coding assistant into your Cloud Development Environments using Ollama and Continue in the dedicated <a href="https://developers.redhat.com/learn/openshift-ai/integrate-private-ai-coding-assistant-your-cde-using-ollama-continue-openshift-dev-spaces">article</a>.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_cline">Cline</h3>
<div class="paragraph">
<p><a href="https://cline.bot/">Cline</a> is an open-source extension for Visual Studio Code, available under the Apache 2.0 license. Cline (pronounced /klaɪn/, like “Klein”), an AI assistant that can use your <strong>CLI</strong> a<strong>N</strong>d <strong>E</strong>ditor. <a href="https://open-vsx.org/extension/saoudrizwan/claude-dev">Cline extension</a> is an autonomous coding agent right in the IDE, capable of creating/editing files, executing commands, using the browser, and more with your permission every step of the way.</p>
</div>
</div>
<div class="sect2">
<h3 id="_roo-code">Roo Code</h3>
<div class="paragraph">
<p><a href="https://open-vsx.org/extension/RooVeterinaryInc/roo-cline">Roo Code</a> is yet another open-source extension for Visual Studio Code, available under the Apache 2.0 license. As a <a href="https://github.com/RooCodeInc/Roo-Code">fork of Cline</a>, Roo Code builds upon its foundation to provide an AI coding assistant that integrates directly into the IDE. It excels at understanding your intentions, offering intelligent code completions, refactoring suggestions, and explaining complex code blocks. Designed to thrive in CDEs, Roo Code provides a secure, reproducible environment to push the boundaries of AI-powered development. With Roo, you can request broad changes, refactor entire functions with a single prompt, and let the AI handle repetitive tasks, freeing you to focus on the creative aspects of coding. Roo Code is an AI-powered autonomous coding agent that lives in your editor. It can:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Communicate in natural language</p>
</li>
<li>
<p>Read and write files directly in your workspace</p>
</li>
<li>
<p>Run terminal commands</p>
</li>
<li>
<p>Automate browser actions</p>
</li>
<li>
<p>Integrate with any OpenAI-compatible or custom API/model</p>
</li>
<li>
<p>Adapt its “personality” and capabilities through Custom Modes</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Whether you’re seeking a flexible coding partner, a system architect, or specialized roles like a QA engineer or product manager, <a href="https://roocode.com/">Roo Code</a> can help you build software more efficiently.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_experience-vibe-coding-now">Experience Vibe Coding Now!</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ready to experience the future of coding? All you need is a browser!</p>
</div>
<div class="paragraph">
<p>You can start Vibe Coding in minutes using <a href="https://eclipse.dev/che/docs/stable/hosted-che/hosted-che/">Eclipse Che hosted by Red Hat</a> on the <a href="https://developers.redhat.com/developer-sandbox">Developer Sandbox</a>.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Register for a <a href="https://developers.redhat.com/developer-sandbox">Developer Sandbox for Red Hat OpenShift account</a>.</p>
</li>
<li>
<p>Go to <a href="https://workspaces.openshift.com/">workspaces.openshift.com</a></p>
</li>
<li>
<p>Start an <code>Empty Workspace</code> from the <strong>Getting Started Samples</strong> or import your pet project from Git:</p>
</li>
</ol>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/vibe-coding/dashboard.png" alt="User Dashboard">
</div>
</div>
<div class="paragraph">
<p>Figure 2: User Dashboard</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Install the <code>Roo Code</code> extension from the marketplace:</p>
</li>
</ol>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/vibe-coding/marketplace.png" alt="Open VSX Marketplace">
</div>
</div>
<div class="paragraph">
<p>Figure 3: Open VSX Marketplace</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
You can add the <code>Roo Code</code> extension to the <a href="https://github.com/eclipse-che/blog/blob/main/.vscode/extensions.json">.vscode/extensions.json</a> file in the Git repository, and it will be installed automatically after workspace startup:
</td>
</tr>
</table>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Choose LLM and Configure the API Key in the Roo Code "Settings".</p>
</li>
</ol>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/vibe-coding/roo-settings.png" alt="Roo Code Settings">
</div>
</div>
<div class="paragraph">
<p>Figure 4: Roo Code Settings</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
For some Gemini models e.g. <code>gemini-2.5-flash</code> you can generate a free API Key on the <a href="https://aistudio.google.com/">Google AI Studio</a>. You only need to set up the API key once in the extension; it will be persisted in your browser settings for future workspaces.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>And&#8230;&#8203; start vibe coding - put the wildest ideas in the chat window, and Roo Code will do it&#8217;s best to make it come true!</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/vibe-coding/roo.png" alt="Roo Code">
</div>
</div>
<div class="paragraph">
<p>Figure 5: Roo Code Extension</p>
</div>
<div class="paragraph">
<p>This iterative, conversational approach allows you to rapidly prototype and build, focusing on the desired outcome rather than the intricate details of implementation.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Vibe coding represents a paradigm shift in software development. It’s about moving away from meticulous, line-by-line implementation and embracing a more intuitive, conversational, and results-driven workflow. This AI-first approach, powered by increasingly sophisticated LLMs, lets developers focus on the "what" rather than the "how," accelerating innovation and making development more accessible.</p>
</div>
<div class="paragraph">
<p>AI coding assistants are central to this new workflow, providing code suggestions, completions, and contextual help. Combining these assistants with a Cloud Development Environment creates a powerful and secure setup. CDEs offer isolated, on-demand workspaces, allowing your AI assistant to experiment freely without risking your local machine. Any issues are contained within the ephemeral workspace, which can be easily discarded and restarted.</p>
</div>
<div class="paragraph">
<p>As we&#8217;ve explored, Cloud Development Environments are the ideal playground for this new era. They provide safe, isolated, and reproducible workspaces where you can unleash powerful AI assistants like <a href="https://open-vsx.org/extension/RooVeterinaryInc/roo-cline">Roo Code</a> without fear of breaking your local setup. The synergy between a CDE and a cutting-edge AI assistant enables a flow state of rapid prototyping and iteration that was previously unimaginable.</p>
</div>
<div class="paragraph">
<p>The journey into vibe coding is just beginning. We encourage you to follow our guide, embrace the flow, and discover how these tools can transform your own development process. The future of coding isn&#8217;t about replacing developers; it&#8217;s about empowering them with tools that amplify their creativity and productivity.</p>
</div>
<div class="paragraph">
<p>Happy Vibe Coding!</p>
</div>
</div>
</div>]]></content><author><name>Ilya Buziuk</name></author><summary type="html"><![CDATA[Vibe Coding with Eclipse Che]]></summary></entry><entry><title type="html">Running at Scale</title><link href="https://che.eclipseprojects.io/2025/04/29/@ilya.buziuk-running-at-scale.html" rel="alternate" type="text/html" title="Running at Scale" /><published>2025-04-29T00:00:00+00:00</published><updated>2025-04-29T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2025/04/29/@ilya.buziuk/running-at-scale</id><content type="html" xml:base="https://che.eclipseprojects.io/2025/04/29/@ilya.buziuk-running-at-scale.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Even though <a href="https://kubernetes.io/">Kubernetes</a> has emerged as a powerful foundation for deploying and managing containerized workloads at scale, achieving scale with Cloud Development Environments (CDEs), particularly in the range of thousands of concurrent workspaces, presents significant challenges.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
CDE workloads are complex to scale mainly because of the fact that underlying IDE solutions, such as <a href="https://github.com/microsoft/vscode">Visual Studio Code - Open Source ("Code - OSS")</a> or <a href="https://www.jetbrains.com/remote-development/gateway/">JetBrains Gateway</a>, are designed as single-user applications rather than multitenant services.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Such a scale imposes substantial infrastructure demands and introduces potential bottlenecks that can impact the performance and stability of the entire system. Addressing these challenges requires meticulous planning, strategic architectural choices, monitoring, and continuous optimization to ensure a seamless and efficient development experience for a large number of users. In this article, you can find a few important takeaways worth considering when running <a href="https://eclipse.dev/che/">Eclipse Che</a> at scale on Kubernetes.</p>
</div>
<div class="sect2">
<h3 id="_planning-your-environment-according-to-object-maximums">Planning your environment according to object maximums</h3>
<div class="paragraph">
<p>While there is no strict limit on the number of resources in a Kubernetes cluster,
there are certain <a href="https://kubernetes.io/docs/setup/best-practices/cluster-large/">considerations for large clusters</a> to keep in mind.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
More insights about the Kubernetes scalability can be found in the <a href="https://kubernetespodcast.com/episode/111-scalability/">"Scalability, with Wojciech Tyczynski"</a> Kubernetes Podcast.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p><a href="https://www.redhat.com/en/technologies/cloud-computing/openshift">OpenShift Container Platform</a>, which is a certified distribution of Kubernetes, also provides a set of tested maximums for various resources, which can serve as an initial guideline for planning your environment:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Resource type</th>
<th class="tableblock halign-left valign-top">Tested maximum</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of nodes</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2000</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of pods</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">150000</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of pods per node</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2500</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of namespace</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">10000</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of services</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">10000</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of secrets</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">80000</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of config maps</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">90000</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Table 1: OpenShift Container Platform tested cluster maximums for various resources.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
You can find more details on the OpenShift Container Platform tested object maximums in the <a href="https://docs.redhat.com/en/documentation/openshift_container_platform/4.18/html/scalability_and_performance/planning-your-environment-according-to-object-maximums#planning-your-environment-according-to-object-maximums">official documentation</a>.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>For example, it is generally not recommended to have more than 10,000 namespaces due to potential performance and management overhead. In Eclipse Che, for instance, each user is allocated a namespace. If you expect the user base to be large, consider spreading workloads across multiple "fit-for-purpose" clusters and potentially leveraging solutions for multi-cluster orchestration.</p>
</div>
</div>
<div class="sect2">
<h3 id="_calculating-resource-requirements">Calculating Resource Requirements</h3>
<div class="paragraph">
<p>When deploying Eclipse Che on Kubernetes, it is crucial to accurately calculate the resource requirements and determine memory and CPU / GPU needs for each CDE to come up with the right sizing of the cluster. In general, the CDE size is limited by and can not be bigger than the worker node size. The resource requirements for CDEs can vary significantly based on the specific workloads and configurations. For example, a simple CDE may require only a few hundred megabytes of memory, while a more complex one will need several gigabytes of memory and multiple CPU cores.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
You can find more details about calculating resource requirements in the <a href="https://eclipse.dev/che/docs/stable/administration-guide/calculating-che-resource-requirements/">official documentation</a>.
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_etcd">etcd</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The primary datastore of Kubernetes cluster configuration and state is <a href="https://etcd.io/">etcd</a>. It holds the cluster state and configuration, including information about nodes, pods, services, and custom resources. As a distributed key-value store, etcd does not scale well past a certain threshold, and as the size of etcd grows, so does the load on the cluster, risking its stability.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
The default etcd size is 2 GB, and the recommended maximum is 8 GB. Exceeding the maximum limit can make the Kubernetes cluster unstable and unresponsive.
</td>
</tr>
</table>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/running-at-scale/etcd.png" alt="Metrics with the progression of the etcd storage growth that leads to cluster instability">
</div>
</div>
<div class="paragraph">
<p>Figure 1: Metrics with the progression of the etcd storage growth that leads to cluster instability.</p>
</div>
<div class="sect2">
<h3 id="_the-size-of-the-objects-matters">The size of the objects matters</h3>
<div class="paragraph">
<p>Not only the overall number, but also the size of the objects stored in etcd is a critical factor that can significantly impact its performance and stability. Each object stored in etcd consumes space, and as the number of objects increases, the overall size of etcd grows too. The larger the object is, the more space it takes in etcd. For example, etcd can be overloaded with just a few thousand of relatively big Kubernetes objects.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
Even though the data stored in a <code>ConfigMap</code> cannot exceed 1 MiB by design, a few thousand of relatively big <code>ConfigMap</code> objects can overload etcd storage.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>In the context of Eclipse Che, by default the operator creates and manages the 'ca-certs-merged' ConfigMap, which contains the Certificate Authorities (CAs) bundle, in every user namespace. With a large number of TLS certificates in the cluster, this results in additional etcd usage.</p>
</div>
<div class="paragraph">
<p>In order to disable mounting the CA bundle using the <code>ConfigMap</code> under the <code>/etc/pki/ca-trust/extracted/pem</code> path, configure the <code>CheCluster</code> Custom Resource by setting the <code>disableWorkspaceCaBundleMount</code> property to <code>true</code>. With this configuration, only custom certificates will be mounted under the path <code>/public-certs</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="yaml"><span style="color: #a6e22e">spec</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">devEnvironments</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
    <span style="color: #a6e22e">trustedCerts</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">disableWorkspaceCaBundleMount</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #66d9ef">true</span></code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
You can find more details about importing untrusted TLS certificates in the <a href="https://eclipse.dev/che/docs/stable/administration-guide/importing-untrusted-tls-certificates/">official documentation</a>.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_devworkspace-objects">DevWorkspace objects</h3>
<div class="paragraph">
<p>For large Kubernetes deployments, particularly those involving a high number of custom resources such as <code>DevWorkspace</code> objects, which represent CDEs, etcd can become a significant performance bottleneck.</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
Based on the load testing for 6,000 <code>DevWorkspace</code> objects, storage consumption for etcd was around 2.5GB.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Starting from <a href="https://github.com/devfile/devworkspace-operator">DevWorkspace Operator</a> version 0.34.0, you can configure a pruner that would automatically clean up <code>DevWorkspace</code> objects that were not in use for a certain period of time. To set the pruner up, configure the <code>DevWorkspaceOperatorConfig</code> object as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="yaml"><span style="color: #a6e22e">apiVersion</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">controller.devfile.io/v1alpha1</span>
<span style="color: #a6e22e">kind</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">DevWorkspaceOperatorConfig</span>
<span style="color: #a6e22e">metadata</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">devworkspace-operator-config</span>
  <span style="color: #a6e22e">namespace</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">crw</span>
<span style="color: #a6e22e">config</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">workspace</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
    <span style="color: #a6e22e">cleanupCronJob</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
      <span style="color: #a6e22e">enabled</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #66d9ef">true</span>
      <span style="color: #a6e22e">dryRun</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #66d9ef">false</span>
      <span style="color: #a6e22e">retainTime</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #ae81ff">2592000</span> <span style="color: #75715e;font-style: italic"># By default, if a workspace was not started for more than 30 days it will be marked for deletion</span>
      <span style="color: #a6e22e">schedule</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">“0 0 1 * *”</span> <span style="color: #75715e;font-style: italic"># By default, the pruner will run once per month</span></code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
You can find more details about DevWorkspace Operator Configuration in the <a href="https://github.com/devfile/devworkspace-operator/blob/main/docs/dwo-configuration.md">official documentation</a>.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_olmconfig">OLMConfig</h3>
<div class="paragraph">
<p>When an operator is installed by the <a href="https://olm.operatorframework.io/">Operator Lifecycle Manager (OLM)</a>, a stripped-down copy of its CSV is created in every namespace the operator is configured to watch. These stripped-down CSVs are known as “Copied CSVs” and communicate to users which controllers are actively reconciling resource events in a given namespace. On especially large clusters, with namespaces and installed operators tending in the hundreds or thousands, Copied CSVs consume an untenable amount of resources; e.g. OLM’s memory usage, cluster etcd limits, networking, etc. In order to eliminate the CSVs copied to every namespace, configure the <code>OLMConfig</code> object accordingly:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="yaml"><span style="color: #a6e22e">apiVersion</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">operators.coreos.com/v1</span>
<span style="color: #a6e22e">kind</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">OLMConfig</span>
<span style="color: #a6e22e">metadata</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">name</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #e6db74">cluster</span>
<span style="color: #a6e22e">spec</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
  <span style="color: #a6e22e">features</span><span style="color: #f8f8f2;background-color: #49483e">:</span>
    <span style="color: #a6e22e">disableCopiedCSVs</span><span style="color: #f8f8f2;background-color: #49483e">:</span> <span style="color: #66d9ef">true</span></code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Additional information about the <code>disableCopiedCSVs</code> feature can be found in its original <a href="https://github.com/operator-framework/enhancements/blob/master/enhancements/olm-toggle-copied-csvs.md">enhancement proposal</a>.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>The primary impact of the <code>disableCopiedCSVs</code> property on etcd is related to resource consumption. In clusters with a large number of namespaces and many cluster-wide Operators, the creation and maintenance of numerous Copied CSVs can lead to increased etcd storage usage and memory consumption. By disabling Copied CSVs, the amount of data stored in etcd is significantly reduced, which can help improve overall cluster performance and stability.</p>
</div>
<div class="paragraph">
<p>This is particularly important for large clusters where the number of namespaces and operators can quickly add up to a significant amount of data. Disabling Copied CSVs can help reduce the load on etcd, leading to improved performance and responsiveness of the cluster.
Additionally, it can help reduce the memory footprint of OLM, as it no longer needs to maintain and manage these additional resources.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
You can find more details about "Disabling Copied CSVs" in the <a href="https://olm.operatorframework.io/docs/advanced-tasks/configuring-olm/#disabling-copied-csvs">official documentation</a>.
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_cluster-autoscaling">Cluster Autoscaling</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Although cluster autoscaling is a powerful Kubernetes feature, you cannot always fall back on it. You should always consider predictive scaling by analyzing load data on your environment to detect daily or weekly usage patterns. If your workloads follow a pattern and there are dramatic peaks throughout the day, you should consider provisioning worker nodes accordingly. For example, if you have a predictable load pattern where the number of workspaces increases during business hours and decreases during off-hours, you can use predictive scaling to adjust the number of worker nodes based on the expected load.
This can help ensure that you have enough resources available to handle the peak load while minimizing costs during off-peak hours.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Consider leveraging open-source solutions like <a href="https://karpenter.sh/">Karpenter</a> for configuration and lifecycle management of the worker nodes. Karpenter can dynamically provision and optimize worker nodes based on the specific requirements of the workloads, helping to improve resource utilization and reduce costs.
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_multi-cluster">Multi-cluster</h2>
<div class="sectionbody">
<div class="paragraph">
<p>By design, Eclipse Che is not multi-cluster aware, and you can only have one instance per cluster. However, you can run Eclipse Che in a multi-cluster environment by deploying Eclipse Che in each different cluster and using a load balancer or DNS-based routing to direct traffic to the appropriate instance based on the user’s location or other criteria. This approach can help improve performance and reliability by distributing the workload across multiple clusters and providing redundancy in case of cluster failures.</p>
</div>
<div class="paragraph">
<p>One example of a multi-cluster architecture is <a href="https://workspaces.openshift.com/">workspaces.openshift.com</a>, which is part of the <a href="https://developers.redhat.com/developer-sandbox">Developer Sandbox</a>.</p>
</div>
<div class="paragraph">
<p>From the infrastructure perspective, the Developer Sandbox consists of multiple <a href="https://www.redhat.com/en/technologies/cloud-computing/openshift/aws">ROSA</a> clusters. On each cluster, the productized version of Eclipse Che is installed and configured using <a href="https://argo-cd.readthedocs.io/en/stable/">Argo CD</a>. Since the user base is spread across multiple clusters, <a href="https://workspaces.openshift.com/">workspaces.openshift.com</a> is used as a single entry point to the productized Eclipse Che instances. You can find implementation details about the multicluster redirector in the following <a href="https://github.com/codeready-toolchain/crw-multicluster-redirector">GitHub repository</a>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/running-at-scale/developer-sandbox.png" alt="Multi-cluster solution for running the productized version of Eclipse Che on the Developer Sandbox">
</div>
</div>
<div class="paragraph">
<p>Figure 2: Multi-cluster solution for running the productized version of Eclipse Che on the Developer Sandbox.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
The solution for <a href="https://workspaces.openshift.com/">workspaces.openshift.com</a> is a Developer Sandbox-specific solution that can not be reused as-is in other environments. However, you can use it as a reference for implementing a similar solution well-tailored to your specific multicluster needs.
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Running Eclipse Che at scale on Kubernetes presents unique challenges that require careful planning and consideration of various factors. By understanding the limitations of Kubernetes, accurately calculating resource requirements, and implementing best practices for managing etcd and OLM, you can build a robust and scalable CDE platform that meets the needs of your users. Additionally, leveraging predictive scaling and considering multicluster architectures can further enhance the performance and reliability of Eclipse Che deployments. By following these guidelines and continuously monitoring and optimizing the environment, you can provide a reliable and efficient CDE, ensure a seamless and efficient development experience for a large number of users while maintaining responsiveness, and prevent performance degradation of the cluster.</p>
</div>
</div>
</div>]]></content><author><name>Ilya Buziuk</name></author><summary type="html"><![CDATA[Running Eclipse Che at scale on Kubernetes]]></summary></entry><entry><title type="html">Working locally in the cloud: Develop in local Visual Studio Code with Eclipse Che as your Cloud Development Environment</title><link href="https://che.eclipseprojects.io/2025/02/27/@vgulyy-use-desktop-visual-studio-code.html" rel="alternate" type="text/html" title="Working locally in the cloud: Develop in local Visual Studio Code with Eclipse Che as your Cloud Development Environment" /><published>2025-02-27T00:00:00+00:00</published><updated>2025-02-27T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2025/02/27/@vgulyy/use-desktop-visual-studio-code</id><content type="html" xml:base="https://che.eclipseprojects.io/2025/02/27/@vgulyy-use-desktop-visual-studio-code.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Eclipse Che provides developers with a web version of the <a href="https://github.com/microsoft/vscode">Visual Studio Code OSS</a> editor, which includes most features from the desktop version. The transition to cloud development can feel quite unusual for developers, but Eclipse Che has a feature that will help you feel right at home immediately.
With <a href="https://code.visualstudio.com/docs/editor/command-line">Visual Studio Code Command Line Interface (CLI)</a> you can create a tunnel that allows you to connect your local Visual Studio Code, an editor you may already be familiar with, to your workspace.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_connecting-visual-studio-code-desktop-to-a-new-workspace">Connecting Visual Studio Code desktop to a new workspace</h2>
<div class="sectionbody">
<div class="paragraph">
<p>You can connect your local Visual Studio Code to a new workspace with a few clicks.
First, create a workspace from the Che Dashboard and choose Visual Studio Code (desktop) as your editor.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/use-desktop-visual-studio-code/select-editor.png" alt="Create Workspace">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
<div class="paragraph">
<p>Wait for the login page to appear and log in with your Microsoft or GitHub account.
Click the <strong>Copy &amp; Continue to Microsoft</strong> or <strong>Copy &amp; Continue to GitHub</strong> button to copy the authentication code to the clipboard and to open the authenticating pop-up.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/use-desktop-visual-studio-code/login-with-provider.png" alt="Login with GitHub account">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
<div class="paragraph">
<p>Complete the authentication process, paste the code from the clipboard, and follow the instructions. Upon successful authentication, close the pop-up and wait for the tunnel to your workspace to be created.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/use-desktop-visual-studio-code/open-visual-studio-code.png" alt="Tunnel to the workspace">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
<div class="paragraph">
<p>Click <strong>Open in Visual Studio Code desktop</strong> to open your workspace in the desktop version of Visual Studio Code. Confirm opening the desktop application by clicking Open Visual Studio Code - URL Handler.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/use-desktop-visual-studio-code/confirm-opening-vscode-desktop.png" alt="Open in Visual Studio Code desktop">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
<div class="paragraph">
<p>Wait for the local Visual Studio Code to load and allow the <strong>Remote - Tunnels</strong> extension to open the URI.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="paragraph">
<p>If Visual Studio Code opens your workspace with a delay, open the <strong>Remote Explorer</strong> view.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_connecting-visual-studio-code-desktop-to-a-running-workspace">Connecting Visual Studio Code desktop to a running workspace</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_prepare-your-local-visual-studio-code">Prepare your local Visual Studio Code.</h3>
<div class="paragraph">
<p>First, you need to install both <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-server">Remote - Tunnels</a> and <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-explorer">Remote Explorer</a> extensions to your local Visual Studio Code. It will allow you to connect to a remote machine via a secure tunnel.</p>
</div>
</div>
<div class="sect2">
<h3 id="_install-visual-studio-code-cli">Install Visual Studio Code CLI.</h3>
<div class="paragraph">
<p>Next, you need to install Visual Studio Code CLI in your workspace. Open a terminal and run the following command to install Visual Studio Code CLI in the <code>/checode</code> directory.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="code">curl 'https://code.visualstudio.com/sha/download?build=stable&amp;os=cli-alpine-x64' --location -o /tmp/code.tar.gz &amp;&amp; \
tar -xvzf /tmp/code.tar.gz --directory=/checode</code></pre>
</div>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<div class="title">Important</div>
</td>
<td class="content">
<div class="paragraph">
<p>If you don&#8217;t have <code>gzip</code> installed in your workspace, you won&#8217;t be able to install the CLI using the command above.</p>
</div>
<div class="paragraph">
<p>In this case you need to:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><a href="https://code.visualstudio.com/Download">download CLI</a> for <strong>Linux x64</strong> architecture to your desktop</p>
</li>
<li>
<p>unpack and upload the extracted binary to your workspace root</p>
</li>
<li>
<p>move the binary to <code>/checode</code> directory and make it executable by <code>mv $PROJECT_SOURCE/code /checode &amp;&amp; chmod +x /checode/code</code></p>
</li>
</ol>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>By placing the Visual Studio Code CLI binary in the <code>/checode</code> directory, it will persist even if the workspace is restarted.</p>
</div>
</div>
<div class="sect2">
<h3 id="_create-a-secure-tunnel-to-the-cloud-development-environment">Create a secure tunnel to the Cloud Development Environment.</h3>
<div class="paragraph">
<p>Open the workspace terminal and launch the Visual Studio Code CLI with the command below.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="code">/checode/code tunnel --accept-server-license-terms --name $DEVWORKSPACE_NAME</code></pre>
</div>
</div>
<div class="paragraph">
<p>Log in using your Microsoft or GitHub account.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/use-desktop-visual-studio-code/cli-create-tunnel.png" alt="Create a secure tunnel to the workpace">
</div>
</div>
<div class="paragraph">
<p>After successful login, you will see the information about the created tunnel and will be prompted to open the workspace in your browser.</p>
</div>
</div>
<div class="sect2">
<h3 id="_open-your-workspace-using-local-visual-studio-code">Open your workspace using local Visual Studio Code.</h3>
<div class="paragraph">
<p>Open your local Visual Studio Code and navigate to the <strong>Remote Explorer</strong> view. A tunnel to your workspace will appear.
With the buttons on the right, open your workspace in the current or a new window.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/use-desktop-visual-studio-code/vscode-remote-explorer.png" alt="Open your workspace in local Visual Studio Code">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="paragraph">
<p>A tunnel to your workspace will not appear if you are not signed in yet.
Sign in using the same account you used to create the tunnel.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>You are now equipped to develop locally within a Cloud Development Environment.
&#160;<br>
&#160;<br>
Happy coding!</p>
</div>
</div>
</div>
</div>]]></content><author><name>Vitaliy Gulyy</name></author><summary type="html"><![CDATA[Use your local Visual Studio Code as an editor for a Che workspace]]></summary></entry><entry><title type="html">In Kubernetes We Trust</title><link href="https://che.eclipseprojects.io/2024/11/26/@ilya.buziuk-in-kubernetes-we-trust.html" rel="alternate" type="text/html" title="In Kubernetes We Trust" /><published>2024-11-26T00:00:00+00:00</published><updated>2024-11-26T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2024/11/26/@ilya.buziuk/in-kubernetes-we-trust</id><content type="html" xml:base="https://che.eclipseprojects.io/2024/11/26/@ilya.buziuk-in-kubernetes-we-trust.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Last year, the <a href="https://youtu.be/eIOZq_e-Fjs?si=lecaEpLC5vEb0-Za">"Pros and cons of using Kubernetes as a development platform"</a>  session was presented at <a href="https://www.eclipse.org/events/2023/eclipsecon/">EclipseCon</a> in Ludwigsburg. The main message was that, indeed, <a href="https://kubernetes.io/">Kubernetes</a> is complex and sometimes there are caveats and tradeoffs to make, but it is evolving rapidly with plenty of new features and opportunities available with every release. Today it is time to reflect a bit more on this topic.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_building-an-application-platform-for-developers">Building an application platform for developers</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If you are considering building your own development platform it is recommended to read the brilliant <a href="https://www.oreilly.com/library/view/production-kubernetes/9781492092292/">“Production Kubernetes”</a> book, where a multitude of potential options are described in great detail:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/in-kubernetes-we-trust/multitude-of-options-available-to-provide-an-application-platform-to-developers.png" alt="The multitude of options available to provide an application platform to developers">
</div>
</div>
<div class="paragraph">
<p>Figure 1: The multitude of options available to provide an application platform to developers.</p>
</div>
<div class="paragraph">
<p>Of course, you can always craft your own platform from scratch or even decide that the <a href="https://world.hey.com/dhh/why-we-re-leaving-the-cloud-654b47e0">cloud</a>, in general, is not your cup of tea and stop the Cloud Development Environment (CDE) journey right here since local development is good enough for your use-case and works “just fine”. Nevertheless, in <a href="https://eclipse.dev/che/">Eclipse Che</a> we strongly believe in the hybrid cloud strategy, and that Kubernetes is one of the best possible options for building a modern CDE platform for developers because of:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Extensibility</p>
</li>
<li>
<p>Scalability</p>
</li>
<li>
<p>Resource Efficiency</p>
</li>
<li>
<p>Consistency</p>
</li>
<li>
<p>High Availability</p>
</li>
<li>
<p>Control</p>
</li>
<li>
<p>Open Source</p>
</li>
<li>
<p>Community</p>
</li>
<li>
<p>Vendor Neutrality</p>
</li>
<li>
<p>Hybrid-Cloud Nature</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>However, there are a lot of subtle details worth considering when using Kubernetes as the pillar for building an application platform for developers. Some of them are described in the dedicated <a href="https://youtu.be/eIOZq_e-Fjs?si=w6_Nx-v4nwg85QgP">EclipseCon session</a> mentioned in the introduction:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Networking</p>
</li>
<li>
<p>Storage</p>
</li>
<li>
<p>Immutability</p>
</li>
<li>
<p>Permissions</p>
</li>
<li>
<p>CPU Throttling</p>
</li>
<li>
<p>OOM Kill</p>
</li>
<li>
<p>Image Pulling</p>
</li>
<li>
<p>Image Building</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>In this article you can find a few more.</p>
</div>
<div class="sect2">
<h3 id="_namespaces">Namespaces</h3>
<div class="paragraph">
<p>While there is no strict limit on the number of namespaces in a Kubernetes cluster, having more than 10,000 is generally not recommended due to potential performance and management overhead. In Eclipse Che for instance, each user is allocated a namespace. If you expect the user base to be large, consider spreading workloads across multiple clusters and potentially leveraging solutions for multi-cluster orchestration.</p>
</div>
</div>
<div class="sect2">
<h3 id="_gitops">GitOps</h3>
<div class="paragraph">
<p>Do NOT manage the Kubernetes clusters manually otherwise you will end up with a snowflake environment. Application definitions, configurations, and environments should be declarative and version controlled. Application deployment and lifecycle management should be automated, auditable, and easy to understand. Using a GitOps CD solution for Kubernetes such as <a href="https://argo-cd.readthedocs.io/">Argo CD</a> is a must-have when managing a complex application platform for developers.</p>
</div>
</div>
<div class="sect2">
<h3 id="_root-access">Root Access</h3>
<div class="paragraph">
<p>Containers running as root on a cluster are a major security risk since they significantly increase the attack surface, potentially allowing root access over the host node. That is the main reason why the containers on <a href="https://www.redhat.com/en/technologies/cloud-computing/openshift">OpenShift</a> are running using <a href="https://cookbook.openshift.org/users-and-role-based-access-control/why-do-my-applications-run-as-a-random-user-id.html">Arbitrary User IDs</a> by default. This approach provides additional security against processes escaping the container due to a container engine vulnerability, thereby achieving escalated permissions on the host node. This basic principle applies to CDEs as well. It might look like a trade-off between security and usability, when users cannot easily install OS-scoped packages in the runtime. However, dynamically installing packages in a running workspace is an anti-pattern - containers are supposed to be immutable, and installing anything inside a running container is not recommended since all the packages will vanish after the restart.  There is also the added benefit of maintaining workspace consistency across different users by adhering to the immutable principle for container images used in the CDE.</p>
</div>
</div>
<div class="sect2">
<h3 id="_emptydir-volumes">emptyDir Volumes</h3>
<div class="paragraph">
<p>Volume mounting could be by far the most time-consuming operation during pod startup. Consider leveraging ephemeral workloads whenever relevant which are using  <a href="https://kubernetes.io/docs/concepts/storage/volumes/#emptydir">emptyDir</a> volumes under the hood. In the context of Eclipse Che, those are ephemeral workspaces that could be particularly useful for developer routines like code review, with the dedicated storage type defined on the <a href="https://devfile.io/">devfile</a> level:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>schemaVersion: 2.3.0
metadata:
  generateName: quarkus-api-example
attributes:
  controller.devfile.io/storage-type: ephemeral</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_cluster-autoscaling">Cluster Autoscaling</h3>
<div class="paragraph">
<p>Although <a href="https://kubernetes.io/docs/concepts/cluster-administration/cluster-autoscaling/">Cluster Autoscaling</a> is a powerful Kubernetes feature, you cannot always fall back on it and should always consider predictive scaling by analyzing load data on your environment to detect daily or weekly usage patterns. If your workloads follow a pattern and there are dramatic peaks throughout the day you should consider provisioning worker nodes accordingly (e.g. a lot of users turn on their smart speakers in the morning between 7 - 9 a.m. causing a huge spike in requests that can be predicted and handled in advance on the infrastructure level).</p>
</div>
</div>
<div class="sect2">
<h3 id="_cpu-limits">CPU Limits</h3>
<div class="paragraph">
<p>Setting CPU Limits in general is a contended topic for production workloads, since If you apply them the workloads are throttled by definition. Limits for CPU for soft-tenancy pods are probably not going to be helpful unless you are approaching very dense setups (&gt; 10 pods per core) - otherwise, you will waste more CPU by throttling than you save. CPU Limits definitely increase tail latencies for most non-predictable workloads (almost all request-driven use cases) in a way that will result in a worse overall application environment for most users most of the time (because of how limits are sliced).  At lower pods per core, you are almost certainly trading a false security for a worse quality of service for the workloads you are running on Kubernetes.</p>
</div>
<div class="paragraph">
<p>CPU Limits are most useful when dealing with bad actors on your own platform, and even then, there are far more effective ways of dealing with bad actors like detection and account blocking.  However, in the case of CDEs, you may consider applying the limits on the namespace level to prevent developers from accidentally saturating a compute node. If you apply limits, you must make sure the limits are high enough to allow normal bursts of CPU usage during the inner-loop activities.  Otherwise, developers may experience unexpected performance issues during CPU-intensive activities.</p>
</div>
</div>
<div class="sect2">
<h3 id="_ephemeral-containers">Ephemeral Containers</h3>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers/">Ephemeral Containers</a> is a great example of how Kubernetes features are providing new opportunities for building application platforms for developers every release. Last year we talked about Ephemeral Containers at EclipseCon as a potential new opportunity for Cloud Development Environments. This year a <a href="https://github.com/devfile/kubectl-debug-ide">kubectl plugin</a> for debugging Kubernetes pods from a CDE, rather than the CLI has been presented at <a href="https://youtu.be/fg57Zmm4eN4?si=8LyyRsud6lMJg59h">KubeCon</a>.</p>
</div>
</div>
<div class="sect2">
<h3 id="_dynamic-resource-allocation-dra">Dynamic Resource Allocation (DRA)</h3>
<div class="paragraph">
<p><a href="https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/">Dynamic Resource Allocation (DRA)</a> is yet another striking example of how Kubernetes features are providing new opportunities for developers with every release. With the push for GPU-centric applications, DRA was presented all throughout the last <a href="https://notes.elmiko.dev/2024/11/19/kubecon-na-2024-retrospective.html">KubeCon North America 2024</a>. It speaks to the popularity of AI-related workloads that require specific resources, and while today DRA mostly targets GPUs, it is very well possible that one day we will be talking about DRA for everything from CPUs and memory to customized hardware accelerators in the future.</p>
</div>
</div>
<div class="sect2">
<h3 id="_release-notes">Release Notes</h3>
<div class="paragraph">
<p>To maximize the potential of your Kubernetes-based developer platform, consistently review the <a href="https://kubernetes.io/releases/notes/">Release Notes</a>. They offer a treasury of opportunities for innovative features,  performance enhancements, optimizations, recommended configurations, best practices, and strategic planning based on future roadmap insights.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_adoption">Adoption</h2>
<div class="sectionbody">
<div class="paragraph">
<p>For the last few years, we have seen a spike in the adoption of <a href="https://eclipse.dev/che/">Eclipse Che</a> and the downstream product <a href="https://developers.redhat.com/products/openshift-dev-spaces">Red Hat OpenShift Dev Spaces</a> built on top of it. Multiple success stories when the Kubernetes-based platform for provisioning CDEs to enterprise teams is deployed across public, private, and hybrid environments motivate and encourage us every day. Here are just a few public references:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>EPAM Systems deploys Eclipse Che on <a href="https://che.eclipseprojects.io/2022/07/25/@karatkep-installing-eclipse-che-on-aks.html">Azure Kubernetes Service (AKS)</a>.</p>
</li>
<li>
<p><a href="https://www.youtube.com/watch?v=NYCFzNDdXTk">Ford Motor Company</a> uses fit-for-purpose OpenShift clusters and a dedicated Kubernetes Operator for managing CDEs.</p>
</li>
<li>
<p><a href="https://www.redhat.com/en/success-stories/capgemini">Capgemini</a> accelerates digital service development for the Federal Information Technology Center (ITZBund) using Red Hat OpenShift Dev Spaces Operator in combination with <a href="https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/index.html">NVIDIA vGPU Operator</a> for managing CDEs in the 100% air-gapped environment, isolated from the internet.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We trust in Kubernetes and do believe in the hybrid cloud. Open Source is in our DNA.</p>
</div>
</div>
</div>]]></content><author><name>Ilya Buziuk</name></author><summary type="html"><![CDATA[Building an application platform for developers on Kubernetes]]></summary></entry><entry><title type="html">Boosting CDE Security in a Kubernetes cluster: A Guide to new features</title><link href="https://che.eclipseprojects.io/2024/10/28/@tolusha-boosting-cde-security-on-kubernetes-cluster.html" rel="alternate" type="text/html" title="Boosting CDE Security in a Kubernetes cluster: A Guide to new features" /><published>2024-10-28T00:00:00+00:00</published><updated>2024-10-28T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2024/10/28/@tolusha/boosting-cde-security-on-kubernetes-cluster</id><content type="html" xml:base="https://che.eclipseprojects.io/2024/10/28/@tolusha-boosting-cde-security-on-kubernetes-cluster.html"><![CDATA[<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>As organizations transition to cloud-native development, maintaining control, security, and flexibility in development environments becomes critical. Eclipse Che is a powerful Kubernetes-native IDE that offers administrators tools for ensuring security and resource efficiency. In this post, we&#8217;ll look at three new Eclipse Che features that improve security and resource control in your development environments.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_limiting-the-number-of-simultaneous-workspaces">Limiting the Number of Simultaneous Workspaces</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Effective resource management is critical in cloud-based environments, as uncontrolled workspace development can quickly deplete resources and degrade system performance. To mitigate this risk, Eclipse Che now has a functionality that restricts the amount of running workspaces per cluster.</p>
</div>
<div class="paragraph">
<p>Administrators can use this feature to limit the amount of workspaces that can run at the same time, reducing resource misuse, supporting fair allocation of resources among teams, and increasing overall efficiency.</p>
</div>
<div class="paragraph">
<p>In the example below, we set the maximum number of running workspaces per cluster to 20:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="shell">kubectl patch checluster/eclipse-che <span style="color: #ae81ff">\</span>
  <span style="color: #f92672">--namespace</span> eclipse-che <span style="color: #ae81ff">\</span>
  <span style="color: #f92672">--type</span><span style="color: #f92672;font-weight: bold">=</span><span style="color: #e6db74">'merge'</span> <span style="color: #f92672">-p</span> <span style="color: #ae81ff">\</span>
    <span style="color: #e6db74">'{"spec":
        {"devEnvironments":
          {"maxNumberOfRunningWorkspacesPerCluster": 20}
        }
     }'</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>If a user exceeds the workspace limit, they will receive a warning message during workspace startup: "Exceeded the cluster limit for running DevWorkspaces"</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/boosting-cde-security-on-kubernetes-cluster/exceeded-the-cluster-limit-for-running-devworkspaces.png" alt="Exceeded the cluster limit for running DevWorkspaces">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
<div class="paragraph">
<p>To learn more about configuring workspace limits, follow the <a href="https://eclipse.dev/che/docs/stable/administration-guide/limiting-the-number-of-workspaces-that-all-users-can-run-simultaneously">Eclipse Che documentation</a>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_untrusted-repository-warning">Untrusted Repository Warning</h2>
<div class="sectionbody">
<div class="paragraph">
<p>It is not recommended to create workspaces from unknown or untrusted repositories automatically. When a user tries to create a workspace in Eclipse Che, a warning window appears on the dashboard, requesting confirmation that they trust the repository before proceeding.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/boosting-cde-security-on-kubernetes-cluster/do-you-trust-the-authors-of-this-repository.png" alt="URL is not permitted for creating a workspace">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_configuring-allowed-urls">Configuring Allowed URLs</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This feature ensures that developer workspaces can only be launched from pre-approved, secure URLs. Organizations can prevent workspaces from being started with unwanted URLs by creating a allowlist of trusted domains.</p>
</div>
<div class="paragraph">
<p>In the example below, we configure the allowed URLs to only permit connections to GitLab:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="shell">kubectl patch checluster/eclipse-che <span style="color: #ae81ff">\</span>
    <span style="color: #f92672">--namespace</span> eclipse-che <span style="color: #ae81ff">\</span>
    <span style="color: #f92672">--type</span><span style="color: #f92672;font-weight: bold">=</span><span style="color: #e6db74">'merge'</span> <span style="color: #ae81ff">\</span>
    <span style="color: #f92672">-p</span> <span style="color: #ae81ff">\</span>
        <span style="color: #e6db74">'{
           "spec": {
             "devEnvironments": {
               "allowedSources": {
                 "urls": ["https://gitlab.com/*"]
               }
             }
           }
         }'</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>If a user attempts to create a workspace with a URL other than GitLab, they will receive an error message: "URL is not permitted for creating a workspace".</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/boosting-cde-security-on-kubernetes-cluster/url-is-not-permitted-for-creating-a-workspace.png" alt="URL is not permitted for creating a workspace">
</div>
</div>
<div class="paragraph">
<p>&#160;<br></p>
</div>
<div class="paragraph">
<p>To learn more about configuring allowed URLs, follow the <a href="https://eclipse.dev/che/docs/stable/administration-guide/configuring-allowed-urls-for-cloud-development-environments/">Eclipse Che documentation</a>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_conclusion">Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Eclipse Che&#8217;s new security features, such as limiting simultaneous workspaces and configuring allowed URLs, give administrators greater control over resource usage and workspace security in cloud-native environments. Implementing these updates allows organizations to improve the efficiency and safety of their development workflows, resulting in a secure and well-regulated workspace.</p>
</div>
</div>
</div>]]></content><author><name>Anatolii Bazko</name></author><summary type="html"><![CDATA[Boosting CDE Security on Kubernetes cluster: A Guide to new features]]></summary></entry><entry><title type="html">Writing documentation in Eclipse Che</title><link href="https://che.eclipseprojects.io/2024/08/09/@deerskindoll-writing-docs-with-che.html" rel="alternate" type="text/html" title="Writing documentation in Eclipse Che" /><published>2024-08-09T00:00:00+00:00</published><updated>2024-08-09T00:00:00+00:00</updated><id>https://che.eclipseprojects.io/2024/08/09/@deerskindoll/writing-docs-with-che</id><content type="html" xml:base="https://che.eclipseprojects.io/2024/08/09/@deerskindoll-writing-docs-with-che.html"><![CDATA[<div class="sect1">
<h2 id="_the-quick-and-easy-way-to-create-documentation">The quick and easy way to create documentation</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With Eclipse Che, writing technical documentation is even easier than you think.
Let&#8217;s use the <a href="https://github.com/eclipse-che/che-docs">Eclipse Che documentation repository on GitHub</a>.
The che-docs repository was created with community contribution in mind,
featuring tools you need to create and test your content.
And from the initial draft to submitting a PR,
everything is happening in the environment you&#8217;re already familiar with: an Eclipse Che cloud development environment (CDE).</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/contributing-to-eclipse-che-docs/workspace-with-preview.png" alt="An Eclipse Che CDE created from the che-docs repository.">
</div>
<div class="title">Figure 1. An Eclipse Che CDE created from the che-docs repository.</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_getting-started">Getting started</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Click the Developer Workspace button in the che-docs repository <a href="https://github.com/eclipse-che/che-docs?tab=readme-ov-file#eclipse-che-documentation-project">README</a> file.
This opens a clone of the repository in an Eclipse Che workspace hosted
by Red Hat in the <a href="https://developers.redhat.com/developer-sandbox">Developer Sandbox</a>.
Alternatively, you can click right here:</p>
</div>
<div class="imageblock">
<div class="content">
<a class="image" href="https://workspaces.openshift.com#https://github.com/eclipse/che-docs"><img src="https://www.eclipse.org/che/contribute.svg" alt="contribute"></a>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_how-does-it-work">How does it work?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>What about the che-docs repository makes using an Eclipse Che CDE to contribute content so convenient? The following two elements:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://eclipse.dev/che/docs/stable/end-user-guide/devfile-introduction/">devfile</a></p>
</li>
<li>
<p>list of <a href="https://eclipse.dev/che/docs/stable/end-user-guide/microsoft-visual-studio-code-open-source-ide/#automating-installation-of-microsoft-visual-studio-code-extensions-at-workspace-startup">automatically installed Microsoft Visual Studio Code extensions</a></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Let&#8217;s look at the devfile first.
The che-docs repository contains a simple <a href="https://github.com/eclipse-che/che-docs/blob/main/devfile.yaml">devfile</a>
that defines the basic features of the che-docs workspace.
It also includes a command for building a preview of your newly created content:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="code"># sh tools/preview.sh</code></pre>
</div>
</div>
<div class="paragraph">
<p>This is helpful not only for checking the layout of the document but also for making sure that embedded images,
links and code blocks are displayed correctly.
Additionally, the preview script features a Vale-based grammar check you can also use separately.
More about this in a moment.</p>
</div>
<div class="paragraph">
<p>By default, the che-docs workspace launches with Visual Studio Code - Open Source ("Code - OSS") as the IDE.
This is relevant for the second file mentioned above.
The che-docs repository features an <a href="https://github.com/eclipse-che/che-docs/blob/main/.vscode/extensions.json">extensions.json</a> file listing Visual Studio Code extensions
you need for writing Eclipse Che content.
When you launch the che-docs workspace for the first time,
these extensions are installed automatically:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/contributing-to-eclipse-che-docs/extensions.png" alt="Overview of automatically installed extensions, including the Vale extension.">
</div>
<div class="title">Figure 2. Overview of automatically installed extensions, including the Vale extension.</div>
</div>
<div class="paragraph">
<p>You can start working immediately,
with minimal additional setup required.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_getting-started-2">Getting started</h2>
<div class="sectionbody">
<div class="paragraph">
<p>By launching the che-docs workspace, you&#8217;re almost ready to go:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>You have a clone of the che-docs repository</p>
</li>
<li>
<p>You have an IDE to write in.</p>
</li>
<li>
<p>You have required extensions installed.</p>
</li>
<li>
<p>You have a preview build script.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>There are only three things left to do.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Read the <a href="https://github.com/eclipse-che/che-docs/blob/main/CONTRIBUTING.adoc">contribution guidelines</a>.</p>
</li>
<li>
<p>Read how to <a href="https://redhat-documentation.github.io/supplementary-style-guide/#technical-examples">document commands</a> for Eclipse Che documentation.</p>
</li>
<li>
<p>Update the grammar- and spelling-checking <a href="https://marketplace.visualstudio.com/items?itemName=ChrisChinchilla.vale-vscode">Vale extension</a> by running the <code>vale-sync</code> command defined in the <a href="https://github.com/eclipse-che/che-docs/blob/main/devfile.yaml">devfile</a> or directly execute it in the terminal:</p>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight" style="color: #f8f8f2;background-color: #49483e"><code data-lang="code"># vale sync</code></pre>
</div>
</div>
</li>
</ol>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="paragraph">
<p>The Vale extension included in the che-docs repository follows the grammatical,
spelling and stylistic rules from the <a href="https://redhat-documentation.github.io/supplementary-style-guide/">Red Hat supplementary style guide</a>.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_writing-tips">Writing tips</h2>
<div class="sectionbody">
<div class="paragraph">
<p>A good technical document is easy to read and easy to follow.
Here are a few tips that will help you write great technical content:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Keep it simple. Avoid self-referential language ("this article is about&#8230;&#8203;"), overly long introductions, and deep-dives into the feature&#8217;s history.</p>
</li>
<li>
<p>Keep it accessible. Short paragraphs, sentences and words make your content easy to read.</p>
</li>
<li>
<p>Keep the focus on the user. Write the content around what the user can achieve when they follow your instructions.</p>
</li>
<li>
<p>Keep passive voice to a minimum.</p>
</li>
</ul>
</div>
<div class="imageblock">
<div class="content">
<img src="/assets/img/contributing-to-eclipse-che-docs/pp-hemingway.png" alt="The famous opening lines of Jane Austen&#8217;s Pride and Prejudice novel don&#8217;t follow any of the writing tips listed in this blog post. At grade 16, they also have a very high readability score in the Hemingway Editor. Your technical document should have a readability score between grade 9 and 11.">
</div>
<div class="title">Figure 3. The famous opening lines of Jane Austen&#8217;s Pride and Prejudice novel don&#8217;t follow any of the writing tips listed in this blog post. At grade 16, they also have a very high readability score in the Hemingway Editor. Your technical document should have a readability score between grade 9 and 11.</div>
</div>
<div class="paragraph">
<p>If you want to learn more about technical writing in general,
check out the <a href="https://developers.google.com/style">Google developer documentation style guide</a>.
The readability test is a part of the <a href="https://hemingwayapp.com/">Hemingway Editor</a>.</p>
</div>
<div class="paragraph">
<p>Happy writing!</p>
</div>
</div>
</div>]]></content><author><name>Jana Vrbkova</name></author><summary type="html"><![CDATA[Write documentation using an Eclipse Che CDE.]]></summary></entry></feed>