<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://blog.phast.sh/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.phast.sh/" rel="alternate" type="text/html" /><updated>2026-11-05T15:44:07+00:00</updated><id>https://blog.phast.sh/feed.xml</id><title type="html">Phast blog</title><subtitle>News and releases from Phast, a dependency manager for PHP.</subtitle><entry><title type="html">Phast 0.1.0 Ai-Petri: now in beta</title><link href="https://blog.phast.sh/posts/phast-0-1-0/" rel="alternate" type="text/html" title="Phast 0.1.0 Ai-Petri: now in beta" /><published>2026-11-03T00:00:00+00:00</published><updated>2026-11-03T00:00:00+00:00</updated><id>https://blog.phast.sh/posts/phast-0-1-0</id><content type="html" xml:base="https://blog.phast.sh/posts/phast-0-1-0/"><![CDATA[<p>The Phast beta is out. Version 0.1.0 is the first public release. It installs real projects from Packagist today, but 
the manifest and lock formats may still change before 1.0.</p>

<p>Phast is a dependency manager for PHP, written in Rust. It reads your existing <code class="language-plaintext highlighter-rouge">composer.json</code>, installs from Packagist,
Private Packagist or Satis, and generates a <code class="language-plaintext highlighter-rouge">vendor/autoload.php</code> your application uses exactly as before,
<code class="language-plaintext highlighter-rouge">\Composer\InstalledVersions</code> included. Nothing in your project has to change to try it.</p>

<h2 id="try-it">Try it</h2>

<p>On Linux and macOS:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-fsSL</span> https://raw.githubusercontent.com/phast-sh/phast/main/install.sh | sh
</code></pre></div></div>

<p>Then run <code class="language-plaintext highlighter-rouge">phast install</code> in any Composer project.</p>

<h2 id="what-it-brings">What it brings</h2>

<p>If you want to, <code class="language-plaintext highlighter-rouge">phast migrate</code> turns your <code class="language-plaintext highlighter-rouge">composer.json</code> into a <strong>TOML manifest</strong>, <code class="language-plaintext highlighter-rouge">phast.toml</code>. It’s easier to read,
and you can finally leave a comment next to a requirement saying why it’s pinned. The <strong>lock file</strong> keeps a stable
order, so diffs stay small and merge conflicts rare.</p>

<p>Monorepos get native <strong>workspaces</strong>, with one lock file and one <code class="language-plaintext highlighter-rouge">vendor/</code> for every member, and no path-repository
wiring to maintain.</p>

<p>There are <strong>supply-chain guards</strong> built in. The lock file records checksums, a <code class="language-plaintext highlighter-rouge">minimum-package-age</code> setting
holds back freshly published releases, and <code class="language-plaintext highlighter-rouge">phast audit</code> checks your dependencies against both Packagist and OSV
advisories.</p>

<p>When resolution fails, the <strong>errors explain</strong> which requirement conflicts with which, and which package pulled it in.
And <strong>scripts</strong> work as you’d expect. <code class="language-plaintext highlighter-rouge">phast run</code> runs them by name, and Composer’s lifecycle events fire as they always
have.</p>

<p>And it’s fast. On <a href="https://github.com/koel/koel">koel</a>, a real app with 202 packages, a cold install takes 7.0s against Composer’s 67.3s, and
an install from a lock with an empty cache, the one CI runs on every pipeline, 5.2s against 17.2s. The benchmark script
and the raw runs are <a href="https://github.com/phast-sh/phast/tree/main/testing/perf">in the repository</a>, so you can check it on your own projects.</p>

<h2 id="whats-missing">What’s missing</h2>

<p>The biggest gap is plugins, since Composer plugins don’t run under Phast yet. Plugin support is planned, and I’m still
working out the best way to approach it. The direction I’m leaning towards is plugins you opt into explicitly, each
running in its own process, rather than inside the package manager. There’s no Windows build yet either.</p>

<h2 id="whats-next">What’s next</h2>

<p>The next release, 0.1.1, focuses on the things a first user is likely to run into. It brings fixes found since the
launch, closes a few supply-chain gaps, and runs the rest of the test suite in CI. New releases will be announced here.</p>

<p>If you try Phast, I’d love to hear how it went, especially if something breaks. Just <a href="https://github.com/phast-sh/phast/issues">open an issue</a>.</p>

<ul>
  <li>Website: <a href="https://phast.sh">phast.sh</a></li>
  <li>Docs: <a href="https://docs.phast.sh">docs.phast.sh</a></li>
  <li>Release: <a href="https://github.com/phast-sh/phast/releases/tag/v0.1.0">0.1.0 Ai-Petri</a></li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[The first public beta of Phast, a dependency manager for PHP that works with your existing Composer projects.]]></summary></entry></feed>