<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Holm blog</title>
  <link href="https://holmhq.com/blog/"/>
  <link rel="self" href="https://holmhq.com/blog/feed.xml"/>
  <id>https://holmhq.com/blog/</id>
  <updated>2026-10-22T00:00:00Z</updated>
  <author><name>The Holm Authors</name></author>
  <entry>
    <title>Every Holm app now speaks MCP</title>
    <link href="https://holmhq.com/blog/every-holm-app-speaks-mcp/"/>
    <id>tag:holmhq.com,2026-10-22:blog/every-holm-app-speaks-mcp</id>
    <published>2026-10-22T00:00:00Z</published>
    <updated>2026-10-22T00:00:00Z</updated>
    <summary>Apps on Holm can now be used straight from ChatGPT and Claude, with nothing extra to build. What that means, what is tested and what comes next.</summary>
    <content type="html">&lt;p&gt;Since v0.255.0, apps on a Holm node can be used from inside ChatGPT and Claude. Holm speaks the Model Context Protocol (MCP), the open standard both use for plugins and connectors, and builds the tools from what your app already does. Nothing extra to write or set up.&lt;/p&gt;
&lt;p&gt;If you run Holm through Claude or another agent, it looks like this. You ask for an app, say a feedback form or a waitlist. The agent builds it and deploys it to your node. That app now also has an address ChatGPT or Claude can connect to, and anyone who adds it can use the app in plain words: &amp;quot;what&amp;#39;s on the waitlist?&amp;quot;, &amp;quot;send this feedback&amp;quot;.&lt;/p&gt;
&lt;p&gt;Why it matters: OpenAI reported 800 million weekly ChatGPT users in October 2025, and both ChatGPT and Claude let people add tools to their chats. Nobody knows yet how much a small plugin gets used, and you can&amp;#39;t sell digital goods inside ChatGPT, so think of it as a new front door to your app rather than a store. With Holm, that door comes with every app.&lt;/p&gt;
&lt;h2 id=&quot;what-an-assistant-can-do&quot;&gt;What an assistant can do&lt;/h2&gt;
&lt;p&gt;Only what your app already offers the public. Anything that needs a signed-in user stays out, and every request from an assistant goes through the same checks as one from a browser. Holm tells the assistant which actions only look things up and which change something. Actions that change things can be made safe to retry: if a connection drops and the assistant sends the same request again, Holm returns the first result instead of doing it twice.&lt;/p&gt;
&lt;p&gt;Our own &lt;a href=&quot;https://feedback.zyt.app&quot;&gt;feedback app&lt;/a&gt; works this way. In a chat it can look up a widget&amp;#39;s public settings and send feedback; the owner&amp;#39;s inbox stays private.&lt;/p&gt;
&lt;p&gt;Apps built before v0.255.0 have this switched off. Ask your agent to switch it on, or to keep any app out of AI chats.&lt;/p&gt;
&lt;h2 id=&quot;what-s-tested-and-what-s-next&quot;&gt;What&amp;#39;s tested, and what&amp;#39;s next&lt;/h2&gt;
&lt;p&gt;Before building this in, we connected a hand-written version of the feedback app to Claude. Claude picked the right actions from plain questions, read and wrote data, and showed an interactive card. The built-in version passes our tests for the current versions of the protocol, but we haven&amp;#39;t yet run it through real ChatGPT and Claude conversations end to end. That&amp;#39;s next.&lt;/p&gt;
&lt;p&gt;Still to come:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Sign-in,&lt;/strong&gt; so an assistant can reach a person&amp;#39;s own data in your app, with their consent. It is designed and under review.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Cards in the chat,&lt;/strong&gt; which the prototype showed and the built-in version doesn&amp;#39;t yet.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Help getting listed&lt;/strong&gt; in the ChatGPT and Claude directories.&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;try-it&quot;&gt;Try it&lt;/h2&gt;
&lt;p&gt;Ask your agent for your app&amp;#39;s MCP address, then add it as a custom connector: in &lt;a href=&quot;https://claude.com/docs/connectors/custom/add-unlisted&quot;&gt;Claude&lt;/a&gt;, or in ChatGPT&amp;#39;s &lt;a href=&quot;https://help.openai.com/en/articles/12584461&quot;&gt;developer mode&lt;/a&gt; (paid plans). The &lt;a href=&quot;/docs/#/serverless-javascript-runtime/use-your-app-from-chatgpt-or-claude&quot;&gt;guide&lt;/a&gt; has the details. If something behaves oddly, the Feedback link at the bottom of this page reaches us.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Holm on Windows: a small compile gap, an untested runtime</title>
    <link href="https://holmhq.com/blog/holm-on-windows/"/>
    <id>tag:holmhq.com,2026-10-16:blog/holm-on-windows</id>
    <published>2026-10-16T00:00:00Z</published>
    <updated>2026-10-16T00:00:00Z</updated>
    <summary>Holm has only ever shipped for Linux and macOS. A Windows build fails to compile in just four places, and proving that it runs well there is the larger job we are now planning.</summary>
    <content type="html">&lt;p&gt;Holm ships for Linux and macOS, on amd64 and arm64. There has never been a Windows build, and the installer stops with &amp;quot;Unsupported OS&amp;quot; anywhere else. This post covers why, what we found when we tried to build Holm for Windows, and what has to happen before we call it supported.&lt;/p&gt;
&lt;p&gt;Nothing described here has shipped. Windows support is planned work.&lt;/p&gt;
&lt;h2 id=&quot;why-there-was-no-windows-build&quot;&gt;Why there was no Windows build&lt;/h2&gt;
&lt;p&gt;Holm started as a way to deploy static sites to your own VPS with no extra dependencies. The design target is still a small server: a cheap VPS with one virtual CPU and 1 GB of memory. A production node is a Linux machine where Holm installs itself as a systemd service, gets HTTPS certificates for your domains and upgrades itself in place.&lt;/p&gt;
&lt;p&gt;Release builds have targeted Linux and macOS since the first release pipeline, and that list has not changed. Linux is where Holm runs in production. macOS lets you run the same binary on your own machine. Even there Holm trails Linux: it has no native service setup on macOS yet. Linux has always come first.&lt;/p&gt;
&lt;p&gt;Windows also raised a product question we had not answered. Should Holm on Windows be a command-line tool that manages Holm servers elsewhere, or a complete local server? Those lead to different work. A server needs integration with the Windows service manager, a safe upgrade path and a clean way to stop and start. We chose to wait for that answer before building either, and to make no claim about Windows in the meantime. The public reference says it plainly: Windows is not an official target.&lt;/p&gt;
&lt;p&gt;The last reason is evidence. A cross-compile proves that code builds. It tells you nothing about how the program behaves on that system. We want platform claims backed by tests that ran on the platform, and our continuous integration has only ever run on Linux. Without a Windows machine in the loop, a Windows build would have been a guess.&lt;/p&gt;
&lt;p&gt;That open question has since narrowed. Whatever role Windows ends up with, the first step is the same: the Holm core has to build and run there. So we started with the build.&lt;/p&gt;
&lt;h2 id=&quot;what-a-windows-compile-turns-up&quot;&gt;What a Windows compile turns up&lt;/h2&gt;
&lt;p&gt;A C toolchain is usually the hardest part of porting a program to Windows. Holm needs none. The binary is built without cgo, and its SQLite driver is written in pure Go. Go can cross-compile a program like that for Windows from a Linux machine with no extra tools.&lt;/p&gt;
&lt;p&gt;When we cross-compiled the server for 64-bit Windows, the build failed in exactly four places. All four are Unix-only code:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Free disk space, checked in three places.&lt;/strong&gt; Holm refuses app storage writes when the disk is nearly full, checks for room before it snapshots the database ahead of a migration, and reports free space in its database stats. All three ask the operating system through the Unix &lt;code&gt;statfs&lt;/code&gt; call.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The single-instance lock.&lt;/strong&gt; At startup Holm takes an exclusive lock on a file beside the database, so a second server can&amp;#39;t open the same database. That lock uses the Unix &lt;code&gt;flock&lt;/code&gt; call.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The hardened network listener.&lt;/strong&gt; On Linux, Holm asks the kernel to hold a new connection until the client sends data (TCP_DEFER_ACCEPT). That blunts slow-connection attacks at the kernel level. It also turns on TCP Fast Open. The library that sets these options is Linux-only and doesn&amp;#39;t compile for Windows. Holm already falls back to a plain listener on other systems at runtime, so only the build breaks.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;We replaced those four with stand-ins in a throwaway copy, and the whole server compiled into a 64-bit Windows executable of about 65 MB. The compile gap is small.&lt;/p&gt;
&lt;p&gt;The real fixes are small too. Windows has direct equivalents for free-space queries and file locks. The listener code will split by build target, so the Linux hardening stays on Linux and every other system gets the plain listener at compile time, as it already does at runtime. We expect the whole change to come to roughly 150 to 250 lines.&lt;/p&gt;
&lt;h2 id=&quot;what-we-don-t-know-yet&quot;&gt;What we don&amp;#39;t know yet&lt;/h2&gt;
&lt;p&gt;None of this has run on Windows. A program that compiles for a platform can still misbehave there, and server software touches the operating system in many places. These are the areas we expect to need work:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Self-upgrade.&lt;/strong&gt; &lt;code&gt;holm upgrade&lt;/code&gt; replaces the running binary with a new release. Linux allows that. Windows won&amp;#39;t let a running .exe be replaced in place, so upgrades need a different approach there.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Running as a service.&lt;/strong&gt; Holm installs a systemd service on Linux. Windows has its own service manager, and Holm has no code for it yet.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Shutdown.&lt;/strong&gt; On Unix, the service manager stops Holm with a signal and Holm shuts down cleanly. Windows delivers stop requests through other channels.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;File permissions and paths.&lt;/strong&gt; Holm sets Unix file modes on its data and assumes Unix-style paths in places. Windows handles both differently.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The installer.&lt;/strong&gt; The installer is a shell script for Linux and macOS. Windows will need its own way to install.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Each of these could be a small fix or could need real design work. We will know once the server runs on an actual Windows machine.&lt;/p&gt;
&lt;h2 id=&quot;the-plan&quot;&gt;The plan&lt;/h2&gt;
&lt;p&gt;The work comes in four steps:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Proper Windows versions of the four spots.&lt;/strong&gt; Native free-space and lock calls, and a listener split by build target.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A Windows cross-compile check in CI.&lt;/strong&gt; Every change gets built for Windows, so new Unix-only code can&amp;#39;t break that build silently.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The test suite on a Windows CI runner.&lt;/strong&gt; The tests that guard the Linux build will run on Windows too.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A smoke test on a disposable Windows VM.&lt;/strong&gt; Start the server, deploy a static app, restart it, upgrade it and run it as a service. The VM is thrown away afterwards, so each run starts from a clean machine.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;The first two steps are mechanical. The last two will show which of the runtime questions above are real problems.&lt;/p&gt;
&lt;h2 id=&quot;where-that-leaves-you-today&quot;&gt;Where that leaves you today&lt;/h2&gt;
&lt;p&gt;The release archives and the installer still cover Linux and macOS only, and the public reference still says Windows is not an official target. That stays true until the tests above pass. A successful compile is not enough for us to call a platform supported. When a Windows build ships, the &lt;a href=&quot;/changelog/&quot;&gt;changelog&lt;/a&gt; will say so.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Holm is open to try</title>
    <link href="https://holmhq.com/blog/holm-is-open-to-try/"/>
    <id>tag:holmhq.com,2026-10-04:blog/holm-is-open-to-try</id>
    <published>2026-10-04T00:00:00Z</published>
    <updated>2026-10-04T00:00:00Z</updated>
    <summary>Holm is a self-hosted platform for apps and agents. Every release before 1.0 is free and stays free, and one command installs it.</summary>
    <content type="html">&lt;p&gt;Holm is a self-hosted platform for apps and agents. One Go binary provides hosting, auth, storage, realtime, workers and operations. One SQLite database carries the whole node: apps, routes, identity, policy and durable state.&lt;/p&gt;
&lt;p&gt;That split is the idea we keep coming back to. The binary is replaceable: you upgrade it, and nothing you built moves. The database is the node: copy the file, and the instance goes with it.&lt;/p&gt;
&lt;h2 id=&quot;free-before-1-0-and-it-stays-that-way&quot;&gt;Free before 1.0, and it stays that way&lt;/h2&gt;
&lt;p&gt;Every Holm release before 1.0 is free for everyone under the &lt;a href=&quot;https://license.holmhq.com/&quot;&gt;Holm Usage License Agreement&lt;/a&gt;. A build&amp;#39;s license is part of the build and governs it permanently: later terms never apply to an earlier build, and you never have to upgrade. There is no license key, license server or expiry date.&lt;/p&gt;
&lt;p&gt;That is not just a promise in a blog post. It is written into &lt;a href=&quot;https://license.holmhq.com/v1/#8-license-versions-and-release-coupling&quot;&gt;section 8 of the license&lt;/a&gt;, and it holds for as long as you follow the license.&lt;/p&gt;
&lt;h2 id=&quot;install-it&quot;&gt;Install it&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;curl -fsSL https://holmhq.com/install.sh | bash&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The installer runs on Linux and macOS, on amd64 and arm64. It asks how you want to run Holm:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Production server&lt;/strong&gt; for a VPS, with a system service, your domain and HTTPS.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Local development&lt;/strong&gt; for your own machine, with a user service on your local IP.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CLI only&lt;/strong&gt; if you just want the binary.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Before service setup, it shows the license and asks you to accept it. The public starting point is v0.223.0, pinned to a checksum with HULA v1. CLI-only users follow the &lt;a href=&quot;/docs/#ten-minute-local-start&quot;&gt;local start guide&lt;/a&gt; to initialize an instance and record acceptance. Later updates use &lt;code&gt;holm upgrade&lt;/code&gt; through a signed release channel. You can &lt;a href=&quot;/install.sh&quot;&gt;read install.sh&lt;/a&gt; before you run it.&lt;/p&gt;
&lt;h2 id=&quot;what-to-expect&quot;&gt;What to expect&lt;/h2&gt;
&lt;p&gt;Holm is in beta and still changing quickly. The &lt;a href=&quot;/changelog/&quot;&gt;public changelog&lt;/a&gt; starts at v0.223.0; later releases add short entries there. Future legal-text changes get a new licence version, ID and versioned address.&lt;/p&gt;
&lt;p&gt;To find your way around, start with the &lt;a href=&quot;/docs/&quot;&gt;field guide&lt;/a&gt;. If you work with a coding agent, point it at &lt;a href=&quot;/llms-full.txt&quot;&gt;llms-full.txt&lt;/a&gt;, the complete plain-text reference. When something breaks or is missing, tell us in the &lt;a href=&quot;https://github.com/holmhq/issues/issues&quot;&gt;issue tracker&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
</feed>
