<?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: suvera</title>
    <description>The latest articles on DEV Community by suvera (@suvera).</description>
    <link>https://dev.to/suvera</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%2F2679109%2Fbbdee0cf-4e37-4821-b169-f59f1cbf3ae6.jpg</url>
      <title>DEV Community: suvera</title>
      <link>https://dev.to/suvera</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/suvera"/>
    <language>en</language>
    <item>
      <title>Winter Boot: Spring Boot-style microservices in PHP 8.5</title>
      <dc:creator>suvera</dc:creator>
      <pubDate>Fri, 23 Oct 2026 05:21:21 +0000</pubDate>
      <link>https://dev.to/suvera/winter-boot-spring-boot-style-microservices-in-php-85-2530</link>
      <guid>https://dev.to/suvera/winter-boot-spring-boot-style-microservices-in-php-85-2530</guid>
      <description>&lt;p&gt;If you have used Spring Boot, you already know most of Winter Boot.&lt;/p&gt;

&lt;p&gt;In an earlier job I was writing Spring Boot and PHP side by side. Spring Boot hooked me. You could start implementing right away, dependency injection just worked, and convention over configuration meant the code I wrote was my app logic and little else. Microservices came together fast. So I kept asking myself: why can't we do this in PHP? I made the first commit in February 2021 to find out.&lt;/p&gt;

&lt;p&gt;Winter Boot is an open-source framework for writing microservices in PHP 8.5. It takes the Spring Boot programming model (beans, dependency injection, declarative transactions, caching, scheduling) and maps it onto PHP attributes. There is no XML and no code generation step.&lt;/p&gt;

&lt;p&gt;This post is a short tour, not a manual. The full &lt;a href="https://suvera.github.io/winter-boot/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; covers everything else, and the code is on &lt;a href="https://github.com/suvera/winter-boot" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small service
&lt;/h2&gt;

&lt;p&gt;Here is a service that reads a product from Postgres and caches it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;com\example\shop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;dev\winterframework\cache\stereotype\CacheEvict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;dev\winterframework\cache\stereotype\Cacheable&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;dev\winterframework\pdbc\PdbcTemplate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;dev\winterframework\stereotype\Autowired&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;dev\winterframework\stereotype\Service&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;dev\winterframework\txn\stereotype\Transactional&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="na"&gt;#[Service]&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;#[Autowired]&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;PdbcTemplate&lt;/span&gt; &lt;span class="nv"&gt;$db&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="na"&gt;#[Cacheable(cacheNames: 'products')]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;queryForMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s1"&gt;'SELECT * FROM products WHERE id = ?'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$id&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;#[Transactional]&lt;/span&gt;
    &lt;span class="na"&gt;#[CacheEvict(cacheNames: 'products', allEntries: true)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s1"&gt;'UPDATE products SET name = ? WHERE id = ?'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$id&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;And a controller that exposes it (imports trimmed from here on):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="na"&gt;#[RestController]&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;#[Autowired]&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;ProductService&lt;/span&gt; &lt;span class="nv"&gt;$products&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="na"&gt;#[GetMapping(path: '/products/{id}')]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;PathVariable&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;withJson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&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 entry point is one class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;require_once&lt;/span&gt; &lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/vendor/autoload.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="na"&gt;#[EnableCaching]&lt;/span&gt;
&lt;span class="na"&gt;#[EnableTransactionManagement]&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;WinterBootApplication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;configDirectory&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/config'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;scanNamespaces&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s1"&gt;'com\\example\\shop'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/src'&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ShopApplication&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WinterWebSwooleApplication&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&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="nc"&gt;ShopApplication&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;main&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plus a few lines of &lt;code&gt;application.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;

&lt;span class="na"&gt;datasource&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt;   &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shopdb&lt;/span&gt;
        &lt;span class="na"&gt;isPrimary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pgsql:host=localhost;dbname=shop"&lt;/span&gt;
        &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shop&lt;/span&gt;
        &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*****"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;php ShopApplication.php&lt;/code&gt;, then &lt;code&gt;curl localhost:8080/products/1&lt;/code&gt;. That's the whole app.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it runs
&lt;/h2&gt;

&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F78eyi7fdruu2eyxm1gza.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F78eyi7fdruu2eyxm1gza.png" alt="How a request flows through a Winter Boot service" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At boot the framework scans your namespaces, builds the bean graph and maps routes. This happens once per worker process, not per request. The server underneath is Swoole, so the process stays alive and the context stays in memory between requests. You pay the reflection and wiring cost up front, and request handling is just method calls.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#[Transactional]&lt;/code&gt; and &lt;code&gt;#[Cacheable]&lt;/code&gt; are aspects. They wrap the method call without a generated proxy class. A small native PHP extension (&lt;code&gt;winter_boot&lt;/code&gt;) handles the interception. That extension is required, which is one more thing to install. I think it's worth it. There are no proxy files to regenerate after a deploy, and &lt;code&gt;final&lt;/code&gt; classes still work. The official Docker image ships with it already built, so in practice most people never compile it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rest of the box
&lt;/h2&gt;

&lt;p&gt;The parts I end up using in almost every service:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;PdbcTemplate&lt;/code&gt; for plain SQL&lt;/li&gt;
&lt;li&gt;PPA (PHP Persistence API), a lightweight ORM: mark a class with &lt;code&gt;#[Table]&lt;/code&gt;, add &lt;code&gt;PpaEntityTrait&lt;/code&gt;, and the framework writes the &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; for you. The Doctrine module is there if you need a full ORM.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#[Transactional]&lt;/code&gt; with propagation, rollback rules and multiple datasources&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#[Scheduled]&lt;/code&gt; and &lt;code&gt;#[Async]&lt;/code&gt; for background work, no separate cron or queue runner&lt;/li&gt;
&lt;li&gt;A built-in migrator for plain &lt;code&gt;.sql&lt;/code&gt; files, easy to run as a pre-deploy step&lt;/li&gt;
&lt;li&gt;Actuator endpoints for health and info, plus Prometheus metrics and OpenTelemetry&lt;/li&gt;
&lt;li&gt;Interceptors, CORS, coroutine-safe sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Optional modules cover Redis, Kafka, SQS, S3, OpenSearch and service discovery. You add a module through Composer and enable it in &lt;code&gt;application.yml&lt;/code&gt;. Most of them live in &lt;a href="https://github.com/suvera/winter-modules" rel="noopener noreferrer"&gt;winter-modules&lt;/a&gt;, and Doctrine ORM and DBAL support is in &lt;a href="https://github.com/suvera/winter-doctrine" rel="noopener noreferrer"&gt;winter-doctrine&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One newer piece I like: put &lt;code&gt;#[McpTool]&lt;/code&gt; on a controller method or a service method and it is served as a Model Context Protocol tool on &lt;code&gt;/mcp&lt;/code&gt;. The input schema comes from the PHP signature and PHPDoc. So the same endpoint your frontend calls can be called by Claude or any other MCP client, through the same interceptors and auth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does it hold up?
&lt;/h2&gt;

&lt;p&gt;The most demanding thing running on it right now is &lt;a href="https://github.com/suvera/snowprint-analytics" rel="noopener noreferrer"&gt;Snowprint&lt;/a&gt;, a self-hosted, cookie-less web analytics tool. In its benchmark it stores about 9,900 events per second on 2 CPUs and about 19,800 on 4 CPUs, with every accepted event persisted. It uses the parts shown above: REST controllers, &lt;code&gt;PdbcTemplate&lt;/code&gt;, scheduled rollups, migrations and the actuator. It also tracks traffic on the Winter Boot docs site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rough edges
&lt;/h2&gt;

&lt;p&gt;Winter Boot needs PHP 8.5, Swoole and the &lt;code&gt;winter_boot&lt;/code&gt; extension. That is a narrower setup than a typical PHP-FPM host, and shared hosting is out. It is built for containers. If you deploy with Docker, use &lt;code&gt;suvera/winter-boot&lt;/code&gt; as the base image and the extension problem goes away.&lt;/p&gt;

&lt;p&gt;It is also a smaller project than Laravel or Symfony. The ecosystem is the framework plus its own modules, not thousands of third-party packages. Plain Composer libraries work fine, though, since it's still PHP.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require suvera/winter-boot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The easiest way to run it is the official Docker image, &lt;a href="https://hub.docker.com/r/suvera/winter-boot" rel="noopener noreferrer"&gt;&lt;code&gt;suvera/winter-boot&lt;/code&gt;&lt;/a&gt;. It's built on &lt;code&gt;php:8.5-cli-alpine&lt;/code&gt; and comes with every extension the framework needs, plus Redis, Kafka and PostgreSQL drivers, already installed. There is also &lt;code&gt;suvera/winter-boot-mysql&lt;/code&gt; if you're on MySQL. The &lt;a href="https://suvera.github.io/winter-boot/installation" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt; shows a ready-to-use Dockerfile.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://suvera.github.io/winter-boot/" rel="noopener noreferrer"&gt;https://suvera.github.io/winter-boot/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/suvera/winter-boot" rel="noopener noreferrer"&gt;https://github.com/suvera/winter-boot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docker image: &lt;a href="https://hub.docker.com/r/suvera/winter-boot" rel="noopener noreferrer"&gt;https://hub.docker.com/r/suvera/winter-boot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Example service: &lt;a href="https://github.com/suvera/winter-example-service" rel="noopener noreferrer"&gt;https://github.com/suvera/winter-example-service&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Issues and pull requests are welcome. If you build something with it, I'd like to hear about it.&lt;/p&gt;

</description>
      <category>php</category>
      <category>microservices</category>
      <category>backend</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
