<?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: Charming</title>
    <description>The latest articles on DEV Community by Charming (usecharming).</description>
    <link>https://dev.to/usecharming</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%2Forganization%2Fprofile_image%2F14120%2F9bb5a09a-19d1-48c5-9f48-cf8a3fe88466.png</url>
      <title>DEV Community: Charming</title>
      <link>https://dev.to/usecharming</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/usecharming"/>
    <language>en</language>
    <item>
      <title>How to host an app your AI built: its own URL and saved data</title>
      <dc:creator>Akhilesh Rangani</dc:creator>
      <pubDate>Fri, 24 Jul 2026 20:17:03 +0000</pubDate>
      <link>https://dev.to/usecharming/how-to-host-an-app-your-ai-built-with-its-own-url-and-saved-data-18ma</link>
      <guid>https://dev.to/usecharming/how-to-host-an-app-your-ai-built-with-its-own-url-and-saved-data-18ma</guid>
      <description>&lt;p&gt;Claude can write a working app right inside a chat. Close the chat and it's gone: no URL, no saved data, nothing to open tomorrow. This is how you turn that throwaway app into a hosted one with its own URL and a database behind it. The example is a reading list, live at &lt;a href="https://charm.ing/avi/reading-list?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=host-app-built-with-claude"&gt;charm.ing/avi/reading-list&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The thing doing the hosting is &lt;a href="https://usecharming.com/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=host-app-built-with-claude"&gt;Charming&lt;/a&gt;. Claude writes the code, Charming runs it. You keep using Claude, or whatever agent you already pay for. Charming is just where the app lives once the conversation ends.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://usecharming.com/blog/how-to-host-an-app-built-with-claude?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=host-app-built-with-claude"&gt;canonical guide&lt;/a&gt; has the full walkthrough and screenshots. This version is for developers: how the connector hooks up, what the published module looks like, and how other agents reach it afterward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect Charming to Claude
&lt;/h2&gt;

&lt;p&gt;Charming plugs into Claude as a custom MCP connector. One-time setup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://claude.ai/customize/connectors" rel="noopener noreferrer"&gt;claude.ai/customize/connectors&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Add custom connector&lt;/strong&gt;, name it Charming, and paste the connector URL: &lt;code&gt;https://charm.ing/mcp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Approve it so Claude can call Charming's tools.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Screenshots and troubleshooting: &lt;a href="https://usecharming.com/setup/claude/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=host-app-built-with-claude"&gt;usecharming.com/setup/claude&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask Claude to build it, then publish it
&lt;/h2&gt;

&lt;p&gt;In a normal Claude chat:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build me a reading list app. I want to add books with a title and author, move each one between to-read, reading, and read, and give finished books a star rating.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude writes it and previews it inline. So far it's just like any other in-chat app. Then:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create this on Charming so it has its own URL and saves my data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude calls the connector and hands back a live URL. That's your hosted app, with storage behind it and an API other agents can call later.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Claude actually publishes
&lt;/h2&gt;

&lt;p&gt;Under the connector, Claude authors and ships one ES module with two named exports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;manifest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;reading-list&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.0.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Reading list&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;buildy:storage/kv@1.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// gives the handlers env.storage&lt;/span&gt;
    &lt;span class="na"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&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;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;op&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;list&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storage&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;books&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;op&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;add&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;books&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storage&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;books&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
      &lt;span class="nx"&gt;books&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;to-read&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;books&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;books&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;books&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No server to stand up, no database to provision. &lt;code&gt;env.storage&lt;/code&gt; is per-app key/value storage that survives every later update, and each declared route becomes a discoverable operation at &lt;code&gt;/app/&amp;lt;id&amp;gt;/api/*&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same app, reachable two ways
&lt;/h2&gt;

&lt;p&gt;Once it's published you're not locked into the chat that built it. Two ways in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Over MCP: point any MCP-capable agent at &lt;code&gt;https://charm.ing/mcp&lt;/code&gt; and it can read or write the same app's data.&lt;/li&gt;
&lt;li&gt;Over HTTP: &lt;code&gt;POST https://charm.ing/api/pair/start&lt;/code&gt; pairs an agent to your account. From there &lt;code&gt;POST /app&lt;/code&gt; creates an app and &lt;code&gt;PUT /app/&amp;lt;id&amp;gt;&lt;/code&gt; updates one, and every declared route is callable at &lt;code&gt;/app/&amp;lt;id&amp;gt;/api/&amp;lt;op&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One data store, more than one agent. From a fresh chat I asked Claude to add the Harry Potter series to the same list. It read the existing app over the connector and queued all seven as to-read. I never touched the storage layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reopen it later
&lt;/h2&gt;

&lt;p&gt;Close the Claude conversation. Open the app's URL again days later, in a new tab. Everything's still there: the books, the statuses, the ratings. They live in Charming's storage, not in the chat transcript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://usecharming.com/blog/how-to-host-an-app-built-with-claude?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=host-app-built-with-claude"&gt;Canonical guide (screenshots and the full walkthrough)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://charm.ing/avi/reading-list?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=host-app-built-with-claude"&gt;Live demo: the reading list&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://usecharming.com/setup/claude/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=host-app-built-with-claude"&gt;Claude connector setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tambo-labs/charming-mcp" rel="noopener noreferrer"&gt;Public repo: Charming MCP server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>webdev</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
