<?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>Forem: Federico De Ponte</title>
    <description>The latest articles on Forem by Federico De Ponte (@fedeponte).</description>
    <link>https://forem.com/fedeponte</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3867911%2F30f5c8ff-5a20-4f96-9216-0f43407a57b3.jpg</url>
      <title>Forem: Federico De Ponte</title>
      <link>https://forem.com/fedeponte</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/fedeponte"/>
    <language>en</language>
    <item>
      <title>I deployed a Python agent to the cloud in 45 seconds. Here's how.</title>
      <dc:creator>Federico De Ponte</dc:creator>
      <pubDate>Wed, 08 Apr 2026 13:58:02 +0000</pubDate>
      <link>https://forem.com/fedeponte/i-deployed-a-python-agent-to-the-cloud-in-45-seconds-heres-how-4hde</link>
      <guid>https://forem.com/fedeponte/i-deployed-a-python-agent-to-the-cloud-in-45-seconds-heres-how-4hde</guid>
      <description>&lt;p&gt;Last week I built a small Python script that takes a URL and summarizes the page using Claude. Ran it locally, worked great. Then I needed to share it with a colleague who doesn't have Python installed, doesn't know what a virtual environment is, and definitely isn't going to clone a repo.&lt;/p&gt;

&lt;p&gt;This is a problem I keep running into. You build something useful in 20 minutes, then spend the rest of the afternoon figuring out how to let other people use it. Docker? Overkill for a single script. A Flask app with a frontend? Now you're maintaining two things. Throw it on a VM? Cool, now you're ops.&lt;/p&gt;

&lt;p&gt;I wanted something simpler: take my Python function, make it available at a URL with a UI that anyone can use.&lt;/p&gt;

&lt;p&gt;So I built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;

&lt;p&gt;Here's the actual code. A URL summarizer that lets you pick the output style:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Anthropic&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bullets&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-20250514&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize this page as &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;summary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the whole thing. A &lt;code&gt;run()&lt;/code&gt; function that takes inputs, does something, returns a dict.&lt;/p&gt;

&lt;h2&gt;
  
  
  The deploy
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;npx floom deploy summarizer.py
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No Dockerfile. No YAML. No CI pipeline. Floom reads the script, figures out the dependencies, tests it in a sandbox, and deploys it.&lt;/p&gt;

&lt;p&gt;You get back a live URL: &lt;code&gt;dashboard.floom.dev/a/url-summarizer&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;p&gt;That URL gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;web UI&lt;/strong&gt; with typed input fields (the &lt;code&gt;url&lt;/code&gt; and &lt;code&gt;style&lt;/code&gt; parameters become form fields automatically)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;REST API&lt;/strong&gt; you can call from other services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Managed secrets&lt;/strong&gt;, so your API keys aren't in the code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version history&lt;/strong&gt; and rollback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The person I needed to share this with opened the link, pasted a URL, hit run, and got a summary. No setup, no install, no "can you pip install this first."&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works under the hood
&lt;/h2&gt;

&lt;p&gt;Floom looks at your &lt;code&gt;run()&lt;/code&gt; function signature and builds a manifest: what inputs it needs, what types they are, what it returns. It spins up an E2B sandbox, installs your dependencies, runs a test to make sure nothing explodes, then deploys it.&lt;/p&gt;

&lt;p&gt;Your secrets (API keys, tokens) are encrypted and injected at runtime. They never touch the code or the manifest.&lt;/p&gt;

&lt;p&gt;The whole thing is built on Convex for the backend and E2B for sandboxed execution. Your code runs in isolated containers, not on some shared server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;I kept watching the same pattern: someone builds an AI agent or automation that's genuinely useful, and it lives on their laptop forever because the gap between "working script" and "thing other people can use" is absurdly wide.&lt;/p&gt;

&lt;p&gt;The tools exist to close that gap, but they're all designed for production engineering teams, not for someone who wrote a useful script on a Saturday.&lt;/p&gt;

&lt;p&gt;Floom is the production layer for AI agents. You write Python, it handles everything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's open source
&lt;/h2&gt;

&lt;p&gt;The whole thing is MIT licensed. The repo is at &lt;a href="https://github.com/floomhq/floom" rel="noopener noreferrer"&gt;github.com/floomhq/floom&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can deploy from Claude Code, Cursor, or any MCP-capable agent. Tell your agent "deploy this on floom" and it knows what to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;If you've ever built something useful that's stuck on your laptop, check out &lt;a href="https://floom.dev" rel="noopener noreferrer"&gt;floom.dev&lt;/a&gt;. It's open source, and deploying your first script is free.&lt;/p&gt;

</description>
      <category>automation</category>
    </item>
  </channel>
</rss>
