<?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: Aleksandr Kubarskii</title>
    <description>The latest articles on DEV Community by Aleksandr Kubarskii (@__89569).</description>
    <link>https://dev.to/__89569</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%2F2821002%2Fd139494e-2c74-4254-a82a-3394fa5bbc22.JPG</url>
      <title>DEV Community: Aleksandr Kubarskii</title>
      <link>https://dev.to/__89569</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/__89569"/>
    <language>en</language>
    <item>
      <title>I'm building Inquir Compute. Here's how deployment works.</title>
      <dc:creator>Aleksandr Kubarskii</dc:creator>
      <pubDate>Mon, 05 Oct 2026 12:15:21 +0000</pubDate>
      <link>https://dev.to/__89569/im-building-inquir-compute-heres-how-deployment-works-1723</link>
      <guid>https://dev.to/__89569/im-building-inquir-compute-heres-how-deployment-works-1723</guid>
      <description>&lt;p&gt;I'm building &lt;a href="https://inquir.org/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=compute_intro" rel="noopener noreferrer"&gt;Inquir Compute&lt;/a&gt;, a cloud platform for apps, databases, and background jobs.&lt;/p&gt;

&lt;p&gt;The kind of setup I have in mind is pretty common: an API, PostgreSQL, and maybe a worker. I can put those on a VPS, but then I'm also setting up HTTPS, collecting logs, and maintaining deployment scripts. For a small project, I'd rather spend that time on the app.&lt;/p&gt;

&lt;p&gt;Inquir lets you deploy from a GitHub repository, a Dockerfile, or an existing container image. The app can stay a regular HTTP server. You don't have to rewrite it around a platform-specific handler.&lt;/p&gt;

&lt;p&gt;Here's how deployment works with a small Node.js app. We'll deploy it, check a second version on a preview URL, and then roll back.&lt;/p&gt;

&lt;h2&gt;
  
  
  The app
&lt;/h2&gt;

&lt;p&gt;You'll need Node.js 22 or later for the CLI and an Inquir account with available resources. Use a workspace where you're the owner or an admin so you can promote releases. There's a note about account access at the end.&lt;/p&gt;

&lt;p&gt;Create a directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;inquir-demo
&lt;span class="nb"&gt;cd &lt;/span&gt;inquir-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add &lt;code&gt;server.mjs&lt;/code&gt;:&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:http&lt;/span&gt;&lt;span class="dl"&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;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&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="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isInteger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;65535&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PORT must be an integer between 1 and 65535&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&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;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;v1&lt;/span&gt;&lt;span class="dl"&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;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&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="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/healthz&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeHead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&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;content-type&lt;/span&gt;&lt;span class="dl"&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;text/plain; charset=utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ok&lt;/span&gt;&lt;span class="dl"&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&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="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeHead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&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;content-type&lt;/span&gt;&lt;span class="dl"&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;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from Inquir&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeHead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&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;content-type&lt;/span&gt;&lt;span class="dl"&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;text/plain; charset=utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Not found&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&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.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Listening on &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="k"&gt;for &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;signal&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SIGTERM&lt;/span&gt;&lt;span class="dl"&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;SIGINT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;once&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&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="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&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="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;unref&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;The app returns its version at &lt;code&gt;/&lt;/code&gt; and responds to health checks at &lt;code&gt;/healthz&lt;/code&gt;. It listens on &lt;code&gt;0.0.0.0&lt;/code&gt;, reads &lt;code&gt;PORT&lt;/code&gt; from the environment, and handles shutdown signals. There are no external dependencies.&lt;/p&gt;

&lt;p&gt;Add a &lt;code&gt;Dockerfile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:22-alpine&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; NODE_ENV=production&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --chown=node:node server.mjs ./server.mjs&lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; node&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "server.mjs"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To try it locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node server.mjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in another terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:3000/healthz
curl http://localhost:3000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should get &lt;code&gt;ok&lt;/code&gt; from the health endpoint and JSON containing &lt;code&gt;"version": "v1"&lt;/code&gt; from &lt;code&gt;/&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploying it
&lt;/h2&gt;

&lt;p&gt;Install the CLI and log in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @inquir/compute-cli
inquir login
inquir workspaces
inquir use WORKSPACE_SLUG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;WORKSPACE_SLUG&lt;/code&gt; with the slug or ID shown by &lt;code&gt;inquir workspaces&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Create a project and select it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;inquir projects create devto-demo &lt;span class="nt"&gt;--slug&lt;/span&gt; devto-demo
inquir projects use devto-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create the app and deploy it from the directory containing the Dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;inquir apps create web &lt;span class="nt"&gt;--port&lt;/span&gt; 3000 &lt;span class="nt"&gt;--health-path&lt;/span&gt; /healthz
inquir apps deploy web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The build runs on Inquir, so you don't need Docker installed locally. Once the release starts and passes its health check, you get a preview URL.&lt;/p&gt;

&lt;p&gt;Open it and check that the app returns &lt;code&gt;v1&lt;/code&gt;. To see its status and logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;inquir apps status web
inquir apps logs web &lt;span class="nt"&gt;--tail&lt;/span&gt; 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you're happy with the preview, promote the release and make the app public:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;inquir apps promote RELEASE_ID
inquir apps update web &lt;span class="nt"&gt;--ingress&lt;/span&gt; public
inquir apps status web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the release ID from the deployment or status output for &lt;code&gt;RELEASE_ID&lt;/code&gt;. It isn't the app name. The production URL will appear in the status output too.&lt;/p&gt;

&lt;p&gt;Promotion and public access are separate settings. You can keep a service internal even after promoting its release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploying a second version
&lt;/h2&gt;

&lt;p&gt;Change this line in &lt;code&gt;server.mjs&lt;/code&gt;:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;v2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;inquir apps deploy web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This app has no persistent volume, so the new release can run alongside the old one. The preview URL should return &lt;code&gt;v2&lt;/code&gt;. Production still returns &lt;code&gt;v1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That gives you time to check the actual app before switching traffic. Passing &lt;code&gt;/healthz&lt;/code&gt; only tells us the server can respond. It could still be returning the wrong data or failing on another endpoint.&lt;/p&gt;

&lt;p&gt;To put the new version into production:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;inquir apps promote NEW_RELEASE_ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the ID of the new release here. To go back to the previous one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;inquir apps rollback web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the previous container is still running on standby, traffic can switch back to it. Otherwise, Inquir has to start it again and wait for the health check.&lt;/p&gt;

&lt;p&gt;One important detail: rollback only restores the application release. It won't undo a database migration, recover deleted records, or take back a request you've already sent to another service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding a database or a worker
&lt;/h2&gt;

&lt;p&gt;You can create PostgreSQL from a template with a persistent volume. The &lt;code&gt;inquir apps connect&lt;/code&gt; command puts its connection string into the app's environment as &lt;code&gt;DATABASE_URL&lt;/code&gt;. You need to deploy a new release for that variable to take effect.&lt;/p&gt;

&lt;p&gt;Your code still needs a database driver or ORM. Inquir handles the connection configuration, not your queries or migrations.&lt;/p&gt;

&lt;p&gt;A worker can run as a long-lived container in the same project. Functions and pipelines are also available for individual calls, webhooks, and scheduled tasks. You don't have to squeeze a process that needs to stay running into a function.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current limits
&lt;/h2&gt;

&lt;p&gt;There are a couple of things worth knowing before putting a real project on it.&lt;/p&gt;

&lt;p&gt;Writable persistent volumes are tied to a single host. An app using one has one replica, with no automatic volume replication or live migration. Updating it means stopping the old container before starting the new one, so there is downtime. The side-by-side deployment above applies to our stateless example, not to an app writing to a persistent volume.&lt;/p&gt;

&lt;p&gt;Container scaling is manual for now. You can set resources and the supported number of replicas, but the platform won't automatically add replicas when traffic increases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trying it with your app
&lt;/h2&gt;

&lt;p&gt;I'm looking for developers willing to try a small project and tell me what gets in the way. An API with a database, a background worker, or an internal tool would all be useful to test. Start with something non-critical and try updating it too, not just getting the first version online.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://inquir.org/docs/deploy-an-application" rel="noopener noreferrer"&gt;deployment docs&lt;/a&gt; have more detail on the commands above.&lt;/p&gt;

&lt;p&gt;What are you using to host your apps now, and what part of the setup would you most like to stop doing yourself?&lt;/p&gt;

</description>
      <category>devops</category>
      <category>webdev</category>
      <category>node</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Building Inquir Compute: Serverless Functions for AI Agents, Background Jobs, and Long-Running Workflows</title>
      <dc:creator>Aleksandr Kubarskii</dc:creator>
      <pubDate>Fri, 15 May 2026 14:07:22 +0000</pubDate>
      <link>https://dev.to/__89569/building-inquir-compute-serverless-functions-for-ai-agents-background-jobs-and-long-running-1bgo</link>
      <guid>https://dev.to/__89569/building-inquir-compute-serverless-functions-for-ai-agents-background-jobs-and-long-running-1bgo</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmylhewowvs6dl8471nx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmylhewowvs6dl8471nx.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most serverless platforms are great when your function is small, stateless, and finishes quickly.&lt;/p&gt;

&lt;p&gt;But modern AI applications often do not look like that.&lt;/p&gt;

&lt;p&gt;They need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run background jobs&lt;/li&gt;
&lt;li&gt;process files&lt;/li&gt;
&lt;li&gt;call LLMs&lt;/li&gt;
&lt;li&gt;execute multi-step pipelines&lt;/li&gt;
&lt;li&gt;expose API endpoints&lt;/li&gt;
&lt;li&gt;handle webhooks&lt;/li&gt;
&lt;li&gt;run scheduled tasks&lt;/li&gt;
&lt;li&gt;keep containers warm&lt;/li&gt;
&lt;li&gt;preserve logs and traces&lt;/li&gt;
&lt;li&gt;avoid Kubernetes complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the problem I am working on with &lt;a href="https://inquir.org" rel="noopener noreferrer"&gt;Inquir Compute&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Inquir Compute is an AI-first Function-as-a-Service platform designed for developers who want to deploy functions, API endpoints, cron jobs, webhooks, and background workflows without managing Kubernetes, containers, ingress, scaling logic, or infrastructure boilerplate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I started building it
&lt;/h2&gt;

&lt;p&gt;I originally worked on Inquir as a search-as-a-service product.&lt;/p&gt;

&lt;p&gt;The idea was simple: help developers build search engines over different data sources.&lt;/p&gt;

&lt;p&gt;But while building ingestion pipelines, I noticed something interesting.&lt;/p&gt;

&lt;p&gt;A lot of the hard parts were not just about search.&lt;/p&gt;

&lt;p&gt;They were about compute.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fetch data from external APIs&lt;/li&gt;
&lt;li&gt;normalize and enrich documents&lt;/li&gt;
&lt;li&gt;split content into chunks&lt;/li&gt;
&lt;li&gt;call AI models&lt;/li&gt;
&lt;li&gt;index the result&lt;/li&gt;
&lt;li&gt;retry failed steps&lt;/li&gt;
&lt;li&gt;run jobs on a schedule&lt;/li&gt;
&lt;li&gt;expose parts of the workflow through HTTP APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At some point, the ingestion pipeline itself became the most interesting part of the system.&lt;/p&gt;

&lt;p&gt;That was the pivot.&lt;/p&gt;

&lt;p&gt;Inquir Compute was born from the idea that AI applications need a simpler way to run server-side logic.&lt;/p&gt;

&lt;p&gt;Not just short-lived functions.&lt;/p&gt;

&lt;p&gt;But real workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with traditional serverless
&lt;/h2&gt;

&lt;p&gt;AWS Lambda, Vercel Functions, Cloudflare Workers, and similar platforms are powerful.&lt;/p&gt;

&lt;p&gt;But when you build AI-heavy systems, you quickly hit limitations.&lt;/p&gt;

&lt;p&gt;Some common issues:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Timeouts
&lt;/h3&gt;

&lt;p&gt;AI workflows are not always fast.&lt;/p&gt;

&lt;p&gt;A function may need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;process a large document&lt;/li&gt;
&lt;li&gt;call multiple LLM APIs&lt;/li&gt;
&lt;li&gt;wait for an external service&lt;/li&gt;
&lt;li&gt;crawl a website&lt;/li&gt;
&lt;li&gt;transform data&lt;/li&gt;
&lt;li&gt;execute several dependent steps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Short execution limits become painful very quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Cold starts
&lt;/h3&gt;

&lt;p&gt;For many APIs, cold starts are acceptable.&lt;/p&gt;

&lt;p&gt;For AI agents and interactive workflows, they are not always acceptable.&lt;/p&gt;

&lt;p&gt;If a user is waiting for an agent to respond, container startup time matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Background jobs are awkward
&lt;/h3&gt;

&lt;p&gt;A lot of platforms are optimized for request-response functions.&lt;/p&gt;

&lt;p&gt;But real products need background work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;send emails&lt;/li&gt;
&lt;li&gt;process uploads&lt;/li&gt;
&lt;li&gt;generate reports&lt;/li&gt;
&lt;li&gt;sync data&lt;/li&gt;
&lt;li&gt;update embeddings&lt;/li&gt;
&lt;li&gt;call webhooks&lt;/li&gt;
&lt;li&gt;clean old records&lt;/li&gt;
&lt;li&gt;run scheduled tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers often end up connecting several services together just to run a job reliably.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Kubernetes is too much for small teams
&lt;/h3&gt;

&lt;p&gt;Kubernetes is powerful, but it is also a lot of operational overhead.&lt;/p&gt;

&lt;p&gt;For many indie hackers, startups, and small engineering teams, the ideal experience is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I write a function, deploy it, expose it as an API, schedule it, and see logs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I configure deployments, services, ingress, secrets, volumes, autoscaling, observability, and routing manually.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Inquir Compute does
&lt;/h2&gt;

&lt;p&gt;Inquir Compute is a serverless compute platform focused on developer experience.&lt;/p&gt;

&lt;p&gt;The core idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Write backend logic as functions and run them as APIs, cron jobs, webhooks, background tasks, or pipeline steps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A function can be used in different ways.&lt;/p&gt;

&lt;p&gt;For example, the same function could be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exposed as an HTTP endpoint&lt;/li&gt;
&lt;li&gt;triggered by a cron schedule&lt;/li&gt;
&lt;li&gt;called inside a pipeline&lt;/li&gt;
&lt;li&gt;used as a webhook handler&lt;/li&gt;
&lt;li&gt;executed manually from the dashboard&lt;/li&gt;
&lt;li&gt;used by an AI agent&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example: a simple function
&lt;/h2&gt;

&lt;p&gt;A function can be as simple as this:&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="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&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;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queryStringParameters&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;developer&lt;/span&gt;&lt;span class="dl"&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="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Hello, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then it can be mapped to an API route like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And called from the outside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://your-domain.com/api/gw/workspace/hello?name&lt;span class="o"&gt;=&lt;/span&gt;Alex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is to make deployment feel closer to writing application logic, not managing infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  API endpoints
&lt;/h2&gt;

&lt;p&gt;Inquir Compute includes an API Gateway-like layer.&lt;/p&gt;

&lt;p&gt;That means functions can be mapped to routes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /users/:id
POST /webhooks/stripe
POST /agent/chat
GET /reports/:reportId
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function receives an event object similar to common serverless platforms:&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="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&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;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathParameters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User profile loaded&lt;/span&gt;&lt;span class="dl"&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes it possible to build small APIs without setting up a traditional backend server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cron jobs
&lt;/h2&gt;

&lt;p&gt;AI and data applications often need scheduled execution.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run a daily sync&lt;/li&gt;
&lt;li&gt;update search indexes&lt;/li&gt;
&lt;li&gt;refresh cached data&lt;/li&gt;
&lt;li&gt;send scheduled reports&lt;/li&gt;
&lt;li&gt;check external APIs&lt;/li&gt;
&lt;li&gt;run cleanup jobs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Inquir Compute, the goal is to make cron a first-class concept.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 2 * * *
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This could trigger a function every day at 2 AM.&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="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Running nightly sync&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Fetch data&lt;/span&gt;
  &lt;span class="c1"&gt;// Transform it&lt;/span&gt;
  &lt;span class="c1"&gt;// Store it&lt;/span&gt;
  &lt;span class="c1"&gt;// Send report&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;h2&gt;
  
  
  Webhooks
&lt;/h2&gt;

&lt;p&gt;Webhooks are another common use case.&lt;/p&gt;

&lt;p&gt;You may want to receive events from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stripe&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;Telegram&lt;/li&gt;
&lt;li&gt;Slack&lt;/li&gt;
&lt;li&gt;Notion&lt;/li&gt;
&lt;li&gt;custom internal systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of running a full server just to receive webhook events, you can deploy a function:&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="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&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;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Webhook received:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payload&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="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;received&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;Then expose it as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /webhooks/github
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pipelines
&lt;/h2&gt;

&lt;p&gt;One of the most important concepts in Inquir Compute is the pipeline.&lt;/p&gt;

&lt;p&gt;AI workflows are rarely a single function.&lt;/p&gt;

&lt;p&gt;They are usually a chain of steps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fetch data
→ Clean data
→ Chunk content
→ Generate embeddings
→ Store result
→ Notify user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Receive user request
→ Call LLM
→ Search knowledge base
→ Call another tool
→ Generate response
→ Save trace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A pipeline can be sequential or parallel.&lt;/p&gt;

&lt;p&gt;Some steps may depend on previous steps.&lt;/p&gt;

&lt;p&gt;Some steps may need retries.&lt;/p&gt;

&lt;p&gt;Some may have conditions.&lt;/p&gt;

&lt;p&gt;The long-term goal is to make these workflows easy to build and observe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hot containers
&lt;/h2&gt;

&lt;p&gt;A major design idea behind Inquir Compute is keeping containers warm.&lt;/p&gt;

&lt;p&gt;Instead of always starting a new container for each invocation, Inquir Compute can keep function containers available for reuse.&lt;/p&gt;

&lt;p&gt;This is especially useful for AI workloads where startup time can be expensive.&lt;/p&gt;

&lt;p&gt;For example, a function may need to load:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an SDK&lt;/li&gt;
&lt;li&gt;a model client&lt;/li&gt;
&lt;li&gt;configuration&lt;/li&gt;
&lt;li&gt;cached data&lt;/li&gt;
&lt;li&gt;dependencies&lt;/li&gt;
&lt;li&gt;initialization logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keeping containers warm can improve the developer and user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observability by default
&lt;/h2&gt;

&lt;p&gt;Serverless is only useful if you can understand what happened.&lt;/p&gt;

&lt;p&gt;For each function or pipeline run, you need visibility into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;logs&lt;/li&gt;
&lt;li&gt;execution time&lt;/li&gt;
&lt;li&gt;errors&lt;/li&gt;
&lt;li&gt;input/output&lt;/li&gt;
&lt;li&gt;failed steps&lt;/li&gt;
&lt;li&gt;retries&lt;/li&gt;
&lt;li&gt;traces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inquir Compute is designed with built-in observability so developers do not need to wire everything manually from day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just use Kubernetes?
&lt;/h2&gt;

&lt;p&gt;You can absolutely build something like this on Kubernetes.&lt;/p&gt;

&lt;p&gt;In fact, under the hood, many platforms eventually need container orchestration concepts.&lt;/p&gt;

&lt;p&gt;But most developers do not want to start there.&lt;/p&gt;

&lt;p&gt;For many projects, Kubernetes is too low-level.&lt;/p&gt;

&lt;p&gt;You need to think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deployments&lt;/li&gt;
&lt;li&gt;services&lt;/li&gt;
&lt;li&gt;ingress&lt;/li&gt;
&lt;li&gt;autoscaling&lt;/li&gt;
&lt;li&gt;secrets&lt;/li&gt;
&lt;li&gt;namespaces&lt;/li&gt;
&lt;li&gt;persistent volumes&lt;/li&gt;
&lt;li&gt;container lifecycle&lt;/li&gt;
&lt;li&gt;monitoring&lt;/li&gt;
&lt;li&gt;networking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inquir Compute tries to hide most of that behind a simpler abstraction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Function → Route → Job → Pipeline → Logs&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The developer should focus on application logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is it for?
&lt;/h2&gt;

&lt;p&gt;Inquir Compute is mainly for developers building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI agents&lt;/li&gt;
&lt;li&gt;internal tools&lt;/li&gt;
&lt;li&gt;SaaS backends&lt;/li&gt;
&lt;li&gt;data pipelines&lt;/li&gt;
&lt;li&gt;webhook-based systems&lt;/li&gt;
&lt;li&gt;scheduled jobs&lt;/li&gt;
&lt;li&gt;API endpoints&lt;/li&gt;
&lt;li&gt;automation workflows&lt;/li&gt;
&lt;li&gt;document processing systems&lt;/li&gt;
&lt;li&gt;search and RAG pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is especially useful when you want serverless simplicity but need more flexibility for long-running or background workloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example use case: AI content pipeline
&lt;/h2&gt;

&lt;p&gt;Imagine you want to build an AI content pipeline.&lt;/p&gt;

&lt;p&gt;The workflow could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Read topic from database
2. Generate article outline
3. Generate draft
4. Improve SEO
5. Generate social post
6. Save result
7. Send notification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step can be a separate function.&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="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateOutline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;topic&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&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="c1"&gt;// Call LLM here&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;outline&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="s2"&gt;Introduction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Problem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Solution&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Example&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Conclusion&lt;/span&gt;&lt;span class="dl"&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then another function can generate the article.&lt;/p&gt;

&lt;p&gt;Another one can create a LinkedIn post.&lt;/p&gt;

&lt;p&gt;Another one can publish or schedule the result.&lt;/p&gt;

&lt;p&gt;This is the kind of workflow that does not always fit well into classic request-response serverless functions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger vision
&lt;/h2&gt;

&lt;p&gt;I think AI applications need a new kind of backend platform.&lt;/p&gt;

&lt;p&gt;Not just hosting.&lt;/p&gt;

&lt;p&gt;Not just functions.&lt;/p&gt;

&lt;p&gt;Not just containers.&lt;/p&gt;

&lt;p&gt;But a compute layer designed around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;agents&lt;/li&gt;
&lt;li&gt;tools&lt;/li&gt;
&lt;li&gt;workflows&lt;/li&gt;
&lt;li&gt;long-running tasks&lt;/li&gt;
&lt;li&gt;scheduled jobs&lt;/li&gt;
&lt;li&gt;API routes&lt;/li&gt;
&lt;li&gt;observability&lt;/li&gt;
&lt;li&gt;developer experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is what I am trying to build with Inquir Compute.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current status
&lt;/h2&gt;

&lt;p&gt;Inquir Compute is still evolving, but the core direction is clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deploy functions from the browser&lt;/li&gt;
&lt;li&gt;expose functions as API endpoints&lt;/li&gt;
&lt;li&gt;run background jobs&lt;/li&gt;
&lt;li&gt;run cron jobs&lt;/li&gt;
&lt;li&gt;build pipelines&lt;/li&gt;
&lt;li&gt;keep containers warm&lt;/li&gt;
&lt;li&gt;provide logs and traces&lt;/li&gt;
&lt;li&gt;reduce infrastructure overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to replace every cloud platform.&lt;/p&gt;

&lt;p&gt;The goal is to make it much easier to build and run AI-first backend logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Serverless made backend deployment much simpler.&lt;/p&gt;

&lt;p&gt;But AI applications are changing what backend workloads look like.&lt;/p&gt;

&lt;p&gt;They are longer-running.&lt;/p&gt;

&lt;p&gt;They are more stateful.&lt;/p&gt;

&lt;p&gt;They depend on external APIs.&lt;/p&gt;

&lt;p&gt;They need background execution.&lt;/p&gt;

&lt;p&gt;They need orchestration.&lt;/p&gt;

&lt;p&gt;They need visibility.&lt;/p&gt;

&lt;p&gt;And they should not require every developer to become a Kubernetes expert.&lt;/p&gt;

&lt;p&gt;That is why I am building Inquir Compute.&lt;/p&gt;

&lt;p&gt;If you are building AI agents, automation workflows, data pipelines, or serverless backends, I would love to hear what problems you are running into.&lt;/p&gt;

&lt;p&gt;In case you like it, I will share more insights on technical solutions I came up to.&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>ai</category>
      <category>node</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
