<?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: Marek Kregiel</title>
    <description>The latest articles on DEV Community by Marek Kregiel (@marek_kregiel_d6361c8268f).</description>
    <link>https://dev.to/marek_kregiel_d6361c8268f</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3469041%2F8aedba89-c1f9-4096-9762-b7903ce7b8d9.jpg</url>
      <title>DEV Community: Marek Kregiel</title>
      <link>https://dev.to/marek_kregiel_d6361c8268f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marek_kregiel_d6361c8268f"/>
    <language>en</language>
    <item>
      <title>Nx, Turborepo, Lerna… Which Monorepo Tool Wins for New Projects?</title>
      <dc:creator>Marek Kregiel</dc:creator>
      <pubDate>Thu, 11 Sep 2025 07:00:15 +0000</pubDate>
      <link>https://dev.to/marek_kregiel_d6361c8268f/nx-turborepo-lerna-which-monorepo-tool-wins-for-new-projects-2efn</link>
      <guid>https://dev.to/marek_kregiel_d6361c8268f/nx-turborepo-lerna-which-monorepo-tool-wins-for-new-projects-2efn</guid>
      <description>&lt;p&gt;I still remember my first interaction with &lt;strong&gt;monorepos&lt;/strong&gt; it was with &lt;strong&gt;Lerna&lt;/strong&gt;. At the time, it felt like a game-changer. Later, I even migrated a large codebase to a monorepo using Lerna, but things in this space evolved really quickly.&lt;/p&gt;

&lt;p&gt;Today, we have tools like &lt;strong&gt;Nx, Turborepo, npm workspaces&lt;/strong&gt; and many more,  they’re improving at a rapid pace. Each one brings its own advantages, from build performance to developer experience.&lt;br&gt;
Personally, I find it hard to imagine starting a new project without a monorepo. The benefits are just too good to ignore:&lt;/p&gt;

&lt;p&gt;•  &lt;strong&gt;Reusability&lt;/strong&gt; of shared libraries and utilities&lt;br&gt;
• &lt;strong&gt;Better collaboration&lt;/strong&gt; between teams&lt;br&gt;
•  &lt;strong&gt;Consistent tooling&lt;/strong&gt; and configuration across projects&lt;br&gt;
•  &lt;strong&gt;Easier refactoring&lt;/strong&gt; across multiple apps/packages&lt;/p&gt;

&lt;p&gt;For me, monorepo is quickly becoming the default choice rather than an exception.&lt;br&gt;
 I’m curious,  &lt;strong&gt;what’s your favorite monorepo tool today?&lt;/strong&gt; &lt;br&gt;
And if you were starting a new project from scratch, which one would you pick?&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>architecture</category>
      <category>javascript</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Migration Experience: 60 000 Users from MongoDB to SQL</title>
      <dc:creator>Marek Kregiel</dc:creator>
      <pubDate>Wed, 03 Sep 2025 06:33:00 +0000</pubDate>
      <link>https://dev.to/marek_kregiel_d6361c8268f/migrating-60000-users-from-mongodb-to-sql-safe-quick-and-easy-4mp9</link>
      <guid>https://dev.to/marek_kregiel_d6361c8268f/migrating-60000-users-from-mongodb-to-sql-safe-quick-and-easy-4mp9</guid>
      <description>&lt;p&gt;Moving data from one database to another can be a daunting task, especially when you need to do it with minimal disruption and maximum safety. This is how I tackled a migration of 60,000 users and their data from a &lt;strong&gt;MongoDB&lt;/strong&gt; to a &lt;strong&gt;SQL&lt;/strong&gt; database, handling approximately 13 columns across two related tables (a one-to-many relationship).&lt;/p&gt;

&lt;p&gt;My primary goals were to ensure the migration was as &lt;strong&gt;easy&lt;/strong&gt;, &lt;strong&gt;safe&lt;/strong&gt;, and &lt;strong&gt;quick&lt;/strong&gt; as possible. A key requirement was to keep data flowing on a secure network and execute the process within our existing application environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Strategy: State Management and Controlled Execution
&lt;/h2&gt;

&lt;p&gt;To manage the migration, I built a simple, in-memory state management system. This system gave me real-time visibility and control over the entire process.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Migration State
&lt;/h3&gt;

&lt;p&gt;I defined a &lt;code&gt;MigrationState&lt;/code&gt; interface to track some metrics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;MigrationState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;stopped&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;startedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;resolvedCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;successCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;errorCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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;I used a global object, migrationsState, to store the state for each migration run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;migrationsState&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="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;MigrationState&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Core Helper Functions&lt;br&gt;
A set of helper functions allowed me to manage the migration's lifecycle and monitor progress. Created functions to do the following things (simple as that):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start a new migration run.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;startMigration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;migrationId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&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;migrationsState&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;migrationId&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;concurrency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;stopped&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;startedAt&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;Date&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;resolvedCount&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="na"&gt;successCount&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="na"&gt;errorCount&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Stop a running migration.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;stopMigration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;migrationId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&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;migrationsState&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;migrationId&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;stopped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Change the concurrency level.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;changeConcurrency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;migrationId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&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;migrationsState&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;migrationId&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;concurrency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;concurrency&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Get the current state.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;getMigration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;migrationId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;MigrationState&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;return&lt;/span&gt; &lt;span class="nx"&gt;migrationsState&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;migrationId&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;These functions were triggered via API calls, giving me an external, controllable interface to the migration process.&lt;/p&gt;

&lt;p&gt;The Execution Logic&lt;br&gt;
The core of the migration was an asynchronous function that processed each user's data, updating the in-memory state as it went.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleUserAction&lt;/span&gt; &lt;span class="o"&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;migrationId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MongoUserModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// This function handles the actual data transfer and transformation per user&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;moveMongoUserDataToSql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
    &lt;span class="nf"&gt;bumpSuccessCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;migrationId&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;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&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="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &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="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;bumpErrorCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;migrationId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;bumpResolvedCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;migrationId&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 simple try...catch...finally block ensured that I always updated my counters, whether the operation succeeded or failed, giving me an accurate picture of the process.&lt;/p&gt;

&lt;p&gt;Real-Time Monitoring and Control&lt;br&gt;
Monitoring was crucial. I tracked both database and server metrics to make informed decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database (SQL)&lt;/strong&gt;: I kept a close eye on DTU % (Database Transaction Unit) to ensure the database wasn't overloaded and could still handle normal application traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server&lt;/strong&gt;: I monitored request response time, CPU usage, memory usage, server logs. This told me how the migration was impacting my application's performance.&lt;/p&gt;

&lt;p&gt;Lessons from Concurrency&lt;br&gt;
By watching these metrics, I could quickly decide when to adjust the concurrency. A higher concurrency level sped up the migration but also increased resource consumption.&lt;/p&gt;

&lt;p&gt;For context, these numbers refer to a medium-complex query in our system:&lt;br&gt;
&lt;strong&gt;Normal response time:&lt;/strong&gt; 50ms - 100ms&lt;br&gt;
&lt;strong&gt;5 concurrency:&lt;/strong&gt; 200ms - 500ms&lt;br&gt;
&lt;strong&gt;10 concurrency:&lt;/strong&gt; 200ms - 2s&lt;/p&gt;

&lt;p&gt;Pushing concurrency too high risked impacting the live application. This highlighted a key takeaway: having real-time metrics and the ability to dynamically adjust concurrency was critical for balancing speed and stability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For future migrations&lt;/strong&gt;, an additional &lt;strong&gt;control to change the interval time between user iterations would provide even more granular control over resource usage&lt;/strong&gt;. This would allow me to "throttle" the migration more effectively.&lt;/p&gt;

&lt;p&gt;This approach provided me with the flexibility and insight necessary to safely and successfully migrate our users. It proved that a well-defined process, combined with real-time monitoring and dynamic control, can make a complex data migration feel manageable and secure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Feedback &amp;amp; Experiences
&lt;/h2&gt;

&lt;p&gt;If you’ve used a similar approach before or see ways this could be improved. I’d love to hear your feedback.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What worked well (or didn’t) when you tried something like this?
&lt;/li&gt;
&lt;li&gt;Are there pitfalls I might have missed?
&lt;/li&gt;
&lt;li&gt;Any improvements you’d suggest?
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please share your thoughts.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
