<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ege Demir</title>
    <description>The latest articles on DEV Community by Ege Demir (@demegire).</description>
    <link>https://dev.to/demegire</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4239147%2F21547f83-60a4-4ac3-80d4-fbc2240ec2ab.jpg</url>
      <title>DEV Community: Ege Demir</title>
      <link>https://dev.to/demegire</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/demegire"/>
    <language>en</language>
    <item>
      <title>How Tin runs marketing workflows with Temporal and E2B</title>
      <dc:creator>Ege Demir</dc:creator>
      <pubDate>Wed, 11 Nov 2026 13:20:16 +0000</pubDate>
      <link>https://dev.to/demegire/how-tin-runs-marketing-workflows-with-temporal-and-e2b-b6f</link>
      <guid>https://dev.to/demegire/how-tin-runs-marketing-workflows-with-temporal-and-e2b-b6f</guid>
      <description>&lt;p&gt;I’m working on &lt;a href="https://tin.computer/" rel="noopener noreferrer"&gt;Tin&lt;/a&gt;, an open-source marketing system for coding agents. This post walks through the architecture in our &lt;a href="https://github.com/tin-computer/tin" rel="noopener noreferrer"&gt;public repository&lt;/a&gt;: how we separate an agent conversation from work that must survive retries, schedules and human review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a chat session is not enough
&lt;/h2&gt;

&lt;p&gt;A marketing task often spans several systems. Research produces files. A content draft waits for review. A scheduled run starts after the original conversation ends. A provider request can fail after an external action has already happened.&lt;/p&gt;

&lt;p&gt;The useful unit of work is therefore a versioned workflow attached to a project, with inspectable inputs and durable outputs. The agent helps choose and configure the work; the workflow system tracks its execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  The components and their responsibilities
&lt;/h2&gt;

&lt;p&gt;Tin exposes a remote MCP endpoint for coding agents. The service uses Python and FastAPI, with PostgreSQL for application state. Temporal coordinates durable execution, and E2B supplies isolated compute. Project repositories hold artifacts beyond the lifetime of an individual sandbox.&lt;/p&gt;

&lt;p&gt;The boundaries matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP:&lt;/strong&gt; discover workflows, inspect prerequisites, start authorized work and inspect results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporal:&lt;/strong&gt; coordinate retries, schedules and waits, including pauses for human review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E2B:&lt;/strong&gt; execute the steps that need an isolated environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project repositories:&lt;/strong&gt; retain the files the work produces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL:&lt;/strong&gt; maintain the product-facing view of projects, runs and review state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See the &lt;a href="https://github.com/tin-computer/tin/blob/main/README.md#architecture" rel="noopener noreferrer"&gt;architecture documentation&lt;/a&gt; and &lt;a href="https://github.com/tin-computer/tin/blob/main/src/tin_lite/workflows.py" rel="noopener noreferrer"&gt;workflow implementation&lt;/a&gt; for the concrete code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep execution history small
&lt;/h2&gt;

&lt;p&gt;Durable execution has a different data model from a chat transcript. Tin’s architecture keeps workflow history focused on identifiers and coordination, while I/O happens in activities. Prompts, credentials and large artifacts do not belong in that history.&lt;/p&gt;

&lt;p&gt;This also avoids treating a long execution log as the product database. The UI needs a practical view of the current run and its outputs, while the execution engine needs enough history to coordinate the work reliably. Those responsibilities are related, but they are different.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version definitions, then inspect before running
&lt;/h2&gt;

&lt;p&gt;A repeatable workflow needs more than a memorable name. Its definition and configuration must be identifiable so that a scheduled run does not silently become a different procedure after an edit. Tin pins workflow versions and exposes inputs and prerequisites for inspection.&lt;/p&gt;

&lt;p&gt;From an agent, the basic sequence is discovery, inspection, configuration and execution. Some workflows need a service connection or account resources before they are ready. Project membership remains the access boundary; knowing a workflow or project identifier is not sufficient authorization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retrying coordination is not the same as retrying an effect
&lt;/h2&gt;

&lt;p&gt;Retries are useful for transient failures, but an external action needs special care. If a provider accepted a request before a connection failed, blindly repeating it can duplicate the effect. Durable orchestration does not automatically make arbitrary third-party actions exactly once.&lt;/p&gt;

&lt;p&gt;The practical design is to keep stable identifiers, record the product state, use provider idempotency where supported and preserve the review boundary around external actions. The exact handling depends on the workflow and provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let sandboxes end without losing the work
&lt;/h2&gt;

&lt;p&gt;E2B gives a run an isolated environment, but a sandbox should not be the only copy of an output. Research notes, drafts and reports need to remain available when that environment is gone. Tin keeps artifacts in project repositories so another run or agent session can inspect the files later.&lt;/p&gt;

&lt;p&gt;That persistence is also useful for review: a person can inspect an actual artifact rather than relying only on a conversational summary of what was produced.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the hosted MCP endpoint
&lt;/h2&gt;

&lt;p&gt;For Claude Code, the repository documents this connection command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add --transport http tin https://app.tin.computer/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will need a Tin account and a project. Individual workflows can also require connected services and credits. Start by inspecting available workflows and their prerequisites before executing anything.&lt;/p&gt;

&lt;p&gt;Tin is &lt;a href="https://github.com/tin-computer/tin/blob/main/LICENSE" rel="noopener noreferrer"&gt;Apache-2.0 licensed&lt;/a&gt;. The hosted app is available at &lt;a href="https://app.tin.computer/" rel="noopener noreferrer"&gt;app.tin.computer&lt;/a&gt;. Self-hosting currently requires engineering setup and managed-service configuration; the repository is not a turnkey self-hosting package.&lt;/p&gt;

&lt;p&gt;If you build durable workflows around coding agents, I’d be interested in how you separate orchestration state, human review and persistent artifacts.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>python</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
